diff --git a/.gitignore b/.gitignore index 3c9d2046..435152fd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ node_modules .vscode-test/ *.vsix +# local +.env +.env.local + # output directory out build diff --git a/package-lock.json b/package-lock.json index 27c37cfb..98bf3039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,16 +24,62 @@ "js-tokens": "^4.0.0" } }, + "@types/assert": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/assert/-/assert-1.4.3.tgz", + "integrity": "sha512-491hfOvNr0+BGOHT2m36xJ+LK68IuOshvxV0VIrKOnzBDL11WlDa3PwO+drTYkwCdfzJRN9REcDPZVVcrx1ucw==", + "dev": true + }, + "@types/dotenv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", + "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/events": { + "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": { + "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": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graphql": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.5.0.tgz", + "integrity": "sha512-MOkzsEp1Jk5bXuAsHsUi6BVv0zCO+7/2PTiZMXWDSsMXvNU6w/PLMQT2vHn8hy2i0JqojPz1Sz6rsFjHtsU0lA==", + "dev": true, + "requires": { + "graphql": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", - "dev": true + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" }, "@types/node": { - "version": "12.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==", + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.4.tgz", + "integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==", "dev": true }, "agent-base": { @@ -55,6 +101,12 @@ "uri-js": "^4.2.2" } }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -87,6 +139,18 @@ "safer-buffer": "~2.1.0" } }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -218,20 +282,20 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concurrently": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.1.tgz", - "integrity": "sha512-48+FE5RJ0qc8azwKv4keVQWlni1hZeSjcWr8shBelOBtBHcKj1aJFM9lHRiSc1x7lq416pkvsqfBMhSRja+Lhw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", "dev": true, "requires": { - "chalk": "^2.4.1", - "date-fns": "^1.23.0", - "lodash": "^4.17.10", + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", "read-pkg": "^4.0.1", - "rxjs": "^6.3.3", + "rxjs": "^6.5.2", "spawn-command": "^0.0.2-1", "supports-color": "^4.5.0", - "tree-kill": "^1.1.0", - "yargs": "^12.0.1" + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" }, "dependencies": { "has-flag": { @@ -256,6 +320,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cross-fetch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz", + "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=", + "requires": { + "node-fetch": "2.1.2", + "whatwg-fetch": "2.0.4" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -297,6 +370,15 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -307,6 +389,11 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "dotenv": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", + "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -316,6 +403,12 @@ "safer-buffer": "^2.1.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -334,6 +427,41 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.1.tgz", + "integrity": "sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", + "dev": true + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -408,6 +536,23 @@ "locate-path": "^3.0.0" } }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -428,6 +573,12 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -464,6 +615,27 @@ "path-is-absolute": "^1.0.0" } }, + "graphql": { + "version": "14.5.4", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.4.tgz", + "integrity": "sha512-dPLvHoxy5m9FrkqWczPPRnH0X80CyvRE6e7Fa5AWEqEAzg9LpxHvKh24po/482E6VWHigOkAmb4xCp6P9yT9gw==", + "requires": { + "iterall": "^1.2.2" + } + }, + "graphql-request": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", + "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", + "requires": { + "cross-fetch": "2.2.2" + } + }, + "graphql-tag": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", + "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -483,24 +655,37 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "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 + }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true }, "hosted-git-info": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.2.tgz", - "integrity": "sha512-CyjlXII6LMsPMyUzxpTt8fzh5QwzGqPmQXgY/Jyf4Zfp27t/FvfhwoE/8laaMUcMy816CkWF20I7NeQhwwY88w==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - } + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true }, "http-proxy-agent": { "version": "2.1.0", @@ -550,24 +735,75 @@ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "is-generator-function": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", + "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", + "dev": true + }, + "is-nan": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", + "integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=", + "dev": true, + "requires": { + "define-properties": "^1.1.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -584,6 +820,11 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -662,13 +903,13 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "yallist": "^3.0.2" + "chalk": "^2.0.1" } }, "map-age-cleaner": { @@ -732,27 +973,62 @@ } }, "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", + "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "dev": true, "requires": { + "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", + "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "glob": "7.1.2", + "find-up": "3.0.0", + "glob": "7.1.3", "growl": "1.10.5", - "he": "1.1.1", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -761,6 +1037,76 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -775,6 +1121,21 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -807,6 +1168,58 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -845,9 +1258,9 @@ "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1012,6 +1425,15 @@ "path-parse": "^1.0.6" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -1147,6 +1569,26 @@ "strip-ansi": "^4.0.0" } }, + "string.prototype.trimleft": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.0.0.tgz", + "integrity": "sha1-aLaqjhYsaoDnbjqKDC50cYbicf8=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.0.2" + } + }, + "string.prototype.trimright": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.0.0.tgz", + "integrity": "sha1-q0pW2AKgH75yk+EehPJNyBZGYd0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.0.2" + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -1162,6 +1604,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -1199,9 +1647,9 @@ "dev": true }, "tslint": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz", - "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz", + "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1248,9 +1696,9 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", + "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==", "dev": true }, "uri-js": { @@ -1270,6 +1718,19 @@ "requires-port": "^1.0.0" } }, + "util": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", + "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "object.entries": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -1307,17 +1768,73 @@ "source-map-support": "^0.5.0", "url-parse": "^1.4.4", "vscode-test": "^0.4.1" + }, + "dependencies": { + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "vscode-test": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", + "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", + "requires": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1" + } + } } }, "vscode-test": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", - "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.2.0.tgz", + "integrity": "sha512-aowqgc8gZe0eflzVUXsBjBrlsJ8eC35kfgfSEeHu9PKA1vQKm/3rVK43TlbxGue8hKtZBElNAJ5QuYklR/vLJA==", + "dev": true, "requires": { "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" + "https-proxy-agent": "^2.2.1", + "rimraf": "^2.6.3" } }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -1333,6 +1850,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -1396,12 +1922,6 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -1431,6 +1951,17 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + } } } } diff --git a/package.json b/package.json index df6dbb07..c6836e03 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,8 @@ { "name": "coderoad-vscode", - "displayName": "CodeRoad", - "description": "Interactive tutorials in your editor", "version": "0.0.1", - "engines": { - "vscode": "^1.34.0" - }, - "categories": [ - "Other" - ], - "publisher": "Shawn McKay", - "author": { - "name": "Shawn McKay " - }, + "description": "Interactive tutorials in your editor", + "homepage": "https://github.com/shmck/coderoad-vscode/README.md", "bugs": { "url": "https://github.com/shmck/coderoad-vscode/issues", "email": "shawn.j.mckay@gmail.com" @@ -21,48 +11,71 @@ "type": "git", "url": "https://github.com/shmck/coderoad-vscode.git" }, - "homepage": "https://github.com/shmck/coderoad-vscode/README.md", - "galleryBanner": { - "color": "#C80000", - "theme": "dark" + "license": "SEE LICENSE IN LICENSE.md", + "author": { + "name": "Shawn McKay " }, - "activationEvents": [ - "onCommand:coderoad.start" - ], "main": "./build/extension.js", - "contributes": { - "commands": [ - { - "command": "coderoad.start", - "title": "Start", - "category": "CodeRoad" - } - ] - }, "scripts": { - "vscode:prepublish": "npm run build", - "machine": "node ./out/state/index.js", "build": "rm -rf build && concurrently \"npm run build:ext\" \"npm run build:web\"", "build:ext": "npm run compile", "build:web": "cd web-app && npm run build", "compile": "tsc -p ./", - "watch": "tsc -watch -p ./", "postinstall": "node ./node_modules/vscode/bin/install", + "machine": "node ./out/state/index.js", "storybook": "cd web-app && npm run storybook", - "test": "npm run build && node ./node_modules/vscode/bin/test" + "test:ext": "node ./build/test/runTest.js", + "test": "jest", + "vscode:prepublish": "npm run build", + "watch": "tsc -watch -p ./" }, - "devDependencies": { + "dependencies": { "@types/mocha": "^5.2.7", - "@types/node": "^12.7.1", - "concurrently": "^4.1.1", + "dotenv": "^8.1.0", + "graphql": "^14.5.4", + "graphql-request": "^1.8.2", + "graphql-tag": "^2.10.1", + "vscode": "^1.1.36", + "xstate": "^4.6.7" + }, + "devDependencies": { + "@types/assert": "^1.4.3", + "@types/dotenv": "^6.1.1", + "@types/glob": "^7.1.1", + "@types/graphql": "^14.5.0", + "@types/node": "^12.7.4", + "assert": "^2.0.0", + "concurrently": "^4.1.2", + "glob": "^7.1.4", + "mocha": "^6.2.0", "prettier": "^1.18.2", - "tslint": "^5.18.0", + "tslint": "^5.19.0", "tslint-config-prettier": "^1.18.0", - "typescript": "^3.5.3" + "typescript": "^3.6.2", + "vscode-test": "^1.2.0" }, - "dependencies": { - "vscode": "^1.1.36", - "xstate": "^4.6.7" + "engines": { + "vscode": "^1.34.0" + }, + "activationEvents": [ + "onCommand:coderoad.start" + ], + "categories": [ + "Other" + ], + "contributes": { + "commands": [ + { + "command": "coderoad.start", + "title": "Start", + "category": "CodeRoad" + } + ] + }, + "displayName": "CodeRoad", + "galleryBanner": { + "color": "#C80000", + "theme": "dark" }, - "license": "SEE LICENSE IN LICENSE.md" + "publisher": "Shawn McKay" } diff --git a/src/Channel.ts b/src/Channel.ts new file mode 100644 index 00000000..ec60e2f9 --- /dev/null +++ b/src/Channel.ts @@ -0,0 +1,54 @@ +import * as CR from 'typings' +import * as vscode from 'vscode' + +import tutorialConfig from './actions/tutorialConfig' +import setupActions from './actions/setupActions' +import solutionActions from './actions/solutionActions' + +interface Channel { + receive(action: CR.Action): void + send(action: CR.Action): Promise +} + +class Channel implements Channel { + private postMessage: (action: CR.Action) => Thenable + constructor(postMessage: (action: CR.Action) => Thenable) { + this.postMessage = postMessage + } + + // receive from webview + public receive = (action: CR.Action) => { + const actionType: string = typeof action === 'string' ? action : action.type + console.log('RECEIVED:', actionType) + switch (actionType) { + case 'TEST_RUN': + vscode.commands.executeCommand('coderoad.run_test') + return + case 'TUTORIAL_CONFIG': + tutorialConfig(action.payload) + return + case 'SETUP_ACTIONS': + console.log(action.payload) + setupActions(action.payload) + return + case 'SOLUTION_ACTIONS': + console.log(action.payload) + solutionActions(action.payload) + return + default: + console.log(`No match for action type: ${actionType}`) + return + } + } + // send to webview + public send = async (action: CR.Action) => { + const success = await this.postMessage(action) + if (!success) { + throw new Error(`Message post failure: ${JSON.stringify(action)}`) + } + } + +} + +export default Channel + diff --git a/src/actions/runTest.ts b/src/actions/runTest.ts new file mode 100644 index 00000000..d01e5cf2 --- /dev/null +++ b/src/actions/runTest.ts @@ -0,0 +1,146 @@ +import * as vscode from 'vscode' +import node from '../services/node' + +// ensure only latest run_test action is taken +let currentId = 0 + +// quick solution to prevent processing multiple results +// NOTE: may be possible to kill child process early +const shouldExitEarly = (processId: number): boolean => { + return currentId !== processId +} + +let channel: vscode.OutputChannel + +const getOutputChannel = (name: string): vscode.OutputChannel => { + if (!channel) { + channel = vscode.window.createOutputChannel(name) + } + return channel +} + +interface Props { + onSuccess(): void + onFail(): void + onRun(): void +} + +async function runTest({onSuccess, onFail, onRun}: Props): Promise { + // increment process id + const processId = ++currentId + + onRun() + + const outputChannelName = 'Test Output' + + // TODO: validate test directory from package.json exists + // let testFile = path.join('test'); + // if (!await exists(testFile)) { + // return emptyTasks; + // } + + // TODO: verify test runner for args + const testArgs = ['--json'] + + // if .git repo, use --onlyChanged + // const hasGit = path.join('.git'); + // if (await exists(hasGit)) { + // testArgs.push('--onlyChanged') + // } + + const commandLine = `npm test -- ${testArgs.join(' ')}` + + try { + // capture position early on test start + // in case position changes + const {stdout} = await node.exec(commandLine) + if (shouldExitEarly(processId)) { + // exit early + return + } + + if (stdout) { + const lines = stdout.split(/\r{0,1}\n/) + console.log('SUCCESS LINES', lines) + for (const line of lines) { + if (line.length === 0) { + continue + } + + const regExp = /^{\"numFailedTestSuites/ + const matches = regExp.exec(line) + if (matches && matches.length) { + console.log('MATCHES SUCCESS') + const result = JSON.parse(line) + + if (result.success) { + console.log('SUCCESS') + if (shouldExitEarly(processId)) { + // exit early + return + } + console.log('call onSuccess') + onSuccess() + } else { + console.log('NOT SUCCESS?') + } + } + } + } + } catch (err) { + if (shouldExitEarly(processId)) { + // exit early + return + } + // error contains output & error message + // output can be parsed as json + const {stdout, stderr} = err + console.log('TEST FAILED', stdout) + + if (!stdout) { + console.error('SOMETHING WENT WRONG WITH A PASSING TEST') + } + // test runner failed + channel = getOutputChannel(outputChannelName) + + if (stdout) { + const lines = stdout.split(/\r{0,1}\n/) + + for (const line of lines) { + if (line.length === 0) { + continue + } + + const dataRegExp = /^{\"numFailedTestSuites"/ + const matches = dataRegExp.exec(line) + + if (matches && matches.length) { + const result = JSON.parse(line) + const firstError = result.testResults.find((t: any) => t.status === 'failed') + + if (firstError) { + if (shouldExitEarly(processId)) { + // exit early + return + } + console.log('ERROR', firstError.message) + console.log('call onFail') + onFail() + } else { + console.error('NOTE: PARSER DID NOT WORK FOR ', line) + } + } + } + } + + if (stderr) { + channel.show(false) + channel.appendLine(stderr) + } + // if (err.stdout) { + // channel.appendLine(err.stdout); + // } + } +} + +export default runTest \ No newline at end of file diff --git a/src/actions/setupActions.ts b/src/actions/setupActions.ts new file mode 100644 index 00000000..7268df2c --- /dev/null +++ b/src/actions/setupActions.ts @@ -0,0 +1,69 @@ +import * as G from 'typings/graphql' +import {join} from 'path' +import * as vscode from 'vscode' +import * as git from '../services/git' +import node from '../services/node' + +interface ErrorMessageFilter { + [lang: string]: { + [key: string]: string + } +} + +// TODO: should be loaded on startup based on language +const errorMessageFilter: ErrorMessageFilter = { + js: { + 'node-gyp': 'Error running npm setup command' + } +} + +const setupActions = async ({commands, commits, files}: G.StepActions): Promise => { + // run commits + for (const commit of commits) { + await git.loadCommit(commit) + } + + // run command + for (const command of commands) { + const {stdout, stderr} = await node.exec(command) + if (stderr) { + console.error(stderr) + // language specific error messages from running commands + for (const message of Object.keys(errorMessageFilter.js)) { + if (stderr.match(message)) { + // ignored error + throw new Error('Error running setup command') + } + } + } + console.log(`run command: ${command}`, stdout) + } + + // open files + for (const filePath of files) { + console.log(`OPEN_FILE ${filePath}`) + try { + // TODO: re-enable after testing + // const workspaceRoots: vscode.WorkspaceFolder[] | undefined = vscode.workspace.workspaceFolders + // if (!workspaceRoots || !workspaceRoots.length) { + // throw new Error('No workspace root path') + // } + // const rootWorkspace: vscode.WorkspaceFolder = workspaceRoots[0] + // const absoluteFilePath = join(rootWorkspace.uri.path, relativeFilePath) + const workspaceRoot = vscode.workspace.rootPath + if (!workspaceRoot) { + throw new Error('No workspace root path') + } + const absoluteFilePath = join(workspaceRoot, filePath) + const doc = await vscode.workspace.openTextDocument(absoluteFilePath) + await vscode.window.showTextDocument(doc, vscode.ViewColumn.One) + // there are times when initialization leave the panel behind any files opened + // ensure the panel is redrawn on the right side first + // webview.createOrShow(vscode.ViewColumn.Two) + } catch (error) { + console.log(`Failed to open file ${filePath}`, error) + } + } +} + +export default setupActions \ No newline at end of file diff --git a/src/actions/solutionActions.ts b/src/actions/solutionActions.ts new file mode 100644 index 00000000..43393eb0 --- /dev/null +++ b/src/actions/solutionActions.ts @@ -0,0 +1,17 @@ +// import * as CR from 'typings' +import * as G from 'typings/graphql' +// import {TutorialModel} from '../services/tutorial' +// import {gitLoadCommits, gitClear} from '../services/git' + +const solutionActions = async (stepActions: G.StepActions): Promise => { + // TODO: should load same as commits + + // const step: G.Step = tutorialModel.step() + // const solution = step.solution + + // await gitClear() + // await gitLoadCommits(solution, dispatch) + +} + +export default solutionActions diff --git a/src/actions/tutorialConfig.ts b/src/actions/tutorialConfig.ts new file mode 100644 index 00000000..285c9b46 --- /dev/null +++ b/src/actions/tutorialConfig.ts @@ -0,0 +1,26 @@ +import * as G from 'typings/graphql' +import * as vscode from 'vscode' +import * as git from '../services/git' + +const tutorialConfig = async (tutorial: G.Tutorial) => { + + // setup git, add remote + await git.initIfNotExists() + await git.setupRemote(tutorial.repo.uri) + + // TODO: allow multiple coding languages in a tutorial + + // setup onSave hook + // console.log(`languageIds: ${languageIds.join(', ')}`) + vscode.workspace.onDidSaveTextDocument((document: vscode.TextDocument) => { + if (document.uri.scheme === 'file' && tutorial.codingLanguage === document.languageId) { + // do work + // TODO: resolve issue if client unaware or out of sync with running test + vscode.commands.executeCommand('coderoad.run_test') + } + }) + + console.log('configured') +} + +export default tutorialConfig \ No newline at end of file diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 446b6a9a..d8d8354d 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -1,174 +1,165 @@ +import {Action} from 'typings' import * as path from 'path' -import * as CR from 'typings' import * as vscode from 'vscode' +import Channel from '../Channel' + +const getNonce = (): string => { + let text = '' + const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)) + } + return text +} + -/** - * Manages React webview panels - */ +// Manages webview panel class ReactWebView { - // @ts-ignore - public loaded: boolean - private panel: vscode.WebviewPanel - private extensionPath: string - private disposables: vscode.Disposable[] = [] - private onReceive: any // TODO: properly type - - public constructor(extensionPath: string) { - this.extensionPath = extensionPath - - // Create and show a new webview panel - this.panel = this.createWebviewPanel(vscode.ViewColumn.Two) - - // Set the webview's initial html content - this.panel.webview.html = this.getHtmlForWebview() - - // Listen for when the panel is disposed - // This happens when the user closes the panel or when the panel is closed programatically - this.panel.onDidDispose(this.dispose, this, this.disposables) - - // Handle messages from the webview - const onReceive = (action: string | CR.Action) => { - // await loading of webview in React before proceeding with loaded state - if (action === 'WEBVIEW_LOADED') { - this.loaded = true - } else { - vscode.commands.executeCommand('coderoad.receive_action', action) - } - } - this.panel.webview.onDidReceiveMessage(onReceive, null, this.disposables) - - // update panel on changes - const updateWindows = () => { - vscode.commands.executeCommand('vscode.setEditorLayout', { - orientation: 0, - groups: [{ groups: [{}], size: 0.6 }, { groups: [{}], size: 0.4 }], - }) - } - - // prevents new panels from going ontop of coderoad panel - vscode.window.onDidChangeActiveTextEditor((textEditor) => { - console.log('onDidChangeActiveTextEditor') - console.log(textEditor) - if (!textEditor || textEditor.viewColumn !== vscode.ViewColumn.Two) { - updateWindows() - } - }) - // // prevents moving coderoad panel on top of left panel - vscode.window.onDidChangeVisibleTextEditors((textEditor) => { - console.log('onDidChangeVisibleTextEditors') - updateWindows() - }) - - // TODO: prevent window from moving to the left when no windows remain on rights - } - - public createOrShow(column: number, callback?: () => void): void { - // If we already have a panel, show it. - // Otherwise, create a new panel. - if (this.panel && this.panel.webview) { - this.panel.reveal(column) - } else { - this.panel = this.createWebviewPanel(column) - } - if (callback) { - // listen for when webview is loaded - // unfortunately there is no easy way of doing this - const webPanelListener = setInterval(() => { - if (this.loaded) { - // callback tells editor the webview has loaded - setTimeout(callback) - clearInterval(webPanelListener) - } - }, 200) - } - } - - public async postMessage(action: CR.Action): Promise { - // Send a message to the webview webview. - // You can send any JSON serializable data. - const success = await this.panel.webview.postMessage(action) - if (!success) { - throw new Error(`Message post failure: ${JSON.stringify(action)}`) - } - } - - private async dispose(): Promise { - // Clean up our resources - this.loaded = false - this.panel.dispose() - Promise.all(this.disposables.map((x) => x.dispose())) - } - - private createWebviewPanel(column: number): vscode.WebviewPanel { - const viewType = 'CodeRoad' - const title = 'CodeRoad' - const config = { - // Enable javascript in the webview - enableScripts: true, - // And restric the webview to only loading content from our extension's `media` directory. - localResourceRoots: [vscode.Uri.file(path.join(this.extensionPath, 'build'))], - // prevents destroying the window when it is in the background - retainContextWhenHidden: true, - } - return vscode.window.createWebviewPanel(viewType, title, column, config) - } - - private getNonce(): string { - let text = '' - const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)) - } - return text - } - - private getHtmlForWebview(): string { - // eslint-disable-next-line - const manifest = require(path.join(this.extensionPath, 'build', 'asset-manifest.json')) - const mainScript = manifest.files['main.js'] - // grab first chunk - const chunk = Object.keys(manifest.files).filter(f => f.match(/^static\/js\/.+\.js$/))[0] - const chunkScript = manifest.files[chunk] - const mainStyle = manifest.files['main.css'] - - const scriptPathOnDisk = vscode.Uri.file(path.join(this.extensionPath, 'build', mainScript)) - const scriptUri = scriptPathOnDisk.with({ scheme: 'vscode-resource' }) - const chunkPathOnDisk = vscode.Uri.file(path.join(this.extensionPath, 'build', chunkScript)) - const chunkUri = chunkPathOnDisk.with({ scheme: 'vscode-resource' }) - const stylePathOnDisk = vscode.Uri.file(path.join(this.extensionPath, 'build', mainStyle)) - const styleUri = stylePathOnDisk.with({ scheme: 'vscode-resource' }) - - // Use a nonce to whitelist which scripts can be run - const [n1, n2, n3] = [1, 2, 3].map(this.getNonce) - - return ` + // @ts-ignore + public loaded: boolean + + public send: Channel['send'] + private panel: vscode.WebviewPanel + private extensionPath: string + private disposables: vscode.Disposable[] = [] + private channel: Channel + + public constructor(extensionPath: string) { + this.extensionPath = extensionPath + + // Create and show a new webview panel + this.panel = this.createWebviewPanel(vscode.ViewColumn.Two) + + // Set the webview initial html content + this.panel.webview.html = this.getHtmlForWebview() + + // Listen for when the panel is disposed + // This happens when the user closes the panel or when the panel is closed programmatically + this.panel.onDidDispose(this.dispose, this, this.disposables) + + this.channel = new Channel((action: Action): Thenable => { + return this.panel.webview.postMessage(action) + }) + // Handle messages from the webview + const receive = this.channel.receive + this.panel.webview.onDidReceiveMessage(receive, null, this.disposables) + this.send = this.channel.send + + + // update panel on changes + const updateWindows = () => { + vscode.commands.executeCommand('vscode.setEditorLayout', { + orientation: 0, + groups: [{groups: [{}], size: 0.6}, {groups: [{}], size: 0.4}], + }) + } + + // prevents new panels from going on top of coderoad panel + vscode.window.onDidChangeActiveTextEditor((textEditor?: vscode.TextEditor) => { + console.log('onDidChangeActiveTextEditor') + console.log(textEditor) + if (!textEditor || textEditor.viewColumn !== vscode.ViewColumn.Two) { + updateWindows() + } + }) + // // prevents moving coderoad panel on top of left panel + vscode.window.onDidChangeVisibleTextEditors((textEditor: vscode.TextEditor[]) => { + console.log('onDidChangeVisibleTextEditors') + updateWindows() + }) + + // TODO: prevent window from moving to the left when no windows remain on rights + } + + public createOrShow(column: number): void { + // If we already have a panel, show it. + // Otherwise, create a new panel. + if (this.panel && this.panel.webview) { + this.panel.reveal(column) + } else { + this.panel = this.createWebviewPanel(column) + } + } + + private async dispose(): Promise { + // Clean up our resources + this.loaded = false + this.panel.dispose() + Promise.all(this.disposables.map((x) => x.dispose())) + } + + private createWebviewPanel(column: number): vscode.WebviewPanel { + const viewType = 'CodeRoad' + const title = 'CodeRoad' + const config = { + // Enable javascript in the webview + enableScripts: true, + // And restrict the webview to only loading content from our extension's `media` directory. + localResourceRoots: [vscode.Uri.file(path.join(this.extensionPath, 'build'))], + // prevents destroying the window when it is in the background + retainContextWhenHidden: true, + } + return vscode.window.createWebviewPanel(viewType, title, column, config) + } + + private getHtmlForWebview(): string { + const buildUri = vscode.Uri.file(path.join(this.extensionPath, 'build')).with({scheme: 'vscode-resource'}) + + const manifest = require(path.join(this.extensionPath, 'build', 'asset-manifest.json')) + + const getSrc = (manifestName: string): any => { + const file = manifest.files[manifestName] + const uriPath = vscode.Uri.file(path.join(this.extensionPath, 'build', file)) + return uriPath.with({scheme: 'vscode-resource'}) + } + + const styles = [ + 'main.css', + // get style chunk + Object.keys(manifest.files).find(f => f.match(/^static\/css\/.+\.css$/)) || '' + ].map(style => getSrc(style)) + + // map over scripts + const scripts = [{ + file: './webpackBuild.js', + }, { + manifest: 'runtime~main.js', + }, { + manifest: 'main.js', + }, { + // get js chunk + manifest: Object.keys(manifest.files).find(f => f.match(/^static\/js\/.+\.js$/)), + }].map(script => ({ + nonce: getNonce(), + src: script.manifest ? getSrc(script.manifest) : script.file + })) + + const indexHtml = ` - - - - - React App - - - - - - - - - - - - -
Loading...
- - - - - ` - } + + + + + + React App + + + + ${styles.map(styleUri => ``).join('\n')} + + + + + + +
Loading...
+ ${scripts.map(s => ``).join('\n')} + + ` + + return indexHtml + } + } export default ReactWebView diff --git a/src/editor/commands.ts b/src/editor/commands.ts new file mode 100644 index 00000000..c186e831 --- /dev/null +++ b/src/editor/commands.ts @@ -0,0 +1,75 @@ +import * as vscode from 'vscode' +import ReactWebView from './ReactWebView' +import runTest from '../actions/runTest' +import {isEmptyWorkspace} from './workspace' + +const COMMANDS = { + START: 'coderoad.start', + OPEN_WEBVIEW: 'coderoad.open_webview', + RUN_TEST: 'coderoad.run_test', +} + +interface CreateCommandProps { + vscodeExt: vscode.ExtensionContext +} + +export const createCommands = ({vscodeExt}: CreateCommandProps) => { + // React panel webview + let webview: any + + return { + // initialize + [COMMANDS.START]: async () => { + console.log('start') + + // TODO: replace with a prompt to open a workspace + await isEmptyWorkspace() + + let webviewState: 'INITIALIZING' | 'RESTARTING' + if (!webview) { + webviewState = 'INITIALIZING' + } else if (webview.loaded) { + // already loaded + vscode.window.showInformationMessage('CodeRoad already open') + return + } else { + webviewState = 'RESTARTING' + } + + // activate machine + webview = new ReactWebView(vscodeExt.extensionPath) + }, + // open React webview + [COMMANDS.OPEN_WEBVIEW]: (column: number = vscode.ViewColumn.Two) => { + console.log('open webview') + // setup 1x1 horizontal layout + + // reset layout + vscode.commands.executeCommand('vscode.setEditorLayout', { + orientation: 0, + groups: [{groups: [{}], size: 0.6}, {groups: [{}], size: 0.4}], + }) + + webview.createOrShow(column) + }, + [COMMANDS.RUN_TEST]: () => { + console.log('run test webview', Object.keys(webview)) + runTest({ + onSuccess: () => { + console.log('COMMAND TEST_PASS') + webview.send({type: 'TEST_PASS'}) + vscode.window.showInformationMessage('PASS') + }, + onFail: () => { + console.log('COMMAND TEST_FAIL') + webview.send({type: 'TEST_FAIL'}) + vscode.window.showWarningMessage('FAIL') + }, + onRun: () => { + console.log('COMMAND TEST_RUN') + webview.send({type: 'TEST_RUN'}) + } + }) + }, + } +} diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts deleted file mode 100644 index c6a00255..00000000 --- a/src/editor/commands/index.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { join } from 'path' -import * as CR from 'typings' -import * as vscode from 'vscode' -import ReactWebView from '../ReactWebView' -import { setStorage } from '../storage' -import { isEmptyWorkspace } from '../workspace' -import runTest from './runTest' - -const COMMANDS = { - START: 'coderoad.start', - TUTORIAL_LAUNCH: 'coderoad.tutorial_launch', - TUTORIAL_SETUP: 'coderoad.tutorial_setup', - OPEN_WEBVIEW: 'coderoad.open_webview', - SEND_STATE: 'coderoad.send_state', - SEND_DATA: 'coderoad.send_data', - RECEIVE_ACTION: 'coderoad.receive_action', - OPEN_FILE: 'coderoad.open_file', - RUN_TEST: 'coderoad.run_test', - TEST_PASS: 'coderoad.test_pass', - TEST_FAIL: 'coderoad.test_fail', -} - -interface CreateCommandProps { - context: vscode.ExtensionContext - machine: CR.StateMachine - storage: any - git: any - position: any -} - -const resetLayout = () => { - vscode.commands.executeCommand('vscode.setEditorLayout', { - orientation: 0, - groups: [{ groups: [{}], size: 0.6 }, { groups: [{}], size: 0.4 }], - }) -} - -export const createCommands = ({ context, machine, storage, git, position }: CreateCommandProps) => { - // React panel webview - let webview: any - - return { - // initialize - [COMMANDS.START]: () => { - - let webviewState: 'INITIALIZING' | 'RESTARTING' - if (!webview) { - webviewState = 'INITIALIZING' - } else if (webview.loaded) { - // already loaded - vscode.window.showInformationMessage('CodeRoad already open') - return - } else { - webviewState = 'RESTARTING' - } - - setStorage(context.workspaceState) - - // activate machine - webview = new ReactWebView(context.extensionPath) - if (webviewState === 'INITIALIZING') { - machine.activate() - } else if (webviewState === 'RESTARTING') { - setTimeout(() => { - // timeout hack to make data update on new windows - // @ts-ignore - machine.refresh() - }, 1000) - } - }, - // open React webview - [COMMANDS.OPEN_WEBVIEW]: (column: number = vscode.ViewColumn.Two) => { - // setup 1x1 horizontal layout - resetLayout() - const callback = () => { - machine.send('WEBVIEW_INITIALIZED') - } - webview.createOrShow(column, callback) - }, - // launch a new tutorial - // NOTE: may be better to move into action as logic is primarily non-vscode - [COMMANDS.TUTORIAL_LAUNCH]: async ({ tutorial, dispatch }: any) => { - console.log('launch tutorial') - - await isEmptyWorkspace() - - await git.gitInitIfNotExists() - - // TODO: use actual tutorial repo - await Promise.all([git.gitSetupRemote(tutorial.meta.repo), storage.setTutorial(tutorial), storage.resetProgress()]) - - machine.send('TUTORIAL_LOADED') - }, - [COMMANDS.TUTORIAL_SETUP]: async (tutorial: CR.Tutorial) => { - console.log('tutorial setup', tutorial) - // setup onSave hook - const languageIds = tutorial.meta.languages - console.log(`languageIds: ${languageIds.join(', ')}`) - vscode.workspace.onDidSaveTextDocument((document: vscode.TextDocument) => { - console.log('save document', document) - if (languageIds.includes(document.languageId) && document.uri.scheme === 'file') { - // do work - machine.send('TEST_RUN') - } - }) - }, - // open a file - [COMMANDS.OPEN_FILE]: async (relativeFilePath: string) => { - console.log(`OPEN_FILE ${JSON.stringify(relativeFilePath)}`) - try { - const workspaceRoot = vscode.workspace.rootPath - if (!workspaceRoot) { - throw new Error('No workspace root path') - } - const absoluteFilePath = join(workspaceRoot, relativeFilePath) - const doc = await vscode.workspace.openTextDocument(absoluteFilePath) - await vscode.window.showTextDocument(doc, vscode.ViewColumn.One) - // there are times when intialization leave the panel behind any files opened - // ensure the panel is redrawn on the right side first - webview.createOrShow(vscode.ViewColumn.Two) - } catch (error) { - console.log(`Failed to open file ${relativeFilePath}`, error) - } - }, - // send messages to webview - [COMMANDS.SEND_STATE]: (payload: { data: any; state: any }) => { - webview.postMessage({ type: 'SET_STATE', payload }) - }, - [COMMANDS.SEND_DATA]: (payload: { data: any }) => { - webview.postMessage({ type: 'SET_DATA', payload }) - }, - [COMMANDS.RECEIVE_ACTION]: (action: string | CR.Action) => { - // send received actions from web-app into state machine - machine.send(action) - }, - [COMMANDS.RUN_TEST]: () => { - runTest({ - onSuccess: () => machine.send('TEST_PASS'), - onFail: () => machine.send('TEST_FAIL'), - }) - }, - [COMMANDS.TEST_PASS]: () => { - vscode.window.showInformationMessage('PASS') - }, - [COMMANDS.TEST_FAIL]: () => { - vscode.window.showWarningMessage('FAIL') - }, - } -} diff --git a/src/editor/commands/loadSolution.ts b/src/editor/commands/loadSolution.ts deleted file mode 100644 index 02ef752e..00000000 --- a/src/editor/commands/loadSolution.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as CR from 'typings' -import * as storage from '../../services/storage' -import { gitLoadCommits, gitClear } from '../../services/git' - -export default async function loadSolution(dispatch: CR.EditorDispatch): Promise { - const [position, tutorial]: [CR.Position, CR.Tutorial | undefined] = await Promise.all([ - storage.getPosition(), - storage.getTutorial(), - ]) - if (!position) { - throw new Error('No tutorial position state found') - } - if (!tutorial) { - throw new Error('Local tutorial not found') - } - // eslint-disable-next-line - const { solution } = tutorial.data.steps[position.stepId].actions - - await gitClear() - await gitLoadCommits(solution, dispatch) -} diff --git a/src/editor/commands/runTest.ts b/src/editor/commands/runTest.ts deleted file mode 100644 index 4a6627c6..00000000 --- a/src/editor/commands/runTest.ts +++ /dev/null @@ -1,142 +0,0 @@ -import * as vscode from 'vscode' -import { exec } from '../../services/node' -import * as storage from '../../services/storage' - -// ensure only latest run_test action is taken -let currentId = 0 - -// quick solution to prevent processing multiple results -// NOTE: may be possible to kill child process early -const shouldExitEarly = (processId: number): boolean => { - return currentId !== processId -} - -let _channel: vscode.OutputChannel - -const getOutputChannel = (name: string): vscode.OutputChannel => { - if (!_channel) { - _channel = vscode.window.createOutputChannel(name) - } - return _channel -} - -interface Props { - onSuccess(): void - onFail(): void -} - -export default async function runTest({ onSuccess, onFail }: Props): Promise { - // increment process id - let processId = ++currentId - - const outputChannelName = 'Test Output' - - // TODO: validate test directory from package.json exists - // let testFile = path.join('test'); - // if (!await exists(testFile)) { - // return emptyTasks; - // } - - // TODO: verify test runner for args - const testArgs = ['--json'] - - // if .git repo, use --onlyChanged - // const hasGit = path.join('.git'); - // if (await exists(hasGit)) { - // testArgs.push('--onlyChanged') - // } - - let commandLine = `npm test -- ${testArgs.join(' ')}` - - try { - // capture position early on test start - // in case position changes - const [position, { stdout }] = await Promise.all([storage.getPosition(), exec(commandLine)]) - if (shouldExitEarly(processId)) { - // exit early - return - } - - if (stdout) { - let lines = stdout.split(/\r{0,1}\n/) - console.log('SUCCESS LINES', lines) - for (let line of lines) { - if (line.length === 0) { - continue - } - - const regExp = /^{\"numFailedTestSuites/ - const matches = regExp.exec(line) - if (matches && matches.length) { - console.log('MATCHES SUCCESS') - const result = JSON.parse(line) - - if (result.success) { - console.log('SUCCESS') - if (shouldExitEarly(processId)) { - // exit early - return - } - console.log('call onSuccess') - onSuccess() - } else { - console.log('NOT SUCCESS?') - } - } - } - } - } catch (err) { - if (shouldExitEarly(processId)) { - // exit early - return - } - // error contains output & error message - // output can be parsed as json - const { stdout, stderr } = err - console.log('TEST FAILED', stdout) - - if (!stdout) { - console.error('SOMETHING WENT WRONG WITH A PASSING TEST') - } - // test runner failed - const channel = getOutputChannel(outputChannelName) - - if (stdout) { - let lines = stdout.split(/\r{0,1}\n/) - - for (let line of lines) { - if (line.length === 0) { - continue - } - - const dataRegExp = /^{\"numFailedTestSuites"/ - const matches = dataRegExp.exec(line) - - if (matches && matches.length) { - const result = JSON.parse(line) - const firstError = result.testResults.find((t: any) => t.status === 'failed') - - if (firstError) { - if (shouldExitEarly(processId)) { - // exit early - return - } - console.log('ERROR', firstError.message) - console.log('call onFail') - onFail() - } else { - console.error('NOTE: PARSER DID NOT WORK FOR ', line) - } - } - } - } - - if (stderr) { - channel.show(false) - channel.appendLine(stderr) - } - // if (err.stdout) { - // channel.appendLine(err.stdout); - // } - } -} diff --git a/src/editor/index.ts b/src/editor/index.ts index 41003627..02ec35e9 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -1,69 +1,43 @@ import * as vscode from 'vscode' -import * as CR from 'typings' -import { createCommands } from './commands' -import * as storage from '../services/storage' -import * as git from '../services/git' -import * as position from '../services/position' - -interface Props { - machine: CR.StateMachine - setWorkspaceRoot(rootPath: string): void -} +import {createCommands} from './commands' class Editor { - // extension context set on activation - // @ts-ignore - private context: vscode.ExtensionContext - private machine: CR.StateMachine - - constructor({ machine, setWorkspaceRoot }: Props) { - this.machine = machine - - // set workspace root for node executions - const { workspace } = vscode - const { rootPath } = workspace - if (!rootPath) { - throw new Error('Requires a workspace. Please open a folder') - } - setWorkspaceRoot(rootPath) - } - public activate = (context: vscode.ExtensionContext): void => { - console.log('ACTIVATE!') - this.context = context - // commands - this.activateCommands() - - // setup tasks or views here - } - public deactivate = (): void => { - console.log('DEACTIVATE!') - // cleanup subscriptions/tasks - for (const disposable of this.context.subscriptions) { - disposable.dispose() - } - // shut down state machine - console.log('deactivate machine') - this.machine.deactivate() - } - - // execute vscode command - public dispatch = (type: string, payload?: any) => { - vscode.commands.executeCommand(type, payload) - } - - private activateCommands = (): void => { - const commands = createCommands({ - context: this.context, - machine: this.machine, - storage, - git, - position, - }) - for (const cmd in commands) { - const command: vscode.Disposable = vscode.commands.registerCommand(cmd, commands[cmd]) - this.context.subscriptions.push(command) - } - } + // extension context set on activation + // @ts-ignore + private vscodeExt: vscode.ExtensionContext + + constructor() { + // set workspace root for node executions + const rootPath = vscode.workspace.rootPath + if (!rootPath) { + throw new Error('Requires a workspace. Please open a folder') + } + } + public activate = (vscodeExt: vscode.ExtensionContext): void => { + console.log('ACTIVATE!') + this.vscodeExt = vscodeExt + // commands + this.activateCommands() + + // setup tasks or views here + } + public deactivate = (): void => { + console.log('DEACTIVATE!') + // cleanup subscriptions/tasks + for (const disposable of this.vscodeExt.subscriptions) { + disposable.dispose() + } + } + + private activateCommands = (): void => { + const commands = createCommands({ + vscodeExt: this.vscodeExt, + }) + for (const cmd in commands) { + const command: vscode.Disposable = vscode.commands.registerCommand(cmd, commands[cmd]) + this.vscodeExt.subscriptions.push(command) + } + } } export default Editor diff --git a/src/editor/storage.ts b/src/editor/storage.ts deleted file mode 100644 index e8af1e36..00000000 --- a/src/editor/storage.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as CR from 'typings' -import * as vscode from 'vscode' - -let storage: vscode.Memento - -// storage must be set initially -export function setStorage(workspaceState: vscode.Memento): void { - storage = workspaceState -} - -export function get(key: string): T | undefined { - return storage.get(key) -} - -export function update(key: string, value: string | object): Thenable { - return storage.update(key, value) -} diff --git a/src/editor/workspace.ts b/src/editor/workspace.ts index e1ecd1cd..60264d06 100644 --- a/src/editor/workspace.ts +++ b/src/editor/workspace.ts @@ -1,43 +1,43 @@ import * as fs from 'fs' import * as path from 'path' import * as vscode from 'vscode' -import { exec, exists } from '../services/node' +import node from '../services/node' export async function isEmptyWorkspace(): Promise { - const { stdout, stderr } = await exec('ls') - if (stderr) { - throw new Error('Error validating if project is empty') - } - return !stdout.length + const {stdout, stderr} = await node.exec('ls') + if (stderr) { + throw new Error('Error validating if project is empty') + } + return !stdout.length } // // TODO: workspace change listener export async function openReadme(): Promise { - const { stderr } = await exec('ls') - if (stderr) { - throw new Error('Error looking for initial file') - } + const {stderr} = await node.exec('ls') + if (stderr) { + throw new Error('Error looking for initial file') + } - const file = 'README.md' - const filePath = path.join(vscode.workspace.rootPath || '', file) - console.log('filePath', filePath) - const hasReadme = await exists(file) + const file = 'README.md' + const filePath = path.join(vscode.workspace.rootPath || '', file) + console.log('filePath', filePath) + const hasReadme = await node.exists(file) - if (!hasReadme) { - // add readme if none exists - try { - const content = '# Welcome to CodeRoad!' - fs.writeFileSync(filePath, content, 'utf8') - } catch (error) { - throw new Error('Error writing READM.md') - } - } + if (!hasReadme) { + // add readme if none exists + try { + const content = '# Welcome to CodeRoad!' + fs.writeFileSync(filePath, content, 'utf8') + } catch (error) { + throw new Error('Error writing README.md') + } + } - try { - const openPath = vscode.Uri.parse(filePath) - const doc = await vscode.workspace.openTextDocument(openPath) - await vscode.window.showTextDocument(doc) - } catch (error) { - throw new Error('Error opening README doc') - } + try { + const openPath = vscode.Uri.parse(filePath) + const doc = await vscode.workspace.openTextDocument(openPath) + await vscode.window.showTextDocument(doc) + } catch (error) { + throw new Error('Error opening README doc') + } } diff --git a/src/extension.ts b/src/extension.ts index 403bb522..a12e7e2d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,19 +1,10 @@ -import * as vscode from 'vscode' -import { setWorkspaceRoot } from './services/node' -import StateMachine from './state' import Editor from './editor' -// state machine that governs application logic -export const machine = new StateMachine({ dispatch: vscode.commands.executeCommand }) - // vscode editor -export const editor = new Editor({ - machine, - setWorkspaceRoot, -}) +export const editor = new Editor() // activate run on vscode extension initialization export const activate = editor.activate -// deactive run on vscode extension shut down +// deactivate run on vscode extension shut down export const deactivate = editor.deactivate diff --git a/src/services/api/index.ts b/src/services/api/index.ts deleted file mode 100644 index 8429ba4f..00000000 --- a/src/services/api/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as CR from 'typings' - -// temporary tutorials -import basicTutorial from '../../tutorials/basic' - -interface Options { - resource: string - params?: any -} - -const tutorialsData: { [key: string]: CR.Tutorial } = { - [basicTutorial.id]: basicTutorial, -} - -// TODO: replace with fetch resource -export default async function fetch(options: Options): Promise { - switch (options.resource) { - case 'getTutorialsSummary': - // list of ids with summaries - const data: { [id: string]: CR.TutorialSummary } = {} - for (const tutorial of Object.values(tutorialsData)) { - data[tutorial.id] = tutorial.data.summary - } - return data - case 'getTutorial': - // specific tutorial by id - return tutorialsData[options.params.id] - default: - throw new Error('Resource not found') - } -} diff --git a/src/services/git/errorMessages.ts b/src/services/git/errorMessages.ts deleted file mode 100644 index 3b3a7e0e..00000000 --- a/src/services/git/errorMessages.ts +++ /dev/null @@ -1,13 +0,0 @@ -interface ErrorMessageFilter { - [lang: string]: { - [key: string]: string - } -} - -const errorMessages: ErrorMessageFilter = { - js: { - 'node-gyp': 'Error running npm setup command' - } -} - -export default errorMessages \ No newline at end of file diff --git a/src/services/git/index.ts b/src/services/git/index.ts index 1ec60bf4..99724487 100644 --- a/src/services/git/index.ts +++ b/src/services/git/index.ts @@ -1,35 +1,35 @@ import * as CR from 'typings' -import { exec, exists } from '../node' -import errorMessages from './errorMessages' +import node from '../node' + const gitOrigin = 'coderoad' const stashAllFiles = async () => { - console.log('stashAllFiles') - // stash files including untracked (eg. newly created file) - const { stdout, stderr } = await exec(`git stash --include-untracked`) - if (stderr) { - console.error(stderr) - throw new Error('Error stashing files') - } + console.log('stashAllFiles') + // stash files including untracked (eg. newly created file) + const {stdout, stderr} = await node.exec(`git stash --include-untracked`) + if (stderr) { + console.error(stderr) + throw new Error('Error stashing files') + } } const cherryPickCommit = async (commit: string, count = 0): Promise => { - if (count > 1) { - console.warn('cherry-pick failed') - return - } - try { - const { stdout } = await exec(`git cherry-pick ${commit}`) - if (!stdout) { - throw new Error('No cherry-pick output') - } - } catch (error) { - console.log('cherry-pick-commit failed') - // stash all files if cherry-pick fails - await stashAllFiles() - return cherryPickCommit(commit, ++count) - } + if (count > 1) { + console.warn('cherry-pick failed') + return + } + try { + const {stdout} = await node.exec(`git cherry-pick ${commit}`) + if (!stdout) { + throw new Error('No cherry-pick output') + } + } catch (error) { + console.log('cherry-pick-commit failed') + // stash all files if cherry-pick fails + await stashAllFiles() + return cherryPickCommit(commit, ++count) + } } @@ -38,38 +38,8 @@ const cherryPickCommit = async (commit: string, count = 0): Promise => { SINGLE git cherry-pick %COMMIT% if fails, will stash all and retry */ -export async function gitLoadCommits(actions: CR.TutorialAction, dispatch: CR.EditorDispatch): Promise { - const { commits, commands, files } = actions - - for (const commit of commits) { - // pull a commit from tutorial repo - console.log(`try cherry-pick ${commit}`) - await cherryPickCommit(commit) - } - - if (commands) { - // TODO: run shell as task - for (const command of commands) { - const { stdout, stderr } = await exec(command) - if (stderr) { - console.error(stderr) - // langauge specific error messages from running commands - for (const message of Object.keys(errorMessages.js)) { - if (stderr.match(message)) { - // ignored error - throw new Error('Error running setup command') - } - } - } - console.log(`run command: ${command}`, stdout) - } - } - - if (files) { - for (const filePath of files) { - dispatch('coderoad.open_file', filePath) - } - } +export function loadCommit(commit: string): Promise { + return cherryPickCommit(commit) } /* @@ -77,97 +47,97 @@ export async function gitLoadCommits(actions: CR.TutorialAction, dispatch: CR.Ed git commit -am '${level}/${stage}/${step} complete' */ -export async function gitSaveCommit(position: CR.Position): Promise { - const { levelId, stageId, stepId } = position - const { stdout, stderr } = await exec(`git commit -am 'completed ${levelId}/${stageId}/${stepId}'`) - if (stderr) { - console.error(stderr) - throw new Error('Error saving progress to Git') - } - console.log('save with commit & continue stdout', stdout) +export async function saveCommit(position: CR.Position): Promise { + const {levelId, stageId, stepId} = position + const {stdout, stderr} = await node.exec(`git commit -am 'completed ${levelId}/${stageId}/${stepId}'`) + if (stderr) { + console.error(stderr) + throw new Error('Error saving progress to Git') + } + console.log('save with commit & continue stdout', stdout) } -export async function gitClear(): Promise { - try { - // commit progress to git - const { stderr } = await exec('git reset HEAD --hard && git clean -fd') - if (!stderr) { - return - } - console.error(stderr) - } catch (error) { - console.error(error) - } - throw new Error('Error cleaning up current unsaved work') +export async function clear(): Promise { + try { + // commit progress to git + const {stderr} = await node.exec('git reset HEAD --hard && git clean -fd') + if (!stderr) { + return + } + console.error(stderr) + } catch (error) { + console.error(error) + } + throw new Error('Error cleaning up current unsaved work') } -export async function gitVersion(): Promise { - const { stdout, stderr } = await exec('git --version') - if (!stderr) { - const match = stdout.match(/^git version (\d+\.)?(\d+\.)?(\*|\d+)/) - if (match) { - // eslint-disable-next-line - const [_, major, minor, patch] = match - return `${major}${minor}${patch}` - } - } - throw new Error('Git not installed. Please install Git') +export async function version(): Promise { + const {stdout, stderr} = await node.exec('git --version') + if (!stderr) { + const match = stdout.match(/^git version (\d+\.)?(\d+\.)?(\*|\d+)/) + if (match) { + // eslint-disable-next-line + const [_, major, minor, patch] = match + return `${major}${minor}${patch}` + } + } + throw new Error('Git not installed. Please install Git') } -async function gitInit(): Promise { - const { stderr } = await exec('git init') - if (stderr) { - throw new Error('Error initializing Gits') - } +async function init(): Promise { + const {stderr} = await node.exec('git init') + if (stderr) { + throw new Error('Error initializing Gits') + } } -export async function gitInitIfNotExists(): Promise { - const hasGit = await gitVersion() +export async function initIfNotExists(): Promise { + const hasGit = await version() - if (!hasGit) { - throw new Error('Git must be installed') - } + if (!hasGit) { + throw new Error('Git must be installed') + } - const hasGitInit = exists('.git') - if (!hasGitInit) { - await gitInit() - } + const hasGitInit = node.exists('.git') + if (!hasGitInit) { + await init() + } } -export async function gitAddRemote(repo: string): Promise { - const { stderr } = await exec(`git remote add ${gitOrigin} ${repo} && git fetch ${gitOrigin}`) - if (stderr) { - const alreadyExists = stderr.match(`${gitOrigin} already exists.`) - const successfulNewBranch = stderr.match('new branch') - - // validate the response is acceptable - if (!alreadyExists && !successfulNewBranch) { - console.error(stderr) - throw new Error('Error adding git remote') - } - } +export async function addRemote(repo: string): Promise { + const {stderr} = await node.exec(`git remote add ${gitOrigin} ${repo} && git fetch ${gitOrigin}`) + if (stderr) { + const alreadyExists = stderr.match(`${gitOrigin} already exists.`) + const successfulNewBranch = stderr.match('new branch') + + // validate the response is acceptable + if (!alreadyExists && !successfulNewBranch) { + console.error(stderr) + throw new Error('Error adding git remote') + } + } } -export async function gitCheckRemoteExists(): Promise { - try { - const { stdout, stderr } = await exec('git remote -v') - if (stderr) { - return false - } - // string match on remote output - // TODO: improve the specificity of this regex - return !!stdout.match(gitOrigin) - } catch (error) { - return false - } +export async function checkRemoteExists(): Promise { + try { + const {stdout, stderr} = await node.exec('git remote -v') + if (stderr) { + return false + } + // string match on remote output + // TODO: improve the specificity of this regex + return !!stdout.match(gitOrigin) + } catch (error) { + return false + } } -export async function gitSetupRemote(repo: string): Promise { - // check coderoad remote not taken - const hasRemote = await gitCheckRemoteExists() - // git remote add coderoad tutorial - // git fetch coderoad - if (!hasRemote) { - await gitAddRemote(repo) - } +export async function setupRemote(repo: string): Promise { + // check coderoad remote not taken + const hasRemote = await checkRemoteExists() + // git remote add coderoad tutorial + // git fetch coderoad + if (!hasRemote) { + await addRemote(repo) + } } diff --git a/src/services/node/index.ts b/src/services/node/index.ts index 81e97d49..d6b583a0 100644 --- a/src/services/node/index.ts +++ b/src/services/node/index.ts @@ -1,26 +1,29 @@ import * as fs from 'fs' -import { join } from 'path' -import { exec as cpExec } from 'child_process' -import { promisify } from 'util' +import {join} from 'path' +import {exec as cpExec} from 'child_process' +import {promisify} from 'util' +import * as vscode from 'vscode' const asyncExec = promisify(cpExec) -let workspaceRoot: string +class Node { + private workspaceRoot: string + constructor() { + this.workspaceRoot = vscode.workspace.rootPath || '' + if (!this.workspaceRoot.length) { + throw new Error('Invalid workspaceRoot') + } + console.log(`workspaceRoot: ${this.workspaceRoot}`) + } + public exec = (cmd: string): Promise<{stdout: string; stderr: string}> => asyncExec(cmd, { + cwd: this.workspaceRoot, + }) -// set workspace root -// other function will use this to target the correct cwd -export function setWorkspaceRoot(rootPath: string): void { - workspaceRoot = rootPath + public exists = (...paths: string[]): boolean => fs.existsSync(join(this.workspaceRoot, ...paths)) } -export const exec = (cmd: string): Promise<{ stdout: string; stderr: string }> => - asyncExec(cmd, { - cwd: workspaceRoot, - }) +export default new Node() -// note: fs.exists is deprecated -// collect all paths together -export const exists = (...paths: string[]): boolean => fs.existsSync(join(workspaceRoot, ...paths)) // export async function clear(): Promise { // // remove all files including ignored diff --git a/src/services/position.ts b/src/services/position.ts deleted file mode 100644 index 6f0e4312..00000000 --- a/src/services/position.ts +++ /dev/null @@ -1,65 +0,0 @@ -import * as CR from 'typings' -import * as storage from './storage' - -export async function getInitial(tutorial: CR.Tutorial): Promise { - const { data } = tutorial - - const levelId = data.summary.levelList[0] - const stageId = data.levels[levelId].stageList[0] - const stepId = data.stages[stageId].stepList[0] - - const position = { - levelId, - stageId, - stepId, - } - - storage.setPosition(position) - - return position -} - -export async function loadProgressPosition() { - const [tutorial, progress] = await Promise.all([storage.getTutorial(), storage.getProgress()]) - - if (!tutorial) { - throw new Error('No tutorial found') - } - - // already complete - if (progress.complete) { - return - } - - const { - data: { summary, levels, stages }, - } = tutorial - - // loop over levels to find first incomplete - const currentLevelId = summary.levelList.find((levelId: string) => !progress.levels[levelId]) - if (!currentLevelId) { - throw new Error('Current level not found') - } - - // loop over stages to find first incomplete - const currentStageId = levels[currentLevelId].stageList.find((stageId: string) => !progress.stages[stageId]) - if (!currentStageId) { - throw new Error('Current stage not found') - } - - // loop over steps to find first incomplete - const currentStepId = stages[currentStageId].stepList.find((stepId: string) => !progress.steps[stepId]) - if (!currentStepId) { - throw new Error('Current step not found') - } - - const position: CR.Position = { - levelId: currentLevelId, - stageId: currentStageId, - stepId: currentStepId, - } - - storage.setPosition(position) -} - -export async function getPrev(): Promise { } diff --git a/src/services/storage.ts b/src/services/storage.ts deleted file mode 100644 index d1df66fc..00000000 --- a/src/services/storage.ts +++ /dev/null @@ -1,77 +0,0 @@ -import * as CR from 'typings' -import * as storage from '../editor/storage' - -// TUTORIAL -const STORE_TUTORIAL = 'coderoad:tutorial' - -export async function getTutorial(): Promise { - return storage.get(STORE_TUTORIAL) -} - -export async function setTutorial(tutorial: CR.Tutorial): Promise { - await storage.update(STORE_TUTORIAL, tutorial) -} - -// POSITION -const STORE_POSITION = 'coderoad:position' - -const defaultPosition = { levelId: '', stageId: '', stepId: '' } - -export async function getPosition(): Promise { - const position: CR.Position | undefined = storage.get(STORE_POSITION) - return position || defaultPosition -} - -export async function setPosition(position: CR.Position): Promise { - await storage.update(STORE_POSITION, position) -} - -// PROGRESS -const STORE_PROGRESS = 'coderoad:progress' - -const defaultProgress = { levels: {}, stages: {}, steps: {}, hints: {}, complete: false } - -export async function getProgress(): Promise { - const progress: CR.Progress | undefined = await storage.get(STORE_PROGRESS) - return progress || defaultProgress -} - -export async function resetProgress(): Promise { - await storage.update(STORE_PROGRESS, defaultProgress) -} - -interface ProgressUpdate { - levels?: { - [levelId: string]: boolean - } - stages?: { - [stageid: string]: boolean - } - steps?: { - [stepId: string]: boolean - } -} - -export async function setProgress(record: ProgressUpdate): Promise { - const progress = await getProgress() - if (record.levels) { - progress.levels = { - ...progress.levels, - ...record.levels, - } - } - if (record.stages) { - progress.stages = { - ...progress.stages, - ...record.stages, - } - } - if (record.steps) { - progress.steps = { - ...progress.steps, - ...record.steps, - } - } - - await storage.update(STORE_PROGRESS, progress) -} diff --git a/src/state/State.png b/src/state/State.png deleted file mode 100644 index 30baf2be..00000000 Binary files a/src/state/State.png and /dev/null differ diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts deleted file mode 100644 index bad7e107..00000000 --- a/src/state/actions/index.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { assign } from 'xstate' -// NOTE: codesmell - importing machine -import { machine } from '../../extension' -import api from '../../services/api' -import * as CR from 'typings' -import * as storage from '../../services/storage' -import * as git from '../../services/git' - -let currentTutorial: CR.Tutorial | undefined -let currentProgress: CR.Progress = { - levels: {}, - stages: {}, - steps: {}, - complete: false, -} - -const calculatePosition = ({ data, progress }: { data: CR.TutorialData, progress: CR.Progress }): CR.Position => { - const { levelList } = data.summary - // take next incomplete level or the final step - const levelId = levelList.find((id: string) => !progress.levels[id]) || levelList[levelList.length - 1] - const { stageList } = data.levels[levelId] - const stageId = stageList.find((id: string) => !progress.stages[id]) || stageList[stageList.length - 1] - const { stepList } = data.stages[stageId] - const stepId = stepList.find((id: string) => !progress.steps[id]) || stepList[stepList.length - 1] - - const nextPosition: CR.Position = { - levelId, - stageId, - stepId, - } - - return nextPosition -} - -export default (dispatch: CR.EditorDispatch) => ({ - createWebview() { - dispatch('coderoad.open_webview') - }, - async newOrContinue() { - // verify that the user has a tutorial & progress - // verify git is setup with a coderoad remote - const [tutorial, progress, hasGit, hasGitRemote] = await Promise.all([ - storage.getTutorial(), - storage.getProgress(), - git.gitVersion(), - git.gitCheckRemoteExists(), - ]) - const canContinue = !!(tutorial && progress && hasGit && hasGitRemote) - - if (canContinue) { - // continue - currentTutorial = tutorial - currentProgress = progress - } - - machine.send(canContinue ? 'CONTINUE' : 'NEW') - }, - async tutorialLaunch() { - // TODO: add selection of tutorial id - const tutorial: CR.Tutorial = await api({ resource: 'getTutorial', params: { id: '1' } }) - currentTutorial = tutorial - console.log('api') - console.log(tutorial) - dispatch('coderoad.tutorial_launch', { tutorial, dispatch }) - }, - tutorialSetup() { - dispatch('coderoad.tutorial_setup', currentTutorial) - }, - initializeNewTutorial: assign({ - position: (context: any): CR.Position => { - const { data } = context - const levelId = data.summary.levelList[0] - const stageId = data.levels[levelId].stageList[0] - const stepId = data.stages[stageId].stepList[0] - return { - levelId, - stageId, - stepId, - } - }, - }), - tutorialContinue: assign({ - // load initial data, progress & position - data(): CR.TutorialData { - console.log('ACTION: tutorialLoad.data') - if (!currentTutorial) { - throw new Error('No Tutorial loaded') - } - return currentTutorial.data - }, - progress(): CR.Progress { - console.log('ACTION: tutorialLoad.progress') - return currentProgress - }, - position(context: any): CR.Position { - console.log('ACTION: tutorialLoad.position') - if (!currentTutorial) { - throw new Error('No Tutorial loaded') - } - const { data } = currentTutorial - const position = calculatePosition({ data, progress: currentProgress }) - - console.log('position', position) - return position - }, - }), - testStart() { - dispatch('coderoad.run_test') - }, - testPass(context: CR.MachineContext): void { - dispatch('coderoad.test_pass') - git.gitSaveCommit(context.position) - }, - testFail() { - dispatch('coderoad.test_fail') - }, - // @ts-ignore - progressUpdate: assign({ - progress: (context: CR.MachineContext): CR.Progress => { - console.log('progress update') - const { progress, position, data } = context - const nextProgress = progress - - nextProgress.steps[position.stepId] = true - const { stepList } = data.stages[position.stageId] - const stageComplete = stepList[stepList.length - 1] === position.stepId - if (stageComplete) { - nextProgress.stages[position.stageId] = true - const { stageList } = data.levels[position.levelId] - const levelComplete = stageList[stageList.length - 1] === position.stageId - if (levelComplete) { - nextProgress.levels[position.levelId] = true - const { levelList } = data.summary - const tutorialComplete = levelList[levelList.length - 1] === position.levelId - if (tutorialComplete) { - nextProgress.complete = true - } - } - } - console.log('progress update', nextProgress) - storage.setProgress(nextProgress) - return nextProgress - }, - }), - stepLoadNext: assign({ - position: (context: any): CR.Position => { - const { data, position } = context - const { stepList } = data.stages[position.stageId] - const currentStepIndex = stepList.indexOf(position.stepId) - - const nextStepId = currentStepIndex < stepList.length ? stepList[currentStepIndex + 1] : position.stepId - - const nextPosition = { - ...context.position, - stepId: nextStepId, - } - - return nextPosition - }, - }), - loadLevel(context: CR.MachineContext): void { - const { data, position } = context - console.log('loadLevel') - console.log(position) - const { levels } = data - const level = levels[position.levelId] - - // run level setup if it exists - if (level && level.actions && level.actions.setup) { - git.gitLoadCommits(level.actions.setup, dispatch) - } - }, - stageLoadNext(context: CR.MachineContext) { - console.log('stageLoadNext') - const { position } = context - console.log(position) - }, - loadStage(context: CR.MachineContext): void { - const { data, position } = context - console.log('loadStage') - console.log(position) - const { stages } = data - const stage = stages[position.levelId] - - // run level setup if it exists - if (stage && stage.actions && stage.actions.setup) { - git.gitLoadCommits(stage.actions.setup, dispatch) - } - }, - // @ts-ignore - updatePosition: assign({ - position: (context: CR.MachineContext) => calculatePosition({ - data: context.data, - progress: context.progress, - }), - }), - stepLoadCommits(context: CR.MachineContext): void { - const { data, position } = context - const { setup } = data.steps[position.stepId].actions - git.gitLoadCommits(setup, dispatch) - }, -}) diff --git a/src/state/context/index.ts b/src/state/context/index.ts deleted file mode 100644 index 054f719f..00000000 --- a/src/state/context/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import basicTutorialData from '../../tutorials/basic' -import * as CR from 'typings' - -const tutorialContext: CR.MachineContext = { - position: { - levelId: '', - stageId: '', - stepId: '', - }, - progress: { - levels: {}, - stages: {}, - steps: {}, - complete: false, - }, - // TODO: load tutorial instead of preloading demo - data: basicTutorialData.data, -} - -export default tutorialContext diff --git a/src/state/guards/index.ts b/src/state/guards/index.ts deleted file mode 100644 index ffd9415e..00000000 --- a/src/state/guards/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as CR from 'typings' - -export default { - hasNextStep: (context: CR.MachineContext): boolean => { - const { data, position, progress } = context - const steps = data.stages[position.stageId].stepList - const stageIncomplete = !progress.stages[position.stageId] - const isNotFinalStep = (!!position.stepId && (steps[steps.length - 1] !== position.stepId)) - const hasNext = stageIncomplete || isNotFinalStep - console.log('GUARD: hasNextStep', hasNext) - return hasNext - }, - hasNextStage: (context: CR.MachineContext): boolean => { - const { data, position, progress } = context - const stages = data.levels[position.levelId].stageList - const stageComplete = progress.stages[position.stageId] - const isNotFinalStage = !!position.stageId && stages[stages.length - 1] !== position.stageId - const hasNext = stageComplete && isNotFinalStage - console.log('GUARD: hasNextStage', hasNext) - return hasNext - }, - hasNextLevel: (context: CR.MachineContext): boolean => { - const { data, position, progress } = context - const levels = data.summary.levelList - const levelComplete = progress.levels[position.levelId] - const isNotFinalLevel = !!position.levelId && levels[levels.length - 1] !== position.levelId - const hasNext = levelComplete && isNotFinalLevel - console.log('GUARD: hasNextLevel', hasNext) - return hasNext - }, -} diff --git a/src/state/index.ts b/src/state/index.ts deleted file mode 100644 index 0e37cf00..00000000 --- a/src/state/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { interpret, Interpreter } from 'xstate' -import * as CR from 'typings' -import createMachine from './machine' - -// machine interpreter -// https://xstate.js.org/docs/guides/interpretation.html - -// convert state into a readable string -const stateToString = (state: string | object, str: string = ''): string => { - if (typeof state === 'object') { - const keys = Object.keys(state) - if (keys && keys.length) { - const key = keys[0] - return stateToString(state[key], str.length ? `${str}.${key}` : key) - } - return str - } else if (typeof state === 'string') { - return state - } - return '' -} - -interface Props { - dispatch: CR.EditorDispatch -} - -class StateMachine { - private dispatch: CR.EditorDispatch - private machineOptions = { - devTools: true, - deferEvents: true, - execute: true, - } - private service: Interpreter - constructor({ dispatch }: Props) { - this.dispatch = dispatch - const machine = createMachine(dispatch) - this.service = interpret(machine, this.machineOptions) - // logging - .onTransition(state => { - if (state.changed) { - console.log(`STATE: ${stateToString(state.value)}`) - dispatch('coderoad.send_state', { state: state.value, data: state.context }) - } else { - dispatch('coderoad.send_data', { data: state.context }) - } - }) - } - public activate() { - // initialize - this.service.start() - } - public deactivate() { - this.service.stop() - } - public refresh() { - console.log('service refresh') - console.log(this.service.state) - const { value, context } = this.service.state - this.dispatch('coderoad.send_state', { state: value, data: context }) - } - public send(action: string | CR.Action) { - this.service.send(action) - } -} - -export default StateMachine diff --git a/src/state/machine.ts b/src/state/machine.ts deleted file mode 100644 index e8f3a0a8..00000000 --- a/src/state/machine.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { Machine } from 'xstate' -import * as CR from 'typings' - -import createActions from './actions' -import guards from './guards' -import initialContext from './context' - -export const machine = (dispatch: CR.EditorDispatch) => - Machine( - { - id: 'root', - context: initialContext, - initial: 'SelectTutorial', - states: { - SelectTutorial: { - onEntry: ['createWebview'], - initial: 'Initial', - states: { - Initial: { - on: { - WEBVIEW_INITIALIZED: 'Startup', - }, - }, - Startup: { - onEntry: ['newOrContinue'], - on: { - CONTINUE: 'ContinueTutorial', - NEW: 'NewTutorial', - }, - }, - NewTutorial: { - initial: 'SelectTutorial', - states: { - SelectTutorial: { - on: { - TUTORIAL_START: 'InitializeTutorial', - }, - }, - InitializeTutorial: { - onEntry: ['tutorialLaunch'], - on: { - TUTORIAL_LOADED: '#tutorial', - }, - }, - }, - }, - ContinueTutorial: { - onEntry: ['tutorialContinue'], - on: { - TUTORIAL_START: '#tutorial-load-next', - }, - }, - }, - }, - Tutorial: { - id: 'tutorial', - initial: 'Initialize', - onEntry: ['tutorialSetup'], - on: { - WEBVIEW_INITIALIZED: '#tutorial-load-next' - }, - states: { - Initialize: { - onEntry: ['initializeNewTutorial'], - after: { - 0: 'Summary', - }, - }, - LoadNext: { - id: 'tutorial-load-next', - after: { - 0: [{ - target: 'Stage', - cond: 'hasNextStep', - }, - { - target: 'Stage', - cond: 'hasNextStage', - }, - { - target: 'Level', - cond: 'hasNextLevel', - }, - { - target: '#completed-tutorial', - }, - ], - }, - }, - - Summary: { - on: { - NEXT: 'Level', - }, - }, - Level: { - onEntry: ['loadLevel'], - on: { - NEXT: 'Stage', - BACK: 'Summary', - }, - }, - Stage: { - onEntry: ['loadStage', 'stepLoadCommits'], - initial: 'Normal', - states: { - Normal: { - on: { - TEST_RUN: 'TestRunning', - STEP_SOLUTION_LOAD: { - actions: ['callSolution'], - }, - }, - }, - TestRunning: { - onEntry: ['testStart'], - on: { - TEST_PASS: 'TestPass', - TEST_FAIL: 'TestFail', - }, - }, - TestPass: { - onEntry: ['testPass', 'progressUpdate'], - onExit: ['stepLoadNext'], - after: { - 1000: 'StepNext', - }, - }, - TestFail: { - onEntry: ['testFail'], - after: { - 0: 'Normal', - }, - }, - StepNext: { - after: { - 0: [ - { - target: 'Normal', - cond: 'hasNextStep', - actions: ['stepLoadCommits'], - }, - { - target: 'StageComplete', - }, - ], - }, - }, - StageComplete: { - on: { - STAGE_NEXT: { - target: '#tutorial-load-next', - actions: ['updatePosition'], - }, - }, - }, - }, - }, - Completed: { - id: 'completed-tutorial', - type: 'final', - }, - }, - }, - }, - }, - { - actions: createActions(dispatch), - guards, - activities: {}, - }, - ) - -export default machine diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts deleted file mode 100644 index 75db3826..00000000 --- a/src/test/extension.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -// -// Note: This example test is leveraging the Mocha test framework. -// Please refer to their documentation on https://mochajs.org/ for help. -// - -// The module 'assert' provides assertion methods from node -import * as assert from 'assert' - -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -// import * as vscode from 'vscode' -// import * as myExtension from '../extension' - -// Defines a Mocha test suite to group tests of similar kind together -suite('Extension Tests', function() { - // Defines a Mocha unit test - test('Something 1', function() { - assert.equal(-1, [1, 2, 3].indexOf(5)) - assert.equal(-1, [1, 2, 3].indexOf(0)) - }) -}) diff --git a/src/test/index.ts b/src/test/index.ts deleted file mode 100644 index 5ebcde50..00000000 --- a/src/test/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -// -// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING -// -// This file is providing the test runner to use when running extension tests. -// By default the test runner in use is Mocha based. -// -// You can provide your own test runner if you want to override it by exporting -// a function run(testsRoot: string, clb: (error: Error, failures?: number) => void): void -// that the extension host can call to run the tests. The test runner is expected to use console.log -// to report the results back to the caller. When the tests are finished, return -// a possible error to the callback or null if none. - -import * as testRunner from 'vscode/lib/testrunner' - -// You can directly control Mocha options by configuring the test runner below -// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options -// for more info -testRunner.configure({ - ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.) - useColors: true, // colored output from test results -}) - -module.exports = testRunner diff --git a/src/test/runTest.ts b/src/test/runTest.ts new file mode 100644 index 00000000..9f6cb22a --- /dev/null +++ b/src/test/runTest.ts @@ -0,0 +1,31 @@ +import * as path from 'path' + +import {runTests} from 'vscode-test' + +async function main() { + console.log('__dirname', __dirname) + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath: string = path.resolve(__dirname, '../../') + + // The path to the extension test script + // Passed to --extensionTestsPath + const extensionTestsPath: string = path.resolve(__dirname, './suite/index') + + const config = { + extensionDevelopmentPath, + extensionTestsPath, + launchArgs: ['--disable-extensions'] // turn off other extensions + } + + // Download VS Code, unzip it and run the integration test + await runTests(config) + .catch((err: Error) => { + console.error(err) + process.exit(1) + }) + + process.exit(0) +} + +main() \ No newline at end of file diff --git a/src/test/suite/extension.test.ts b/src/test/suite/extension.test.ts new file mode 100644 index 00000000..f40bee78 --- /dev/null +++ b/src/test/suite/extension.test.ts @@ -0,0 +1,25 @@ + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode' +import {before, after} from 'mocha' +import * as assert from 'assert' +// import * as myExtension from '../../extension' + +suite('Extension tests', () => { + before(() => { + vscode.window.showInformationMessage('Start all tests.') + }) + + test('Loads App', async () => { + await vscode.commands.executeCommand('coderoad.start') + await setTimeout(() => Promise.resolve(), 5000) + // const webview = vscode.window.activeTextEditor + // console.log(webview) + assert.equal(2, 2) + }) + + after(() => { + console.log('done') + }) +}) \ No newline at end of file diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts new file mode 100644 index 00000000..35a9b96e --- /dev/null +++ b/src/test/suite/index.ts @@ -0,0 +1,37 @@ +import * as path from 'path' +import * as Mocha from 'mocha' +import * as glob from 'glob' + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + }) + mocha.useColors(true) + + const testsRoot = path.resolve(__dirname, '..') + + return new Promise((c, e) => { + glob('**/**.test.js', {cwd: testsRoot}, (err, files) => { + if (err) { + return e(err) + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))) + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)) + } else { + c() + } + }) + } catch (err) { + e(err) + } + }) + }) +} \ No newline at end of file diff --git a/src/tutorials/basic.ts b/src/tutorials/basic.ts deleted file mode 100644 index e514cdc7..00000000 --- a/src/tutorials/basic.ts +++ /dev/null @@ -1,180 +0,0 @@ -import * as CR from 'typings' - -const basic: CR.Tutorial = { - id: '1', - meta: { - version: '0.1.0', - repo: 'https://github.com/ShMcK/coderoad-tutorial-basic.git', - createdBy: 'shmck', - createdAt: 'Sat, 11 May 2019 18:25:24 GMT', - updatedBy: 'shmck', - updatedAt: 'Sat, 11 May 2019 18:25:24 GMT', - contributors: ['shmck'], - languages: ['javascript'], - testRunner: 'jest', - }, - data: { - summary: { - title: 'Basic Test', - description: 'A basic coding skills example', - levelList: ['level1Id', 'level2Id'], - }, - levels: { - level1Id: { - stageList: ['stage1Id', 'stage2Id'], - content: { - title: 'Operators', - text: 'A description of this stage', - }, - actions: { - setup: { - commits: ['aab5f3d'], - commands: ['npm install'], - } - } - }, - level2Id: { - stageList: ['a'], - content: { - title: 'Logic', - text: 'Some basic logic in level 2' - } - } - }, - stages: { - stage1Id: { - stepList: ['step1Id', 'step2Id', 'step3Id'], - content: { - title: 'Sum Stage', - text: 'A description of this stage', - }, - }, - stage2Id: { - stepList: ['1', '2'], - content: { - title: 'Second Stage', - text: 'Going into round 2' - } - }, - a: { - stepList: ['a1', 'a2'], - content: { - title: 'Part 1', - text: 'Going into round 1' - } - }, - }, - steps: { - step1Id: { - content: { - title: 'Sum', - text: 'Write a function `add` that adds two numbers together', - }, - actions: { - setup: { - commits: ['8fa5ad5'], - files: ['src/sum.js'], - }, - solution: { - commits: ['abe3123'], - }, - }, - hints: [], - }, - step2Id: { - content: { - title: 'Multiply', - text: 'Write a function `multiply` that multiplies two numbers together', - }, - actions: { - setup: { - commits: ['0e01df8'], - files: ['src/multiply.js'], - }, - solution: { - commits: ['1b9a520'], - }, - }, - hints: [], - }, - step3Id: { - content: { - title: 'Divide', - text: 'Write a function `divide` that divides', - }, - actions: { - setup: { - commits: ['40802cf'], - files: ['src/divide.js'], - }, - solution: { - commits: ['b321a3d'], - }, - }, - hints: [], - }, - 1: { - content: { - title: 'Modulo', - text: 'Modulo `%` it up' - }, - actions: { - setup: { - commits: ['4db40b4'], - files: ['src/modulo.js'], - }, - solution: { - commits: ['3580c9d'] - } - } - }, - 2: { - content: { - title: 'Power', - text: 'Power up with `**` powers' - }, - actions: { - setup: { - commits: ['abc1e2d'], - files: ['src/power.js'], - }, - solution: { - commits: ['5d28c25'] - } - } - }, - a1: { - content: { - title: 'Hello', - text: 'Return the word "hello"' - }, - actions: { - setup: { - commits: ['2faa934'], - files: ['src/word.js'], - }, - solution: { - commits: ['29f6b0d'] - } - } - }, - a2: { - content: { - title: 'Bye', - text: 'Return the word "bye"' - }, - actions: { - setup: { - commits: ['b1894dd'], - files: ['src/word.js'], - }, - solution: { - commits: ['0e83af8'] - } - } - }, - }, - }, -} - -export default basic diff --git a/tsconfig.json b/tsconfig.json index be561d2d..e62adc7c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,9 +19,12 @@ "experimentalDecorators": true, "emitDecoratorMetadata": true, "paths": { - "typings": ["../typings/index.d.ts"] + "typings": ["../typings/index.d.ts"], + "typings/graphql": ["../typings/graphql.d.ts"], + "@api": ["services/api/index"], + "@gql/*": ["services/api/gql/*"] }, "allowJs": true }, - "exclude": ["node_modules", ".vscode-test", "build", "resources", "web-app"] + "exclude": ["node_modules", ".vscode-test", "build", "resources", "web-app", "*.js", "*.test.ts"] } diff --git a/tslint.json b/tslint.json index 702ed407..484ae6aa 100644 --- a/tslint.json +++ b/tslint.json @@ -13,11 +13,13 @@ "semicolon": [true, "never"], "triple-equals": true, "forin": false, - "no-console": false + "no-console": false, + "no-submodule-imports": false, + "no-object-literal-type-assertion": false }, "defaultSeverity": "warning", - "no-submodule-imports": false, + "linterOptions": { - "exclude": ["node_modules/**"] + "exclude": ["node_modules/**", "src/typings/graphql.d.ts"] } } diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts new file mode 100644 index 00000000..fc51b35f --- /dev/null +++ b/typings/graphql.d.ts @@ -0,0 +1,568 @@ +import {GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig} from 'graphql'; +export type Maybe = T | null; +export type RequireFields = {[X in Exclude]?: T[X]} & {[P in K]-?: NonNullable}; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string, + String: string, + Boolean: boolean, + Int: number, + Float: number, + /** + * A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the + * `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO + * 8601 standard for representation of dates and times using the Gregorian calendar. + **/ + DateTime: any, + /** Git commit hash */ + Commit: any, + /** The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */ + JSON: any, + /** The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */ + JSONObject: any, + /** The `Upload` scalar type represents a file upload. */ + Upload: any, +}; + + + +export enum CacheControlScope { + Public = 'PUBLIC', + Private = 'PRIVATE' +} + + +export type CreateTokenInput = { + accessToken: Scalars['String'], +}; + +export type CreateTokenOutput = { + __typename?: 'CreateTokenOutput', + token: Scalars['String'], +}; + + +export enum EnumCodingLanguage { + Javascript = 'JAVASCRIPT' +} + +export enum EnumTestRunner { + Jest = 'JEST' +} + +export type GithubUser = { + __typename?: 'GithubUser', + id: Scalars['ID'], + name?: Maybe, + email?: Maybe, + location?: Maybe, + avatarUrl?: Maybe, +}; + + + +export type Level = { + __typename?: 'Level', + id: Scalars['ID'], + title: Scalars['String'], + text: Scalars['String'], + stage?: Maybe, + stages: Array, + setup?: Maybe, + status: string +}; + + +export type LevelStageArgs = { + stageId: Scalars['ID'] +}; + +export type Mutation = { + __typename?: 'Mutation', + createToken?: Maybe, +}; + + +export type MutationCreateTokenArgs = { + input: CreateTokenInput +}; + +export type Query = { + __typename?: 'Query', + tutorial?: Maybe, + tutorials?: Maybe>>, + user?: Maybe, + level?: Maybe, + stage?: Maybe, + step?: Maybe, + stepActions?: Maybe, +}; + + +export type QueryTutorialArgs = { + id: Scalars['ID'] +}; + + +export type QueryLevelArgs = { + id: Scalars['ID'] +}; + + +export type QueryStageArgs = { + id: Scalars['ID'] +}; + + +export type QueryStepArgs = { + id: Scalars['ID'] +}; + + +export type QueryStepActionsArgs = { + id: Scalars['ID'] +}; + +export enum Role { + Admin = 'ADMIN', + User = 'USER' +} + +export type Stage = { + __typename?: 'Stage', + id: Scalars['ID'], + title: Scalars['String'], + text: Scalars['String'], + step?: Maybe, + steps: Array, + setup?: Maybe, + status: string +}; + + +export type StageStepArgs = { + stepId: Scalars['ID'] +}; + +export type Step = { + __typename?: 'Step', + id: Scalars['ID'], + title: Scalars['String'], + text: Scalars['String'], + setup: StepActions, + solution: StepActions, + status: string +}; + +export type StepActions = { + __typename?: 'StepActions', + id: Scalars['ID'], + commits: Array, + files: Array, + commands: Array, +}; + +export type Tutorial = { + __typename?: 'Tutorial', + id: Scalars['ID'], + repo: TutorialRepo, + createdBy: User, + createdAt: Scalars['DateTime'], + updatedBy: User, + updatedAt: Scalars['DateTime'], + codingLanguage: EnumCodingLanguage, + testRunner: EnumTestRunner, + title: Scalars['String'], + text: Scalars['String'], + releasedAt?: Maybe, + releasedBy?: Maybe, + version: TutorialVersion, + versions: Array, + completed: Scalars['Boolean'], +}; + + +export type TutorialVersionArgs = { + version?: Maybe +}; + +export type TutorialRepo = { + __typename?: 'TutorialRepo', + tutorialId: Scalars['ID'], + uri: Scalars['String'], + branch: Scalars['String'], + name: Scalars['String'], + owner: Scalars['String'], +}; + +export type TutorialVersion = { + __typename?: 'TutorialVersion', + tutorialId: Scalars['ID'], + version: Scalars['String'], + coderoadVersion: Scalars['String'], + createdAt: Scalars['DateTime'], + createdBy: User, + publishedAt?: Maybe, + publishedBy?: Maybe, + level?: Maybe, + levels: Array, + stage?: Maybe, + step?: Maybe, + completed: Scalars['Boolean'], +}; + + +export type TutorialVersionLevelArgs = { + levelId: Scalars['ID'] +}; + + +export type TutorialVersionStageArgs = { + stageId: Scalars['ID'] +}; + + +export type TutorialVersionStepArgs = { + stepId: Scalars['ID'] +}; + + +export type User = { + __typename?: 'User', + id: Scalars['ID'], + name?: Maybe, + email: Scalars['String'], + location?: Maybe, + avatarUrl?: Maybe, + createdAt: Scalars['DateTime'], + updatedAt: Scalars['DateTime'], + githubUser?: Maybe, +}; +export type TutorialSummaryFragment = ( + {__typename?: 'Tutorial'} + & Pick +); + + +export type ResolverTypeWrapper = Promise | T; + +export type ResolverFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => Promise | TResult; + + +export type StitchingResolver = { + fragment: string; + resolve: ResolverFn; +}; + +export type Resolver = + | ResolverFn + | StitchingResolver; + +export type SubscriptionSubscribeFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => AsyncIterator | Promise>; + +export type SubscriptionResolveFn = ( + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +export interface SubscriptionSubscriberObject { + subscribe: SubscriptionSubscribeFn<{[key in TKey]: TResult}, TParent, TContext, TArgs>; + resolve?: SubscriptionResolveFn; +} + +export interface SubscriptionResolverObject { + subscribe: SubscriptionSubscribeFn; + resolve: SubscriptionResolveFn; +} + +export type SubscriptionObject = + | SubscriptionSubscriberObject + | SubscriptionResolverObject; + +export type SubscriptionResolver = + | ((...args: any[]) => SubscriptionObject) + | SubscriptionObject; + +export type TypeResolveFn = ( + parent: TParent, + context: TContext, + info: GraphQLResolveInfo +) => Maybe; + +export type NextResolverFn = () => Promise; + +export type DirectiveResolverFn = ( + next: NextResolverFn, + parent: TParent, + args: TArgs, + context: TContext, + info: GraphQLResolveInfo +) => TResult | Promise; + +/** Mapping between all available schema types and the resolvers types */ +export type ResolversTypes = { + Query: ResolverTypeWrapper<{}>, + ID: ResolverTypeWrapper, + Tutorial: ResolverTypeWrapper, + TutorialRepo: ResolverTypeWrapper, + String: ResolverTypeWrapper, + User: ResolverTypeWrapper, + DateTime: ResolverTypeWrapper, + GithubUser: ResolverTypeWrapper, + EnumCodingLanguage: EnumCodingLanguage, + EnumTestRunner: EnumTestRunner, + TutorialVersion: ResolverTypeWrapper, + Level: ResolverTypeWrapper, + Stage: ResolverTypeWrapper, + Step: ResolverTypeWrapper, + StepActions: ResolverTypeWrapper, + Commit: ResolverTypeWrapper, + Boolean: ResolverTypeWrapper, + Mutation: ResolverTypeWrapper<{}>, + createTokenInput: CreateTokenInput, + CreateTokenOutput: ResolverTypeWrapper, + CacheControlScope: CacheControlScope, + JSON: ResolverTypeWrapper, + JSONObject: ResolverTypeWrapper, + Role: Role, + Upload: ResolverTypeWrapper, + Int: ResolverTypeWrapper, +}; + +/** Mapping between all available schema types and the resolvers parents */ +export type ResolversParentTypes = { + Query: {}, + ID: Scalars['ID'], + Tutorial: Tutorial, + TutorialRepo: TutorialRepo, + String: Scalars['String'], + User: User, + DateTime: Scalars['DateTime'], + GithubUser: GithubUser, + EnumCodingLanguage: EnumCodingLanguage, + EnumTestRunner: EnumTestRunner, + TutorialVersion: TutorialVersion, + Level: Level, + Stage: Stage, + Step: Step, + StepActions: StepActions, + Commit: Scalars['Commit'], + Boolean: Scalars['Boolean'], + Mutation: {}, + createTokenInput: CreateTokenInput, + CreateTokenOutput: CreateTokenOutput, + CacheControlScope: CacheControlScope, + JSON: Scalars['JSON'], + JSONObject: Scalars['JSONObject'], + Role: Role, + Upload: Scalars['Upload'], + Int: Scalars['Int'], +}; + +export type AuthDirectiveResolver>}> = DirectiveResolverFn; + +export type CacheControlDirectiveResolver>, + scope?: Maybe> +}> = DirectiveResolverFn; + +export interface CommitScalarConfig extends GraphQLScalarTypeConfig { + name: 'Commit' +} + +export type CreateTokenOutputResolvers = { + token?: Resolver, +}; + +export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig { + name: 'DateTime' +} + +export type GithubUserResolvers = { + id?: Resolver, + name?: Resolver, ParentType, ContextType>, + email?: Resolver, ParentType, ContextType>, + location?: Resolver, ParentType, ContextType>, + avatarUrl?: Resolver, ParentType, ContextType>, +}; + +export interface JsonScalarConfig extends GraphQLScalarTypeConfig { + name: 'JSON' +} + +export interface JsonObjectScalarConfig extends GraphQLScalarTypeConfig { + name: 'JSONObject' +} + +export type LevelResolvers = { + id?: Resolver, + title?: Resolver, + text?: Resolver, + stage?: Resolver, ParentType, ContextType, RequireFields>, + stages?: Resolver, ParentType, ContextType>, + setup?: Resolver, ParentType, ContextType>, +}; + +export type MutationResolvers = { + createToken?: Resolver, ParentType, ContextType, RequireFields>, +}; + +export type QueryResolvers = { + tutorial?: Resolver, ParentType, ContextType, RequireFields>, + tutorials?: Resolver>>, ParentType, ContextType>, + user?: Resolver, ParentType, ContextType>, + level?: Resolver, ParentType, ContextType, RequireFields>, + stage?: Resolver, ParentType, ContextType, RequireFields>, + step?: Resolver, ParentType, ContextType, RequireFields>, + stepActions?: Resolver, ParentType, ContextType, RequireFields>, +}; + +export type StageResolvers = { + id?: Resolver, + title?: Resolver, + text?: Resolver, + step?: Resolver, ParentType, ContextType, RequireFields>, + steps?: Resolver, ParentType, ContextType>, + setup?: Resolver, ParentType, ContextType>, +}; + +export type StepResolvers = { + id?: Resolver, + title?: Resolver, + text?: Resolver, + setup?: Resolver, + solution?: Resolver, +}; + +export type StepActionsResolvers = { + id?: Resolver, + commits?: Resolver, ParentType, ContextType>, + files?: Resolver, ParentType, ContextType>, + commands?: Resolver, ParentType, ContextType>, +}; + +export type TutorialResolvers = { + id?: Resolver, + repo?: Resolver, + createdBy?: Resolver, + createdAt?: Resolver, + updatedBy?: Resolver, + updatedAt?: Resolver, + codingLanguage?: Resolver, + testRunner?: Resolver, + title?: Resolver, + text?: Resolver, + releasedAt?: Resolver, ParentType, ContextType>, + releasedBy?: Resolver, ParentType, ContextType>, + version?: Resolver, + versions?: Resolver, ParentType, ContextType>, + completed?: Resolver, +}; + +export type TutorialRepoResolvers = { + tutorialId?: Resolver, + uri?: Resolver, + branch?: Resolver, + name?: Resolver, + owner?: Resolver, +}; + +export type TutorialVersionResolvers = { + tutorialId?: Resolver, + version?: Resolver, + coderoadVersion?: Resolver, + createdAt?: Resolver, + createdBy?: Resolver, + publishedAt?: Resolver, ParentType, ContextType>, + publishedBy?: Resolver, ParentType, ContextType>, + level?: Resolver, ParentType, ContextType, RequireFields>, + levels?: Resolver, ParentType, ContextType>, + stage?: Resolver, ParentType, ContextType, RequireFields>, + step?: Resolver, ParentType, ContextType, RequireFields>, + completed?: Resolver, +}; + +export interface UploadScalarConfig extends GraphQLScalarTypeConfig { + name: 'Upload' +} + +export type UserResolvers = { + id?: Resolver, + name?: Resolver, ParentType, ContextType>, + email?: Resolver, + location?: Resolver, ParentType, ContextType>, + avatarUrl?: Resolver, ParentType, ContextType>, + createdAt?: Resolver, + updatedAt?: Resolver, + githubUser?: Resolver, ParentType, ContextType>, +}; + +export type Resolvers = { + Commit?: GraphQLScalarType, + CreateTokenOutput?: CreateTokenOutputResolvers, + DateTime?: GraphQLScalarType, + GithubUser?: GithubUserResolvers, + JSON?: GraphQLScalarType, + JSONObject?: GraphQLScalarType, + Level?: LevelResolvers, + Mutation?: MutationResolvers, + Query?: QueryResolvers, + Stage?: StageResolvers, + Step?: StepResolvers, + StepActions?: StepActionsResolvers, + Tutorial?: TutorialResolvers, + TutorialRepo?: TutorialRepoResolvers, + TutorialVersion?: TutorialVersionResolvers, + Upload?: GraphQLScalarType, + User?: UserResolvers, +}; + + +/** + * @deprecated + * Use "Resolvers" root object instead. If you wish to get "IResolvers", add "typesPrefix: I" to your config. +*/ +export type IResolvers = Resolvers; +export type DirectiveResolvers = { + auth?: AuthDirectiveResolver, + cacheControl?: CacheControlDirectiveResolver, +}; + + +/** +* @deprecated +* Use "DirectiveResolvers" root object instead. If you wish to get "IDirectiveResolvers", add "typesPrefix: I" to your config. +*/ +export type IDirectiveResolvers = DirectiveResolvers; +export interface IntrospectionResultData { + __schema: { + types: { + kind: string; + name: string; + possibleTypes: { + name: string; + }[]; + }[]; + }; +} + +// @ts-ignore +const result: IntrospectionResultData = { + __schema: { + types: [] + } +}; + +export default result; diff --git a/typings/index.d.ts b/typings/index.d.ts index f42a963c..f90eb917 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,181 +1,178 @@ -import { send } from 'xstate' +import {send} from 'xstate' +import * as G from './graphql' export interface TutorialLevel { - stageList: string[] - content: { - title: string - text: string - } - actions?: { - setup: TutorialAction - } + stageList: string[] + content: { + title: string + text: string + } + actions?: { + setup: TutorialAction + } } export interface TutorialStage { - stepList: string[] - content: { - title: string - text: string - } - actions?: { - setup: TutorialAction - } + stepList: string[] + content: { + title: string + text: string + } + actions?: { + setup: TutorialAction + } } export interface TutorialHint { - text: string - displayed?: boolean + text: string + displayed?: boolean } export interface TutorialAction { - commits: string[] - commands?: string[] - files?: string[] + commits: string[] + commands?: string[] + files?: string[] } export interface TutorialStepContent { - text: string - title?: string + text: string + title?: string } export interface TutorialStep { - content: TutorialStepContent - actions: { - setup: TutorialAction - solution: TutorialAction - } - hints?: TutorialHint[] + content: TutorialStepContent + actions: { + setup: TutorialAction + solution: TutorialAction + } + hints?: TutorialHint[] } export interface TutorialData { - summary: TutorialSummary - levels: { - [levelId: string]: TutorialLevel - } - stages: { - [stageId: string]: TutorialStage - } - steps: { - [stepId: string]: TutorialStep - } + summary: TutorialSummary + levels: { + [levelId: string]: TutorialLevel + } + stages: { + [stageId: string]: TutorialStage + } + steps: { + [stepId: string]: TutorialStep + } } export interface TutorialMeta { - version: string - repo: string - createdBy: string - createdAt: string - updatedBy: string - updatedAt: string - contributors: string[] - languages: string[] - testRunner: string + version: string + repo: string + createdBy: string + createdAt: string + updatedBy: string + updatedAt: string + contributors: string[] + languages: string[] + testRunner: string } export interface TutorialSummary { - title: string - description: string - levelList: string[] + title: string + description: string + levelList: string[] } export interface Tutorial { - id: string - meta: TutorialMeta - data: TutorialData + id: string + meta: TutorialMeta + data: TutorialData } export interface Progress { - levels: { - [levelId: string]: boolean - } - stages: { - [stageId: string]: boolean - } - steps: { - [stepId: string]: boolean - } - complete: boolean + levels: { + [levelId: string]: boolean + } + stages: { + [stageId: string]: boolean + } + steps: { + [stepId: string]: boolean + } + complete: boolean } // current tutorial position export interface Position { - levelId: string - stageId: string - stepId: string - complete?: boolean + levelId: string + stageId: string + stepId: string + complete?: boolean } // current tutorial state export interface Action { - type: string - payload?: any - meta?: any + type: string + payload?: any + meta?: any } export interface MachineContext { - position: Position - data: { - summary: TutorialSummary - levels: { - [levelId: string]: TutorialLevel - } - stages: { - [stageId: string]: TutorialStage - } - steps: { - [stepId: string]: TutorialStep - } - } - progress: Progress + tutorial: G.Tutorial | null, + position: Position, + progress: Progress, } export interface MachineEvent { - type: string - payload?: any + type: string + payload?: any + data?: any } export interface MachineStateSchema { - states: { - SelectTutorial: { - states: { - Initial: {} - Startup: {} - NewTutorial: { - states: { - SelectTutorial: {} - InitializeTutorial: {} - } - } - ContinueTutorial: {} - } - } - Tutorial: { - states: { - Initialize: {} - Summary: {} - LoadNext: {} - Level: {} - Stage: { - states: { - Normal: {} - TestRunning: {} - TestPass: {} - TestFail: {} - StepNext: {} - StageComplete: {} - } - } - Completed: {} - } - } - } + states: { + Start: { + states: { + Startup: {} + SelectTutorial: {} + ContinueTutorial: {} + } + } + Tutorial: { + states: { + Initialize: {} + Summary: {} + LoadNext: {} + Level: {} + Stage: { + states: { + Normal: {} + TestRunning: {} + TestPass: {} + TestFail: {} + StepNext: {} + StageComplete: {} + } + } + Completed: {} + } + } + } } export interface StateMachine { - activate(): void - deactivate(): void - send(action: string | Action): void + activate(): void + deactivate(): void + send(action: string | Action): void } -export type EditorDispatch = (type: string, payload?: any) => void +interface MessageData { + tutorial?: {id: string} + position: Position + progress: Progress +} + +interface MessageState { + state: string +} + + +// todo: type each string param and payload +export type EditorDispatch = (type: string, payload?: MessageData | MessageState | any) => void diff --git a/web-app/.env b/web-app/.env deleted file mode 100644 index ed7b099e..00000000 --- a/web-app/.env +++ /dev/null @@ -1 +0,0 @@ -PUBLIC_URL=./ \ No newline at end of file diff --git a/web-app/.storybook/webpack.config.js b/web-app/.storybook/webpack.config.js index c1b26045..b81e78c1 100644 --- a/web-app/.storybook/webpack.config.js +++ b/web-app/.storybook/webpack.config.js @@ -16,5 +16,8 @@ module.exports = ({ config }) => { }, }) config.resolve.extensions.push('.ts', '.tsx') + + config.resolve.modules = ['node_modules', path.resolve(__dirname, '../src')] + return config } diff --git a/web-app/package-lock.json b/web-app/package-lock.json index 4dac4fd7..661381c4 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@alifd/next": { - "version": "1.16.6", - "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.16.6.tgz", - "integrity": "sha512-hGK0qlVp46hgRWZJeIvWF/Lkc8mAAHswbBdDxEyMjMaXtLBH6uZsO6/RvORP4VHM+1bE3qIUU58PeSuhVAkGVA==", + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.17.10.tgz", + "integrity": "sha512-+8mTQ8YUHAIB62B4EK9v5TMxPepBO/6uvto/RyWS9Yr42wHxCKW5L3ZWF04H4n9AAdvDUFap+pKrnMDBYweCxg==", "requires": { "babel-runtime": "^6.26.0", "classnames": "^2.2.3", @@ -25,6 +25,40 @@ } } }, + "@apollo/react-common": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@apollo/react-common/-/react-common-3.1.0.tgz", + "integrity": "sha512-X8IfSZyvV8oHPJ46163Am4e81Kjl4BbojpYaYEpQtpGFHIA7cZ+MvuG4M6OJNh+SZArTfnwcPvJaCtkY8n3apA==", + "requires": { + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } + } + }, + "@apollo/react-hooks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.1.0.tgz", + "integrity": "sha512-tbVIAQMemeM6FaMFA7JCV+7hfJzPJSl/r7QAaFc5i8fWmdXZPYzZCeFOI7DdsWyAoLQS+RY14mDH9Ufacaulnw==", + "requires": { + "@apollo/react-common": "^3.1.0", + "@wry/equality": "^0.1.9", + "ts-invariant": "^0.4.4", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + } + } + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -166,6 +200,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", + "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", "@babel/helper-member-expression-to-functions": "^7.0.0", @@ -325,6 +360,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "dev": true, "requires": { "@babel/template": "^7.4.4", "@babel/traverse": "^7.4.4", @@ -360,6 +396,7 @@ "version": "7.4.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz", "integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==", + "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.4.0", "@babel/helper-plugin-utils": "^7.0.0" @@ -369,12 +406,22 @@ "version": "7.4.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz", "integrity": "sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==", + "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.4.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-decorators": "^7.2.0" } }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", + "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, "@babel/plugin-proposal-json-strings": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", @@ -581,6 +628,7 @@ "version": "7.4.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz", "integrity": "sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-flow": "^7.2.0" @@ -764,6 +812,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz", "integrity": "sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg==", + "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -774,7 +823,8 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -1066,9 +1116,9 @@ } }, "@emotion/core": { - "version": "10.0.15", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.15.tgz", - "integrity": "sha512-VHwwl3k/ddMfQOHYgOJryXOs2rGJ5AfKLQGm5AVolNonnr6tkmDI4nzIMNaPpveoXVs7sP0OrF24UunIPxveQw==", + "version": "10.0.16", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.16.tgz", + "integrity": "sha512-whbiiA7FfPreBY4BqWky2qRfAZvq+4dKQ1WNJuiYQwPCNmb0pEYDgNheSbZoNKtGTtfPaM28hBbZAKWD5EZXmQ==", "dev": true, "requires": { "@babel/runtime": "^7.4.3", @@ -1181,27 +1231,33 @@ "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, "@hapi/hoek": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", - "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==" + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.2.1.tgz", + "integrity": "sha512-JPiBy+oSmsq3St7XlipfN5pNA6bDJ1kpa73PrK/zR29CVClDVqy04AanM/M/qx5bSF+I61DdCfAvRrujau+zRg==" }, "@hapi/joi": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.0.3.tgz", - "integrity": "sha512-z6CesJ2YBwgVCi+ci8SI8zixoj8bGFn/vZb9MBPbSyoxsS2PnWYjHcyTM17VLK6tx64YVK38SDIh10hJypB+ig==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", "requires": { "@hapi/address": "2.x.x", - "@hapi/hoek": "6.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", "@hapi/topo": "3.x.x" } }, "@hapi/topo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.0.tgz", - "integrity": "sha512-gZDI/eXOIk8kP2PkUKjWu9RW8GGVd2Hkgjxyr/S7Z+JF+0mr7bAlbw+DkTRxnD580o8Kqxlnba9wvqp5aOHBww==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.3.tgz", + "integrity": "sha512-JmS9/vQK6dcUYn7wc2YZTqzIKubAQcJKu2KCKAru6es482U5RT5fP1EXCPtlXpiK7PR0On/kpQKI4fRKkzpZBQ==", "requires": { - "@hapi/hoek": "6.x.x" + "@hapi/hoek": "8.x.x" } }, "@icons/material": { @@ -1211,46 +1267,47 @@ "dev": true }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "requires": { - "@jest/source-map": "^24.3.0", + "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "requires": { "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", "micromatch": "^3.1.10", "p-each-series": "^1.0.0", - "pirates": "^4.0.1", "realpath-native": "^1.1.0", "rimraf": "^2.5.4", + "slash": "^2.0.0", "strip-ansi": "^5.0.0" }, "dependencies": { @@ -1259,6 +1316,18 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -1270,35 +1339,35 @@ } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", - "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.2", @@ -1306,24 +1375,24 @@ "istanbul-lib-instrument": "^3.0.1", "istanbul-lib-report": "^2.0.4", "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", + "node-notifier": "^5.4.2", "slash": "^2.0.0", "source-map": "^0.6.0", "string-length": "^2.0.0" }, "dependencies": { "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -1338,9 +1407,9 @@ } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.1.15", @@ -1360,42 +1429,43 @@ } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -1410,13 +1480,13 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/yargs": "^13.0.0" } }, "@mrmlnc/readdir-enhanced": { @@ -1447,16 +1517,16 @@ } }, "@storybook/addon-actions": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-5.1.10.tgz", - "integrity": "sha512-njl2AHBGi27NvisOB8LFnWH/3RcyJT/CW7tl1cvV2j5FH2oBjq5MsjxKyJIcKwC677k1Wr8G8fw/zSEHrPpmgA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-5.1.11.tgz", + "integrity": "sha512-Fp4b8cBYrl9zudvamVYTxE1XK2tzg91hgBDoVxIbDvSMZ2aQXSq8B5OFS4eSdvg+ldEOBbvIgUNS1NIw+FGntQ==", "dev": true, "requires": { - "@storybook/addons": "5.1.10", - "@storybook/api": "5.1.10", - "@storybook/components": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/theming": "5.1.10", + "@storybook/addons": "5.1.11", + "@storybook/api": "5.1.11", + "@storybook/components": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/theming": "5.1.11", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -1469,16 +1539,16 @@ } }, "@storybook/addon-knobs": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-5.1.10.tgz", - "integrity": "sha512-j5wXBIPGQxK+guFDAi8xNBdUnyQglhDplVoC9SswkSMarqtWq02TT+OLN2VSBgpvzHmhLUW3autjJGfmwP4ltQ==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-5.1.11.tgz", + "integrity": "sha512-16GY8IPxVBcmq5TqPtP6254Qw5FvdefDZjIQd+ByJJliQjXZMQKxEl6JhRq98iUfSxEB+6JCPnpKPa666jmCMA==", "dev": true, "requires": { - "@storybook/addons": "5.1.10", - "@storybook/client-api": "5.1.10", - "@storybook/components": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/theming": "5.1.10", + "@storybook/addons": "5.1.11", + "@storybook/client-api": "5.1.11", + "@storybook/components": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/theming": "5.1.11", "copy-to-clipboard": "^3.0.8", "core-js": "^3.0.1", "escape-html": "^1.0.3", @@ -1501,14 +1571,14 @@ } }, "@storybook/addon-links": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-5.1.10.tgz", - "integrity": "sha512-LDDcIU4ae76063baWuoi7dWI8YeSCq595siUlxM+aNydxHsIdQhi7vH1GRJL1oqCvvYLykdopcjKofO5EiTVdw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-5.1.11.tgz", + "integrity": "sha512-NV4gRduMNm0dchKCWAZ4YQSYOdj5acoztGIz3w+xs9e+MAXOHXs7iL8sBbqAFlfz4elPGHWW+8NGn9UYxQFK+Q==", "dev": true, "requires": { - "@storybook/addons": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/router": "5.1.10", + "@storybook/addons": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/router": "5.1.11", "common-tags": "^1.8.0", "core-js": "^3.0.1", "global": "^4.3.2", @@ -1525,30 +1595,30 @@ } }, "@storybook/addons": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.1.10.tgz", - "integrity": "sha512-M9b2PCp9RZxDC6wL7vVt2SCKCGXrrEAOsdpMvU569yB1zoUPEiiqElVDwb91O2eAGPnmd2yjImp90kOpKUW0EA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.1.11.tgz", + "integrity": "sha512-714Xg6pX4rjDY1urL94w4oOxIiK6jCFSp4oKvqLj7dli5CG7d34Yt9joyTgOb2pkbrgmbMWAZJq0L0iOjHzpzw==", "dev": true, "requires": { - "@storybook/api": "5.1.10", - "@storybook/channels": "5.1.10", - "@storybook/client-logger": "5.1.10", + "@storybook/api": "5.1.11", + "@storybook/channels": "5.1.11", + "@storybook/client-logger": "5.1.11", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" } }, "@storybook/api": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.1.10.tgz", - "integrity": "sha512-YeZe/71zLMmgT95IMAEZOc9AwL6Y23mWvkZMwFbkokxS9+bU/qmVlQ0B9c3JBzO3OSs7sXaRqyP1o3QkQgVsiw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.1.11.tgz", + "integrity": "sha512-zzPZM6W67D4YKCbUN4RhC/w+/CtnH/hFbSh/QUBdwXFB1aLh2qA1UTyB8i6m6OA6JgVHBqEkl10KhmeILLv/eA==", "dev": true, "requires": { - "@storybook/channels": "5.1.10", - "@storybook/client-logger": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/router": "5.1.10", - "@storybook/theming": "5.1.10", + "@storybook/channels": "5.1.11", + "@storybook/client-logger": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/router": "5.1.11", + "@storybook/theming": "5.1.11", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", @@ -1564,37 +1634,37 @@ } }, "@storybook/channel-postmessage": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.1.10.tgz", - "integrity": "sha512-kQZIwltN2cWDXluhCfdModFDK1LHV9ZhNQ1b/uD9vn1c65rQ9u7r4lRajCfS0X1dmAWqz48cBcEurAubNgmswg==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.1.11.tgz", + "integrity": "sha512-S7Uq7+c9kOJ9BB4H9Uro2+dVhqoMchYCipQzAkD4jIIwK99RNzGdAaRipDC1k0k/C+v2SOa+D5xBbb3XVYPSrg==", "dev": true, "requires": { - "@storybook/channels": "5.1.10", - "@storybook/client-logger": "5.1.10", + "@storybook/channels": "5.1.11", + "@storybook/client-logger": "5.1.11", "core-js": "^3.0.1", "global": "^4.3.2", "telejson": "^2.2.1" } }, "@storybook/channels": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.1.10.tgz", - "integrity": "sha512-w7n/bV1BLu51KI1eLc75lN9H1ssBc3PZMXk88GkMiKyBVRzPlJA5ixnzH86qwYGReE0dhRpsgHXZ5XmoKaVmPA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.1.11.tgz", + "integrity": "sha512-MlrjVGNvYOnDvv2JDRhr4wikbnZ8HCFCpVsFqKPFxj7I3OYBR417RvFkydX3Rtx4kwB9rmZEgLhfAfsSytkALg==", "dev": true, "requires": { "core-js": "^3.0.1" } }, "@storybook/client-api": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.1.10.tgz", - "integrity": "sha512-v2PqiNUhwDlVDLYL94f6LFjdYMToTpuwWh9aeqzt/4PAJUnIcA+2P8+qXiYdJTqQy/u7P72HFMlc9Ru4tl3QFg==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.1.11.tgz", + "integrity": "sha512-znzSxZ1ZCqtEKrFoW7xT8iBbdiAXaQ8RNxQFKHuYPqWX+RLol6S3duEOxu491X2SzUg0StUmrX5qL9Rnth8dRQ==", "dev": true, "requires": { - "@storybook/addons": "5.1.10", - "@storybook/client-logger": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/router": "5.1.10", + "@storybook/addons": "5.1.11", + "@storybook/client-logger": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/router": "5.1.11", "common-tags": "^1.8.0", "core-js": "^3.0.1", "eventemitter3": "^3.1.0", @@ -1629,22 +1699,22 @@ } }, "@storybook/client-logger": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.10.tgz", - "integrity": "sha512-vB1NoFWRTgcERwodhbgoDwI00eqU8++nXI7GhMS1CY8haZaSp3gyKfHRWyfH+M+YjQuGBRUcvIk4gK6OtSrDOw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.1.11.tgz", + "integrity": "sha512-je4To+9zD3SEJsKe9R4u15N4bdXFBR7pdBToaRIur+XSvvShLFehZGseQi+4uPAj8vyG34quGTCeUC/BKY0LwQ==", "dev": true, "requires": { "core-js": "^3.0.1" } }, "@storybook/components": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.1.10.tgz", - "integrity": "sha512-QUQeeQp1xNWiL4VlxFAea0kqn2zvBfmfPlUddOFO9lBhT6pVy0xYPjXjbTVWjVcYzZpyUNWw5GplqrR5jhlaCA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.1.11.tgz", + "integrity": "sha512-EQgD7HL2CWnnY968KrwUSU2dtKFGTGRJVc4vwphYEeZwAI0lX6qbTMuwEP22hDZ2OSRBxcvcXT8cvduDlZlFng==", "dev": true, "requires": { - "@storybook/client-logger": "5.1.10", - "@storybook/theming": "5.1.10", + "@storybook/client-logger": "5.1.11", + "@storybook/theming": "5.1.11", "core-js": "^3.0.1", "global": "^4.3.2", "markdown-to-jsx": "^6.9.1", @@ -1664,9 +1734,9 @@ } }, "@storybook/core": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.1.10.tgz", - "integrity": "sha512-zkNjufOFrLpFpmr73F/gaJh0W0vWqXIo5zrKvQt1LqmMeCU/v8MstHi4XidlK43UpeogfaXl5tjNCQDO/bd0Dw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.1.11.tgz", + "integrity": "sha512-LkSoAJlLEtrzFcoINX3dz4oT6xUPEHEp2/WAXLqUFeCnzJHAxIsRvbVxB49Kh/2TrgDFZpL9Or8XXMzZtE6KYw==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.3.3", @@ -1674,15 +1744,15 @@ "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-env": "^7.4.5", - "@storybook/addons": "5.1.10", - "@storybook/channel-postmessage": "5.1.10", - "@storybook/client-api": "5.1.10", - "@storybook/client-logger": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/node-logger": "5.1.10", - "@storybook/router": "5.1.10", - "@storybook/theming": "5.1.10", - "@storybook/ui": "5.1.10", + "@storybook/addons": "5.1.11", + "@storybook/channel-postmessage": "5.1.11", + "@storybook/client-api": "5.1.11", + "@storybook/client-logger": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/node-logger": "5.1.11", + "@storybook/router": "5.1.11", + "@storybook/theming": "5.1.11", + "@storybook/ui": "5.1.11", "airbnb-js-shims": "^1 || ^2", "autoprefixer": "^9.4.9", "babel-plugin-add-react-displayname": "^0.0.5", @@ -1730,6 +1800,7 @@ "shelljs": "^0.8.3", "style-loader": "^0.23.1", "terser-webpack-plugin": "^1.2.4", + "unfetch": "^4.1.0", "url-loader": "^1.1.2", "util-deprecate": "^1.0.2", "webpack": "^4.33.0", @@ -1738,9 +1809,9 @@ }, "dependencies": { "acorn": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", - "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true }, "ajv": { @@ -1836,9 +1907,9 @@ } }, "graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "locate-path": { @@ -2079,9 +2150,9 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -2093,9 +2164,9 @@ "dev": true }, "webpack": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", - "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==", + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -2136,18 +2207,18 @@ } }, "@storybook/core-events": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.1.10.tgz", - "integrity": "sha512-Lvu/rNcgS+XCkQKSGdNpUSWjpFF9AOSHPXsvkwHbRwJYdMDn3FznlXfDUiubOWtsziXHB6vl3wkKDlH+ckb32Q==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.1.11.tgz", + "integrity": "sha512-m+yIFRdB47+IPBFBGS2OUXrSLkoz5iAXvb3c0lGAePf5wSR+o/Ni/9VD5l6xBf+InxHLSc9gcDEJehrT0fJAaQ==", "dev": true, "requires": { "core-js": "^3.0.1" } }, "@storybook/node-logger": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.1.10.tgz", - "integrity": "sha512-Z4UKh7QBOboQhUF5S/dKOx3OWWCNZGwYu8HZa/O+P68+XnQDhuZCYwqWG49xFhZd0Jb0W9gdUL2mWJw5POG9PA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.1.11.tgz", + "integrity": "sha512-LG0KM4lzb9LEffcO3Ps9FcHHsVgQUc/oG+kz3p0u9fljFoL3cJHF1Mb4o+HrSydtdWZs/spwZ/BLEo5n/AByDw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -2166,16 +2237,16 @@ } }, "@storybook/react": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-5.1.10.tgz", - "integrity": "sha512-wWy9l83KgbP8P2A8AbkwExEAdA0iznb4jEnCGzP1hAv8Q5LmL3MLPb1dIZqhWrg+E2m3tZei+7A7qu2Q8/cLLw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-5.1.11.tgz", + "integrity": "sha512-y8/L2OWvev3fGREhAmToLVDPf8YEZMs5+vzSdzXlVlPkqHyAmWPtLY4sRB6K+TsEF0gwaC5F2BvMnKxbNYwd/Q==", "dev": true, "requires": { "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-flow": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@storybook/core": "5.1.10", - "@storybook/node-logger": "5.1.10", + "@storybook/core": "5.1.11", + "@storybook/node-logger": "5.1.11", "@svgr/webpack": "^4.0.3", "babel-plugin-add-react-displayname": "^0.0.5", "babel-plugin-named-asset-import": "^0.3.1", @@ -2194,9 +2265,9 @@ }, "dependencies": { "acorn": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", - "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true }, "ajv": { @@ -2366,9 +2437,9 @@ "dev": true }, "webpack": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", - "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==", + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -2411,9 +2482,9 @@ } }, "@storybook/router": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.1.10.tgz", - "integrity": "sha512-BdG6/essPZFHCP2ewCG0gYFQfmuuTSHXAB5fd/rwxLSYj1IzNznC5OxkvnSaTr4rgoxxaW/z1hbN1NuA0ivlFA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.1.11.tgz", + "integrity": "sha512-Xt7R1IOWLlIxis6VKV9G8F+e/G4G8ng1zXCqoDq+/RlWzlQJ5ccO4bUm2/XGS1rEgY4agMzmzjum18HoATpLGA==", "dev": true, "requires": { "@reach/router": "^1.2.1", @@ -2432,14 +2503,14 @@ } }, "@storybook/theming": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.1.10.tgz", - "integrity": "sha512-5cN1lmdVUwAR8U3T49Lfb8JW5RBvxBSPGZpUmbLGz1zi0tWBJgYXoGtw4RbTBjV9kCQOXkHGH12AsdDxHh931w==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.1.11.tgz", + "integrity": "sha512-PtRPfiAWx5pQbTm45yyPB+CuW/vyDmcmNOt+xnDzK52omeWaSD7XK2RfadN3u4QXCgha7zs35Ppx1htJio2NRA==", "dev": true, "requires": { "@emotion/core": "^10.0.9", "@emotion/styled": "^10.0.7", - "@storybook/client-logger": "5.1.10", + "@storybook/client-logger": "5.1.11", "common-tags": "^1.8.0", "core-js": "^3.0.1", "deep-object-diff": "^1.1.0", @@ -2460,19 +2531,19 @@ } }, "@storybook/ui": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.1.10.tgz", - "integrity": "sha512-ezkoVtzoKh93z2wzkqVIqyrIzTkj8tizgAkoPa7mUAbLCxu6LErHITODQoyEiJWI4Epy3yU9GYXFWwT71hdwsA==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.1.11.tgz", + "integrity": "sha512-mopuFSwtodvH4HRdaSBlgYxzYca1qyvzZ0BxOPocXhiFfFR+V9NyNJqKKRA3vinWuuZWpYcnPTu3h8skmjMirg==", "dev": true, "requires": { - "@storybook/addons": "5.1.10", - "@storybook/api": "5.1.10", - "@storybook/channels": "5.1.10", - "@storybook/client-logger": "5.1.10", - "@storybook/components": "5.1.10", - "@storybook/core-events": "5.1.10", - "@storybook/router": "5.1.10", - "@storybook/theming": "5.1.10", + "@storybook/addons": "5.1.11", + "@storybook/api": "5.1.11", + "@storybook/channels": "5.1.11", + "@storybook/client-logger": "5.1.11", + "@storybook/components": "5.1.11", + "@storybook/core-events": "5.1.11", + "@storybook/router": "5.1.11", + "@storybook/theming": "5.1.11", "copy-to-clipboard": "^3.0.8", "core-js": "^3.0.1", "core-js-pure": "^3.0.1", @@ -2538,7 +2609,8 @@ "@svgr/babel-plugin-svg-dynamic-title": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.0.tgz", - "integrity": "sha512-3eI17Pb3jlg3oqV4Tie069n1SelYKBUpI90txDcnBWk4EGFW+YQGyQjy6iuJAReH0RnpUJ9jUExrt/xniGvhqw==" + "integrity": "sha512-3eI17Pb3jlg3oqV4Tie069n1SelYKBUpI90txDcnBWk4EGFW+YQGyQjy6iuJAReH0RnpUJ9jUExrt/xniGvhqw==", + "dev": true }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "4.2.0", @@ -2559,6 +2631,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.0.tgz", "integrity": "sha512-Lgy1RJiZumGtv6yJroOxzFuL64kG/eIcivJQ7y9ljVWL+0QXvFz4ix1xMrmjMD+rpJWwj50ayCIcFelevG/XXg==", + "dev": true, "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", @@ -2574,6 +2647,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.0.tgz", "integrity": "sha512-Ycu1qrF5opBgKXI0eQg3ROzupalCZnSDETKCK/3MKN4/9IEmt3jPX/bbBjftklnRW+qqsCEpO0y/X9BTRw2WBg==", + "dev": true, "requires": { "@svgr/plugin-jsx": "^4.3.0", "camelcase": "^5.3.1", @@ -2584,6 +2658,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.2.0.tgz", "integrity": "sha512-IvAeb7gqrGB5TH9EGyBsPrMRH/QCzIuAkLySKvH2TLfLb2uqk98qtJamordRQTpHH3e6TORfBXoTo7L7Opo/Ow==", + "dev": true, "requires": { "@babel/types": "^7.4.0" } @@ -2592,6 +2667,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.0.tgz", "integrity": "sha512-0ab8zJdSOTqPfjZtl89cjq2IOmXXUYV3Fs7grLT9ur1Al3+x3DSp2+/obrYKUGbQUnLq96RMjSZ7Icd+13vwlQ==", + "dev": true, "requires": { "@babel/core": "^7.4.3", "@svgr/babel-preset": "^4.3.0", @@ -2605,6 +2681,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.2.0.tgz", "integrity": "sha512-zUEKgkT172YzHh3mb2B2q92xCnOAMVjRx+o0waZ1U50XqKLrVQ/8dDqTAtnmapdLsGurv8PSwenjLCUpj6hcvw==", + "dev": true, "requires": { "cosmiconfig": "^5.2.0", "merge-deep": "^3.0.2", @@ -2615,6 +2692,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", + "dev": true, "requires": { "@babel/core": "^7.1.6", "@babel/plugin-transform-react-constant-elements": "^7.0.0", @@ -2656,13 +2734,18 @@ } }, "@types/babel__traverse": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", - "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "requires": { "@babel/types": "^7.3.0" } }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" + }, "@types/highlight.js": { "version": "9.12.3", "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz", @@ -2692,9 +2775,9 @@ } }, "@types/jest": { - "version": "24.0.17", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.17.tgz", - "integrity": "sha512-1cy3xkOAfSYn78dsBWy4M3h/QF/HeWPchNFDjysVtp3GHeTdSmtluNnELfCmfNRRHo0OWEcpf+NsEJQvwQfdqQ==", + "version": "24.0.18", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", + "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", "dev": true, "requires": { "@types/jest-diff": "*" @@ -2706,6 +2789,11 @@ "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", "dev": true }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" + }, "@types/linkify-it": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-2.1.0.tgz", @@ -2722,9 +2810,9 @@ } }, "@types/node": { - "version": "12.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==" + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.4.tgz", + "integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==" }, "@types/prop-types": { "version": "15.7.1", @@ -2737,10 +2825,19 @@ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, + "@types/ramda": { + "version": "0.26.21", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.26.21.tgz", + "integrity": "sha512-zMYtIZMceA6BvH+or6LmewLBgojbXg5+FGCwjO8K+Z+d/ZWxILmhhASXkehW0PqJL+V0QbyDeeAHix0dvEKXfQ==", + "dev": true, + "requires": { + "ts-toolbelt": "^3.8.4" + } + }, "@types/react": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.1.tgz", - "integrity": "sha512-jGM2x8F7m7/r+81N/BOaUKVwbC5Cdw6ExlWEUpr77XPwVeNvAppnPEnMMLMfxRDYL8FPEX8MHjwtD2NQMJ0yyQ==", + "version": "16.9.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.2.tgz", + "integrity": "sha512-jYP2LWwlh+FTqGd9v7ynUKZzjj98T8x7Yclz479QdRhHfuW9yQ+0jjnD31eXSXutmBpppj5PYNLYLRfnZJvcfg==", "dev": true, "requires": { "@types/prop-types": "*", @@ -2748,9 +2845,9 @@ } }, "@types/react-dom": { - "version": "16.8.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.5.tgz", - "integrity": "sha512-idCEjROZ2cqh29+trmTmZhsBAUNQuYrF92JHKzZ5+aiFM1mlSk3bb23CK7HhYuOY75Apgap5y2jTyHzaM2AJGA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.0.tgz", + "integrity": "sha512-OL2lk7LYGjxn4b0efW3Pvf2KBVP0y1v3wip1Bp7nA79NkOpElH98q3WdCEdDj93b2b0zaeBG9DvriuKjIK5xDA==", "dev": true, "requires": { "@types/react": "*" @@ -2774,12 +2871,14 @@ "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", + "dev": true }, "@types/vfile": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", + "dev": true, "requires": { "@types/node": "*", "@types/unist": "*", @@ -2790,6 +2889,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", + "dev": true, "requires": { "@types/node": "*", "@types/unist": "*" @@ -2802,35 +2902,60 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==" + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==" + }, + "@types/zen-observable": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz", + "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==" }, "@typescript-eslint/eslint-plugin": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz", - "integrity": "sha512-U224c29E2lo861TQZs6GSmyC0OYeRNg6bE9UVIiFBxN2MlA0nq2dCrgIVyyRbC05UOcrgf2Wk/CF2gGOPQKUSQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz", + "integrity": "sha512-WQHCozMnuNADiqMtsNzp96FNox5sOVpU8Xt4meaT4em8lOG1SrOv92/mUbEHQVh90sldKSfcOc/I0FOb/14G1g==", "requires": { - "@typescript-eslint/parser": "1.6.0", - "@typescript-eslint/typescript-estree": "1.6.0", - "requireindex": "^1.2.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "eslint-utils": "^1.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", "tsutils": "^3.7.0" } }, + "@typescript-eslint/experimental-utils": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", + "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "1.13.0", + "eslint-scope": "^4.0.0" + } + }, "@typescript-eslint/parser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.6.0.tgz", - "integrity": "sha512-VB9xmSbfafI+/kI4gUK3PfrkGmrJQfh0N4EScT1gZXSZyUxpsBirPL99EWZg9MmPG0pzq/gMtgkk7/rAHj4aQw==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.13.0.tgz", + "integrity": "sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ==", "requires": { - "@typescript-eslint/typescript-estree": "1.6.0", - "eslint-scope": "^4.0.0", + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "1.13.0", + "@typescript-eslint/typescript-estree": "1.13.0", "eslint-visitor-keys": "^1.0.0" } }, "@typescript-eslint/typescript-estree": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.6.0.tgz", - "integrity": "sha512-A4CanUwfaG4oXobD5y7EXbsOHjCwn8tj1RDd820etpPAjH+Icjc2K9e/DQM1Hac5zH2BSy+u6bjvvF2wwREvYA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", + "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", "requires": { "lodash.unescape": "4.0.1", "semver": "5.5.0" @@ -3001,6 +3126,23 @@ "@xtuc/long": "4.2.2" } }, + "@wry/context": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz", + "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==", + "requires": { + "@types/node": ">=6", + "tslib": "^1.9.3" + } + }, + "@wry/equality": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.9.tgz", + "integrity": "sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ==", + "requires": { + "tslib": "^1.9.3" + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -3032,22 +3174,24 @@ } }, "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", + "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==" }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + } } }, "acorn-jsx": { @@ -3056,15 +3200,55 @@ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==" }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, "address": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, "airbnb-js-shims": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.0.tgz", @@ -3196,6 +3380,110 @@ "normalize-path": "^2.1.1" } }, + "apollo-boost": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/apollo-boost/-/apollo-boost-0.4.4.tgz", + "integrity": "sha512-ASngBvazmp9xNxXfJ2InAzfDwz65o4lswlEPrWoN35scXmCz8Nz4k3CboUXbrcN/G0IExkRf/W7o9Rg0cjEBqg==", + "requires": { + "apollo-cache": "^1.3.2", + "apollo-cache-inmemory": "^1.6.3", + "apollo-client": "^2.6.4", + "apollo-link": "^1.0.6", + "apollo-link-error": "^1.0.3", + "apollo-link-http": "^1.3.1", + "graphql-tag": "^2.4.2", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + } + }, + "apollo-cache": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.2.tgz", + "integrity": "sha512-+KA685AV5ETEJfjZuviRTEImGA11uNBp/MJGnaCvkgr+BYRrGLruVKBv6WvyFod27WEB2sp7SsG8cNBKANhGLg==", + "requires": { + "apollo-utilities": "^1.3.2", + "tslib": "^1.9.3" + } + }, + "apollo-cache-inmemory": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.3.tgz", + "integrity": "sha512-S4B/zQNSuYc0M/1Wq8dJDTIO9yRgU0ZwDGnmlqxGGmFombOZb9mLjylewSfQKmjNpciZ7iUIBbJ0mHlPJTzdXg==", + "requires": { + "apollo-cache": "^1.3.2", + "apollo-utilities": "^1.3.2", + "optimism": "^0.10.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + } + }, + "apollo-client": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.4.tgz", + "integrity": "sha512-oWOwEOxQ9neHHVZrQhHDbI6bIibp9SHgxaLRVPoGvOFy7OH5XUykZE7hBQAVxq99tQjBzgytaZffQkeWo1B4VQ==", + "requires": { + "@types/zen-observable": "^0.8.0", + "apollo-cache": "1.3.2", + "apollo-link": "^1.0.0", + "apollo-utilities": "1.3.2", + "symbol-observable": "^1.0.2", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } + }, + "apollo-link": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.12.tgz", + "integrity": "sha512-fsgIAXPKThyMVEMWQsUN22AoQI+J/pVXcjRGAShtk97h7D8O+SPskFinCGEkxPeQpE83uKaqafB2IyWdjN+J3Q==", + "requires": { + "apollo-utilities": "^1.3.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3", + "zen-observable-ts": "^0.8.19" + } + }, + "apollo-link-error": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.11.tgz", + "integrity": "sha512-442DNqn3CNRikDaenMMkoDmCRmkoUx/XyUMlRTZBEFdTw3FYPQLsmDO3hzzC4doY5/BHcn9/jdYh9EeLx4HPsA==", + "requires": { + "apollo-link": "^1.2.12", + "apollo-link-http-common": "^0.2.14", + "tslib": "^1.9.3" + } + }, + "apollo-link-http": { + "version": "1.5.15", + "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.15.tgz", + "integrity": "sha512-epZFhCKDjD7+oNTVK3P39pqWGn4LEhShAoA1Q9e2tDrBjItNfviiE33RmcLcCURDYyW5JA6SMgdODNI4Is8tvQ==", + "requires": { + "apollo-link": "^1.2.12", + "apollo-link-http-common": "^0.2.14", + "tslib": "^1.9.3" + } + }, + "apollo-link-http-common": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.14.tgz", + "integrity": "sha512-v6mRU1oN6XuX8beVIRB6OpF4q1ULhSnmy7ScnHnuo1qV6GaFmDcbdvXqxIkAV1Q8SQCo2lsv4HeqJOWhFfApOg==", + "requires": { + "apollo-link": "^1.2.12", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + } + }, + "apollo-utilities": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz", + "integrity": "sha512-JWNHj8XChz7S4OZghV6yc9FNnzEXj285QYp/nLNh943iObycI5GTDO3NGR9Dth12LRrSFMeDOConPfPln+WGfg==", + "requires": { + "@wry/equality": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "ts-invariant": "^0.4.0", + "tslib": "^1.9.3" + } + }, "app-root-dir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", @@ -3234,6 +3522,11 @@ "commander": "^2.11.0" } }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3424,9 +3717,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "asynckit": { "version": "0.4.0", @@ -3442,6 +3735,7 @@ "version": "9.6.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.0.tgz", "integrity": "sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==", + "dev": true, "requires": { "browserslist": "^4.6.1", "caniuse-lite": "^1.0.30000971", @@ -3523,9 +3817,9 @@ } }, "babel-eslint": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", - "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.2.tgz", + "integrity": "sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.0.0", @@ -3597,29 +3891,37 @@ "dev": true }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" } }, "babel-loader": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", - "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", "dev": true, "requires": { "find-cache-dir": "^2.0.0", "loader-utils": "^1.0.2", "mkdirp": "^0.5.1", - "util.promisify": "^1.0.0" + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "babel-plugin-add-react-displayname": { @@ -3632,14 +3934,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "dev": true, "requires": { "object.assign": "^4.1.0" } }, "babel-plugin-emotion": { - "version": "10.0.15", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.15.tgz", - "integrity": "sha512-E3W68Zk8EcKpRUDW2tsFKi4gsavapMRjfr2/KKgG3l7l2zZpiKk0BxB59Ul9C0w0ekv6my/ylGOk2WroaqKXPw==", + "version": "10.0.16", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.16.tgz", + "integrity": "sha512-a01Xrourr/VRpw4KicX9drDwfVGHmw8HmlQk++N4fv0j73EfHKWC1Ah4Vu8s1cTGVvTiwum+UhVpJenV8j03FQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -3655,9 +3958,9 @@ } }, "babel-plugin-import": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.12.0.tgz", - "integrity": "sha512-3Fo7sJ2Hm71y1VJS7eMA/E7J5+roKJmzwia5BxzUQREBs6CRylwtvQq8m39W8nplG4Y7rZwOCndh5MzRTSmHpA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.12.1.tgz", + "integrity": "sha512-3BwVJFEByTUyqZWOxizr/YwYcqqre2EebmgSUtXyToJbHzJv6rTxA0LApDntvwERlmIvcM6lUktUN0snMTjOsA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -3665,19 +3968,20 @@ } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "requires": { + "@babel/helper-plugin-utils": "^7.0.0", "find-up": "^3.0.0", "istanbul-lib-instrument": "^3.3.0", "test-exclude": "^5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "requires": { "@types/babel__traverse": "^7.0.6" } @@ -3686,6 +3990,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz", "integrity": "sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==", + "dev": true, "requires": { "@babel/runtime": "^7.4.2", "cosmiconfig": "^5.2.0", @@ -3708,15 +4013,15 @@ } }, "babel-plugin-minify-dead-code-elimination": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.0.tgz", - "integrity": "sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz", + "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==", "dev": true, "requires": { "babel-helper-evaluate-path": "^0.5.0", "babel-helper-mark-eval-scopes": "^0.4.3", "babel-helper-remove-or-void": "^0.4.3", - "lodash.some": "^4.6.0" + "lodash": "^4.17.11" } }, "babel-plugin-minify-flip-comparisons": { @@ -3729,11 +4034,12 @@ } }, "babel-plugin-minify-guarded-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.3.tgz", - "integrity": "sha1-zHCbRFP9IbHzAod0RMifiEJ845c=", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", + "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", "dev": true, "requires": { + "babel-helper-evaluate-path": "^0.5.0", "babel-helper-flip-expressions": "^0.4.3" } }, @@ -3765,11 +4071,12 @@ "dev": true }, "babel-plugin-minify-simplify": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.0.tgz", - "integrity": "sha512-TM01J/YcKZ8XIQd1Z3nF2AdWHoDsarjtZ5fWPDksYZNsoOjQ2UO2EWm824Ym6sp127m44gPlLFiO5KFxU8pA5Q==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", + "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", "dev": true, "requires": { + "babel-helper-evaluate-path": "^0.5.0", "babel-helper-flip-expressions": "^0.4.3", "babel-helper-is-nodes-equiv": "^0.0.1", "babel-helper-to-multiple-sequence-expressions": "^0.5.0" @@ -3787,7 +4094,8 @@ "babel-plugin-named-asset-import": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz", - "integrity": "sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==" + "integrity": "sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==", + "dev": true }, "babel-plugin-react-docgen": { "version": "3.1.0", @@ -3898,30 +4206,30 @@ "dev": true }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "babel-preset-minify": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.0.tgz", - "integrity": "sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz", + "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==", "dev": true, "requires": { "babel-plugin-minify-builtins": "^0.5.0", "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.1", "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.4", "babel-plugin-minify-infinity": "^0.4.3", "babel-plugin-minify-mangle-names": "^0.5.0", "babel-plugin-minify-numeric-literals": "^0.4.3", "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.1", "babel-plugin-minify-type-constructors": "^0.4.3", "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", "babel-plugin-transform-member-expression-literals": "^6.9.4", @@ -3934,13 +4242,14 @@ "babel-plugin-transform-remove-undefined": "^0.5.0", "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash.isplainobject": "^4.0.6" + "lodash": "^4.17.11" } }, "babel-preset-react-app": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.0.tgz", "integrity": "sha512-YVsDA8HpAKklhFLJtl9+AgaxrDaor8gGvDFlsg1ByOS0IPGUovumdv4/gJiAnLcDmZmKlH6+9sVOz4NVW7emAg==", + "dev": true, "requires": { "@babel/core": "7.4.3", "@babel/plugin-proposal-class-properties": "7.4.0", @@ -3966,6 +4275,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/generator": "^7.4.0", @@ -3987,6 +4297,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz", "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0" @@ -3996,6 +4307,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz", "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==", + "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-define-map": "^7.4.0", @@ -4011,6 +4323,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz", "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==", + "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } @@ -4019,6 +4332,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==", + "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", @@ -4073,7 +4387,8 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -4106,7 +4421,8 @@ "bail": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz", - "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==" + "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==", + "dev": true }, "balanced-match": { "version": "1.0.0", @@ -4456,9 +4772,9 @@ } }, "bser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", - "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "requires": { "node-int64": "^0.4.0" } @@ -4499,21 +4815,22 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" @@ -4636,7 +4953,8 @@ "ccount": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz", - "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==" + "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==", + "dev": true }, "chalk": { "version": "2.4.2", @@ -5294,13 +5612,48 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } } }, "clone-deep": { @@ -5393,7 +5746,8 @@ "comma-separated-tokens": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", - "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==" + "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==", + "dev": true }, "commander": { "version": "2.20.0", @@ -5415,6 +5769,14 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, "compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", @@ -5469,9 +5831,9 @@ } }, "confusing-browser-globals": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.7.tgz", - "integrity": "sha512-cgHI1azax5ATrZ8rJ+ODDML9Fvu67PimB6aNxBrc/QwSaDaM9eTfIEUHx3bBLJJ82ioSb+/5zfsMCCEJax3ByQ==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.8.tgz", + "integrity": "sha512-lI7asCibVJ6Qd3FGU7mu4sfG4try4LX3+GVS+Gv8UlrEf2AeW57piecapnog2UHZSbcX/P/1UDWVaTsblowlZg==" }, "connect-history-api-fallback": { "version": "1.6.0", @@ -5563,7 +5925,8 @@ "core-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", - "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==" + "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==", + "dev": true }, "core-js-compat": { "version": "3.1.3", @@ -5603,9 +5966,9 @@ }, "dependencies": { "acorn": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", - "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true }, "ajv": { @@ -5739,9 +6102,9 @@ "dev": true }, "webpack": { - "version": "4.39.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", - "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==", + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -5914,6 +6277,24 @@ "randomfill": "^1.0.3" } }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "css-blank-pseudo": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", @@ -6136,22 +6517,22 @@ } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "requires": { "cssom": "0.3.x" } }, "csstype": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", - "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==", "dev": true }, "currently-unhandled": { @@ -6168,6 +6549,15 @@ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "damerau-levenshtein": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", @@ -6406,9 +6796,9 @@ } }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" }, "diffie-hellman": { "version": "5.0.3", @@ -6763,18 +7153,47 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.50", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, "es5-shim": { "version": "4.5.13", "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.13.tgz", "integrity": "sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw==", "dev": true }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-shim": { "version": "0.35.5", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz", "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==", "dev": true }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6786,9 +7205,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "requires": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -6811,75 +7230,212 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.0.tgz", + "integrity": "sha512-sS0SZwm5UAoI83F+cgdomz0cBNPs+AnRvEboNYeWvrZ8UcDHCu/5muocwoDL2TkHq9skkP0GvZjmwI8HG7S3sw==", "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", + "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.0", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", + "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "inquirer": "^6.4.1", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.11", + "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", "table": "^5.2.3", - "text-table": "^0.2.0" + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { - "import-fresh": { + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "figures": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, + "inquirer": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" } } }, "eslint-config-react-app": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-4.0.1.tgz", - "integrity": "sha512-ZsaoXUIGsK8FCi/x4lT2bZR5mMkL/Kgj+Lnw690rbvvUr/uiwgFiD8FcfAhkCycm7Xte6O5lYz4EqMx2vX7jgw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.0.1.tgz", + "integrity": "sha512-GYXP3F/0PSHlYfGHhahqnJze8rYKxzXgrzXVqRRd4rDO40ga4NA3aHM7/HKbwceDN0/C1Ij3BoAWFawJgRbXEw==", "requires": { - "confusing-browser-globals": "^1.0.7" + "confusing-browser-globals": "^1.0.8" } }, "eslint-import-resolver-node": { @@ -6907,9 +7463,9 @@ } }, "eslint-loader": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz", - "integrity": "sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", "requires": { "loader-fs-cache": "^1.0.0", "loader-utils": "^1.0.2", @@ -6919,9 +7475,9 @@ } }, "eslint-module-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", - "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "requires": { "debug": "^2.6.8", "pkg-dir": "^2.0.0" @@ -6989,28 +7545,36 @@ } }, "eslint-plugin-flowtype": { - "version": "2.50.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz", - "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + } } }, "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "requires": { + "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", + "eslint-module-utils": "^2.4.0", "has": "^1.0.3", - "lodash": "^4.17.11", "minimatch": "^3.0.4", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" + "resolve": "^1.11.0" }, "dependencies": { "debug": { @@ -7123,14 +7687,23 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-jsx-a11y": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz", - "integrity": "sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", "requires": { + "@babel/runtime": "^7.4.5", "aria-query": "^3.0.0", "array-includes": "^3.0.3", "ast-types-flow": "^0.0.7", @@ -7138,21 +7711,33 @@ "damerau-levenshtein": "^1.0.4", "emoji-regex": "^7.0.2", "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1" + "jsx-ast-utils": "^2.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + } } }, "eslint-plugin-react": { - "version": "7.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", - "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", "requires": { "array-includes": "^3.0.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", "object.fromentries": "^2.0.0", - "prop-types": "^15.6.2", - "resolve": "^1.9.0" + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" }, "dependencies": { "doctrine": { @@ -7162,13 +7747,21 @@ "requires": { "esutils": "^2.0.2" } + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-react-hooks": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz", - "integrity": "sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, "eslint-scope": { "version": "4.0.3", @@ -7180,9 +7773,12 @@ } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", + "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "requires": { + "eslint-visitor-keys": "^1.0.0" + } }, "eslint-visitor-keys": { "version": "1.0.0", @@ -7190,13 +7786,20 @@ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.0.tgz", + "integrity": "sha512-boA7CHRLlVWUSg3iL5Kmlt/xT3Q+sXnKoRYYzj1YeM10A76TEJBbotV5pKbnK42hEUIr121zTv+QLRM5LsCPXQ==", "requires": { - "acorn": "^6.0.7", + "acorn": "^7.0.0", "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + } } }, "esprima": { @@ -7332,16 +7935,16 @@ } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" } }, "express": { @@ -7656,6 +8259,12 @@ "requires": { "graceful-fs": "^4.1.6" } + }, + "ramda": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", + "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", + "dev": true } } }, @@ -7749,9 +8358,9 @@ } }, "flatted": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", - "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" }, "flatten": { "version": "1.0.2", @@ -7813,6 +8422,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.1.1.tgz", "integrity": "sha512-gqWAEMLlae/oeVnN6RWCAhesOJMswAN1MaKNqhhjXHV5O0/rTUjWI4UbgQHdlrVbCnb+xLotXmJbBlC66QmpFw==", + "dev": true, "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", @@ -7827,7 +8437,8 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true } } }, @@ -7901,9 +8512,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.6.tgz", - "integrity": "sha512-vfmKZp3XPM36DNF0qhW+Cdxk7xm7gTEHY1clv1Xq1arwRQuKZgAhw+NZNWbJBtuaNxzNXwhfdPYRrvIbjfS33A==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", "optional": true }, "fstream": { @@ -8190,6 +8801,19 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, + "graphql": { + "version": "14.5.4", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.4.tgz", + "integrity": "sha512-dPLvHoxy5m9FrkqWczPPRnH0X80CyvRE6e7Fa5AWEqEAzg9LpxHvKh24po/482E6VWHigOkAmb4xCp6P9yT9gw==", + "requires": { + "iterall": "^1.2.2" + } + }, + "graphql-tag": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", + "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -8205,6 +8829,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "dev": true, "requires": { "duplexer": "^0.1.1", "pify": "^3.0.0" @@ -8347,6 +8972,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.1.tgz", "integrity": "sha512-UfPzdl6fbxGAxqGYNThRUhRlDYY7sXu6XU9nQeX4fFZtV+IHbyEJtd+DUuwOqNV4z3K05E/1rIkoVr/JHmeWWA==", + "dev": true, "requires": { "ccount": "^1.0.3", "hastscript": "^5.0.0", @@ -8358,12 +8984,14 @@ "hast-util-parse-selector": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz", - "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==" + "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==", + "dev": true }, "hastscript": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.0.tgz", "integrity": "sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ==", + "dev": true, "requires": { "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.2.0", @@ -8675,16 +9303,10 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -8709,6 +9331,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "dev": true, "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -8728,12 +9351,14 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -8828,7 +9453,8 @@ "is-buffer": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true }, "is-callable": { "version": "1.1.4", @@ -8999,7 +9625,8 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -9035,7 +9662,8 @@ "is-root": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", - "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" + "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -9181,77 +9809,82 @@ "handlebars": "^4.1.2" } }, + "iterall": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", + "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + }, "jest": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", - "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.7.1" + "jest-cli": "^24.8.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" }, "dependencies": { "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -9261,46 +9894,46 @@ } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "requires": { "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "requires": { "detect-newline": "^2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", - "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" } }, @@ -9314,6 +9947,11 @@ "jsdom": "^14.0.0" }, "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, "jsdom": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", @@ -9368,36 +10006,36 @@ } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" }, "jest-haste-map": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", - "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" @@ -9887,55 +10525,56 @@ } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "co": "^4.6.0", - "expect": "^24.8.0", + "expect": "^24.9.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", "throat": "^4.0.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "requires": { - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "requires": { "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -9944,11 +10583,11 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, "jest-pnp-resolver": { @@ -9957,16 +10596,16 @@ "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" }, "jest-resolve": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", - "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", "requires": { - "@jest/types": "^24.7.0", + "@jest/types": "^24.8.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -9974,47 +10613,47 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "jest-snapshot": "^24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^4.0.0" }, "dependencies": { "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -10024,41 +10663,41 @@ } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" }, "dependencies": { "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -10068,35 +10707,36 @@ } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==" + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.0" }, "dependencies": { "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "browser-resolve": "^1.11.3", "chalk": "^2.0.1", "jest-pnp-resolver": "^1.2.1", @@ -10104,22 +10744,22 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -10142,22 +10782,22 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, "jest-watch-typeahead": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.3.0.tgz", - "integrity": "sha512-+uOtlppt9ysST6k6ZTqsPI0WNz2HLa8bowiZylZoQCQaAVn7XsVmHhZREkz73FhKelrFrpne4hQQjdq42nFEmA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.3.1.tgz", + "integrity": "sha512-cDIko96c4Yqg/7mfye1eEYZ6Pvugo9mnOOhGQod3Es7/KptNv1b+9gFVaotzdqNqTlwbkA80BnWHtzV4dc+trA==", "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.4.1", @@ -10183,25 +10823,25 @@ } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.8.0", + "jest-util": "^24.9.0", "string-length": "^2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "requires": { - "merge-stream": "^1.0.1", + "merge-stream": "^2.0.0", "supports-color": "^6.1.0" }, "dependencies": { @@ -10366,11 +11006,12 @@ } }, "jsx-ast-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.1.0.tgz", - "integrity": "sha512-yDGDG2DS4JcqhA6blsuYbtsT09xL8AoLuUR2Gb5exrw7UEM19sBcOTq+YBBhrNbl0PUC4R4LnFu+dHg2HKeVvA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", + "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", "requires": { - "array-includes": "^3.0.3" + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" } }, "killable": { @@ -10444,9 +11085,9 @@ } }, "core-js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.0.tgz", - "integrity": "sha512-gybgLzmr7SQRSF6UzGYXducx4eE10ONQlyEnQoqiGPbmbn7zLkb73tPfc4YbZN0lvcTQwoLNPjq4RuCaCumGyQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==", "dev": true }, "dotenv": { @@ -10477,9 +11118,9 @@ "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "levn": { "version": "0.3.0", @@ -10611,48 +11252,31 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - }, "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { - "lodash._reinterpolate": "~3.0.0", + "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "lodash.throttle": { @@ -10672,9 +11296,9 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.2.tgz", - "integrity": "sha512-Jt2MHrCNdtIe1W6co3tF5KXGRkzF+TYffiQstfXa04mrss9IKXzAAXYWak8LbZseAQY03sH2GzMCMU0ZOUc9bg==" + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz", + "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==" }, "loose-envify": { "version": "1.4.0", @@ -10802,9 +11426,9 @@ "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=" }, "markdown-it-prism": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.2.tgz", - "integrity": "sha512-tBRK+L36D2m4NauUr9teyFYJXBtw6XtuCdCJJWeNabSBwKlgI3oil4TfHHWd0bunwSf8zkmXEZkJzDVgVkfp+g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-prism/-/markdown-it-prism-2.0.3.tgz", + "integrity": "sha512-ygl74S7LnJMzmMclxRPzuWgd251r+u6ROmED1sPY42UZweRMbmrJqZo2WXTN3PeMHJPZPXiCsWBsyOxUPyiRGQ==", "requires": { "prismjs": "^1.16.0" } @@ -11015,12 +11639,9 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.2.3", @@ -11292,6 +11913,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -11372,9 +11998,9 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -11386,7 +12012,7 @@ "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -11398,7 +12024,7 @@ "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", - "vm-browserify": "0.0.4" + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -11414,21 +12040,26 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.2.tgz", + "integrity": "sha512-85nkTziazE2dR4pyoLxMwz0b9MmxFQPVXYs/WlWI7CPtBkARJOV+89khdNjpbclXIJDECQYnTvh1xuZV3WHkCA==", "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.1.0", + "semver": "^6.3.0", "shellwords": "^0.1.1", - "which": "^1.3.0" + "which": "^1.3.1" }, "dependencies": { + "is-wsl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.0.tgz", + "integrity": "sha512-pFTjpv/x5HRj8kbZ/Msxi9VrvtOMRBqaDi3OIcbwPI3OuH+r3lLxVWukLITBaOGJIbA/w2+M1eVmVa4XNQlAmQ==" + }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -11668,6 +12299,11 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -11691,7 +12327,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.12.0", @@ -11776,7 +12411,6 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, "requires": { "is-wsl": "^1.1.0" } @@ -11789,6 +12423,14 @@ "is-wsl": "^1.1.0" } }, + "optimism": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.2.tgz", + "integrity": "sha512-zPfBIxFFWMmQboM9+Z4MSJqc1PXp82v1PFq/GfQaufI69mHKlup7ykGNnfuGIGssXJQkmhSodQ/k9EWwjd8O8A==", + "requires": { + "@wry/context": "^0.4.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -11811,11 +12453,11 @@ } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", "requires": { - "cssnano": "^4.1.0", + "cssnano": "^4.1.10", "last-call-webpack-plugin": "^3.0.0" } }, @@ -12020,9 +12662,9 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" }, "path-dirname": { "version": "1.0.2", @@ -12172,11 +12814,11 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", "requires": { - "ts-pnp": "^1.0.0" + "ts-pnp": "^1.1.2" } }, "polished": { @@ -12206,9 +12848,9 @@ "dev": true }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.22.tgz", + "integrity": "sha512-aZuwaz9ujJsyE8C5kurXAD8UmRxsJr+RtZWyQRvRk19Z2ri5uuHw5YS4tDBZrJlOS9Zw96uAbBuPb6W4wgvV5A==", "requires": { "async": "^1.5.2", "debug": "^2.2.0", @@ -12399,12 +13041,37 @@ } }, "postcss-custom-properties": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.10.tgz", - "integrity": "sha512-GDL0dyd7++goDR4SSasYdRNNvp4Gqy1XMzcCnTijiph7VB27XXpJ8bW/AI0i2VSBZ55TpdGhMr37kMSpRfYD0Q==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", "requires": { - "postcss": "^7.0.14", + "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-custom-selectors": { @@ -12559,11 +13226,11 @@ } }, "postcss-initial": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.0.tgz", - "integrity": "sha512-WzrqZ5nG9R9fUtrA+we92R4jhVvEB32IIRTzfIG/PLL8UV4CvbF1ugTEHEFX6vWxl41Xt5RTCJPEZkuWzrOM+Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.1.tgz", + "integrity": "sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==", "requires": { - "lodash.template": "^4.2.4", + "lodash.template": "^4.5.0", "postcss": "^7.0.2" } }, @@ -12755,9 +13422,9 @@ } }, "postcss-nesting": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.0.tgz", - "integrity": "sha512-WSsbVd5Ampi3Y0nk/SKr5+K34n52PqMqEfswu6RtU4r7wA8vSD+gM8/D9qq4aJkHImwn1+9iEFTbjoWsQeqtaQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "requires": { "postcss": "^7.0.2" } @@ -12899,26 +13566,26 @@ } }, "postcss-preset-env": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.6.0.tgz", - "integrity": "sha512-I3zAiycfqXpPIFD6HXhLfWXIewAWO8emOKz+QSsxaUZb9Dp8HbF5kUf+4Wy/AxR33o+LRoO8blEWCHth0ZsCLA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", "requires": { - "autoprefixer": "^9.4.9", - "browserslist": "^4.4.2", - "caniuse-lite": "^1.0.30000939", + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", "css-blank-pseudo": "^0.1.4", "css-has-pseudo": "^0.10.0", "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.3.0", - "postcss": "^7.0.14", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", "postcss-attribute-case-insensitive": "^4.0.1", "postcss-color-functional-notation": "^2.0.1", "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.2", + "postcss-color-hex-alpha": "^5.0.3", "postcss-color-mod-function": "^3.0.3", "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.7", - "postcss-custom-properties": "^8.0.9", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", "postcss-custom-selectors": "^5.1.2", "postcss-dir-pseudo-class": "^5.0.0", "postcss-double-position-gradients": "^1.0.0", @@ -12940,6 +13607,83 @@ "postcss-replace-overflow-wrap": "^3.0.0", "postcss-selector-matches": "^4.0.0", "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.0" + } + }, + "browserslist": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + } + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==" + }, + "electron-to-chromium": { + "version": "1.3.235", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.235.tgz", + "integrity": "sha512-xNabEDbMIKPLQd6xgv4nyyeMaWXIKSJr6G51ZhUemHhbz6kjZAYcygA8CvfEcMF+Mt5eLmDWaLmfSOWdQxzBVQ==" + }, + "node-releases": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.27.tgz", + "integrity": "sha512-9iXUqHKSGo6ph/tdXVbHFbhRVQln4ZDTIBJCzsa90HimnBYc5jw8RWYt4wBYFHehGyC3koIz5O4mb2fHrbPOuA==", + "requires": { + "semver": "^5.3.0" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-pseudo-class-any-link": { @@ -13082,9 +13826,9 @@ "dev": true }, "pretty-bytes": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz", - "integrity": "sha512-ujANBhiUsl9AhREUDUEY1GPOharMGm8x8juS7qOHybcLi7XsKfrYQ88hSly1l2i0klXHTDYrlL8ihMCG55Dc3w==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" }, "pretty-error": { "version": "2.1.1", @@ -13096,11 +13840,11 @@ } }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" @@ -13148,9 +13892,9 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", - "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", + "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", "requires": { "asap": "~2.0.6" } @@ -13183,12 +13927,12 @@ } }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "prop-types": { @@ -13205,6 +13949,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.1.0.tgz", "integrity": "sha512-tODH6R3+SwTkAQckSp2S9xyYX8dEKYkeXw+4TmJzTxnNzd6mQPu1OD4f9zPrvw/Rm4wpPgI+Zp63mNSGNzUgHg==", + "dev": true, "requires": { "xtend": "^4.0.1" } @@ -13332,10 +14077,9 @@ "dev": true }, "ramda": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", - "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", - "dev": true + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" }, "randombytes": { "version": "2.1.0", @@ -13398,16 +14142,28 @@ } }, "react-app-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.1.tgz", - "integrity": "sha512-LbVpT1NdzTdDDs7xEZdebjDrqsvKi5UyVKUQqtTYYNyC1JJYVAwNQWe4ybWvoT2V2WW9PGVO2u5Y6aVj4ER/Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.2.tgz", + "integrity": "sha512-yZcpLnIr0FOIzrOOz9JC37NWAWEuCaQWmYn9EWjEzlCW4cOmA5MkT5L3iP8QuUeFnoqVCTJgjIWYbXEJgNXhGA==", "requires": { - "core-js": "3.0.1", + "core-js": "3.1.4", "object-assign": "4.1.1", - "promise": "8.0.2", + "promise": "8.0.3", "raf": "3.4.1", - "regenerator-runtime": "0.13.2", + "regenerator-runtime": "0.13.3", "whatwg-fetch": "3.0.0" + }, + "dependencies": { + "core-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz", + "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==" + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } } }, "react-clientside-effect": { @@ -13437,6 +14193,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", "integrity": "sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ==", + "dev": true, "requires": { "@babel/code-frame": "7.0.0", "address": "1.0.3", @@ -13468,12 +14225,14 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, "browserslist": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", + "dev": true, "requires": { "caniuse-lite": "^1.0.30000955", "electron-to-chromium": "^1.3.122", @@ -13484,6 +14243,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "dev": true, "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -13504,6 +14264,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -13572,9 +14333,9 @@ } }, "react-draggable": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.0.tgz", - "integrity": "sha512-U7/jD0tAW4T0S7DCPK0kkKLyL0z61sC/eqU+NUfDjnq+JtBKaYKDHpsK2wazctiA4alEzCXUnzkREoxppOySVw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-3.3.1.tgz", + "integrity": "sha512-JeKyuO5f1jnVwMHdNkFpmaQoYn/6CyIiCDGSKbTgRisEtekjeUCeKmlNaNTLlpKOEu0SaKcBA1HlypSqWN/8Tw==", "dev": true, "requires": { "classnames": "^2.2.5", @@ -13584,7 +14345,8 @@ "react-error-overlay": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", - "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" + "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==", + "dev": true }, "react-fast-compare": { "version": "2.0.4", @@ -13674,13 +14436,13 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-popper": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz", - "integrity": "sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.4.tgz", + "integrity": "sha512-9AcQB29V+WrBKk6X7p0eojd1f25/oJajVdMZkywIoAV6Ag7hzE1Mhyeup2Q1QnvFRtGQFQvtqfhlEoDAPfKAVA==", "dev": true, "requires": { "@babel/runtime": "^7.1.2", - "create-react-context": "<=0.2.2", + "create-react-context": "^0.3.0", "popper.js": "^1.14.4", "prop-types": "^15.6.1", "typed-styles": "^0.0.7", @@ -13688,13 +14450,13 @@ }, "dependencies": { "create-react-context": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz", - "integrity": "sha512-KkpaLARMhsTsgp0d2NA/R94F/eDLbhXERdIq3LvX2biCAXcDvHYoOqHfWCHf1+OLj+HKBotLG3KqaOOf+C1C+A==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz", + "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==", "dev": true, "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" + "gud": "^1.0.0", + "warning": "^4.0.3" } }, "warning": { @@ -13743,186 +14505,812 @@ } }, "react-scripts": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.0.1.tgz", - "integrity": "sha512-LKEjBhVpEB+c312NeJhzF+NATxF7JkHNr5GhtwMeRS1cMeLElMeIu8Ye7WGHtDP7iz7ra4ryy48Zpo6G/cwWUw==", - "requires": { - "@babel/core": "7.4.3", - "@svgr/webpack": "4.1.0", - "@typescript-eslint/eslint-plugin": "1.6.0", - "@typescript-eslint/parser": "1.6.0", - "babel-eslint": "10.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.1.1.tgz", + "integrity": "sha512-dbjTG9vJC61OI62hIswQYg5xHvwlxDTH6QXz6ICEuA5AqkFQWk1LKl76sk8fVL2WsyumbBc4FErALwKcEV2vNA==", + "requires": { + "@babel/core": "7.5.5", + "@svgr/webpack": "4.3.2", + "@typescript-eslint/eslint-plugin": "1.13.0", + "@typescript-eslint/parser": "1.13.0", + "babel-eslint": "10.0.2", "babel-jest": "^24.8.0", - "babel-loader": "8.0.5", - "babel-plugin-named-asset-import": "^0.3.2", - "babel-preset-react-app": "^9.0.0", + "babel-loader": "8.0.6", + "babel-plugin-named-asset-import": "^0.3.3", + "babel-preset-react-app": "^9.0.1", "camelcase": "^5.2.0", "case-sensitive-paths-webpack-plugin": "2.2.0", "css-loader": "2.1.1", "dotenv": "6.2.0", "dotenv-expand": "4.2.0", - "eslint": "^5.16.0", - "eslint-config-react-app": "^4.0.1", - "eslint-loader": "2.1.2", - "eslint-plugin-flowtype": "2.50.1", - "eslint-plugin-import": "2.16.0", - "eslint-plugin-jsx-a11y": "6.2.1", - "eslint-plugin-react": "7.12.4", - "eslint-plugin-react-hooks": "^1.5.0", + "eslint": "^6.1.0", + "eslint-config-react-app": "^5.0.1", + "eslint-loader": "2.2.1", + "eslint-plugin-flowtype": "3.13.0", + "eslint-plugin-import": "2.18.2", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-react": "7.14.3", + "eslint-plugin-react-hooks": "^1.6.1", "file-loader": "3.0.1", "fs-extra": "7.0.1", - "fsevents": "2.0.6", + "fsevents": "2.0.7", "html-webpack-plugin": "4.0.0-beta.5", "identity-obj-proxy": "3.0.0", "is-wsl": "^1.1.0", - "jest": "24.7.1", + "jest": "24.8.0", "jest-environment-jsdom-fourteen": "0.1.0", - "jest-resolve": "24.7.1", - "jest-watch-typeahead": "0.3.0", + "jest-resolve": "24.8.0", + "jest-watch-typeahead": "0.3.1", "mini-css-extract-plugin": "0.5.0", - "optimize-css-assets-webpack-plugin": "5.0.1", - "pnp-webpack-plugin": "1.2.1", + "optimize-css-assets-webpack-plugin": "5.0.3", + "pnp-webpack-plugin": "1.5.0", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", "postcss-normalize": "7.0.1", - "postcss-preset-env": "6.6.0", + "postcss-preset-env": "6.7.0", "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.1", - "react-dev-utils": "^9.0.1", - "resolve": "1.10.0", - "sass-loader": "7.1.0", - "semver": "6.0.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "1.2.3", + "react-app-polyfill": "^1.0.2", + "react-dev-utils": "^9.0.3", + "resolve": "1.12.0", + "resolve-url-loader": "3.1.0", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "style-loader": "1.0.0", + "terser-webpack-plugin": "1.4.1", "ts-pnp": "1.1.2", - "url-loader": "1.1.2", - "webpack": "4.29.6", + "url-loader": "2.1.0", + "webpack": "4.39.1", "webpack-dev-server": "3.2.1", "webpack-manifest-plugin": "2.0.4", - "workbox-webpack-plugin": "4.2.0" + "workbox-webpack-plugin": "4.3.1" }, "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, "@babel/core": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", - "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.0", - "@babel/helpers": "^7.4.3", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, - "babel-loader": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", - "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "requires": { - "find-cache-dir": "^2.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "util.promisify": "^1.0.0" + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" } }, - "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "@babel/helper-create-class-features-plugin": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.5.tgz", + "integrity": "sha512-ZsxkyYiRA7Bg+ZTRpPvB6AbOFKTFFK4LrvTet8lInm0V468MWCaSYJE+I7v2z2r8KNLtYiV+K5kTCnR7dvyZjg==", "requires": { - "for-own": "^1.0.0", - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4" } }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "@babel/helper-define-map": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", + "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", "requires": { - "for-in": "^1.0.1" + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.5.5", + "lodash": "^4.17.13" } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "@babel/helper-member-expression-to-functions": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", + "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "requires": { + "@babel/types": "^7.5.5" + } }, - "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "@babel/helper-replace-supers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", + "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", "requires": { - "clone-deep": "^2.0.1", - "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", - "neo-async": "^2.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - } + "@babel/helper-member-expression-to-functions": "^7.5.5", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } }, - "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "@babel/helpers": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" } - } - } - }, - "react-select": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.4.4.tgz", - "integrity": "sha512-C4QPLgy9h42J/KkdrpVxNmkY6p4lb49fsrbDk/hRcZpX7JvZPNb6mGj+c5SzyEtBv1DmQ9oPH4NmhAFvCrg8Jw==", - "dev": true, - "requires": { - "classnames": "^2.2.5", - "emotion": "^9.1.2", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "raf": "^3.4.0", - "react-input-autosize": "^2.2.1", - "react-transition-group": "^2.2.1" - } - }, - "react-syntax-highlighter": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz", - "integrity": "sha512-G2bkZxmF3VOa4atEdXIDSfwwCqjw6ZQX5znfTaHcErA1WqHIS0o6DaSCDKFPVaOMXQEB9Hf1UySYQvuJmV8CXg==", + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==" + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz", + "integrity": "sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", + "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz", + "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", + "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz", + "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", + "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz", + "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==", + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", + "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz", + "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/runtime": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz", + "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.1.tgz", + "integrity": "sha512-p6z6JJroP989jHWcuraeWpzdejehTmLUpyC9smhTBWyPN0VVGe2phbYxpPTV7Vh8XzmFrcG55idrnfWn/2oQEw==" + }, + "@svgr/babel-preset": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.1.tgz", + "integrity": "sha512-rPFKLmyhlh6oeBv3j2vEAj2nd2QbWqpoJLKzBLjwQVt+d9aeXajVaPNEqrES2spjXKR4OxfgSs7U0NtmAEkr0Q==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.1", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + } + }, + "@svgr/core": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.2.tgz", + "integrity": "sha512-N+tP5CLFd1hP9RpO83QJPZY3NL8AtrdqNbuhRgBkjE/49RnMrrRsFm1wY8pueUfAGvzn6tSXUq29o6ah8RuR5w==", + "requires": { + "@svgr/plugin-jsx": "^4.3.2", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@svgr/plugin-jsx": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.2.tgz", + "integrity": "sha512-+1GW32RvmNmCsOkMoclA/TppNjHPLMnNZG3/Ecscxawp051XJ2MkO09Hn11VcotdC2EPrDfT8pELGRo+kbZ1Eg==", + "requires": { + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.1", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + } + }, + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "requires": { + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.2.tgz", + "integrity": "sha512-F3VE5OvyOWBEd2bF7BdtFRyI6E9it3mN7teDw0JQTlVtc4HZEYiiLSl+Uf9Uub6IYHVGc+qIrxxDyeedkQru2w==", + "requires": { + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.2", + "@svgr/plugin-jsx": "^4.3.2", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" + } + }, + "address": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.0.tgz", + "integrity": "sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==" + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-macros": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", + "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "requires": { + "@babel/runtime": "^7.4.2", + "cosmiconfig": "^5.2.0", + "resolve": "^1.10.0" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.3.tgz", + "integrity": "sha512-1XDRysF4894BUdMChT+2HHbtJYiO7zx5Be7U6bT8dISy7OdyETMGIAQBMPQCsY1YRf0xcubwnKKaDr5bk15JTA==" + }, + "babel-preset-react-app": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.1.tgz", + "integrity": "sha512-v7MeY+QxdBhM9oU5uOQCIHLsErYkEbbjctXsb10II+KAnttbe0rvprvP785dRxfa9dI4ZbsGXsRU07Qdi5BtOw==", + "requires": { + "@babel/core": "7.5.5", + "@babel/plugin-proposal-class-properties": "7.5.5", + "@babel/plugin-proposal-decorators": "7.4.4", + "@babel/plugin-proposal-object-rest-spread": "7.5.5", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-destructuring": "7.5.0", + "@babel/plugin-transform-flow-strip-types": "7.4.4", + "@babel/plugin-transform-react-display-name": "7.2.0", + "@babel/plugin-transform-runtime": "7.5.5", + "@babel/preset-env": "7.5.5", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.3.3", + "@babel/runtime": "7.5.5", + "babel-plugin-dynamic-import-node": "2.3.0", + "babel-plugin-macros": "2.6.1", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/preset-env": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz", + "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.5.5", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.5.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.5.5", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "caniuse-lite": { + "version": "1.0.30000989", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", + "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.235", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.235.tgz", + "integrity": "sha512-xNabEDbMIKPLQd6xgv4nyyeMaWXIKSJr6G51ZhUemHhbz6kjZAYcygA8CvfEcMF+Mt5eLmDWaLmfSOWdQxzBVQ==" + }, + "fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "node-releases": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.27.tgz", + "integrity": "sha512-9iXUqHKSGo6ph/tdXVbHFbhRVQln4ZDTIBJCzsa90HimnBYc5jw8RWYt4wBYFHehGyC3koIz5O4mb2fHrbPOuA==", + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "react-dev-utils": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.3.tgz", + "integrity": "sha512-OyInhcwsvycQ3Zr2pQN+HV4gtRXrky5mJXIy4HnqrWa+mI624xfYfqGuC9dYbxp4Qq3YZzP8GSGQjv0AgNU15w==", + "requires": { + "@babel/code-frame": "7.5.5", + "address": "1.1.0", + "browserslist": "4.6.6", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.1", + "recursive-readdir": "2.2.2", + "shell-quote": "1.6.1", + "sockjs-client": "1.3.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", + "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", + "requires": { + "caniuse-lite": "^1.0.30000984", + "electron-to-chromium": "^1.3.191", + "node-releases": "^1.1.25" + } + } + } + }, + "react-error-overlay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.1.tgz", + "integrity": "sha512-V9yoTr6MeZXPPd4nV/05eCBvGH9cGzc52FN8fs0O0TVQ3HYYf1n7EgZVtHbldRq5xU9zEzoXIITjYNIfxDDdUw==" + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "schema-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha512-g6SViEZAfGNrToD82ZPUjq52KUPDYc+fN5+g6Euo5mLokl/9Yx14z0Cu4RR1m55HtBXejO0sBt+qw79axN+Fiw==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + } + }, + "url-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.1.0.tgz", + "integrity": "sha512-kVrp/8VfEm5fUt+fl2E0FQyrpmOYgMEkBsv8+UDP1wFhszECq5JyGF33I7cajlVY90zRZ6MyfgKXngLvHYZX8A==", + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.0.0" + } + } + } + }, + "react-select": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-2.4.4.tgz", + "integrity": "sha512-C4QPLgy9h42J/KkdrpVxNmkY6p4lb49fsrbDk/hRcZpX7JvZPNb6mGj+c5SzyEtBv1DmQ9oPH4NmhAFvCrg8Jw==", + "dev": true, + "requires": { + "classnames": "^2.2.5", + "emotion": "^9.1.2", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "raf": "^3.4.0", + "react-input-autosize": "^2.2.1", + "react-transition-group": "^2.2.1" + } + }, + "react-syntax-highlighter": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz", + "integrity": "sha512-G2bkZxmF3VOa4atEdXIDSfwwCqjw6ZQX5znfTaHcErA1WqHIS0o6DaSCDKFPVaOMXQEB9Hf1UySYQvuJmV8CXg==", "dev": true, "requires": { "babel-runtime": "^6.18.0", @@ -14145,6 +15533,11 @@ "safe-regex": "^1.1.0" } }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, "regexp-tree": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz", @@ -14201,6 +15594,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.0.tgz", "integrity": "sha512-V2OjMD0xcSt39G4uRdMTqDXXm6HwkUbLMDayYKA/d037j8/OtVSQ+tqKwYWOuyBeoCs/3clXRe30VUjeMDTBSA==", + "dev": true, "requires": { "hast-util-from-parse5": "^5.0.0", "parse5": "^5.0.0", @@ -14286,7 +15680,8 @@ "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true }, "request": { "version": "2.88.0", @@ -14364,16 +15759,16 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, - "requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==" - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + }, "resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -14406,6 +15801,53 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "resolve-url-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.0.tgz", + "integrity": "sha512-2QcrA+2QgVqsMJ1Hn5NnJXIGCX1clQ1F6QJTqOeiaDw9ACo1G2k+8/shq3mtqne03HOFyskAClqfxKyFBriXZg==", + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.0.0", + "compose-function": "3.0.3", + "convert-source-map": "1.6.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.14", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "postcss": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", + "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -14420,6 +15862,27 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -14448,9 +15911,9 @@ } }, "rsvp": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { "version": "2.3.0", @@ -14737,18 +16200,36 @@ } }, "sass-loader": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", - "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", + "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", "dev": true, "requires": { "clone-deep": "^4.0.1", - "loader-utils": "^1.0.1", - "neo-async": "^2.5.0", - "pify": "^4.0.1", - "semver": "^5.5.0" + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.1.0", + "semver": "^6.3.0" }, "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -14766,16 +16247,20 @@ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "schema-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.2.0.tgz", + "integrity": "sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "shallow-clone": { @@ -14795,11 +16280,11 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", - "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "requires": { - "xmlchars": "^1.3.1" + "xmlchars": "^2.1.1" } }, "scheduler": { @@ -15171,9 +16656,9 @@ } }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==" }, "slash": { "version": "2.0.0", @@ -15392,7 +16877,8 @@ "space-separated-tokens": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", - "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" + "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==", + "dev": true }, "spdx-correct": { "version": "3.1.0", @@ -15423,9 +16909,9 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" }, "spdy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", - "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15699,9 +17185,9 @@ } }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" }, "style-equal": { "version": "1.0.0", @@ -15712,6 +17198,7 @@ "version": "0.23.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, "requires": { "loader-utils": "^1.1.0", "schema-utils": "^1.0.0" @@ -15759,6 +17246,11 @@ "has-flag": "^3.0.0" } }, + "svg-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", + "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==" + }, "svgo": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", @@ -15783,13 +17275,12 @@ "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "symbol.prototype.description": { "version": "1.0.0", @@ -15801,21 +17292,37 @@ } }, "table": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.0.tgz", - "integrity": "sha512-nHFDrxmbrkU7JAFKqKbDJXfzrX2UBsWmrieXFTGxiI5e4ncg3VqsZeI4EzNmX0ncp4XNGVeoxIWJXfCIXwrsvw==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", + "ajv": "^6.10.2", + "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -15927,13 +17434,13 @@ } }, "terser": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", - "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.4.tgz", + "integrity": "sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==", "requires": { - "commander": "^2.19.0", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.10" + "source-map-support": "~0.5.12" }, "dependencies": { "source-map": { @@ -15944,24 +17451,34 @@ } }, "terser-webpack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", - "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^1.7.0", "source-map": "^0.6.1", - "terser": "^3.16.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } } } }, @@ -16132,7 +17649,8 @@ "trough": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz", - "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==" + "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==", + "dev": true }, "true-case-path": { "version": "1.0.3", @@ -16143,20 +17661,34 @@ "glob": "^7.1.2" } }, + "ts-invariant": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", + "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", + "requires": { + "tslib": "^1.9.3" + } + }, "ts-pnp": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.2.tgz", "integrity": "sha512-f5Knjh7XCyRIzoC/z1Su1yLLRrPrFCgtUAh/9fCSP6NKbATwpOL1+idQVXQokK9GRFURn/jYPGPfegIctwunoA==" }, + "ts-toolbelt": { + "version": "3.8.63", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-3.8.63.tgz", + "integrity": "sha512-OlsFC8uF1mpN2O7DlvSkgnXzOvubO790eFhTvZBFI+WLge2BYzkQk73Q3yF0R8usxhkqbemLomqRhCGWasoIKw==", + "dev": true + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tsutils": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz", - "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", "requires": { "tslib": "^1.8.1" } @@ -16179,6 +17711,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.3.tgz", + "integrity": "sha512-51IMtNfVcee8+9GJvj0spSuFcZHe9vSib6Xtgsny1Km9ugyz2mbS08I3rsUIRYgJohFRFU1160sgRodYz378Hg==" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -16214,9 +17751,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", - "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.2.tgz", + "integrity": "sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw==" }, "typescript-eslint-parser": { "version": "22.0.0", @@ -16279,6 +17816,12 @@ } } }, + "unfetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.1.0.tgz", + "integrity": "sha512-crP/n3eAPUJxZXM9T80/yv0YhkTEx2K1D3h7D1AJM6fzsWZrxdyRuLN0JH/dkZh1LNH8LxCnBzoPFCPbb2iGpg==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -16307,6 +17850,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", + "dev": true, "requires": { "@types/unist": "^2.0.0", "@types/vfile": "^3.0.0", @@ -16322,6 +17866,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", + "dev": true, "requires": { "is-buffer": "^2.0.0", "replace-ext": "1.0.0", @@ -16392,7 +17937,8 @@ "unist-util-stringify-position": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true }, "universalify": { "version": "0.1.2", @@ -16488,6 +18034,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, "requires": { "loader-utils": "^1.1.0", "mime": "^2.0.3", @@ -16545,6 +18092,11 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -16578,6 +18130,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.1.tgz", "integrity": "sha512-lRHFCuC4SQBFr7Uq91oJDJxlnftoTLQ7eKIpMdubhYcVMho4781a8MWXLy3qZrZ0/STD1kRiKc0cQOHm4OkPeA==", + "dev": true, "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -16590,6 +18143,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz", "integrity": "sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA==", + "dev": true, "requires": { "@types/unist": "^2.0.2" } @@ -16598,6 +18152,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.1.tgz", "integrity": "sha512-KtasSV+uVU7RWhUn4Lw+wW1Zl/nW8JWx7JCPps10Y9JRRIDeDXf8wfBLoOSsJLyo27DqMyAi54C6Jf/d6Kr2Bw==", + "dev": true, "requires": { "@types/unist": "^2.0.2", "unist-util-stringify-position": "^2.0.0" @@ -16609,17 +18164,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "dev": true, "requires": { "unist-util-stringify-position": "^1.1.1" } }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" }, "w3c-hr-time": { "version": "1.0.1", @@ -16677,7 +18230,8 @@ "web-namespaces": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", - "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==" + "integrity": "sha512-r8sAtNmgR0WKOKOxzuSgk09JsHlpKlB+uHi937qypOu3PZ17UxPrierFKDye/uNHjNTTEshu5PId8rojIPj/tA==", + "dev": true }, "webidl-conversions": { "version": "4.0.2", @@ -16685,34 +18239,70 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.29.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.6.tgz", - "integrity": "sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==", + "version": "4.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.1.tgz", + "integrity": "sha512-/LAb2TJ2z+eVwisldp3dqTEoNhzp/TLCZlmZm3GGGAlnfIWDgOEE758j/9atklNLfRyhKbZTCOIoPqLJXeBLbQ==", "requires": { "@webassemblyjs/ast": "1.8.5", "@webassemblyjs/helper-module-context": "1.8.5", "@webassemblyjs/wasm-edit": "1.8.5", "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } } }, "webpack-dev-middleware": { @@ -16773,6 +18363,31 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "decamelize": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", @@ -16787,9 +18402,9 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "strip-ansi": { "version": "3.0.1", @@ -17122,13 +18737,13 @@ "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" }, "workbox-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-YZsiA+y/ns/GdWRaBsfYv8dln1ebWtGnJcTOg1ppO0pO1tScAHX0yGtHIjndxz3L/UUhE8b0NQE9KeLNwJwA5A==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", "requires": { "@babel/runtime": "^7.0.0", "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.2.0" + "workbox-build": "^4.3.1" } }, "workbox-window": { @@ -17231,7 +18846,8 @@ "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=" + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -17239,15 +18855,20 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, "xmlchars": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz", - "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.1.1.tgz", + "integrity": "sha512-7hew1RPJ1iIuje/Y01bGD/mXokXxegAgVS+e+E0wSi2ILHQkYAH1+JXARwTjZSM4Z4Z+c73aKspEcqj+zPPL/w==" }, "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" }, + "xstate": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.6.7.tgz", + "integrity": "sha512-mqgtH6BXOgjOHVDxZPyW/h6QUC5kfEggh5IN8uOitjzrdCScE/a/cwcRvgcH8CGAXYReDNvasOKD0aFBWAZ1fg==" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -17264,39 +18885,74 @@ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" }, "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "zen-observable": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.14.tgz", + "integrity": "sha512-kQz39uonEjEESwh+qCi83kcC3rZJGh4mrZW7xjkSQYXkq//JZHTtKo+6yuVloTgMtzsIWOJrjIrKvk/dqm0L5g==" + }, + "zen-observable-ts": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.19.tgz", + "integrity": "sha512-u1a2rpE13G+jSzrg3aiCqXU5tN2kw41b+cBZGmnc+30YimdkKiDj9bTowcB41eL77/17RF/h+393AuVgShyheQ==", + "requires": { + "tslib": "^1.9.3", + "zen-observable": "^0.8.0" + } } } } diff --git a/web-app/package.json b/web-app/package.json index 19948df2..9f38977d 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -2,27 +2,13 @@ "name": "coderoad-app", "version": "0.1.0", "private": true, - "dependencies": { - "@alifd/next": "^1.16.6", - "markdown-it": "^9.1.0", - "markdown-it-emoji": "^1.4.0", - "markdown-it-prism": "^2.0.2", - "moment": "^2.24.0", - "react": "^16.9.0", - "react-dom": "^16.9.0", - "react-scripts": "3.0.1", - "typescript": "^3.5.3" - }, "scripts": { - "start": "react-scripts start", "build": "react-scripts build", "postbuild": "cp -R ./build/ ../build/ && cp public/webpackBuild.js ../build/webpackBuild.js", - "test": "react-scripts test", + "build-storybook": "build-storybook", + "start": "react-scripts start", "storybook": "start-storybook -p 6006", - "build-storybook": "build-storybook" - }, - "eslintConfig": { - "extends": "react-app" + "test": "react-scripts test" }, "browserslist": { "production": [ @@ -36,24 +22,45 @@ "last 1 safari version" ] }, + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@alifd/next": "^1.17.10", + "@apollo/react-hooks": "^3.1.0", + "apollo-boost": "^0.4.4", + "graphql": "^14.5.4", + "markdown-it": "^9.1.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-prism": "^2.0.3", + "moment": "^2.24.0", + "ramda": "^0.26.1", + "react": "^16.9.0", + "react-dom": "^16.9.0", + "react-scripts": "^3.1.1", + "reselect": "^4.0.0", + "typescript": "^3.6.2", + "xstate": "^4.6.7" + }, "devDependencies": { "@babel/core": "^7.5.4", - "@storybook/addon-actions": "^5.1.10", - "@storybook/addon-knobs": "^5.1.10", - "@storybook/addon-links": "^5.1.10", - "@storybook/addons": "^5.1.10", - "@storybook/react": "^5.1.10", + "@storybook/addon-actions": "^5.1.11", + "@storybook/addon-knobs": "^5.1.11", + "@storybook/addon-links": "^5.1.11", + "@storybook/addons": "^5.1.11", + "@storybook/react": "^5.1.11", "@types/highlight.js": "^9.12.3", - "@types/jest": "^24.0.17", + "@types/jest": "^24.0.18", "@types/markdown-it": "0.0.8", - "@types/node": "^12.7.1", - "@types/react": "^16.9.1", - "@types/react-dom": "^16.8.5", + "@types/node": "^12.7.4", + "@types/ramda": "^0.26.21", + "@types/react": "^16.9.2", + "@types/react-dom": "^16.9.0", "@types/storybook__react": "^4.0.2", - "babel-loader": "^8.0.5", - "babel-plugin-import": "^1.12.0", + "babel-loader": "^8.0.6", + "babel-plugin-import": "^1.12.1", "node-sass": "^4.12.0", - "sass-loader": "^7.2.0", + "sass-loader": "^8.0.0", "typescript-eslint-parser": "^22.0.0" } } diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 8008c8b2..159d2a8e 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -1,61 +1,13 @@ import * as React from 'react' -import * as CR from 'typings' +import { ApolloProvider } from '@apollo/react-hooks' -import Debugger from './components/Debugger' +import client from './services/apollo' import Routes from './Routes' -import DataContext, { initialData, initialState } from './utils/DataContext' -import { send } from './utils/vscode' -interface ReceivedEvent { - data: CR.Action -} - -const App = () => { - const [state, setState] = React.useState(initialState) - const [data, setData]: [CR.MachineContext, (data: CR.MachineContext) => void] = React.useState(initialData) - - // update state based on response from editor - const handleEvent = (event: ReceivedEvent): void => { - const message = event.data - // messages from core - if (message.type === 'SET_STATE') { - setState(message.payload.state) - setData(message.payload.data) - } else if (message.type === 'SET_DATA') { - setData(message.payload.data) - } - } - - // event bus listener - React.useEffect(() => { - const listener = 'message' - window.addEventListener(listener, handleEvent) - return () => { - window.removeEventListener(listener, handleEvent) - } - }) - - // trigger progress when webview loaded - React.useEffect(() => { - send('WEBVIEW_LOADED') - }) - - const value = { - state, - position: data.position, - data: data.data, - progress: data.progress, - } - - // TODO: refactor cond to user and accept first route as if/else if - return ( - -
- {process.env.REACT_APP_DEBUG && } - -
-
- ) -} +const App = () => ( + + + +) export default App diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index 7238d629..f9aa1882 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -1,61 +1,53 @@ import * as React from 'react' +import * as CR from 'typings' +import Workspace from './components/Workspace' import Router from './components/Router' import LoadingPage from './containers/LoadingPage' import ContinuePage from './containers/Continue' import NewPage from './containers/New' -import TutorialPage from './containers/Tutorial' +import SummaryPage from './containers/Tutorial/SummaryPage' +import LevelSummaryPage from './containers/Tutorial/LevelPage' +import StageSummaryPage from './containers/Tutorial/StagePage' +import CompletedPage from './containers/Tutorial/CompletedPage' const { Route } = Router -interface Props { - state: any -} - -const styles = { - page: { - margin: 0, - backgroundColor: 'white', - }, -} - -const Routes = ({ state }: Props) => { - const [dimensions, setDimensions] = React.useState({ - width: window.innerWidth - 20, - height: window.innerHeight - 20, - }) - - // solution for windows getting off size - // without adding multiple listeners - React.useEffect(() => { - const dimensionsInterval = setInterval(() => { - setDimensions({ - width: window.innerWidth - 20, - height: window.innerHeight - 20, - }) - }, 5000) - return () => { - clearInterval(dimensionsInterval) - } - }) +const tempSend = (action: any) => console.log('sent') +const Routes = () => { return ( -
- - + + + - - + + + + + + + + + + + + + + + + + - - + + - - + + -
+ ) } diff --git a/web-app/src/components/Cond/index.tsx b/web-app/src/components/Cond/index.tsx deleted file mode 100644 index 73f2375a..00000000 --- a/web-app/src/components/Cond/index.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import * as React from 'react' -import { stateMatch } from './utils/state' - -interface Props { - state: any - path: string - children: React.ReactElement -} - -const Cond = (props: Props) => { - if (!stateMatch(props.state, props.path)) { - return null - } - return props.children -} - -export default Cond diff --git a/web-app/src/components/Cond/utils/state.ts b/web-app/src/components/Cond/utils/state.ts deleted file mode 100644 index f2bb1289..00000000 --- a/web-app/src/components/Cond/utils/state.ts +++ /dev/null @@ -1,19 +0,0 @@ -export function stateMatch(state: any, statePath: string) { - let current = state - const paths = statePath.split('.') - let complete = false - try { - for (const p of paths) { - if (p === current && !complete) { - // handle strings - complete = true - } else { - // handle objects - current = current[p] - } - } - } catch (error) { - return false - } - return current !== undefined -} diff --git a/web-app/src/components/Debugger/debuggerWrapper.tsx b/web-app/src/components/Debugger/debuggerWrapper.tsx new file mode 100644 index 00000000..dbd9ed8d --- /dev/null +++ b/web-app/src/components/Debugger/debuggerWrapper.tsx @@ -0,0 +1,16 @@ +import * as React from 'react' +import Debugger from './index' +import stateToString from './stateToString' + +const debuggerWrapper = (element: React.ReactElement, state: any) => { + if (process.env.REACT_APP_DEBUG) { + return ( + + {element} + + ) + } + return element +} + +export default debuggerWrapper diff --git a/web-app/src/components/Debugger/index.tsx b/web-app/src/components/Debugger/index.tsx index 7d6329c3..d6442786 100644 --- a/web-app/src/components/Debugger/index.tsx +++ b/web-app/src/components/Debugger/index.tsx @@ -1,15 +1,22 @@ import * as React from 'react' +import * as G from 'typings/graphql' +import * as CR from 'typings' interface Props { - value: any + state: string + tutorial: G.Tutorial + position: CR.Position + progress: CR.Progress + children: React.ReactElement } -const Debugger = ({ value }: Props) => ( +const Debugger = ({ state, children, position, progress, tutorial }: Props) => (
-

state: {JSON.stringify(value.state)}

-

position: {JSON.stringify(value.position)}

-

progress: {JSON.stringify(value.progress)}

-

data: {JSON.stringify(value.data)}

+

state: {state}

+

tutorial: {tutorial ? tutorial.id : 'none'}

+

position: {JSON.stringify(position)}

+

progress: {JSON.stringify(progress)}

+ {children}
) diff --git a/web-app/src/components/Debugger/stateToString.ts b/web-app/src/components/Debugger/stateToString.ts new file mode 100644 index 00000000..705fb492 --- /dev/null +++ b/web-app/src/components/Debugger/stateToString.ts @@ -0,0 +1,16 @@ +const stateToString = (state: string | object, str: string = ''): string => { + if (typeof state === 'object') { + const keys = Object.keys(state) + if (keys && keys.length) { + const key = keys[0] + // @ts-ignore + return stateToString(state[key], str.length ? `${str}.${key}` : key) + } + return str + } else if (typeof state === 'string') { + return str.length ? `${str}.${state}` : state + } + return '' +} + +export default stateToString \ No newline at end of file diff --git a/web-app/src/components/Error/index.tsx b/web-app/src/components/Error/index.tsx new file mode 100644 index 00000000..b9c71bbf --- /dev/null +++ b/web-app/src/components/Error/index.tsx @@ -0,0 +1,45 @@ +import * as React from 'react' +import { ApolloError } from 'apollo-boost' +import { GraphQLError } from 'graphql' + +const styles = { + container: { + color: '#D8000C', + backgroundColor: '#FFBABA', + padding: '1rem', + }, +} + +interface Props { + error: ApolloError +} + +const ErrorView = ({ error }: Props) => { + console.log(error) + return ( +
+

Error

+ {error.graphQLErrors && ( +
+ {error.graphQLErrors.map(({ message, locations, path }: GraphQLError, index: number) => ( +
+ [GraphQL error]: Message: {message}, Location: {locations}, Path: {path} +
+ ))} +
+ )} + {error.networkError && ( +
+ [Network error]: {error.networkError.message} +
+ )} + {error.extraInfo && ( +

+ [Extra info]: {JSON.stringify(error.extraInfo)} +

+ )} +
+ ) +} + +export default ErrorView diff --git a/web-app/src/components/Level/index.tsx b/web-app/src/components/Level/index.tsx deleted file mode 100644 index e457bec5..00000000 --- a/web-app/src/components/Level/index.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { Button, Step } from '@alifd/next' -import * as React from 'react' -import CR from 'typings' -import CC from '../../../../typings/context' - -import Markdown from '../Markdown' -import LevelStageSummary from './LevelStageSummary' - -const styles = { - card: {}, - content: { - padding: '0rem 1rem', - paddingBottom: '1rem', - }, - list: { - padding: '0rem', - }, - options: { - padding: '0rem 1rem', - }, - steps: { - padding: '1rem 0.5rem', - }, - title: {}, -} - -interface Props { - level: CR.TutorialLevel - stages: { - [stageId: string]: any // CC.StageWithStatus - } - onNext(): void - onBack(): void -} - -const Level = ({ level, stages, onNext, onBack }: Props) => { - const { content, stageList } = level - const { title, text } = content - const activeIndex = stageList.findIndex((stageId: string) => { - return stages[stageId].status.active - }) - - return ( -
-
-

{title}

- {text} -
-
- - {stageList.map((stageId: string, index: number) => { - const stage: CC.StageWithStatus = stages[stageId] - const { active } = stage.status - const clickHandler = active ? onNext : () => {} - // note - must add click handler to title, content & step.item - // as all are separted components - return ( - - {stage.content.title || `Stage ${index + 1}`} - - } - content={} - onClick={clickHandler} - /> - ) - })} - -
-
- -
-
- ) -} - -export default Level diff --git a/web-app/src/components/Router/Route.tsx b/web-app/src/components/Router/Route.tsx index 7e80f066..33b1abe8 100644 --- a/web-app/src/components/Router/Route.tsx +++ b/web-app/src/components/Router/Route.tsx @@ -1,6 +1,6 @@ interface Props { children: any - path: string + path: string } const Route = ({ children }: Props) => children diff --git a/web-app/src/components/Router/index.tsx b/web-app/src/components/Router/index.tsx index a865b937..41fadf36 100644 --- a/web-app/src/components/Router/index.tsx +++ b/web-app/src/components/Router/index.tsx @@ -1,21 +1,43 @@ import * as React from 'react' +import * as CR from 'typings' +import { useMachine } from '../../services/xstate-react' +import machine from '../../services/state/machine' + import Route from './Route' -import { stateMatch } from '../Cond/utils/state' +import debuggerWrapper from '../Debugger/debuggerWrapper' +import channel from '../../services/channel' +import messageBusReceiver from '../../services/channel/receiver' interface Props { - state: string children: any } +interface CloneElementProps { + context: CR.MachineContext + send(action: CR.Action): void +} + // router finds first state match of -const Router = ({ state, children }: Props) => { +const Router = ({ children }: Props): React.ReactElement | null => { + const [state, send] = useMachine(machine, { + interpreterOptions: { + logger: console.log.bind('XSTATE:'), + }, + }) + + channel.setMachineSend(send) + + // event bus listener + React.useEffect(messageBusReceiver, []) + const childArray = React.Children.toArray(children) for (const child of childArray) { - if (stateMatch(state, child.props.path)) { - return child.props.children + if (state.matches(child.props.path)) { + const element = React.cloneElement(child.props.children, { send, context: state.context }) + return debuggerWrapper(element, state) } } - console.warn(`No Route matches for ${state}`) + console.warn(`No Route matches for ${JSON.stringify(state)}`) return null } diff --git a/web-app/src/components/Stage/StepDescription/index.tsx b/web-app/src/components/Stage/StepDescription/index.tsx deleted file mode 100644 index 24688dce..00000000 --- a/web-app/src/components/Stage/StepDescription/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import * as React from 'react' -import CR from 'typings' -import Markdown from '../../Markdown' - -const styles = { - // active: { - // backgroundColor: '#e6f7ff', - // }, - card: { - paddingRight: '1rem', - }, -} - -interface Props { - content: CR.TutorialStepContent - status: any // CC.StageStepStatus -} - -const StepDescription = ({ content, status }: Props) => { - const hidden = !status.active && !status.complete - if (hidden) { - return null - } - return ( -
- {content.text} -
- ) -} - -export default StepDescription diff --git a/web-app/src/components/Stage/index.tsx b/web-app/src/components/Stage/index.tsx deleted file mode 100644 index df8ce9e1..00000000 --- a/web-app/src/components/Stage/index.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { Button, Step } from '@alifd/next' -import * as React from 'react' -import CR from 'typings' - -import Markdown from '../Markdown' -import StepDescription from './StepDescription' - -const styles = { - card: { - padding: 0, - }, - content: { - padding: '0rem 1rem', - paddingBottom: '1rem', - }, - options: { - padding: '0rem 1rem', - }, - steps: { - padding: '1rem 0rem', - }, - title: {}, -} - -interface Props { - stage: CR.TutorialStage - steps: { - [stepId: string]: any // CC.Step - } - complete: boolean - onContinue(): void -} - -const Stage = ({ stage, steps, onContinue, complete }: Props) => { - const { stepList, content } = stage - const { title, text } = content - // grab the active step - const activeIndex = stepList.findIndex((stepId: string) => { - return steps[stepId].status.active - }) - return ( -
-
-

{title}

- {text} -
-
- - {stepList.map((stepId: string, index: number) => { - const step = steps[stepId] - return ( - } - /> - ) - })} - -
- - {complete && ( -
- -
- )} -
- ) -} - -export default Stage diff --git a/web-app/src/components/Summary/index.tsx b/web-app/src/components/Summary/index.tsx deleted file mode 100644 index ee8d56a8..00000000 --- a/web-app/src/components/Summary/index.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Button } from '@alifd/next' -import * as React from 'react' -import CR from 'typings' - -const styles = { - card: { - // width: '20rem', - }, - content: { - padding: '0rem 1rem', - }, - options: { - padding: '1rem', - }, - title: {}, -} - -interface Props { - data: CR.TutorialData - onNext(): void -} - -const Summary = ({ data, onNext }: Props) => { - const { summary } = data - return ( -
-
-

{summary.title}

-

{summary.description}

-
-
- -
-
- ) -} - -export default Summary diff --git a/web-app/src/components/Workspace/index.tsx b/web-app/src/components/Workspace/index.tsx new file mode 100644 index 00000000..ef2381b0 --- /dev/null +++ b/web-app/src/components/Workspace/index.tsx @@ -0,0 +1,30 @@ +import * as React from 'react' + +interface Props { + children: React.ReactElement +} + +const resize = () => ({ + width: window.innerWidth - 20, + height: window.innerHeight - 20, +}) + +const Workspace = ({ children }: Props) => { + const [dimensions, setDimensions] = React.useState(resize()) + + // solution for windows getting off size + React.useEffect(() => { + setDimensions(resize()) + }, [window.innerHeight, window.innerHeight]) + + const styles = { + page: { + margin: 0, + backgroundColor: 'white', + }, + } + + return
{children}
+} + +export default Workspace diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index c40ff78b..a01ea5c7 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -1,33 +1,39 @@ import * as React from 'react' -import { send } from '../../utils/vscode' -import DataContext from '../../utils/DataContext' import { Button, Card } from '@alifd/next' +import * as CR from 'typings' +import * as T from 'typings/graphql' interface Props { + tutorial: T.Tutorial onContinue(): void } -export const ContinuePage = (props: Props) => { - // context - const { data } = React.useContext(DataContext) - return ( -
-

Continue

- -
-

{data.summary.title}

-

{data.summary.description}

- -
-
-
- ) +export const ContinuePage = (props: Props) => ( +
+

Continue

+ +
+

{props.tutorial.title}

+

{props.tutorial.text}

+ +
+
+
+) + +interface ContainerProps { + context: CR.MachineContext + send(action: CR.Action | string): void } -export default () => ( - { - send('TUTORIAL_START') - }} - /> -) +const ContinuePageContainer = ({ context, send }: ContainerProps) => { + const { tutorial } = context + + if (!tutorial) { + throw new Error('Tutorial not found') + } + + return send('TUTORIAL_START')} /> +} + +export default ContinuePageContainer diff --git a/web-app/src/containers/New/TutorialList/TutorialItem.tsx b/web-app/src/containers/New/TutorialList/TutorialItem.tsx new file mode 100644 index 00000000..f7e22370 --- /dev/null +++ b/web-app/src/containers/New/TutorialList/TutorialItem.tsx @@ -0,0 +1,18 @@ +import * as React from 'react' +import { Button } from '@alifd/next' + +interface Props { + title?: string + text?: string + onSelect(): void +} + +const TutorialItem = (props: Props) => ( +
+

{props.title || 'Title'}

+

{props.text || 'Description'}

+ +
+) + +export default TutorialItem diff --git a/web-app/src/containers/New/TutorialList/index.tsx b/web-app/src/containers/New/TutorialList/index.tsx new file mode 100644 index 00000000..bd85f14b --- /dev/null +++ b/web-app/src/containers/New/TutorialList/index.tsx @@ -0,0 +1,34 @@ +import * as React from 'react' + +import channel from '../../../services/channel' +import * as T from 'typings/graphql' +import TutorialItem from './TutorialItem' + +interface Props { + tutorialList: T.Tutorial[] +} + +const TutorialList = (props: Props) => { + const onSelect = (tutorial: T.Tutorial) => { + channel.machineSend({ + type: 'TUTORIAL_START', + payload: { + tutorial, + } + }) + } + return ( +
+ {props.tutorialList.map((tutorial: T.Tutorial) => ( + onSelect(tutorial)} + title={tutorial.title || ''} + text={tutorial.text || ''} + /> + ))} +
+ ) +} + +export default TutorialList diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index a48edbb4..0086f950 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -1,38 +1,45 @@ import * as React from 'react' -import { Button } from '@alifd/next' +import { useQuery } from '@apollo/react-hooks' +import * as T from 'typings/graphql' +import * as CR from 'typings' -import Cond from '../../components/Cond' -import DataContext from '../../utils/DataContext' -import { send } from '../../utils/vscode' -import LoadingPage from '../../containers/LoadingPage' +import queryTutorials from '../../services/apollo/queries/tutorials' +import LoadingPage from '../LoadingPage' +import ErrorView from '../../components/Error' +import TutorialList from './TutorialList' interface Props { - onNew(tutorialId: string): void + tutorialList: T.Tutorial[] } -export const NewPage = (props: Props) => { - const { state } = React.useContext(DataContext) - const [tutorialList] = React.useState([{ id: '1', title: 'Demo', description: 'A basic demo' }]) - // context +export const NewPage = (props: Props) => ( +
+

Start a New Tutorial

+ +
+) + +const Loading = () => + +interface ContainerProps { + send(action: CR.Action): void +} + +const NewPageContainer = (props: ContainerProps) => { + const { data, loading, error } = useQuery(queryTutorials) + if (loading) { + return + } + + if (error) { + return + } + return ( -
- -
-

Start a new Project

- {tutorialList.map(tutorial => ( -
-

{tutorial.title}

-

{tutorial.description}

- -
- ))} -
-
- - - -
+ + + ) } -export default () => send('TUTORIAL_START')} /> +export default NewPageContainer diff --git a/web-app/src/containers/Tutorial/CompletedPage.tsx b/web-app/src/containers/Tutorial/CompletedPage.tsx index 813290e3..742dc0ea 100644 --- a/web-app/src/containers/Tutorial/CompletedPage.tsx +++ b/web-app/src/containers/Tutorial/CompletedPage.tsx @@ -1,7 +1,30 @@ import * as React from 'react' +import { Button } from '@alifd/next' +import * as CR from 'typings' -const CompletedPage = () => { - return
Tutorial Complete
+const styles = { + options: { + padding: '0rem 1rem', + }, +} + +interface Props { + context: CR.MachineContext + send(action: CR.Action|string): void +} + +const CompletedPage = (props: Props) => { + const selectNewTutorial = () => { + props.send('SELECT_TUTORIAL') + } + return ( +
+

Tutorial Complete

+
+ +
+
+ ) } export default CompletedPage diff --git a/web-app/src/containers/Tutorial/LevelPage.tsx b/web-app/src/containers/Tutorial/LevelPage.tsx deleted file mode 100644 index d95966b3..00000000 --- a/web-app/src/containers/Tutorial/LevelPage.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import * as React from 'react' -import DataContext from '../../utils/DataContext' -import Level from '../../components/Level' - -interface LevelProps { - send(action: string): void -} - -const LevelPage = (props: LevelProps) => { - const { position, data, progress } = React.useContext(DataContext) - const { levelId } = position - const level = data.levels[levelId] - const onNext = (): void => { - props.send('NEXT') - } - const onBack = (): void => { - props.send('BACK') - } - - const stages: { [stageId: string]: any } = {} - for (const stageId of level.stageList) { - stages[stageId] = { - ...data.stages[stageId], - status: { - complete: progress.stages[stageId] || false, - active: position.stageId === stageId, - }, - } - } - - return -} - -export default LevelPage diff --git a/web-app/src/components/Level/LevelStageSummary.tsx b/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx similarity index 80% rename from web-app/src/components/Level/LevelStageSummary.tsx rename to web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx index 50837f69..6443ddbf 100644 --- a/web-app/src/components/Level/LevelStageSummary.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx @@ -1,8 +1,8 @@ import { Icon } from '@alifd/next' import * as React from 'react' -import CC from '../../../../typings/context' +import * as T from 'typings/graphql' -import Markdown from '../Markdown' +import Markdown from '../../../../components/Markdown' const styles = { card: { @@ -24,17 +24,17 @@ const styles = { } interface Props { - stage: CC.StageWithStatus + stage: T.Stage onNext(): void } const LevelStageSummary = (props: Props) => { const { stage, onNext } = props - const { active } = stage.status + const active = stage.status === 'ACTIVE' return (
- {stage.content.text} + {stage.text || ''}
{active && }
diff --git a/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx b/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx new file mode 100644 index 00000000..785bc088 --- /dev/null +++ b/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx @@ -0,0 +1,76 @@ +import { Step } from '@alifd/next' +import * as React from 'react' +import * as T from 'typings/graphql' + +import Markdown from '../../../../components/Markdown' +import LevelStageSummary from './LevelStageSummary' + +const styles = { + card: {}, + content: { + padding: '0rem 1rem', + paddingBottom: '1rem', + }, + list: { + padding: '0rem', + }, + options: { + padding: '0rem 1rem', + }, + steps: { + padding: '1rem 0.5rem', + }, + title: {}, +} + +interface Props { + level: T.Level + onNext(): void +} + +const Level = ({ level, onNext }: Props) => { + if (!level || !level.stages) { + throw new Error('No level stages found') + } + const activeIndex = level.stages.findIndex((stage: T.Stage | null) => stage && stage.status === 'ACTIVE') || 0 + return ( +
+
+

{level.title}

+ {level.text || ''} +
+
+ + {level.stages.map((stage: T.Stage | null, index: number) => { + if (!stage) { + return null + } + const active = stage.status === 'ACTIVE' + const clickHandler = active + ? onNext + : () => { + /* empty */ + } + // note - must add click handler to title, content & step.item + // as all are separated components + return ( + + {stage.title || `Stage ${index + 1}`} + + } + content={} + onClick={clickHandler} + /> + ) + })} + +
+
+ ) +} + +export default Level diff --git a/web-app/src/containers/Tutorial/LevelPage/index.tsx b/web-app/src/containers/Tutorial/LevelPage/index.tsx new file mode 100644 index 00000000..aa4ba130 --- /dev/null +++ b/web-app/src/containers/Tutorial/LevelPage/index.tsx @@ -0,0 +1,50 @@ +import * as React from 'react' +import * as CR from 'typings' +import * as G from 'typings/graphql' + +import Level from './Level' + +interface LevelProps { + level: G.Level + send(action: string): void +} + +export const LevelSummaryPage = (props: LevelProps) => { + const onNext = (): void => { + props.send('NEXT') + } + return +} + +interface ContainerProps { + context: CR.MachineContext + send(action: string): void +} + +const LevelSummaryPageContainer = (props: ContainerProps) => { + const { tutorial, position, progress } = props.context + + if (!tutorial) { + throw new Error('Tutorial not found in LevelSummaryPageContainer') + } + + const level: G.Level | undefined = tutorial.version.levels.find((l: G.Level) => l.id === position.levelId) + + if (!level) { + throw new Error('Level not found in LevelSummaryPageContainer') + } + + level.stages.forEach((stage: G.Stage) => { + if (stage.id === position.stageId) { + stage.status = 'ACTIVE' + } else if (progress.stages[stage.id]) { + stage.status = 'COMPLETE' + } else { + stage.status = 'INCOMPLETE' + } + }) + + return +} + +export default LevelSummaryPageContainer diff --git a/web-app/src/containers/Tutorial/StagePage.tsx b/web-app/src/containers/Tutorial/StagePage.tsx deleted file mode 100644 index 10416207..00000000 --- a/web-app/src/containers/Tutorial/StagePage.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from 'react' -import DataContext from '../../utils/DataContext' -import Stage from '../../components/Stage' - -interface PageProps { - send(action: string): void -} - -const StagePage = (props: PageProps) => { - const { position, data, progress } = React.useContext(DataContext) - const { stageId } = position - const stage = data.stages[stageId] - - if (!stage) { - // may throw if no stage is supplied on restart - return
No Stage!
- } - - const stageComplete = progress.stages[stageId] || false - - const onContinue = (): void => { - props.send('STAGE_NEXT') - } - - // create step subset - const steps: { [stepId: string]: any } = {} - for (const stepId of stage.stepList) { - steps[stepId] = { - ...data.steps[stepId], - status: { - // flag progressed steps as complete - complete: progress.steps[stepId] || false, - // set active step to active - active: position.stepId === stepId, - }, - } - } - return -} - -export default StagePage diff --git a/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx b/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx new file mode 100644 index 00000000..5ecd71f8 --- /dev/null +++ b/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx @@ -0,0 +1,29 @@ +import * as React from 'react' +import Markdown from '../../../../../components/Markdown' + +const styles = { + // active: { + // backgroundColor: '#e6f7ff', + // }, + card: { + paddingRight: '1rem', + }, +} + +interface Props { + text?: string | null + hide: boolean +} + +const StepDescription = ({ text, hide }: Props) => { + if (hide) { + return null + } + return ( +
+ {text || ''} +
+ ) +} + +export default StepDescription diff --git a/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx b/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx new file mode 100644 index 00000000..6c35f5ae --- /dev/null +++ b/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx @@ -0,0 +1,78 @@ +import { Button, Step } from '@alifd/next' +import * as React from 'react' +import * as T from 'typings/graphql' + +import Markdown from '../../../../components/Markdown' +import StepDescription from './StepDescription' + +const styles = { + card: { + padding: 0, + }, + content: { + padding: '0rem 1rem', + paddingBottom: '1rem', + }, + options: { + padding: '0rem 1rem', + }, + steps: { + padding: '1rem 0rem', + }, + title: {}, +} + +interface Props { + stage: T.Stage + onContinue(): void + onSave(): void +} + +const Stage = ({ stage, onContinue, onSave }: Props) => { + if (!stage.steps) { + throw new Error('No Stage steps found') + } + + // grab the active step + const activeIndex: number = stage.steps.findIndex((step: T.Step | null) => { + return step && step.status === 'ACTIVE' + }) + + return ( +
+
+

{stage.title}

+ {stage.text || ''} +
+
+ + {stage.steps.map((step: T.Step | null, index: number) => { + if (!step) { + return null + } + const hide = step.status === 'INCOMPLETE' + return ( + } + /> + ) + })} + +
+ + {stage.status === 'COMPLETE' ? ( +
+ +
+ ) : ( +
+ +
+ )} +
+ ) +} + +export default Stage diff --git a/web-app/src/containers/Tutorial/StagePage/index.tsx b/web-app/src/containers/Tutorial/StagePage/index.tsx new file mode 100644 index 00000000..d677ebe6 --- /dev/null +++ b/web-app/src/containers/Tutorial/StagePage/index.tsx @@ -0,0 +1,63 @@ +import * as React from 'react' +import * as CR from 'typings' +import * as G from 'typings/graphql' + +import Stage from './Stage' + +interface PageProps { + context: CR.MachineContext + send(action: CR.Action): void +} + +const StageSummaryPageContainer = (props: PageProps) => { + const { tutorial, position, progress } = props.context + + if (!tutorial) { + throw new Error('Tutorial not found in StageSummaryPageContainer') + } + + const level: G.Level | undefined = tutorial.version.levels.find((l: G.Level) => l.id === position.levelId) + + if (!level) { + throw new Error('Level not found in StageSummaryPageContainer') + } + + const stage: G.Stage | undefined = level.stages.find((s: G.Stage) => s.id === position.stageId) + + if (!stage) { + throw new Error('Stage not found in StageSummaryPageContainer') + } + + const onContinue = (): void => { + props.send({ + type: 'STAGE_NEXT', + payload: { + stageId: position.stageId, + }, + }) + } + + const onSave = (): void => { + props.send({ + type: 'TEST_RUN', + payload: { + stepId: position.stepId, + }, + }) + } + + stage.steps.forEach((step: G.Step) => { + if (progress.steps[step.id]) { + step.status = 'COMPLETE' + } else if (step.id === position.stepId) { + step.status = 'ACTIVE' + } else { + step.status = 'INCOMPLETE' + } + }) + stage.status = progress.stages[position.stageId] ? 'COMPLETE' : 'ACTIVE' + + return +} + +export default StageSummaryPageContainer diff --git a/web-app/src/containers/Tutorial/SummaryPage.tsx b/web-app/src/containers/Tutorial/SummaryPage.tsx deleted file mode 100644 index e1eacc70..00000000 --- a/web-app/src/containers/Tutorial/SummaryPage.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import * as React from 'react' -import DataContext from '../../utils/DataContext' -import Summary from '../../components/Summary' - -interface PageProps { - send(action: string): void -} - -const SummaryPage = (props: PageProps) => { - const { data } = React.useContext(DataContext) - return props.send('NEXT')} /> -} - -export default SummaryPage diff --git a/web-app/src/containers/Tutorial/SummaryPage/Summary/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/Summary/index.tsx new file mode 100644 index 00000000..2daf7a38 --- /dev/null +++ b/web-app/src/containers/Tutorial/SummaryPage/Summary/index.tsx @@ -0,0 +1,35 @@ +import { Button } from '@alifd/next' +import * as React from 'react' + +const styles = { + card: { + // width: '20rem', + }, + content: { + padding: '0rem 1rem', + }, + options: { + padding: '1rem', + }, + title: {}, +} + +interface Props { + title: string + text: string + onNext(): void +} + +const Summary = ({ title, text, onNext }: Props) => ( +
+
+

{title}

+

{text}

+
+
+ +
+
+) + +export default Summary diff --git a/web-app/src/containers/Tutorial/SummaryPage/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/index.tsx new file mode 100644 index 00000000..95d17989 --- /dev/null +++ b/web-app/src/containers/Tutorial/SummaryPage/index.tsx @@ -0,0 +1,49 @@ +import * as React from 'react' +import * as CR from 'typings' +import { useQuery } from '@apollo/react-hooks' + +import queryTutorial from '../../../services/apollo/queries/tutorial' +import Summary from './Summary' +import ErrorView from '../../../components/Error' + +interface PageProps { + context: CR.MachineContext + send(action: CR.Action): void +} + +const SummaryPage = (props: PageProps) => { + const { tutorial } = props.context + + if (!tutorial) { + throw new Error('Tutorial not found in summary page') + } + const { loading, error, data } = useQuery(queryTutorial, { + fetchPolicy: 'network-only', // for debugging purposes + variables: { + tutorialId: tutorial.id, + version: tutorial.version.version, + }, + }) + + if (loading) { + return
Loading Summary...
+ } + + if (error) { + return + } + + const onNext = () => + props.send({ + type: 'LOAD_TUTORIAL', + payload: { + tutorial: data.tutorial, + }, + }) + + const { title, text } = data.tutorial + + return +} + +export default SummaryPage diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx deleted file mode 100644 index a0180919..00000000 --- a/web-app/src/containers/Tutorial/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import * as React from 'react' -import { send } from '../../utils/vscode' - -import Router from '../../components/Router' -import LoadingPage from '../LoadingPage' -import SummaryPage from './SummaryPage' -import LevelPage from './LevelPage' -import StagePage from './StagePage' -import CompletedPage from './CompletedPage' - -const { Route } = Router - -interface Props { - state: any -} - -const Tutorial = (props: Props) => { - return ( - - - - - - - - - - - - - - - - - - ) -} - -export default Tutorial diff --git a/web-app/src/index.tsx b/web-app/src/index.tsx index 6a448537..c2315d7f 100644 --- a/web-app/src/index.tsx +++ b/web-app/src/index.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import * as React from 'react' import ReactDOM from 'react-dom' import App from './App' diff --git a/web-app/src/services/api/index.tsx b/web-app/src/services/api/index.tsx deleted file mode 100644 index aa05ea0d..00000000 --- a/web-app/src/services/api/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import * as CR from 'typings' - -// temporary tutorials -import basicTutorial from '../../tutorials/basic' - -interface Options { - resource: string - params?: any -} - -const tutorialsData: { [key: string]: CR.Tutorial } = { - tutorialId: basicTutorial, -} - -// TODO: replace with fetch resource -export default async function fetch(options: Options): Promise { - console.log('options', options) - switch (options.resource) { - case 'getTutorialsSummary': - // list of ids with summaries - let data: { [id: string]: CR.TutorialSummary } = {} - for (const tutorial of Object.values(tutorialsData)) { - data[tutorial.id] = tutorial.data.summary - } - return data - case 'getTutorial': - // specific tutorial by id - return tutorialsData[options.params.id] - default: - throw new Error('Resource not found') - } -} diff --git a/web-app/src/services/apollo/index.ts b/web-app/src/services/apollo/index.ts new file mode 100644 index 00000000..6fb3d296 --- /dev/null +++ b/web-app/src/services/apollo/index.ts @@ -0,0 +1,13 @@ +import ApolloClient, {InMemoryCache} from 'apollo-boost' + +export const cache = new InMemoryCache() + +const client = new ApolloClient({ + uri: process.env.REACT_APP_GQL_URI, + headers: { + Authorization: process.env.REACT_APP_GQL_AUTH_TOKEN, + }, + cache, +}) + +export default client \ No newline at end of file diff --git a/web-app/src/services/apollo/queries/tutorial.ts b/web-app/src/services/apollo/queries/tutorial.ts new file mode 100644 index 00000000..fe4a27d1 --- /dev/null +++ b/web-app/src/services/apollo/queries/tutorial.ts @@ -0,0 +1,59 @@ +import {gql} from 'apollo-boost' + +export default gql` + query getTutorial($tutorialId: ID!, $version: String) { + tutorial(id: $tutorialId) { + id + title + text + codingLanguage + testRunner + repo { + uri + } + version(version: $version) { + version + coderoadVersion + levels { + id + title + text + setup { + id + commands + commits + files + } + stages { + id + title + text + setup { + id + commands + commits + files + } + steps { + id + title + text + setup { + id + commands + commits + files + } + solution { + id + commands + commits + files + } + } + } + } + } + } + } +` diff --git a/web-app/src/services/apollo/queries/tutorials.ts b/web-app/src/services/apollo/queries/tutorials.ts new file mode 100644 index 00000000..e7ed5001 --- /dev/null +++ b/web-app/src/services/apollo/queries/tutorials.ts @@ -0,0 +1,16 @@ +import { gql } from 'apollo-boost' + +export default gql` + query getTutorials { + tutorials { + id + title + text + codingLanguage + version { + version + coderoadVersion + } + } + } +` diff --git a/web-app/src/services/channel/index.ts b/web-app/src/services/channel/index.ts new file mode 100644 index 00000000..3b5895d7 --- /dev/null +++ b/web-app/src/services/channel/index.ts @@ -0,0 +1,63 @@ +import {Action} from 'typings' + +declare var acquireVsCodeApi: any + +interface ReceivedEvent { + data: Action +} + +class Channel { + constructor() { + // setup mock if browser only + // @ts-ignore + if (!window.acquireVsCodeApi) { + // @ts-ignore + require('./mock') + } + + const editor = acquireVsCodeApi() + this.editorSend = editor.postMessage + } + public machineSend = (action: Action | string) => { /* */} + public editorSend = (action: Action) => { /* */} + + public setMachineSend = (send: any) => { + this.machineSend = send + } + public receive = (event: ReceivedEvent) => { + console.log('CLIENT RECEIVE') + const action = event.data + + // @ts-ignore // ignore browser events from plugins + if (action.source) {return } + console.log(`CLIENT RECEIVE: ${action.type}`, action) + // messages from core + switch (action.type) { + case 'TUTORIAL_LOADED': + // send action to state machine + this.machineSend('TUTORIAL_LOADED') + console.log('send action to state machine') + return + case 'TEST_PASS': + // { type: 'TEST_PASS', payload: { stepId: string }} + this.machineSend(action) + console.log('test passed') + return + case 'TEST_FAIL': + this.machineSend(action) + return + case 'TEST_RUN': + console.log('TEST_RUN') + return + case 'ACTIONS_LOADED': + console.log('ACTIONS_LOADED') + return + default: + if (action.type) { + console.warn(`Unknown received action ${action.type}`, action) + } + } + } +} + +export default new Channel() diff --git a/web-app/src/services/channel/mock.ts b/web-app/src/services/channel/mock.ts new file mode 100644 index 00000000..6d373f02 --- /dev/null +++ b/web-app/src/services/channel/mock.ts @@ -0,0 +1,34 @@ +import {Action} from 'typings' +import channel from './index' + +const createReceiveEvent = (action: Action) => ({ + data: action +}) + +// mock vscode from client side development +// @ts-ignore +window.acquireVsCodeApi = () => ({ + postMessage(action: Action) { + console.log('postMessage', action) + + switch (action.type) { + case 'TUTORIAL_START': + return setTimeout(() => { + const receiveAction: Action = { + type: 'TUTORIAL_LOADED' + } + channel.receive(createReceiveEvent(receiveAction)) + }, 1000) + case 'TEST_RUN': + return setTimeout(() => { + const receiveAction: Action = { + type: 'TEST_PASS', + payload: action.payload, + } + channel.receive(createReceiveEvent(receiveAction)) + }, 1000) + default: + console.warn(`${action.type} not found in post message mock`) + } + } +}) \ No newline at end of file diff --git a/web-app/src/services/channel/receiver.ts b/web-app/src/services/channel/receiver.ts new file mode 100644 index 00000000..b4abe3d0 --- /dev/null +++ b/web-app/src/services/channel/receiver.ts @@ -0,0 +1,12 @@ +import channel from './index' + +const messageBusReceiver = () => { + // update state based on response from editor + const listener = 'message' + window.addEventListener(listener, channel.receive) + return () => { + window.removeEventListener(listener, channel.receive) + } +} + +export default messageBusReceiver \ No newline at end of file diff --git a/web-app/src/services/selectors/index.ts b/web-app/src/services/selectors/index.ts new file mode 100644 index 00000000..315726a6 --- /dev/null +++ b/web-app/src/services/selectors/index.ts @@ -0,0 +1,3 @@ +export * from './tutorial' +export * from './position' +export * from './progress' \ No newline at end of file diff --git a/web-app/src/services/selectors/position.ts b/web-app/src/services/selectors/position.ts new file mode 100644 index 00000000..ec7b0061 --- /dev/null +++ b/web-app/src/services/selectors/position.ts @@ -0,0 +1,22 @@ +import {createSelector} from 'reselect' +import * as G from 'typings/graphql' +import * as CR from 'typings' +import * as tutorial from './tutorial' + +export const defaultPosition = () => ({ + levelId: '', + stageId: '', + stepId: '' +}) + +export const initialPosition = createSelector( + tutorial.currentVersion, + (version: G.TutorialVersion) => { + const position: CR.Position = { + levelId: version.levels[0].id, + stageId: version.levels[0].stages[0].id, + stepId: version.levels[0].stages[0].steps[0].id, + } + return position + } +) diff --git a/web-app/src/services/selectors/progress.ts b/web-app/src/services/selectors/progress.ts new file mode 100644 index 00000000..649272f5 --- /dev/null +++ b/web-app/src/services/selectors/progress.ts @@ -0,0 +1,6 @@ +export const defaultProgress = () => ({ + levels: {}, + stages: {}, + steps: {}, + complete: false +}) \ No newline at end of file diff --git a/web-app/src/services/selectors/tutorial.ts b/web-app/src/services/selectors/tutorial.ts new file mode 100644 index 00000000..e653d7c6 --- /dev/null +++ b/web-app/src/services/selectors/tutorial.ts @@ -0,0 +1,58 @@ +import {MachineContext} from 'typings' +import * as G from 'typings/graphql' +import {createSelector} from 'reselect' + +export const currentTutorial = ({tutorial}: MachineContext): G.Tutorial => { + if (!tutorial) { + throw new Error('Tutorial not found') + } + return tutorial +} + +export const currentVersion = createSelector( + currentTutorial, + (tutorial: G.Tutorial) => { + if (!tutorial.version) { + throw new Error('Tutorial version not found') + } + return tutorial.version + }) + +export const currentLevel = (context: MachineContext): G.Level => createSelector( + currentVersion, + (version: G.TutorialVersion): G.Level => { + // merge in the updated position + // sent with the test to ensure consistency + const levels: G.Level[] = version.levels + + const level: G.Level | undefined = levels.find((l: G.Level) => l.id === context.position.levelId) + + if (!level) { + throw new Error('Level not found when selecting level') + } + return level + })(context) + +export const currentStage = (context: MachineContext): G.Stage => createSelector( + currentLevel, + (level: G.Level): G.Stage => { + const stages: G.Stage[] = level.stages + const stage: G.Stage | undefined = stages.find((s: G.Stage) => s.id === context.position.stageId) + if (!stage) { + throw new Error('No Stage found') + } + return stage + } +)(context) + +export const currentStep = (context: MachineContext): G.Step => createSelector( + currentStage, + (stage: G.Stage): G.Step => { + const steps: G.Step[] = stage.steps + const step: G.Step | undefined = steps.find((s: G.Step) => s.id === context.position.stepId) + if (!step) { + throw new Error('No Step found') + } + return step + } +)(context) diff --git a/web-app/src/services/state/actions/api.ts b/web-app/src/services/state/actions/api.ts new file mode 100644 index 00000000..9b2486cd --- /dev/null +++ b/web-app/src/services/state/actions/api.ts @@ -0,0 +1,7 @@ +import * as CR from 'typings' + +export default { + userTutorialComplete(context: CR.MachineContext) { + console.log('should update user tutorial as complete') + } +} \ No newline at end of file diff --git a/web-app/src/services/state/actions/context.ts b/web-app/src/services/state/actions/context.ts new file mode 100644 index 00000000..012abd53 --- /dev/null +++ b/web-app/src/services/state/actions/context.ts @@ -0,0 +1,248 @@ +import {assign, send} from 'xstate' +import * as G from 'typings/graphql' +import * as CR from 'typings' +import * as storage from '../storage' +import * as selectors from '../../selectors' + +export default { + setTutorial: assign({ + tutorial: (context: CR.MachineContext, event: CR.MachineEvent): any => { + const {tutorial} = event.payload + storage.tutorial.set(tutorial) + return tutorial + }, + }), + continueTutorial: assign({ + tutorial: (context: CR.MachineContext, event: CR.MachineEvent) => event.data.payload.tutorial, + progress: (context: CR.MachineContext, event: CR.MachineEvent) => event.data.payload.progress, + position: (context: CR.MachineContext, event: CR.MachineEvent) => event.data.payload.position, + }), + // @ts-ignore + initPosition: assign({ + position: (context: CR.MachineContext, event: CR.MachineEvent): CR.Position => { + const position: CR.Position = selectors.initialPosition(event.payload) + storage.position.set(position) + return position + }, + }), + // @ts-ignore + updateStepPosition: assign({ + position: (context: CR.MachineContext, event: CR.MachineEvent): CR.Position => { + + // TODO: calculate from progress + + const {position} = context + // merge in the updated position + // sent with the test to ensure consistency + const stage: G.Stage = selectors.currentStage(context) + const steps: G.Step[] = stage.steps + + // final step but not completed + if (steps[steps.length - 1].id === position.stepId) { + return position + } + + const stepIndex = steps.findIndex((s: G.Step) => s.id === position.stepId) + + const step: G.Step = steps[stepIndex + 1] + + const nextPosition: CR.Position = { + ...position, + stepId: step.id + } + + storage.position.set(nextPosition) + + return nextPosition + }, + }), + // @ts-ignore + updateStagePosition: assign({ + position: (context: CR.MachineContext): CR.Position => { + const {position} = context + + const level: G.Level = selectors.currentLevel(context) + const stages: G.Stage[] = level.stages + + const stageIndex = stages.findIndex((s: G.Stage) => s.id === position.stageId) + const stage: G.Stage = stages[stageIndex + 1] + + const nextPosition: CR.Position = { + ...position, + stageId: stage.id, + stepId: stage.steps[0].id, + } + + storage.position.set(nextPosition) + + return nextPosition + }, + }), + // @ts-ignore + updateLevelPosition: assign({ + position: (context: CR.MachineContext): CR.Position => { + const {position} = context + const version = selectors.currentVersion(context) + // merge in the updated position + // sent with the test to ensure consistency + const levels: G.Level[] = version.levels + + const levelIndex = levels.findIndex((l: G.Level) => l.id === position.levelId) + const level: G.Level = levels[levelIndex + 1] + + const nextPosition: CR.Position = { + levelId: level.id, + stageId: level.stages[0].id, + stepId: level.stages[0].steps[0].id, + } + + storage.position.set(nextPosition) + + return nextPosition + }, + }), + // @ts-ignore + updateStepProgress: assign({ + progress: (context: CR.MachineContext, event: CR.MachineEvent): CR.Progress => { + + // update progress by tracking completed + const currentProgress: CR.Progress = context.progress + + // TODO: should use event id, to verify not multiple successes jumping one + // const stepId = event.payload.stepId + const {stepId} = context.position + + currentProgress.steps[stepId] = true + + storage.progress.set(currentProgress) + + return currentProgress + }, + }), + // @ts-ignore + updateStageProgress: assign({ + progress: (context: CR.MachineContext, event: CR.MachineEvent): CR.Progress => { + // update progress by tracking completed + const {progress, position} = context + + const stageId: string = position.stageId + + progress.stages[stageId] = true + + storage.progress.set(progress) + + return progress + }, + }), + // @ts-ignore + updatePosition: assign({ + position: (context: CR.MachineContext, event: CR.MachineEvent): CR.Progress => { + const {position} = event.payload + return position + } + }), + loadNext: send((context: CR.MachineContext): CR.Action => { + const {position, progress} = context + + const version = selectors.currentVersion(context) + const level = selectors.currentLevel(context) + const stage = selectors.currentStage(context) + + const steps: G.Step[] = stage.steps + + const stepIndex = steps.findIndex((s: G.Step) => s.id === position.stepId) + const stepComplete = progress.steps[position.stepId] + const finalStep = (stepIndex > -1 && stepIndex === steps.length - 1) + const hasNextStep = (!finalStep && !stepComplete) + + + // NEXT STEP + if (hasNextStep) { + const nextPosition = {...position, stepId: steps[stepIndex + 1].id} + return {type: 'NEXT_STEP', payload: {position: nextPosition}} + } + + // has next stage? + + const {stages} = level + const stageIndex = stages.findIndex((s: G.Stage) => s.id === position.stageId) + const finalStage = (stageIndex > -1 && stageIndex === stages.length - 1) + const hasNextStage = (!finalStage) + + // NEXT STAGE + if (hasNextStage) { + const nextStage = stages[stageIndex + 1] + const nextPosition = { + levelId: position.levelId, + stageId: nextStage.id, + stepId: nextStage.steps[0].id, + } + return {type: 'NEXT_STAGE', payload: {position: nextPosition}} + } + + // has next level? + + const {levels} = version + const levelIndex = levels.findIndex((l: G.Level) => l.id === position.levelId) + const finalLevel = (levelIndex > -1 && levelIndex === levels.length - 1) + const hasNextLevel = (!finalLevel) + + // NEXT LEVEL + if (hasNextLevel) { + const nextLevel = levels[levelIndex + 1] + const nextStage = nextLevel.stages[0] + const nextPosition = { + levelId: nextLevel.id, + stageId: nextStage.id, + stepId: nextStage.steps[0].id, + } + return {type: 'NEXT_LEVEL', payload: {position: nextPosition}} + } + + // COMPLETED + return {type: 'COMPLETED'} + }), + stepNext: send((context: CR.MachineContext): CR.Action => { + const {position, progress} = context + + const stage: G.Stage = selectors.currentStage(context) + + const {steps} = stage + // TODO: verify not -1 + const stepIndex = steps.findIndex((s: G.Step) => s.id === position.stepId) + const finalStep = stepIndex === steps.length - 1 + const stepComplete = progress.steps[position.stepId] + // not final step, or final step but not complete + const hasNextStep = !finalStep || !stepComplete + + if (hasNextStep) { + const nextStep = steps[stepIndex + 1] + return { + type: 'LOAD_NEXT_STEP', + payload: { + step: nextStep + } + } + } else { + return { + type: 'STAGE_COMPLETE' + } + } + }), + reset: assign({ + tutorial() { + storage.tutorial.set(null) + return null + }, + progress(): CR.Progress { + const progress: CR.Progress = selectors.defaultProgress() + storage.progress.set(progress) + return progress + }, + position(): CR.Position { + const position: CR.Position = selectors.defaultPosition() + storage.position.set(position) + return position + } + }) +} \ No newline at end of file diff --git a/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts new file mode 100644 index 00000000..14d5133a --- /dev/null +++ b/web-app/src/services/state/actions/editor.ts @@ -0,0 +1,64 @@ +import * as G from 'typings/graphql' +import * as CR from 'typings' +import * as selectors from '../../selectors' +import channel from '../../channel' + +export default { + initializeTutorial(context: CR.MachineContext, event: CR.MachineEvent) { + // setup test runner and git + const {tutorial} = event.data.payload + if (!tutorial) { + throw new Error('Invalid tutorial for tutorial config') + } + const payload = { + codingLanguage: tutorial.codingLanguage, + testRunner: tutorial.testRunner, + repo: tutorial.repo, + } + console.log('EDITOR: TUTORIAL_CONFIG', payload) + channel.editorSend({ + type: 'TUTORIAL_CONFIG', + payload, + }) + }, + testStart(context: CR.MachineContext, event: CR.MachineEvent) { + console.log('EDITOR: TEST_RUN') + const {stepId} = event.payload + channel.editorSend({ + type: 'TEST_RUN', + payload: { + stepId, + } + }) + }, + loadLevel(context: CR.MachineContext): void { + const level: G.Level = selectors.currentLevel(context) + if (level.setup) { + // load step actions + channel.editorSend({ + type: 'SETUP_ACTIONS', + payload: level.setup, + }) + } + }, + loadStage(context: CR.MachineContext): void { + const stage: G.Stage = selectors.currentStage(context) + if (stage.setup) { + // load step actions + channel.editorSend({ + type: 'SETUP_ACTIONS', + payload: stage.setup, + }) + } + }, + loadStep(context: CR.MachineContext): void { + const step: G.Step = selectors.currentStep(context) + if (step.setup) { + // load step actions + channel.editorSend({ + type: 'SETUP_ACTIONS', + payload: step.setup, + }) + } + }, +} \ No newline at end of file diff --git a/web-app/src/services/state/actions/index.ts b/web-app/src/services/state/actions/index.ts new file mode 100644 index 00000000..0af5449f --- /dev/null +++ b/web-app/src/services/state/actions/index.ts @@ -0,0 +1,9 @@ +import editorActions from './editor' +import contextActions from './context' +import apiActions from './api' + +export default { + ...editorActions, + ...contextActions, + ...apiActions, +} diff --git a/web-app/src/services/state/actions/invoke.ts b/web-app/src/services/state/actions/invoke.ts new file mode 100644 index 00000000..9ffe965b --- /dev/null +++ b/web-app/src/services/state/actions/invoke.ts @@ -0,0 +1,81 @@ +import * as storage from '../storage' +import * as CR from 'typings' +import * as G from 'typings/graphql' +import client from '../../apollo' +import tutorialQuery from '../../apollo/queries/tutorial' + +export const newOrContinue = async (context: CR.MachineContext) => { + const [tutorial, progress] = await Promise.all([ + storage.tutorial.get(), + storage.progress.get() + ]) + + const hasExistingTutorial: boolean = (!!tutorial && !!progress && !progress.complete && !!tutorial.id) + + if (!hasExistingTutorial) { + return Promise.reject() + } + + // Calculate position based on progress + + // @ts-ignore + const level = tutorial.version.levels.find((l: G.Level) => !progress.levels[l.id]) + if (!level) { + // tutorial complete + return Promise.reject() + } + + // @ts-ignore + const stage = level.stages.find((s: G.Stage) => !progress.stages[s.id]) + if (!stage) { + // something went wrong + return Promise.reject() + } + + // @ts-ignore + const step = stage.steps.find((s: G.Step) => !progress.steps[s.id]) + if (!step) { + return Promise.reject() + } + + const position = { + levelId: level.id, + stageId: stage.id, + stepId: step.id, + } + + return { + type: 'CONTINUE', + payload: { + tutorial, + position, + progress + } + } +} + +export const loadTutorial = async (context: CR.MachineContext) => { + if (!context.tutorial) { + throw new Error('Tutorial not available to load') + } + + const result = await client.query({ + query: tutorialQuery, + variables: { + tutorialId: context.tutorial.id, + version: context.tutorial.version.version, + } + }) + .catch((error: Error) => { + return Promise.reject(`Failed to load tutorial config ${error.message}`) + }) + if (!result || !result.data) { + return Promise.reject('No tutorial returned from tutorial config query') + } + + const {data} = result + return { + type: 'TUTORIAL_LOADED', + payload: data + } +} \ No newline at end of file diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts new file mode 100644 index 00000000..190c091d --- /dev/null +++ b/web-app/src/services/state/machine.ts @@ -0,0 +1,176 @@ +import {Machine, MachineOptions} from 'xstate' +import * as CR from 'typings' +import actions from './actions' +import * as invoke from './actions/invoke' + +const options: MachineOptions = { + // @ts-ignore + actions +} + +export const machine = Machine( + { + id: 'root', + initial: 'Start', + context: { + tutorial: null, + position: {levelId: '', stageId: '', stepId: ''}, + progress: { + levels: {}, + stages: {}, + steps: {}, + complete: false + } + }, + states: { + Start: { + initial: 'Startup', + states: { + Startup: { + invoke: { + id: 'newOrContinue', + src: invoke.newOrContinue, + onDone: { + target: 'ContinueTutorial', + actions: ['continueTutorial'] + }, + onError: 'SelectTutorial' + }, + }, + SelectTutorial: { + id: 'start-new-tutorial', + on: { + TUTORIAL_START: { + target: '#tutorial', + actions: ['setTutorial'], + }, + }, + }, + ContinueTutorial: { + on: { + TUTORIAL_START: '#tutorial', + }, + }, + }, + }, + Tutorial: { + id: 'tutorial', + initial: 'Initialize', + states: { + Initialize: { + invoke: { + id: 'loadTutorial', + src: invoke.loadTutorial, + onDone: { + target: 'Summary', + actions: ['initializeTutorial'] + }, + onError: 'Initialize' // TODO: handle load tutorial error + }, + }, + LoadNext: { + id: 'tutorial-load-next', + onEntry: ['loadNext'], + on: { + NEXT_STEP: { + target: 'Stage', + actions: ['updatePosition'] + }, + NEXT_STAGE: { + target: 'Stage', + actions: ['updatePosition'] + }, + NEXT_LEVEL: { + target: 'Level', + actions: ['updatePosition'] + }, + COMPLETED: '#completed-tutorial' + } + }, + + Summary: { + on: { + LOAD_TUTORIAL: { + target: 'Level', + actions: ['initPosition', 'setTutorial'] + } + }, + }, + Level: { + onEntry: ['loadLevel'], + on: { + NEXT: 'Stage', + BACK: 'Summary', + }, + }, + Stage: { + id: 'tutorial-stage', + onEntry: ['loadStage', 'loadStep'], + initial: 'Normal', + states: { + Normal: { + on: { + TEST_RUN: 'TestRunning', + STEP_SOLUTION_LOAD: { + actions: ['callSolution'], + }, + }, + }, + TestRunning: { + onEntry: ['testStart'], + on: { + TEST_PASS: { + target: 'TestPass', + actions: ['updateStepProgress'] + }, + TEST_FAIL: 'TestFail', + }, + }, + TestPass: { + onExit: ['updateStepPosition'], + after: { + 1000: 'StepNext', + }, + }, + TestFail: { + onEntry: ['testFail'], + after: { + 0: 'Normal', + }, + }, + StepNext: { + onEntry: ['stepNext'], + on: { + LOAD_NEXT_STEP: { + target: 'Normal', + actions: ['loadStep'] + }, + STAGE_COMPLETE: { + target: "StageComplete", + actions: ['updateStageProgress'] + } + } + }, + StageComplete: { + on: { + STAGE_NEXT: '#tutorial-load-next', + }, + }, + }, + }, + Completed: { + id: 'completed-tutorial', + onEntry: ['userTutorialComplete'], + on: { + SELECT_TUTORIAL: { + target: '#start-new-tutorial', + actions: ['reset'] + } + } + }, + }, + }, + }, + }, options) + +export default machine diff --git a/web-app/src/services/state/storage.ts b/web-app/src/services/state/storage.ts new file mode 100644 index 00000000..18fdb438 --- /dev/null +++ b/web-app/src/services/state/storage.ts @@ -0,0 +1,36 @@ +import * as CR from 'typings' +import * as G from 'typings/graphql' + +// localStorage + +class Storage { + private key: string + // TODO: replace somehow with localStorage + // window.localStorage not working inside of vscode + private storage = { + getItem(key: string) { + return null + }, + setItem(key: string, value: string) { + return + } + } + constructor(key: string) { + this.key = key + } + public get = async (): Promise => { + const value = await this.storage.getItem(this.key) + if (value) { + return JSON.parse(value) + } + return null + } + public set = (value: T): void => { + const stringValue = JSON.stringify(value) + this.storage.setItem(this.key, stringValue) + } +} + +export const tutorial = new Storage('coderoad:tutorial') +export const position = new Storage('coderoad:position') +export const progress = new Storage('coderoad:progress') diff --git a/web-app/src/services/xstate-react/index.ts b/web-app/src/services/xstate-react/index.ts new file mode 100644 index 00000000..99a3774b --- /dev/null +++ b/web-app/src/services/xstate-react/index.ts @@ -0,0 +1,145 @@ +import {useState, useRef, useEffect} from 'react' +import { + interpret, + EventObject, + StateMachine, + State, + Interpreter, + InterpreterOptions, + MachineOptions +} from 'xstate' + +interface UseMachineOptions { + /** + * If provided, will be merged with machine's context. + */ + context?: Partial + /** + * If `true`, service will start immediately (before mount). + */ + immediate: boolean +} + +const defaultOptions = { + immediate: false +} + +export function useMachine( + machine: StateMachine, + options: Partial & + Partial> & + Partial> = defaultOptions +): [ + State, + Interpreter['send'], + Interpreter + ] { + const { + context, + guards, + actions, + activities, + services, + delays, + immediate, + ...interpreterOptions + } = options + + const machineConfig = { + context, + guards, + actions, + activities, + services, + delays + } + + // Reference the machine + const machineRef = useRef | null>(null) + + // Create the machine only once + // See https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily + if (machineRef.current === null) { + machineRef.current = machine.withConfig(machineConfig, { + ...machine.context, + ...context + } as TContext) + } + + // Reference the service + const serviceRef = useRef | null>(null) + + // Create the service only once + if (serviceRef.current === null) { + serviceRef.current = interpret( + machineRef.current, + interpreterOptions + ).onTransition(state => { + // Update the current machine state when a transition occurs + if (state.changed) { + setCurrent(state) + } + }) + } + + const service = serviceRef.current + + // Make sure actions are kept updated when they change. + // This mutation assignment is safe because the service instance is only used + // in one place -- this hook's caller. + useEffect(() => { + Object.assign(service.machine.options.actions, actions) + }, [service.machine.options.actions, actions]) + + // Start service immediately (before mount) if specified in options + if (immediate) { + service.start() + } + + // Keep track of the current machine state + const [current, setCurrent] = useState(service.initialState) + + useEffect(() => { + // Start the service when the component mounts. + // Note: the service will start only if it hasn't started already. + service.start() + + return () => { + // Stop the service when the component unmounts + service.stop() + } + }, [service]) + + return [current, service.send, service] +} + +export function useService( + service: Interpreter +): [ + State, + Interpreter['send'], + Interpreter + ] { + const [current, setCurrent] = useState(service.state) + + useEffect(() => { + // Set to current service state as there is a possibility + // of a transition occurring between the initial useState() + // initialization and useEffect() commit. + setCurrent(service.state) + + const listener = (state: State) => { + if (state.changed) { + setCurrent(state) + } + } + + service.onTransition(listener) + + return () => { + service.off(listener) + } + }, [service]) + + return [current, service.send, service] +} diff --git a/web-app/src/tutorials/basic.ts b/web-app/src/tutorials/basic.ts deleted file mode 100644 index e514cdc7..00000000 --- a/web-app/src/tutorials/basic.ts +++ /dev/null @@ -1,180 +0,0 @@ -import * as CR from 'typings' - -const basic: CR.Tutorial = { - id: '1', - meta: { - version: '0.1.0', - repo: 'https://github.com/ShMcK/coderoad-tutorial-basic.git', - createdBy: 'shmck', - createdAt: 'Sat, 11 May 2019 18:25:24 GMT', - updatedBy: 'shmck', - updatedAt: 'Sat, 11 May 2019 18:25:24 GMT', - contributors: ['shmck'], - languages: ['javascript'], - testRunner: 'jest', - }, - data: { - summary: { - title: 'Basic Test', - description: 'A basic coding skills example', - levelList: ['level1Id', 'level2Id'], - }, - levels: { - level1Id: { - stageList: ['stage1Id', 'stage2Id'], - content: { - title: 'Operators', - text: 'A description of this stage', - }, - actions: { - setup: { - commits: ['aab5f3d'], - commands: ['npm install'], - } - } - }, - level2Id: { - stageList: ['a'], - content: { - title: 'Logic', - text: 'Some basic logic in level 2' - } - } - }, - stages: { - stage1Id: { - stepList: ['step1Id', 'step2Id', 'step3Id'], - content: { - title: 'Sum Stage', - text: 'A description of this stage', - }, - }, - stage2Id: { - stepList: ['1', '2'], - content: { - title: 'Second Stage', - text: 'Going into round 2' - } - }, - a: { - stepList: ['a1', 'a2'], - content: { - title: 'Part 1', - text: 'Going into round 1' - } - }, - }, - steps: { - step1Id: { - content: { - title: 'Sum', - text: 'Write a function `add` that adds two numbers together', - }, - actions: { - setup: { - commits: ['8fa5ad5'], - files: ['src/sum.js'], - }, - solution: { - commits: ['abe3123'], - }, - }, - hints: [], - }, - step2Id: { - content: { - title: 'Multiply', - text: 'Write a function `multiply` that multiplies two numbers together', - }, - actions: { - setup: { - commits: ['0e01df8'], - files: ['src/multiply.js'], - }, - solution: { - commits: ['1b9a520'], - }, - }, - hints: [], - }, - step3Id: { - content: { - title: 'Divide', - text: 'Write a function `divide` that divides', - }, - actions: { - setup: { - commits: ['40802cf'], - files: ['src/divide.js'], - }, - solution: { - commits: ['b321a3d'], - }, - }, - hints: [], - }, - 1: { - content: { - title: 'Modulo', - text: 'Modulo `%` it up' - }, - actions: { - setup: { - commits: ['4db40b4'], - files: ['src/modulo.js'], - }, - solution: { - commits: ['3580c9d'] - } - } - }, - 2: { - content: { - title: 'Power', - text: 'Power up with `**` powers' - }, - actions: { - setup: { - commits: ['abc1e2d'], - files: ['src/power.js'], - }, - solution: { - commits: ['5d28c25'] - } - } - }, - a1: { - content: { - title: 'Hello', - text: 'Return the word "hello"' - }, - actions: { - setup: { - commits: ['2faa934'], - files: ['src/word.js'], - }, - solution: { - commits: ['29f6b0d'] - } - } - }, - a2: { - content: { - title: 'Bye', - text: 'Return the word "bye"' - }, - actions: { - setup: { - commits: ['b1894dd'], - files: ['src/word.js'], - }, - solution: { - commits: ['0e83af8'] - } - } - }, - }, - }, -} - -export default basic diff --git a/web-app/src/utils/DataContext.tsx b/web-app/src/utils/DataContext.tsx deleted file mode 100644 index ffee2cfc..00000000 --- a/web-app/src/utils/DataContext.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from 'react' -import * as CR from 'typings' - -export const initialState = { SelectTutorial: 'Initial ' } -export const initialData: CR.MachineContext = { - position: { levelId: '', stageId: '', stepId: '' }, - data: { - summary: { - title: '', - description: '', - levelList: [], - }, - levels: {}, - stages: {}, - steps: {}, - }, - progress: { levels: {}, stages: {}, steps: {}, complete: false }, -} - -const DataContext = React.createContext({ state: initialState, ...initialData }) - -export default DataContext diff --git a/web-app/src/utils/vscode.ts b/web-app/src/utils/vscode.ts deleted file mode 100644 index 97cc804d..00000000 --- a/web-app/src/utils/vscode.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Action } from 'typings' - -declare var acquireVsCodeApi: any - -const vscode = acquireVsCodeApi() - -export function send(event: string | Action) { - return vscode.postMessage(event) -} diff --git a/web-app/stories/Continue.stories.tsx b/web-app/stories/Continue.stories.tsx index 92d413ee..2aaf9bf4 100644 --- a/web-app/stories/Continue.stories.tsx +++ b/web-app/stories/Continue.stories.tsx @@ -3,7 +3,17 @@ import React from 'react' import { storiesOf } from '@storybook/react' import { action } from '@storybook/addon-actions' -import { ContinuePage } from '../src/containers/Continue' -import demo from './data/basic' +import apolloProvider from './utils/ApolloDecorator' +import ContinuePageContainer, { ContinuePage } from '../src/containers/Continue' -storiesOf('Continue', module).add('Page', () => ) +storiesOf('Continue', module) + .add('Page', () => { + const tutorial = { + id: '1', + title: 'Example Tutorial', + text: 'Some summary', + } + return + }) + .addDecorator(apolloProvider) + .add('Container', () => ) diff --git a/web-app/stories/Level.stories.tsx b/web-app/stories/Level.stories.tsx index 6e87383f..46b8f7c1 100644 --- a/web-app/stories/Level.stories.tsx +++ b/web-app/stories/Level.stories.tsx @@ -1,11 +1,14 @@ import React from 'react' import { object, withKnobs } from '@storybook/addon-knobs' +import { action } from '@storybook/addon-actions' import { linkTo } from '@storybook/addon-links' import { storiesOf } from '@storybook/react' import SideBarDecorator from './utils/SideBarDecorator' -import Level from '../src/components/Level' +import apolloProvider from './utils/ApolloDecorator' +import Level from '../src/containers/Tutorial/LevelPage/Level' +import LevelSummaryPageContainer, { LevelSummaryPage } from '../src/containers/Tutorial/LevelPage' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) @@ -13,48 +16,67 @@ storiesOf('Tutorial SideBar', module) .add('Level', () => ( )) + .add('Level Summary', () => { + return ( + + ) + }) + .addDecorator(apolloProvider) + .add('Level Summary Container', () => { + return + }) diff --git a/web-app/stories/New.stories.tsx b/web-app/stories/New.stories.tsx index f82ef46e..f8a9eeee 100644 --- a/web-app/stories/New.stories.tsx +++ b/web-app/stories/New.stories.tsx @@ -1,8 +1,36 @@ import React from 'react' - import { storiesOf } from '@storybook/react' import { action } from '@storybook/addon-actions' +import * as T from '../../typings/graphql' +import apolloProvider from './utils/ApolloDecorator' -import { NewPage } from '../src/containers/New' +import TutorialList from '../src/containers/New/TutorialList' +import TutorialItem from '../src/containers/New/TutorialList/TutorialItem' +import NewContainer from '../src/containers/New' -storiesOf('New', module).add('Page', () => ) +storiesOf('New', module) + .add('Tutorial', () => { + const tutorial = { + id: '1', + title: 'Tutorial 1', + text: 'The first one', + } + return + }) + .add('TutorialList', () => { + const tutorialList = [ + { + id: '1', + title: 'Tutorial 1', + text: 'The first one', + }, + { + id: '2', + title: 'Tutorial 2', + text: 'The second one', + }, + ] + return + }) + .addDecorator(apolloProvider) + .add('Container', () => ) diff --git a/web-app/stories/Stage.stories.tsx b/web-app/stories/Stage.stories.tsx index 7b22dda1..b4013fb2 100644 --- a/web-app/stories/Stage.stories.tsx +++ b/web-app/stories/Stage.stories.tsx @@ -1,56 +1,53 @@ import React from 'react' import { action } from '@storybook/addon-actions' -import { boolean, object, withKnobs } from '@storybook/addon-knobs' +import { object, withKnobs } from '@storybook/addon-knobs' import { storiesOf } from '@storybook/react' -import demo from './data/basic' import SideBarDecorator from './utils/SideBarDecorator' -import Stage from '../src/components/Stage' +import Stage from '../src/containers/Tutorial/StagePage/Stage' +import StageContainer from '../src/containers/Tutorial/StagePage' +import ApolloDecorator from './utils/ApolloDecorator' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) .addDecorator(withKnobs) .add('Stage', () => ( )) + .addDecorator(ApolloDecorator) + .add('Stage Summary Container', () => ) diff --git a/web-app/stories/Step.stories.tsx b/web-app/stories/Step.stories.tsx index 982ad4b9..dfede1c9 100644 --- a/web-app/stories/Step.stories.tsx +++ b/web-app/stories/Step.stories.tsx @@ -1,54 +1,36 @@ import React from 'react' -import { object, withKnobs } from '@storybook/addon-knobs' +import { boolean, text, withKnobs } from '@storybook/addon-knobs' import { storiesOf } from '@storybook/react' import SideBarDecorator from './utils/SideBarDecorator' -import Step from '../src/components/Stage/StepDescription' +import Step from '../src/containers/Tutorial/StagePage/Stage/StepDescription' const stepText = 'This is a long paragraph of step text intended to wrap around the side after a short period of writing to demonstrate text wrap among other things' +const paragraphText = `Markdown included \`code\`, *bold*, & _italics_. + \`\`\`javascript + var a = 12 + + function example(a) { + return a + 1 + } + \`\`\` + + Headers can be added: + + # h1 + ## h2 + ### h3 + #### h4 + ##### h5 + + Emojis: :) :| :( + ` + storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) .addDecorator(withKnobs) - .add('Step', () => ( - - )) - .add('Step Markdown', () => ( - - )) + .add('Step', () => ) + .add('Step Markdown', () => ) diff --git a/web-app/stories/Summary.stories.tsx b/web-app/stories/Summary.stories.tsx index 3b5d61ce..df547406 100644 --- a/web-app/stories/Summary.stories.tsx +++ b/web-app/stories/Summary.stories.tsx @@ -1,22 +1,13 @@ import React from 'react' -import { object, withKnobs } from '@storybook/addon-knobs' import { linkTo } from '@storybook/addon-links' import { storiesOf } from '@storybook/react' import SideBarDecorator from './utils/SideBarDecorator' -import Summary from '../src/components/Summary' -import demo from './data/basic' +import Summary from '../src/containers/Tutorial/SummaryPage/Summary' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) - .addDecorator(withKnobs) .add('Summary', () => ( - + )) diff --git a/web-app/stories/utils/ApolloDecorator.tsx b/web-app/stories/utils/ApolloDecorator.tsx new file mode 100644 index 00000000..d49def86 --- /dev/null +++ b/web-app/stories/utils/ApolloDecorator.tsx @@ -0,0 +1,15 @@ +import React, { Fragment } from 'react' +import client from '../../src/services/apollo' +import { ApolloProvider } from '@apollo/react-hooks' + +function StorybookProvider({ children }) { + return ( + + {children} + + ) +} + +export default story => { + return {story()} +} diff --git a/web-app/tsconfig.paths.json b/web-app/tsconfig.paths.json index 1ae54a31..8b9fea6b 100644 --- a/web-app/tsconfig.paths.json +++ b/web-app/tsconfig.paths.json @@ -3,7 +3,8 @@ "baseUrl": "src", "rootDirs": ["src", "stories"], "paths": { - "typings": ["../../typings/index.d.ts"] + "typings": ["../../typings/index.d.ts"], + "typings/graphql": ["../../typings/graphql.d.ts"] }, "allowSyntheticDefaultImports": true },