From 9004e358f9740ff7b312c509945b066cd39d85af Mon Sep 17 00:00:00 2001 From: shmck Date: Tue, 13 Aug 2019 22:23:31 -0700 Subject: [PATCH 01/64] setup server api --- .env | 1 + package-lock.json | 38 +++++++++++++++++++++++-- package.json | 3 ++ src/services/api/api.ts | 13 +++++++++ src/services/api/gql/query/tutorial.gql | 16 +++++++++++ src/services/api/index.ts | 2 +- 6 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 .env create mode 100644 src/services/api/api.ts create mode 100644 src/services/api/gql/query/tutorial.gql diff --git a/.env b/.env new file mode 100644 index 00000000..b4851fcc --- /dev/null +++ b/.env @@ -0,0 +1 @@ +API_URL=http://localhost:3000/graphql \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 27c37cfb..02fc807b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,14 @@ "js-tokens": "^4.0.0" } }, + "@types/dotenv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", + "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "requires": { + "@types/node": "*" + } + }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", @@ -33,8 +41,7 @@ "@types/node": { "version": "12.7.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==", - "dev": true + "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==" }, "agent-base": { "version": "4.3.0", @@ -107,6 +114,15 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -307,6 +323,11 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "dotenv": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", + "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -408,6 +429,14 @@ "locate-path": "^3.0.0" } }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -556,6 +585,11 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, "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", diff --git a/package.json b/package.json index df6dbb07..dc74208e 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "test": "npm run build && node ./node_modules/vscode/bin/test" }, "devDependencies": { + "@types/dotenv": "^6.1.1", "@types/mocha": "^5.2.7", "@types/node": "^12.7.1", "concurrently": "^4.1.1", @@ -61,6 +62,8 @@ "typescript": "^3.5.3" }, "dependencies": { + "axios": "^0.19.0", + "dotenv": "^8.0.0", "vscode": "^1.1.36", "xstate": "^4.6.7" }, diff --git a/src/services/api/api.ts b/src/services/api/api.ts new file mode 100644 index 00000000..c51faa37 --- /dev/null +++ b/src/services/api/api.ts @@ -0,0 +1,13 @@ +import axios from 'axios' + +require('dotenv').config() + +const api = axios.create({ + baseURL: process.env.API_URL, + method: 'POST', + headers: { + 'Content-Type': 'application/graphql', + } +}) + +export default api \ No newline at end of file diff --git a/src/services/api/gql/query/tutorial.gql b/src/services/api/gql/query/tutorial.gql new file mode 100644 index 00000000..9397a9c6 --- /dev/null +++ b/src/services/api/gql/query/tutorial.gql @@ -0,0 +1,16 @@ +query getTutorial($tutorialId: ID!) { + tutorial(id: $tutorialId) { + id + testRunner + codingLanguage + repo { + uri + branch + } + latestVersion { + version + coderoadVersion + data + } + } +} diff --git a/src/services/api/index.ts b/src/services/api/index.ts index 8429ba4f..dbcac727 100644 --- a/src/services/api/index.ts +++ b/src/services/api/index.ts @@ -12,7 +12,7 @@ const tutorialsData: { [key: string]: CR.Tutorial } = { [basicTutorial.id]: basicTutorial, } -// TODO: replace with fetch resource +// TODO: replace with fetch resource in ./api.ts export default async function fetch(options: Options): Promise { switch (options.resource) { case 'getTutorialsSummary': From 4bd3fad30add813f356fd3ef22d093907e80b7d6 Mon Sep 17 00:00:00 2001 From: shmck Date: Tue, 13 Aug 2019 22:31:55 -0700 Subject: [PATCH 02/64] setup apollo on web --- web-app/.env | 1 - web-app/package-lock.json | 211 ++++++++++++++++++- web-app/package.json | 3 + web-app/src/App.tsx | 16 +- web-app/src/containers/Continue/tutorial.gql | 24 +++ web-app/src/containers/New/tutorials.gql | 17 ++ web-app/src/services/api/index.tsx | 2 +- web-app/src/services/apollo/index.ts | 7 + 8 files changed, 271 insertions(+), 10 deletions(-) delete mode 100644 web-app/.env create mode 100644 web-app/src/containers/Continue/tutorial.gql create mode 100644 web-app/src/containers/New/tutorials.gql create mode 100644 web-app/src/services/apollo/index.ts 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/package-lock.json b/web-app/package-lock.json index 4dac4fd7..33fe4d0a 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -25,6 +25,40 @@ } } }, + "@apollo/react-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@apollo/react-common/-/react-common-3.0.0.tgz", + "integrity": "sha512-EqHASkcmxipy2hU8rja+lD1S1HoTdodKKyJZZ3dgewnAHXnzXnnC3rw1+lkrgXPFsI2n2d2N2LYisD79OCdPmw==", + "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.0.0", + "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.0.0.tgz", + "integrity": "sha512-7kaV6rkx2WZjDYcBmp52oyhTxbNn5Jc4AUmsXZVEnDu9uuvNYURA8bLlJNF8yu4zS7ed8D+ZebC0y0bhrz8wIg==", + "requires": { + "@apollo/react-common": "^3.0.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", @@ -2806,6 +2840,11 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==" }, + "@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", @@ -3001,6 +3040,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", @@ -3196,6 +3252,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", @@ -8190,6 +8350,19 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, + "graphql": { + "version": "14.4.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.4.2.tgz", + "integrity": "sha512-6uQadiRgnpnSS56hdZUSvFrVcQ6OF9y6wkxJfKquFtHlnl7+KSuWwSJsdwiK1vybm1HgcdbpGkCpvhvsVQ0UZQ==", + "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", @@ -9181,6 +9354,11 @@ "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", @@ -11789,6 +11967,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", @@ -15783,8 +15969,7 @@ "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", @@ -16143,6 +16328,14 @@ "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", @@ -17297,6 +17490,20 @@ "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..a0225a09 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -4,6 +4,9 @@ "private": true, "dependencies": { "@alifd/next": "^1.16.6", + "@apollo/react-hooks": "^3.0.0", + "apollo-boost": "^0.4.4", + "graphql": "^14.4.2", "markdown-it": "^9.1.0", "markdown-it-emoji": "^1.4.0", "markdown-it-prism": "^2.0.2", diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 8008c8b2..e48c7cfe 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -1,6 +1,8 @@ import * as React from 'react' +import { ApolloProvider } from '@apollo/react-hooks' import * as CR from 'typings' +import client from './services/apollo' import Debugger from './components/Debugger' import Routes from './Routes' import DataContext, { initialData, initialState } from './utils/DataContext' @@ -49,12 +51,14 @@ const App = () => { // TODO: refactor cond to user and accept first route as if/else if return ( - -
- {process.env.REACT_APP_DEBUG && } - -
-
+ + +
+ {process.env.REACT_APP_DEBUG && } + +
+
+
) } diff --git a/web-app/src/containers/Continue/tutorial.gql b/web-app/src/containers/Continue/tutorial.gql new file mode 100644 index 00000000..cbd8b82f --- /dev/null +++ b/web-app/src/containers/Continue/tutorial.gql @@ -0,0 +1,24 @@ +query getTutorial($tutorialId: ID!) { + tutorial(id: $tutorialId) { + id + title + text + createdBy { + id + name + } + createdAt + codingLanguage + repo { + uri + branch + owner + name + } + latestVersion { + version + coderoadVersion + data + } + } +} diff --git a/web-app/src/containers/New/tutorials.gql b/web-app/src/containers/New/tutorials.gql new file mode 100644 index 00000000..9247c267 --- /dev/null +++ b/web-app/src/containers/New/tutorials.gql @@ -0,0 +1,17 @@ +query getTutorials { + tutorials { + id + title + text + createdBy { + id + name + } + createdAt + codingLanguage + latestVersion { + version + coderoadVersion + } + } +} diff --git a/web-app/src/services/api/index.tsx b/web-app/src/services/api/index.tsx index aa05ea0d..2bfdb83c 100644 --- a/web-app/src/services/api/index.tsx +++ b/web-app/src/services/api/index.tsx @@ -18,7 +18,7 @@ export default async function fetch(options: Options): Promise { switch (options.resource) { case 'getTutorialsSummary': // list of ids with summaries - let data: { [id: string]: CR.TutorialSummary } = {} + const data: { [id: string]: CR.TutorialSummary } = {} for (const tutorial of Object.values(tutorialsData)) { data[tutorial.id] = tutorial.data.summary } diff --git a/web-app/src/services/apollo/index.ts b/web-app/src/services/apollo/index.ts new file mode 100644 index 00000000..a3f3c502 --- /dev/null +++ b/web-app/src/services/apollo/index.ts @@ -0,0 +1,7 @@ +import ApolloClient from 'apollo-boost' + +const client = new ApolloClient({ + uri: process.env.REACT_APP_GQL_URI, +}) + +export default client \ No newline at end of file From 44562617d2f3e7d695fc3e6bc58fb95ef6264031 Mon Sep 17 00:00:00 2001 From: shmck Date: Tue, 13 Aug 2019 23:08:37 -0700 Subject: [PATCH 03/64] setup new page query --- web-app/src/containers/New/index.tsx | 61 +++++++++++++++--------- web-app/src/containers/New/query.ts | 16 +++++++ web-app/src/containers/New/tutorials.gql | 17 ------- 3 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 web-app/src/containers/New/query.ts delete mode 100644 web-app/src/containers/New/tutorials.gql diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index a48edbb4..fc4be722 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -4,35 +4,50 @@ import { Button } from '@alifd/next' import Cond from '../../components/Cond' import DataContext from '../../utils/DataContext' import { send } from '../../utils/vscode' +import { useQuery } from '@apollo/react-hooks' +import query from './query' + import LoadingPage from '../../containers/LoadingPage' interface Props { + state: any + tutorialList: any[] onNew(tutorialId: string): void } -export const NewPage = (props: Props) => { +export const NewPage = (props: Props) => ( +
+ +
+

Start a new Project

+ {props.tutorialList.map(tutorial => ( +
+

{tutorial.title}

+

{tutorial.description}

+ +
+ ))} +
+
+ + + +
+) + +export default () => { + console.log('load new') const { state } = React.useContext(DataContext) + const { data, loading, error } = useQuery(query) const [tutorialList] = React.useState([{ id: '1', title: 'Demo', description: 'A basic demo' }]) - // context - return ( -
- -
-

Start a new Project

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

{tutorial.title}

-

{tutorial.description}

- -
- ))} -
-
- - - -
- ) -} + console.log('data', data) + if (loading) { + return null + } -export default () => send('TUTORIAL_START')} /> + if (error) { + return
'Error'
+ } + + return send('TUTORIAL_START')} state={state} tutorialList={tutorialList} /> +} diff --git a/web-app/src/containers/New/query.ts b/web-app/src/containers/New/query.ts new file mode 100644 index 00000000..49d2a643 --- /dev/null +++ b/web-app/src/containers/New/query.ts @@ -0,0 +1,16 @@ +import { gql } from 'apollo-boost' + +export default gql` + query getTutorials { + tutorials { + id + title + text + codingLanguage + latestVersion { + version + coderoadVersion + } + } + } +` diff --git a/web-app/src/containers/New/tutorials.gql b/web-app/src/containers/New/tutorials.gql deleted file mode 100644 index 9247c267..00000000 --- a/web-app/src/containers/New/tutorials.gql +++ /dev/null @@ -1,17 +0,0 @@ -query getTutorials { - tutorials { - id - title - text - createdBy { - id - name - } - createdAt - codingLanguage - latestVersion { - version - coderoadVersion - } - } -} From d0f984bcdc18603213d610546053a5db7f4bb536 Mon Sep 17 00:00:00 2001 From: shmck Date: Fri, 16 Aug 2019 07:02:04 -0700 Subject: [PATCH 04/64] npm updates --- web-app/package-lock.json | 398 ++++++++++++++++++++------------------ web-app/package.json | 19 +- 2 files changed, 215 insertions(+), 202 deletions(-) diff --git a/web-app/package-lock.json b/web-app/package-lock.json index 33fe4d0a..f15e6859 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.16.7", + "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.16.7.tgz", + "integrity": "sha512-TSmRNooTozOA2HDolqmCWEgaEjtat+ZObZTHJ0Qdyk9QPD2Dr3qu1nUqGRPyC0PA7hipa6S7FjibPH901ZwCxg==", "requires": { "babel-runtime": "^6.26.0", "classnames": "^2.2.3", @@ -26,9 +26,9 @@ } }, "@apollo/react-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@apollo/react-common/-/react-common-3.0.0.tgz", - "integrity": "sha512-EqHASkcmxipy2hU8rja+lD1S1HoTdodKKyJZZ3dgewnAHXnzXnnC3rw1+lkrgXPFsI2n2d2N2LYisD79OCdPmw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@apollo/react-common/-/react-common-3.0.1.tgz", + "integrity": "sha512-7SC4qqPFo/41AhaQKCRovIshKkm4JLEGXyRHi+NPsaNJyk2J/HrWREnlHVqoPzYeIyq33f1L6j/NAkKn1NOnnQ==", "requires": { "ts-invariant": "^0.4.4", "tslib": "^1.10.0" @@ -42,11 +42,11 @@ } }, "@apollo/react-hooks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.0.0.tgz", - "integrity": "sha512-7kaV6rkx2WZjDYcBmp52oyhTxbNn5Jc4AUmsXZVEnDu9uuvNYURA8bLlJNF8yu4zS7ed8D+ZebC0y0bhrz8wIg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.0.1.tgz", + "integrity": "sha512-Boai/T+2z3m23Gy82m1pB+FOlrhkBJ//EIYa3pqX9sUsvgRWMKC+3NxpeHEUYqsf0qzFiM1dO4Pn9OxCFstM8g==", "requires": { - "@apollo/react-common": "^3.0.0", + "@apollo/react-common": "^3.0.1", "@wry/equality": "^0.1.9", "ts-invariant": "^0.4.4", "tslib": "^1.10.0" @@ -1100,9 +1100,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", @@ -1481,16 +1481,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", @@ -1503,16 +1503,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", @@ -1535,14 +1535,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", @@ -1559,30 +1559,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", @@ -1598,37 +1598,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", @@ -1663,22 +1663,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", @@ -1698,9 +1698,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", @@ -1708,15 +1708,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", @@ -1764,6 +1764,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", @@ -1772,9 +1773,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": { @@ -1870,9 +1871,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": { @@ -2113,9 +2114,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 } } @@ -2127,9 +2128,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", @@ -2170,18 +2171,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", @@ -2200,16 +2201,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", @@ -2228,9 +2229,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": { @@ -2400,9 +2401,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", @@ -2445,9 +2446,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", @@ -2466,14 +2467,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", @@ -2494,19 +2495,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", @@ -2756,9 +2757,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.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" }, "@types/prop-types": { "version": "15.7.1", @@ -2772,9 +2773,9 @@ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" }, "@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": "*", @@ -3345,6 +3346,21 @@ "tslib": "^1.9.3" } }, + "apollo-storybook-core": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/apollo-storybook-core/-/apollo-storybook-core-0.5.2.tgz", + "integrity": "sha512-8CbKUbRMIxGnz5Ci1jx7dOSDmCcktykfID96wji+E/vFVzE+dvGunuvEJexiVjCOebXJinXe6dqWJZuETot+Sw==", + "dev": true + }, + "apollo-storybook-react": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/apollo-storybook-react/-/apollo-storybook-react-0.2.1.tgz", + "integrity": "sha512-xERyr0EQbiUOBLE3pLRuM27T4Fsh2dVIV8yRy0VZ3eIAsXQrcuxTuM4d5kV+UiYqBNgH9M14+C6OuF9DNMilRw==", + "dev": true, + "requires": { + "apollo-storybook-core": "^0.5.2" + } + }, "apollo-utilities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz", @@ -3797,9 +3813,9 @@ } }, "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", @@ -3868,15 +3884,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": { @@ -3889,11 +3905,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" } }, @@ -3925,11 +3942,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" @@ -4067,21 +4085,21 @@ } }, "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", @@ -4094,7 +4112,7 @@ "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": { @@ -5763,9 +5781,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": { @@ -5899,9 +5917,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", @@ -6309,9 +6327,9 @@ } }, "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": { @@ -10622,9 +10640,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": { @@ -10789,23 +10807,11 @@ "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", @@ -13758,9 +13764,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", @@ -13860,13 +13866,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", @@ -13874,13 +13880,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": { @@ -16472,6 +16478,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", diff --git a/web-app/package.json b/web-app/package.json index a0225a09..9b26c66f 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@alifd/next": "^1.16.6", - "@apollo/react-hooks": "^3.0.0", + "@alifd/next": "^1.16.7", + "@apollo/react-hooks": "^3.0.1", "apollo-boost": "^0.4.4", "graphql": "^14.4.2", "markdown-it": "^9.1.0", @@ -41,18 +41,19 @@ }, "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/markdown-it": "0.0.8", - "@types/node": "^12.7.1", - "@types/react": "^16.9.1", + "@types/node": "^12.7.2", + "@types/react": "^16.9.2", "@types/react-dom": "^16.8.5", "@types/storybook__react": "^4.0.2", + "apollo-storybook-react": "^0.2.1", "babel-loader": "^8.0.5", "babel-plugin-import": "^1.12.0", "node-sass": "^4.12.0", From a591a2d4d7815abbad1a35d7a661fef0e59e4bba Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 17:00:10 -0700 Subject: [PATCH 05/64] sort-package-json --- package-lock.json | 17 ++++++- package.json | 77 ++++++++++++++++---------------- web-app/package-lock.json | 93 +++++++++++++++++++++++++++++++++++++++ web-app/package.json | 41 +++++++++-------- 4 files changed, 168 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02fc807b..81ee6636 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "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": "*" } @@ -41,7 +42,8 @@ "@types/node": { "version": "12.7.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==" + "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==", + "dev": true }, "agent-base": { "version": "4.3.0", @@ -493,6 +495,14 @@ "path-is-absolute": "^1.0.0" } }, + "graphql": { + "version": "14.4.2", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.4.2.tgz", + "integrity": "sha512-6uQadiRgnpnSS56hdZUSvFrVcQ6OF9y6wkxJfKquFtHlnl7+KSuWwSJsdwiK1vybm1HgcdbpGkCpvhvsVQ0UZQ==", + "requires": { + "iterall": "^1.2.2" + } + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -618,6 +628,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", diff --git a/package.json b/package.json index dc74208e..f574e4ee 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,35 +11,29 @@ "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": "npm run build && node ./node_modules/vscode/bin/test", + "vscode:prepublish": "npm run build", + "watch": "tsc -watch -p ./" + }, + "dependencies": { + "axios": "^0.19.0", + "dotenv": "^8.0.0", + "graphql": "^14.4.2", + "vscode": "^1.1.36", + "xstate": "^4.6.7" }, "devDependencies": { "@types/dotenv": "^6.1.1", @@ -61,11 +45,28 @@ "tslint-config-prettier": "^1.18.0", "typescript": "^3.5.3" }, - "dependencies": { - "axios": "^0.19.0", - "dotenv": "^8.0.0", - "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/web-app/package-lock.json b/web-app/package-lock.json index f15e6859..f65e1a8b 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -41,6 +41,48 @@ } } }, + "@apollo/react-components": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@apollo/react-components/-/react-components-3.0.1.tgz", + "integrity": "sha512-IQwcwv+ItW/QHUeO2zQH+CJGnqepPwwShD9H6+v1ptLvixggodr7S4KalNKXgRUVJsoPBFiVgpTMoJe3h4+Eyg==", + "dev": true, + "requires": { + "@apollo/react-common": "^3.0.1", + "@apollo/react-hooks": "^3.0.1", + "prop-types": "^15.7.2", + "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==", + "dev": true + } + } + }, + "@apollo/react-hoc": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@apollo/react-hoc/-/react-hoc-3.0.1.tgz", + "integrity": "sha512-sKt0/xjr6jknJztJRWA0zX9wUY/xBq6lwyqPxrRM72hCatz/BSi1tgVv9LMHTA0aJPBK79pWXFq/EeiXW2LkVw==", + "dev": true, + "requires": { + "@apollo/react-common": "^3.0.1", + "@apollo/react-components": "^3.0.1", + "hoist-non-react-statics": "^3.3.0", + "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==", + "dev": true + } + } + }, "@apollo/react-hooks": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.0.1.tgz", @@ -59,6 +101,25 @@ } } }, + "@apollo/react-ssr": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@apollo/react-ssr/-/react-ssr-3.0.1.tgz", + "integrity": "sha512-eeAaajIH1zbMk+zigNAlEeyVH80ELrsjvRCcQxH80+THgnJx/hgkKfmhG2p1q2Djefyv6VfImAwd4xqX6/LRSA==", + "dev": true, + "requires": { + "@apollo/react-common": "^3.0.1", + "@apollo/react-hooks": "^3.0.1", + "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==", + "dev": true + } + } + }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -6535,6 +6596,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "deprecated-decorator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", + "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=", + "dev": true + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -8381,6 +8448,19 @@ "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" }, + "graphql-tools": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.5.tgz", + "integrity": "sha512-kQCh3IZsMqquDx7zfIGWBau42xe46gmqabwYkpPlCLIjcEY1XK+auP7iGRD9/205BPyoQdY8hT96MPpgERdC9Q==", + "dev": true, + "requires": { + "apollo-link": "^1.2.3", + "apollo-utilities": "^1.0.1", + "deprecated-decorator": "^0.1.6", + "iterall": "^1.1.3", + "uuid": "^3.1.0" + } + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -13589,6 +13669,19 @@ "prop-types": "^15.6.2" } }, + "react-apollo": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-3.0.1.tgz", + "integrity": "sha512-2hsSYBfxPqPquS8CupWq+U+6XuDfr/Rr1ssXwfOTYe5gCyTthdUqafIm+pyStur9X2W4ZNQMFyjVicsPNq2tnA==", + "dev": true, + "requires": { + "@apollo/react-common": "^3.0.1", + "@apollo/react-components": "^3.0.1", + "@apollo/react-hoc": "^3.0.1", + "@apollo/react-hooks": "^3.0.1", + "@apollo/react-ssr": "^3.0.1" + } + }, "react-app-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.1.tgz", diff --git a/web-app/package.json b/web-app/package.json index 9b26c66f..f78f431c 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -2,30 +2,13 @@ "name": "coderoad-app", "version": "0.1.0", "private": true, - "dependencies": { - "@alifd/next": "^1.16.7", - "@apollo/react-hooks": "^3.0.1", - "apollo-boost": "^0.4.4", - "graphql": "^14.4.2", - "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": [ @@ -39,6 +22,23 @@ "last 1 safari version" ] }, + "eslintConfig": { + "extends": "react-app" + }, + "dependencies": { + "@alifd/next": "^1.16.7", + "@apollo/react-hooks": "^3.0.1", + "apollo-boost": "^0.4.4", + "graphql": "^14.4.2", + "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" + }, "devDependencies": { "@babel/core": "^7.5.4", "@storybook/addon-actions": "^5.1.11", @@ -53,7 +53,6 @@ "@types/react": "^16.9.2", "@types/react-dom": "^16.8.5", "@types/storybook__react": "^4.0.2", - "apollo-storybook-react": "^0.2.1", "babel-loader": "^8.0.5", "babel-plugin-import": "^1.12.0", "node-sass": "^4.12.0", From 5a060fdd6c5f739480b33addcfc169a9d5adcf8b Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 17:00:35 -0700 Subject: [PATCH 06/64] migrate codegen graphql typings --- typings/graphql.d.ts | 202 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 typings/graphql.d.ts diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts new file mode 100644 index 00000000..ac8d5d9b --- /dev/null +++ b/typings/graphql.d.ts @@ -0,0 +1,202 @@ +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 type AuthenticateUserPayload = { + __typename?: 'AuthenticateUserPayload', + user: User, + token: Scalars['String'], +}; + +export enum CacheControlScope { + Public = 'PUBLIC', + Private = 'PRIVATE' +} + + + +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?: Maybe, + text?: Maybe, + stages?: Maybe>>, + setup?: Maybe, +}; + +export type Mutation = { + __typename?: 'Mutation', + authenticate?: Maybe, +}; + + +export type MutationAuthenticateArgs = { + accessToken: Scalars['String'] +}; + +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?: Maybe, + text?: Maybe, + steps?: Maybe>>, + setup?: Maybe, +}; + +export type Step = { + __typename?: 'Step', + id: Scalars['ID'], + title?: Maybe, + text?: Maybe, + setup?: Maybe, + solution?: Maybe, +}; + +export type StepActions = { + __typename?: 'StepActions', + id: Scalars['ID'], + commits?: Maybe>>, + files?: Maybe>>, + commands?: Maybe>>, +}; + +export type Tutorial = { + __typename?: 'Tutorial', + id: Scalars['ID'], + repo?: Maybe, + createdBy?: Maybe, + createdAt?: Maybe, + updatedBy?: Maybe, + updatedAt?: Maybe, + codingLanguage?: Maybe, + testRunner?: Maybe, + title?: Maybe, + text?: Maybe, + releasedAt?: Maybe, + releasedBy?: Maybe, + latestVersion?: Maybe, + versions?: Maybe>>, +}; + +export type TutorialRepo = { + __typename?: 'TutorialRepo', + tutorialId: Scalars['ID'], + uri?: Maybe, + branch?: Maybe, + name?: Maybe, + owner?: Maybe, +}; + +export type TutorialVersion = { + __typename?: 'TutorialVersion', + tutorialId: Scalars['ID'], + version: Scalars['String'], + coderoadVersion?: Maybe, + createdAt?: Maybe, + createdBy?: Maybe, + publishedAt?: Maybe, + publishedBy?: Maybe, + levels?: Maybe>>, +}; + + +export type User = { + __typename?: 'User', + id: Scalars['ID'], + name?: Maybe, + email?: Maybe, + location?: Maybe, + avatarUrl?: Maybe, + createdAt?: Maybe, + updatedAt?: Maybe, + githubUser?: Maybe, +}; +export type TutorialSummaryFragment = ( + { __typename?: 'Tutorial' } + & Pick +); + From f3f9765dbfc129d1c48ec134cc8388c3fc5bb8de Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 17:00:48 -0700 Subject: [PATCH 07/64] cleanup routes --- web-app/src/Routes.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index 7238d629..fdded7cb 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -45,7 +45,10 @@ const Routes = ({ state }: Props) => { - + + + + From 2d84fa8e4bb96fc9d56dfb82b3a81762c04d1eee Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 19:35:24 -0700 Subject: [PATCH 08/64] setup apollo decorator --- web-app/stories/utils/ApolloDecorator.tsx | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 web-app/stories/utils/ApolloDecorator.tsx diff --git a/web-app/stories/utils/ApolloDecorator.tsx b/web-app/stories/utils/ApolloDecorator.tsx new file mode 100644 index 00000000..3d70710b --- /dev/null +++ b/web-app/stories/utils/ApolloDecorator.tsx @@ -0,0 +1,22 @@ +import React, { Fragment } from 'react' +import ApolloClient from 'apollo-boost' +import { ApolloProvider } from '@apollo/react-hooks' + +const graphqlClient = new ApolloClient({ + uri: 'http://localhost:4000/graphql', + headers: { + Authorization: process.env.GQL_AUTH_TOKEN, + }, +}) + +function StorybookProvider({ children }) { + return ( + + {children} + + ) +} + +export default story => { + return {story()} +} From 1114d13641d97e0abb4724b6c099f5f6c4f738c7 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 19:35:52 -0700 Subject: [PATCH 09/64] new queryTutorials loaded --- .../components/TutorialList/TutorialItem.tsx | 18 ++++++++ web-app/src/components/TutorialList/index.tsx | 24 ++++++++++ web-app/src/containers/New/index.tsx | 44 ++++++------------- .../New/{query.ts => queryTutorials.ts} | 0 web-app/stories/New.stories.tsx | 36 +++++++++++++-- 5 files changed, 88 insertions(+), 34 deletions(-) create mode 100644 web-app/src/components/TutorialList/TutorialItem.tsx create mode 100644 web-app/src/components/TutorialList/index.tsx rename web-app/src/containers/New/{query.ts => queryTutorials.ts} (100%) diff --git a/web-app/src/components/TutorialList/TutorialItem.tsx b/web-app/src/components/TutorialList/TutorialItem.tsx new file mode 100644 index 00000000..71a3e0bb --- /dev/null +++ b/web-app/src/components/TutorialList/TutorialItem.tsx @@ -0,0 +1,18 @@ +import * as React from 'react' +import { Button } from '@alifd/next' + +interface Props { + title?: string + text?: string + onNew(): void +} + +const TutorialItem = (props: Props) => ( +
+

{props.title || 'Title'}

+

{props.text || 'Description'}

+ +
+) + +export default TutorialItem diff --git a/web-app/src/components/TutorialList/index.tsx b/web-app/src/components/TutorialList/index.tsx new file mode 100644 index 00000000..abd775e7 --- /dev/null +++ b/web-app/src/components/TutorialList/index.tsx @@ -0,0 +1,24 @@ +import * as React from 'react' + +import * as T from '../../../../typings/graphql' +import TutorialItem from './TutorialItem' + +interface Props { + tutorialList: T.Tutorial[] + onNew(id: string): void +} + +const TutorialList = (props: Props) => ( +
+ {props.tutorialList.map((tutorial: T.Tutorial) => ( + props.onNew(tutorial.id)} + 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 fc4be722..3e11afc0 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -1,53 +1,35 @@ import * as React from 'react' -import { Button } from '@alifd/next' - -import Cond from '../../components/Cond' -import DataContext from '../../utils/DataContext' -import { send } from '../../utils/vscode' import { useQuery } from '@apollo/react-hooks' -import query from './query' +import * as T from '../../../../typings/graphql' -import LoadingPage from '../../containers/LoadingPage' +import queryTutorials from './queryTutorials' +import { send } from '../../utils/vscode' +import TutorialList from '../../components/TutorialList' interface Props { - state: any - tutorialList: any[] + tutorialList: T.Tutorial[] onNew(tutorialId: string): void } export const NewPage = (props: Props) => (
- -
-

Start a new Project

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

{tutorial.title}

-

{tutorial.description}

- -
- ))} -
-
- - - +

Start a new Project

+
) -export default () => { - console.log('load new') - const { state } = React.useContext(DataContext) - const { data, loading, error } = useQuery(query) - const [tutorialList] = React.useState([{ id: '1', title: 'Demo', description: 'A basic demo' }]) +const NewPageContainer = () => { + const { data, loading, error } = useQuery(queryTutorials) console.log('data', data) if (loading) { return null } if (error) { - return
'Error'
+ return
{JSON.stringify(error, null, 2)}
} - return send('TUTORIAL_START')} state={state} tutorialList={tutorialList} /> + return send('TUTORIAL_START')} tutorialList={data.tutorials} /> } + +export default NewPageContainer diff --git a/web-app/src/containers/New/query.ts b/web-app/src/containers/New/queryTutorials.ts similarity index 100% rename from web-app/src/containers/New/query.ts rename to web-app/src/containers/New/queryTutorials.ts diff --git a/web-app/stories/New.stories.tsx b/web-app/stories/New.stories.tsx index f82ef46e..dfa2fd34 100644 --- a/web-app/stories/New.stories.tsx +++ b/web-app/stories/New.stories.tsx @@ -1,8 +1,38 @@ 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/components/TutorialList' +import TutorialItem from '../src/components/TutorialList/TutorialItem' +import NewContainer from '../src/containers/New' -storiesOf('New', module).add('Page', () => ) +storiesOf('New', module) + .add('Tutorial', () => { + const tutorial: T.Tutorial = { + id: '1', + title: 'Tutorial 1', + text: 'The first one', + } + return + }) + .add('TutorialList', () => { + const tutorialList: T.Tutorial[] = [ + { + id: '1', + title: 'Tutorial 1', + text: 'The first one', + }, + { + id: '2', + title: 'Tutorial 2', + text: 'The second one', + }, + ] + return + }) + .addDecorator(apolloProvider) + .add('Container', () => { + return + }) From 4b1d714e7cc66c36fcc2ac8e5fe4fa821d9e21aa Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 20:42:33 -0700 Subject: [PATCH 10/64] migrate latestVersion to version --- src/services/api/gql/query/tutorial.gql | 2 +- typings/graphql.d.ts | 2 +- web-app/src/containers/Continue/tutorial.gql | 2 +- web-app/src/containers/New/queryTutorials.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/api/gql/query/tutorial.gql b/src/services/api/gql/query/tutorial.gql index 9397a9c6..1f998568 100644 --- a/src/services/api/gql/query/tutorial.gql +++ b/src/services/api/gql/query/tutorial.gql @@ -7,7 +7,7 @@ query getTutorial($tutorialId: ID!) { uri branch } - latestVersion { + version { version coderoadVersion data diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index ac8d5d9b..0d764a0e 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -158,7 +158,7 @@ export type Tutorial = { text?: Maybe, releasedAt?: Maybe, releasedBy?: Maybe, - latestVersion?: Maybe, + version?: Maybe, versions?: Maybe>>, }; diff --git a/web-app/src/containers/Continue/tutorial.gql b/web-app/src/containers/Continue/tutorial.gql index cbd8b82f..3160c520 100644 --- a/web-app/src/containers/Continue/tutorial.gql +++ b/web-app/src/containers/Continue/tutorial.gql @@ -15,7 +15,7 @@ query getTutorial($tutorialId: ID!) { owner name } - latestVersion { + version { version coderoadVersion data diff --git a/web-app/src/containers/New/queryTutorials.ts b/web-app/src/containers/New/queryTutorials.ts index 49d2a643..e7ed5001 100644 --- a/web-app/src/containers/New/queryTutorials.ts +++ b/web-app/src/containers/New/queryTutorials.ts @@ -7,7 +7,7 @@ export default gql` title text codingLanguage - latestVersion { + version { version coderoadVersion } From 5d38263991fc6538a64a1efe9d5231d5a3624cb4 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 20:56:15 -0700 Subject: [PATCH 11/64] remove data from version, schema change --- src/services/api/gql/query/tutorial.gql | 1 - web-app/src/containers/Continue/tutorial.gql | 1 - 2 files changed, 2 deletions(-) diff --git a/src/services/api/gql/query/tutorial.gql b/src/services/api/gql/query/tutorial.gql index 1f998568..444f4a8b 100644 --- a/src/services/api/gql/query/tutorial.gql +++ b/src/services/api/gql/query/tutorial.gql @@ -10,7 +10,6 @@ query getTutorial($tutorialId: ID!) { version { version coderoadVersion - data } } } diff --git a/web-app/src/containers/Continue/tutorial.gql b/web-app/src/containers/Continue/tutorial.gql index 3160c520..0d3a9d80 100644 --- a/web-app/src/containers/Continue/tutorial.gql +++ b/web-app/src/containers/Continue/tutorial.gql @@ -18,7 +18,6 @@ query getTutorial($tutorialId: ID!) { version { version coderoadVersion - data } } } From 8d4d43fb2f3e4d449a898aaa492089610df9551d Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 20:56:27 -0700 Subject: [PATCH 12/64] ckean up new container loading --- web-app/src/containers/New/index.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 3e11afc0..ace121e0 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -4,6 +4,7 @@ import * as T from '../../../../typings/graphql' import queryTutorials from './queryTutorials' import { send } from '../../utils/vscode' +import LoadingPage from '../LoadingPage' import TutorialList from '../../components/TutorialList' interface Props { @@ -18,18 +19,28 @@ export const NewPage = (props: Props) => ( ) +const Loading = () => + const NewPageContainer = () => { const { data, loading, error } = useQuery(queryTutorials) - console.log('data', data) if (loading) { - return null + return Loading } if (error) { - return
{JSON.stringify(error, null, 2)}
+ return ( +
+
{error.message}
+

{JSON.stringify(error, null, 2)}

+
+ ) } - return send('TUTORIAL_START')} tutorialList={data.tutorials} /> + return ( + + send('TUTORIAL_START')} tutorialList={data.tutorials} /> + + ) } export default NewPageContainer From 64837c085eb72399c67577cb129baa4f1094b088 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 17 Aug 2019 21:18:48 -0700 Subject: [PATCH 13/64] load continue container --- web-app/src/containers/Continue/index.tsx | 73 +++++++++++++------ .../{tutorial.gql => queryTutorial.ts} | 9 ++- web-app/stories/Continue.stories.tsx | 16 +++- web-app/stories/New.stories.tsx | 4 +- 4 files changed, 72 insertions(+), 30 deletions(-) rename web-app/src/containers/Continue/{tutorial.gql => queryTutorial.ts} (61%) diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index c40ff78b..a31dd9b5 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -1,33 +1,62 @@ import * as React from 'react' -import { send } from '../../utils/vscode' -import DataContext from '../../utils/DataContext' +import { useQuery } from '@apollo/react-hooks' import { Button, Card } from '@alifd/next' +import { send } from '../../utils/vscode' +import LoadingPage from '../LoadingPage' +import queryTutorial from './queryTutorial' +import * as T from '../../../../typings/graphql' + interface Props { + tutorial: T.Tutorial onContinue(): void } -export const ContinuePage = (props: Props) => { - // context - const { data } = React.useContext(DataContext) +export const ContinuePage = (props: Props) => ( +
+

Continue

+ +
+

{props.tutorial.title}

+

{props.tutorial.text}

+ +
+
+
+) + +const Loading = () => + +const ContinuePageContainer = () => { + // TODO: load specific tutorialId + const { data, loading, error } = useQuery(queryTutorial, { + variables: { + tutorialId: 1, + version: '0.1.0', + }, + }) + + if (loading) { + return Loading + } + + if (error) { + return ( +
+
{error.message}
+

{JSON.stringify(error, null, 2)}

+
+ ) + } + return ( -
-

Continue

- -
-

{data.summary.title}

-

{data.summary.description}

- -
-
-
+ { + send('TUTORIAL_START') + }} + /> ) } -export default () => ( - { - send('TUTORIAL_START') - }} - /> -) +export default ContinuePageContainer diff --git a/web-app/src/containers/Continue/tutorial.gql b/web-app/src/containers/Continue/queryTutorial.ts similarity index 61% rename from web-app/src/containers/Continue/tutorial.gql rename to web-app/src/containers/Continue/queryTutorial.ts index 0d3a9d80..43739ed9 100644 --- a/web-app/src/containers/Continue/tutorial.gql +++ b/web-app/src/containers/Continue/queryTutorial.ts @@ -1,4 +1,7 @@ -query getTutorial($tutorialId: ID!) { +import { gql } from 'apollo-boost' + +export default gql` + query getTutorial($tutorialId: ID!, $version: String) { tutorial(id: $tutorialId) { id title @@ -15,9 +18,11 @@ query getTutorial($tutorialId: ID!) { owner name } - version { + version(version: $version) { version coderoadVersion } } } + +` 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/New.stories.tsx b/web-app/stories/New.stories.tsx index dfa2fd34..e652ceab 100644 --- a/web-app/stories/New.stories.tsx +++ b/web-app/stories/New.stories.tsx @@ -33,6 +33,4 @@ storiesOf('New', module) return }) .addDecorator(apolloProvider) - .add('Container', () => { - return - }) + .add('Container', () => ) From b2fcd7a9e1519860056da07e55a8e0b1efe58bb1 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 10:34:27 -0700 Subject: [PATCH 14/64] add error component --- package-lock.json | 6 ++++ package.json | 1 + web-app/src/components/Error/index.tsx | 45 ++++++++++++++++++++++++++ web-app/src/containers/New/index.tsx | 8 ++--- 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 web-app/src/components/Error/index.tsx diff --git a/package-lock.json b/package-lock.json index 81ee6636..cc42bfaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,12 @@ "@types/node": "*" } }, + "@types/graphql": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.2.3.tgz", + "integrity": "sha512-UoCovaxbJIxagCvVfalfK7YaNhmxj3BQFRQ2RHQKLiu+9wNXhJnlbspsLHt/YQM99IaLUUFJNzCwzc6W0ypMeQ==", + "dev": true + }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", diff --git a/package.json b/package.json index f574e4ee..50d9de6c 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ }, "devDependencies": { "@types/dotenv": "^6.1.1", + "@types/graphql": "^14.2.3", "@types/mocha": "^5.2.7", "@types/node": "^12.7.1", "concurrently": "^4.1.1", diff --git a/web-app/src/components/Error/index.tsx b/web-app/src/components/Error/index.tsx new file mode 100644 index 00000000..124c4934 --- /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:', error) + return ( +
+

Error

+ {error.graphQLErrors && ( +
+ {error.graphQLErrors.map(({ message, locations, path }: GraphQLError) => ( +
+ [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/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index ace121e0..346015b4 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -5,6 +5,7 @@ import * as T from '../../../../typings/graphql' import queryTutorials from './queryTutorials' import { send } from '../../utils/vscode' import LoadingPage from '../LoadingPage' +import ErrorView from '../../components/Error' import TutorialList from '../../components/TutorialList' interface Props { @@ -28,12 +29,7 @@ const NewPageContainer = () => { } if (error) { - return ( -
-
{error.message}
-

{JSON.stringify(error, null, 2)}

-
- ) + return } return ( From 0c9b0b9331292465596dcfec58fc861a1c933898 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 12:39:22 -0700 Subject: [PATCH 15/64] clenaup level summary progress --- web-app/src/containers/Continue/index.tsx | 8 +-- web-app/src/containers/Tutorial/LevelPage.tsx | 34 ---------- .../Tutorial/LevelSummaryPage/index.tsx | 66 +++++++++++++++++++ .../Tutorial/LevelSummaryPage/queryLevels.ts | 25 +++++++ web-app/src/containers/Tutorial/index.tsx | 4 +- web-app/stories/Level.stories.tsx | 10 +++ 6 files changed, 105 insertions(+), 42 deletions(-) delete mode 100644 web-app/src/containers/Tutorial/LevelPage.tsx create mode 100644 web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx create mode 100644 web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index a31dd9b5..3ee5d1ca 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -5,6 +5,7 @@ import { Button, Card } from '@alifd/next' import { send } from '../../utils/vscode' import LoadingPage from '../LoadingPage' import queryTutorial from './queryTutorial' +import ErrorView from '../../components/Error' import * as T from '../../../../typings/graphql' interface Props { @@ -41,12 +42,7 @@ const ContinuePageContainer = () => { } if (error) { - return ( -
-
{error.message}
-

{JSON.stringify(error, null, 2)}

-
- ) + return } return ( 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/containers/Tutorial/LevelSummaryPage/index.tsx b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx new file mode 100644 index 00000000..acfb344f --- /dev/null +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx @@ -0,0 +1,66 @@ +import * as React from 'react' +import { useQuery } from '@apollo/react-hooks' + +import ErrorView from '../../../components/Error' +// import Level from '../../../components/Level' +import * as T from '../../../../../typings/graphql' +import queryLevels from './queryLevels' + +interface LevelProps { + levels: T.Level[] + send(action: string): void +} + +export const LevelSummaryPage = (props: LevelProps) => { + // 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
LevelSummaryPage
+ + // return +} + +interface ContainerProps { + send(action: string): void +} + +const LevelSummaryPageContainer = (props: ContainerProps) => { + const { loading, error, data } = useQuery(queryLevels, { + variables: { + tutorialId: '1', + version: '0.1.0', + levelId: '1', + }, + }) + + if (loading) { + return
Loading Levels...
+ } + + if (error) { + return + } + + const { levels } = data.tutorial.version + + return +} + +export default LevelSummaryPageContainer diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts b/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts new file mode 100644 index 00000000..64977c47 --- /dev/null +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts @@ -0,0 +1,25 @@ +import { gql } from 'apollo-boost' + +export default gql` + query getLevel($tutorialId: ID!, $version: String, $levelId: ID!) { + tutorial(id: $tutorialId) { + id + version(version: $version) { + version + coderoadVersion + level(levelId: $levelId) { + id + title + text + + stages { + id + title + text + + } + } + } + } +} +` diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx index a0180919..c9658225 100644 --- a/web-app/src/containers/Tutorial/index.tsx +++ b/web-app/src/containers/Tutorial/index.tsx @@ -4,7 +4,7 @@ import { send } from '../../utils/vscode' import Router from '../../components/Router' import LoadingPage from '../LoadingPage' import SummaryPage from './SummaryPage' -import LevelPage from './LevelPage' +import LevelSummaryPage from './LevelSummaryPage' import StagePage from './StagePage' import CompletedPage from './CompletedPage' @@ -24,7 +24,7 @@ const Tutorial = (props: Props) => {
- + diff --git a/web-app/stories/Level.stories.tsx b/web-app/stories/Level.stories.tsx index 6e87383f..229bc9e4 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 apolloProvider from './utils/ApolloDecorator' import Level from '../src/components/Level' +import LevelSummaryPageContainer, { LevelSummaryPage } from '../src/containers/Tutorial/LevelSummaryPage' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) @@ -58,3 +61,10 @@ storiesOf('Tutorial SideBar', module) onBack={linkTo('TUtorial SideBar', 'Summary')} /> )) + .add('Level Summary', () => { + return + }) + .addDecorator(apolloProvider) + .add('Level Summary Container', () => { + return + }) From f57b3679e278d5262e0e398962bf891db6d3fab1 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 12:39:29 -0700 Subject: [PATCH 16/64] apollo decorator with local cache --- web-app/src/services/apollo/index.ts | 42 ++++++++++++++++++++++- web-app/stories/utils/ApolloDecorator.tsx | 11 ++---- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/web-app/src/services/apollo/index.ts b/web-app/src/services/apollo/index.ts index a3f3c502..78487437 100644 --- a/web-app/src/services/apollo/index.ts +++ b/web-app/src/services/apollo/index.ts @@ -1,7 +1,47 @@ -import ApolloClient from 'apollo-boost' +import ApolloClient, { InMemoryCache } from 'apollo-boost' const client = new ApolloClient({ uri: process.env.REACT_APP_GQL_URI, + headers: { + Authorization: process.env.GQL_AUTH_TOKEN, + }, + cache: new InMemoryCache(), + resolvers: { + Mutation: { + setStatus: (_root, variables, { cache, getCacheKey }) => { + // TODO: optimize status setting to act on diffs + + // set local cache + function set(typename: string, id: string, status: 'ACTIVE' | 'COMPLETE') { + const writeId = getCacheKey({ __typename: typename, id }) + const data = { status } + cache.writeData({ id: writeId, data }) + } + + const { progress, position } = variables + + // set level progress & active + for (const levelId of Object.keys(progress.levels)) { + set('Level', levelId, 'COMPLETE') + } + set('Level', position.levelId, 'ACTIVE') + + // set stage progress & active + for (const stageId of Object.keys(progress.stages)) { + set('Stage', stageId, 'COMPLETE') + } + set('Stage', position.stageId, 'ACTIVE') + + // set step progress & active + for (const stepId of Object.keys(progress.steps)) { + set('Step', stepId, 'COMPLETE') + } + set('Step', position.stepId, 'ACTIVE') + + return null + }, + }, + }, }) export default client \ No newline at end of file diff --git a/web-app/stories/utils/ApolloDecorator.tsx b/web-app/stories/utils/ApolloDecorator.tsx index 3d70710b..d49def86 100644 --- a/web-app/stories/utils/ApolloDecorator.tsx +++ b/web-app/stories/utils/ApolloDecorator.tsx @@ -1,17 +1,10 @@ import React, { Fragment } from 'react' -import ApolloClient from 'apollo-boost' +import client from '../../src/services/apollo' import { ApolloProvider } from '@apollo/react-hooks' -const graphqlClient = new ApolloClient({ - uri: 'http://localhost:4000/graphql', - headers: { - Authorization: process.env.GQL_AUTH_TOKEN, - }, -}) - function StorybookProvider({ children }) { return ( - + {children} ) From 2b16a0b9d9cc3c10e1ad58005bf33eae2063a8ec Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 14:57:29 -0700 Subject: [PATCH 17/64] working LevelStage container --- typings/graphql.d.ts | 3 ++ .../components/Level/LevelStageSummary.tsx | 8 ++-- web-app/src/components/Level/index.tsx | 44 +++++++++---------- .../Tutorial/LevelSummaryPage/index.tsx | 43 ++++++------------ .../{queryLevels.ts => queryLevel.ts} | 4 +- web-app/src/services/apollo/index.ts | 15 +++++++ 6 files changed, 60 insertions(+), 57 deletions(-) rename web-app/src/containers/Tutorial/LevelSummaryPage/{queryLevels.ts => queryLevel.ts} (88%) diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index 0d764a0e..f502902f 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -65,6 +65,7 @@ export type Level = { text?: Maybe, stages?: Maybe>>, setup?: Maybe, + status?: 'INCOMPLETE' | 'COMPLETE' | 'ACTIVE', }; export type Mutation = { @@ -125,6 +126,7 @@ export type Stage = { text?: Maybe, steps?: Maybe>>, setup?: Maybe, + status?: 'INCOMPLETE' | 'COMPLETE' | 'ACTIVE', }; export type Step = { @@ -134,6 +136,7 @@ export type Step = { text?: Maybe, setup?: Maybe, solution?: Maybe, + status?: 'INCOMPLETE' | 'COMPLETE' | 'ACTIVE' }; export type StepActions = { diff --git a/web-app/src/components/Level/LevelStageSummary.tsx b/web-app/src/components/Level/LevelStageSummary.tsx index 50837f69..e4892d75 100644 --- a/web-app/src/components/Level/LevelStageSummary.tsx +++ b/web-app/src/components/Level/LevelStageSummary.tsx @@ -1,6 +1,6 @@ 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' @@ -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/components/Level/index.tsx b/web-app/src/components/Level/index.tsx index e457bec5..0dbfbdc4 100644 --- a/web-app/src/components/Level/index.tsx +++ b/web-app/src/components/Level/index.tsx @@ -1,7 +1,6 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' -import CR from 'typings' -import CC from '../../../../typings/context' +import * as T from '../../../../typings/graphql' import Markdown from '../Markdown' import LevelStageSummary from './LevelStageSummary' @@ -25,45 +24,46 @@ const styles = { } interface Props { - level: CR.TutorialLevel - stages: { - [stageId: string]: any // CC.StageWithStatus - } + level: T.Level 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 - }) - +const Level = ({ level, onNext, onBack }: 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 (
-

{title}

- {text} +

{level.title}

+ {level.text || ''}
- {stageList.map((stageId: string, index: number) => { - const stage: CC.StageWithStatus = stages[stageId] - const { active } = stage.status - const clickHandler = active ? onNext : () => {} + {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 separted components return ( - {stage.content.title || `Stage ${index + 1}`} + {stage.title || `Stage ${index + 1}`} } - content={} + content={} onClick={clickHandler} /> ) diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx index acfb344f..b577f92a 100644 --- a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx @@ -2,39 +2,24 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import ErrorView from '../../../components/Error' -// import Level from '../../../components/Level' +import Level from '../../../components/Level' import * as T from '../../../../../typings/graphql' -import queryLevels from './queryLevels' +import queryLevel from './queryLevel' interface LevelProps { - levels: T.Level[] + level: T.Level send(action: string): void } export const LevelSummaryPage = (props: LevelProps) => { - // 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
LevelSummaryPage
- - // return + const onNext = (): void => { + props.send('NEXT') + } + const onBack = (): void => { + props.send('BACK') + } + console.log('props', props) + return } interface ContainerProps { @@ -42,7 +27,7 @@ interface ContainerProps { } const LevelSummaryPageContainer = (props: ContainerProps) => { - const { loading, error, data } = useQuery(queryLevels, { + const { loading, error, data } = useQuery(queryLevel, { variables: { tutorialId: '1', version: '0.1.0', @@ -58,9 +43,9 @@ const LevelSummaryPageContainer = (props: ContainerProps) => { return } - const { levels } = data.tutorial.version + const { level } = data.tutorial.version - return + return } export default LevelSummaryPageContainer diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts b/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevel.ts similarity index 88% rename from web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts rename to web-app/src/containers/Tutorial/LevelSummaryPage/queryLevel.ts index 64977c47..70ce134a 100644 --- a/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevels.ts +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevel.ts @@ -11,12 +11,12 @@ export default gql` id title text - + status @client stages { id title text - + status @client } } } diff --git a/web-app/src/services/apollo/index.ts b/web-app/src/services/apollo/index.ts index 78487437..4fa5c194 100644 --- a/web-app/src/services/apollo/index.ts +++ b/web-app/src/services/apollo/index.ts @@ -41,6 +41,21 @@ const client = new ApolloClient({ return null }, }, + Level: { + status() { + return 'INCOMPLETE' + } + }, + Stage: { + status() { + return 'INCOMPLETE' + } + }, + Step: { + status() { + return 'INCOMPLETE' + } + } }, }) From 204840f89409ed162acfb917355e31a4c3bad990 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 15:03:07 -0700 Subject: [PATCH 18/64] update level stories & structure --- .../Tutorial/LevelSummaryPage/index.tsx | 1 - web-app/stories/Level.stories.tsx | 82 +++++++++++-------- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx index b577f92a..7d13b1a5 100644 --- a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx @@ -18,7 +18,6 @@ export const LevelSummaryPage = (props: LevelProps) => { const onBack = (): void => { props.send('BACK') } - console.log('props', props) return } diff --git a/web-app/stories/Level.stories.tsx b/web-app/stories/Level.stories.tsx index 229bc9e4..0311ae01 100644 --- a/web-app/stories/Level.stories.tsx +++ b/web-app/stories/Level.stories.tsx @@ -16,53 +16,65 @@ storiesOf('Tutorial SideBar', module) .add('Level', () => ( )) .add('Level Summary', () => { - return + return ( + + ) }) .addDecorator(apolloProvider) .add('Level Summary Container', () => { From 2bc96a1ba498218d2948cdd669c9d5395384e12a Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 15:53:57 -0700 Subject: [PATCH 19/64] cleanup gql paths --- web-app/src/components/Level/index.tsx | 2 +- web-app/src/components/Stage/index.tsx | 37 ++++++++++--------- web-app/src/components/TutorialList/index.tsx | 2 +- web-app/src/containers/Continue/index.tsx | 2 +- web-app/src/containers/New/index.tsx | 2 +- .../Tutorial/LevelSummaryPage/index.tsx | 2 +- web-app/tsconfig.paths.json | 3 +- 7 files changed, 27 insertions(+), 23 deletions(-) diff --git a/web-app/src/components/Level/index.tsx b/web-app/src/components/Level/index.tsx index 0dbfbdc4..027e92b9 100644 --- a/web-app/src/components/Level/index.tsx +++ b/web-app/src/components/Level/index.tsx @@ -1,6 +1,6 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' -import * as T from '../../../../typings/graphql' +import * as T from 'typings/graphql' import Markdown from '../Markdown' import LevelStageSummary from './LevelStageSummary' diff --git a/web-app/src/components/Stage/index.tsx b/web-app/src/components/Stage/index.tsx index df8ce9e1..5b3e065e 100644 --- a/web-app/src/components/Stage/index.tsx +++ b/web-app/src/components/Stage/index.tsx @@ -1,6 +1,6 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' -import CR from 'typings' +import * as T from 'typings/graphql' import Markdown from '../Markdown' import StepDescription from './StepDescription' @@ -23,36 +23,39 @@ const styles = { } interface Props { - stage: CR.TutorialStage - steps: { - [stepId: string]: any // CC.Step - } + stage: T.Stage complete: boolean onContinue(): void } -const Stage = ({ stage, steps, onContinue, complete }: Props) => { - const { stepList, content } = stage - const { title, text } = content +const Stage = ({ stage, onContinue, complete }: Props) => { + if (!stage.steps) { + throw new Error('No Stage steps found') + } + // grab the active step - const activeIndex = stepList.findIndex((stepId: string) => { - return steps[stepId].status.active + const activeIndex: number = stage.steps.findIndex((step: T.Step | null) => { + return step && step.status === 'ACTIVE' }) + return (
-

{title}

- {text} +

{stage.title}

+ {stage.text || ''}
- {stepList.map((stepId: string, index: number) => { - const step = steps[stepId] + {stage.steps.map((step: T.Step | null, index: number) => { + if (!step) { + return null + } + const hide = status === 'INCOMPLETE' return ( } + key={step.id} + title={step.title || `Step ${index + 1}`} + content={} /> ) })} diff --git a/web-app/src/components/TutorialList/index.tsx b/web-app/src/components/TutorialList/index.tsx index abd775e7..b88fedc3 100644 --- a/web-app/src/components/TutorialList/index.tsx +++ b/web-app/src/components/TutorialList/index.tsx @@ -1,6 +1,6 @@ import * as React from 'react' -import * as T from '../../../../typings/graphql' +import * as T from 'typings/graphql' import TutorialItem from './TutorialItem' interface Props { diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index 3ee5d1ca..aefa695f 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -1,12 +1,12 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import { Button, Card } from '@alifd/next' +import * as T from 'typings/graphql' import { send } from '../../utils/vscode' import LoadingPage from '../LoadingPage' import queryTutorial from './queryTutorial' import ErrorView from '../../components/Error' -import * as T from '../../../../typings/graphql' interface Props { tutorial: T.Tutorial diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 346015b4..2595ff65 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' -import * as T from '../../../../typings/graphql' +import * as T from 'typings/graphql' import queryTutorials from './queryTutorials' import { send } from '../../utils/vscode' diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx index 7d13b1a5..b756d1fb 100644 --- a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx @@ -1,9 +1,9 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' +import * as T from 'typings/graphql' import ErrorView from '../../../components/Error' import Level from '../../../components/Level' -import * as T from '../../../../../typings/graphql' import queryLevel from './queryLevel' interface LevelProps { 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 }, From 372658d3f2bc4cb3de380529d1545afc732097f3 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 15:54:07 -0700 Subject: [PATCH 20/64] add level/stage/step to gql --- typings/graphql.d.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index f502902f..f58bb942 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -184,6 +184,9 @@ export type TutorialVersion = { publishedAt?: Maybe, publishedBy?: Maybe, levels?: Maybe>>, + level?: Maybe, + stage?: Maybe, + step?: Maybe, }; From 44613b6f7a8909af9961f54ce6797786763eacbc Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 15:54:20 -0700 Subject: [PATCH 21/64] migrate stage page --- .../components/Level/LevelStageSummary.tsx | 2 +- .../Stage/StepDescription/index.tsx | 12 ++--- web-app/src/containers/Tutorial/StagePage.tsx | 41 --------------- .../Tutorial/StageSummaryPage/index.tsx | 50 +++++++++++++++++++ .../Tutorial/StageSummaryPage/queryStage.ts | 19 +++++++ 5 files changed, 75 insertions(+), 49 deletions(-) delete mode 100644 web-app/src/containers/Tutorial/StagePage.tsx create mode 100644 web-app/src/containers/Tutorial/StageSummaryPage/index.tsx create mode 100644 web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts diff --git a/web-app/src/components/Level/LevelStageSummary.tsx b/web-app/src/components/Level/LevelStageSummary.tsx index e4892d75..64f366c3 100644 --- a/web-app/src/components/Level/LevelStageSummary.tsx +++ b/web-app/src/components/Level/LevelStageSummary.tsx @@ -1,6 +1,6 @@ import { Icon } from '@alifd/next' import * as React from 'react' -import * as T from '../../../../typings/graphql' +import * as T from 'typings/graphql' import Markdown from '../Markdown' diff --git a/web-app/src/components/Stage/StepDescription/index.tsx b/web-app/src/components/Stage/StepDescription/index.tsx index 24688dce..dcbe179f 100644 --- a/web-app/src/components/Stage/StepDescription/index.tsx +++ b/web-app/src/components/Stage/StepDescription/index.tsx @@ -1,5 +1,4 @@ import * as React from 'react' -import CR from 'typings' import Markdown from '../../Markdown' const styles = { @@ -12,18 +11,17 @@ const styles = { } interface Props { - content: CR.TutorialStepContent - status: any // CC.StageStepStatus + text?: string | null + hide: boolean } -const StepDescription = ({ content, status }: Props) => { - const hidden = !status.active && !status.complete - if (hidden) { +const StepDescription = ({ text, hide }: Props) => { + if (hide) { return null } return (
- {content.text} + {text || ''}
) } 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/StageSummaryPage/index.tsx b/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx new file mode 100644 index 00000000..b7ca8469 --- /dev/null +++ b/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx @@ -0,0 +1,50 @@ +import * as React from 'react' +import { useQuery } from '@apollo/react-hooks' +import * as T from 'typings/graphql' + +import Stage from '../../../components/Stage' +import ErrorView from '../../../components/Error' +import queryStage from './queryStage' + +interface PageProps { + stage: T.Stage + send(action: string): void +} + +export const StageSummaryPage = ({ stage, send }: PageProps) => { + if (!stage) { + // may throw if no stage is supplied on restart + throw new Error('No stage provided') + } + + const stageComplete = stage.status === 'COMPLETE' + + const onContinue = (): void => { + send('STAGE_NEXT') + } + + return +} + +const StageSummaryPageContainer = props => { + const { loading, error, data } = useQuery(queryStage, { + variables: { + tutorialId: '1', + version: '1.0.0', + stageId: '1', + }, + }) + if (loading) { + return
Loading Levels...
+ } + + if (error) { + return + } + + const { stage } = data.tutorial.version + + return +} + +export default StageSummaryPageContainer diff --git a/web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts b/web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts new file mode 100644 index 00000000..de2d4df0 --- /dev/null +++ b/web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts @@ -0,0 +1,19 @@ +import { gql } from 'apollo-boost' + +export default gql` + query getStage($tutorialId: ID!, $version: String, $stageId: ID!) { + tutorial(id: $tutorialId) { + id + version(version: $version) { + version + coderoadVersion + stage(stageId: $stageId) { + id + title + text + status @client + } + } + } +} +` From df11100e699612df30f18013feebf8add8dc424f Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 16:20:23 -0700 Subject: [PATCH 22/64] fix typing paths for storybook --- tslint.json | 5 +++-- web-app/.storybook/webpack.config.js | 3 +++ web-app/src/components/Stage/StepDescription/index.tsx | 2 +- web-app/src/containers/Continue/index.tsx | 4 ++-- web-app/src/containers/New/index.tsx | 6 +++--- .../src/containers/Tutorial/LevelSummaryPage/index.tsx | 4 ++-- .../src/containers/Tutorial/StageSummaryPage/index.tsx | 4 ++-- web-app/src/containers/Tutorial/SummaryPage.tsx | 4 ++-- web-app/src/containers/Tutorial/index.tsx | 8 ++++---- web-app/tsconfig.paths.json | 7 ++++++- 10 files changed, 28 insertions(+), 19 deletions(-) diff --git a/tslint.json b/tslint.json index 702ed407..a4ffba90 100644 --- a/tslint.json +++ b/tslint.json @@ -13,10 +13,11 @@ "semicolon": [true, "never"], "triple-equals": true, "forin": false, - "no-console": false + "no-console": false, + "no-submodule-imports": false }, "defaultSeverity": "warning", - "no-submodule-imports": false, + "linterOptions": { "exclude": ["node_modules/**"] } 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/src/components/Stage/StepDescription/index.tsx b/web-app/src/components/Stage/StepDescription/index.tsx index dcbe179f..fc696f9d 100644 --- a/web-app/src/components/Stage/StepDescription/index.tsx +++ b/web-app/src/components/Stage/StepDescription/index.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import Markdown from '../../Markdown' +import Markdown from 'components/Markdown' const styles = { // active: { diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index aefa695f..a1eaa39b 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -3,10 +3,10 @@ import { useQuery } from '@apollo/react-hooks' import { Button, Card } from '@alifd/next' import * as T from 'typings/graphql' -import { send } from '../../utils/vscode' +import { send } from 'utils/vscode' import LoadingPage from '../LoadingPage' import queryTutorial from './queryTutorial' -import ErrorView from '../../components/Error' +import ErrorView from 'components/Error' interface Props { tutorial: T.Tutorial diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 2595ff65..10ad4a4a 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -3,10 +3,10 @@ import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' import queryTutorials from './queryTutorials' -import { send } from '../../utils/vscode' +import { send } from 'utils/vscode' import LoadingPage from '../LoadingPage' -import ErrorView from '../../components/Error' -import TutorialList from '../../components/TutorialList' +import ErrorView from 'components/Error' +import TutorialList from 'components/TutorialList' interface Props { tutorialList: T.Tutorial[] diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx index b756d1fb..4725e832 100644 --- a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx @@ -2,8 +2,8 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' -import ErrorView from '../../../components/Error' -import Level from '../../../components/Level' +import ErrorView from 'components/Error' +import Level from 'components/Level' import queryLevel from './queryLevel' interface LevelProps { diff --git a/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx b/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx index b7ca8469..91ee700d 100644 --- a/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx @@ -2,8 +2,8 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' -import Stage from '../../../components/Stage' -import ErrorView from '../../../components/Error' +import Stage from 'components/Stage' +import ErrorView from 'components/Error' import queryStage from './queryStage' interface PageProps { diff --git a/web-app/src/containers/Tutorial/SummaryPage.tsx b/web-app/src/containers/Tutorial/SummaryPage.tsx index e1eacc70..f9eb34f5 100644 --- a/web-app/src/containers/Tutorial/SummaryPage.tsx +++ b/web-app/src/containers/Tutorial/SummaryPage.tsx @@ -1,6 +1,6 @@ import * as React from 'react' -import DataContext from '../../utils/DataContext' -import Summary from '../../components/Summary' +import DataContext from 'utils/DataContext' +import Summary from 'components/Summary' interface PageProps { send(action: string): void diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx index c9658225..35dd831a 100644 --- a/web-app/src/containers/Tutorial/index.tsx +++ b/web-app/src/containers/Tutorial/index.tsx @@ -1,11 +1,11 @@ import * as React from 'react' -import { send } from '../../utils/vscode' +import { send } from 'utils/vscode' -import Router from '../../components/Router' +import Router from 'components/Router' import LoadingPage from '../LoadingPage' import SummaryPage from './SummaryPage' import LevelSummaryPage from './LevelSummaryPage' -import StagePage from './StagePage' +import StageSummaryPage from './StageSummaryPage' import CompletedPage from './CompletedPage' const { Route } = Router @@ -27,7 +27,7 @@ const Tutorial = (props: Props) => { - + diff --git a/web-app/tsconfig.paths.json b/web-app/tsconfig.paths.json index 8b9fea6b..b09fea6a 100644 --- a/web-app/tsconfig.paths.json +++ b/web-app/tsconfig.paths.json @@ -3,8 +3,13 @@ "baseUrl": "src", "rootDirs": ["src", "stories"], "paths": { + "components/*": ["./components/*"], + "containers/*": ["./containers/*"], + "services/*": ["./services/*"], + "styles/*": ["./styles/*"], "typings": ["../../typings/index.d.ts"], - "typings/graphql": ["../../typings/graphql.d.ts"] + "typings/graphql": ["../../typings/graphql.d.ts"], + "utils/*": ["./utils/*"] }, "allowSyntheticDefaultImports": true }, From 7bab14b0625642545165e610dd62771db2407bca Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 16:20:32 -0700 Subject: [PATCH 23/64] cleanup Stage story --- web-app/src/components/Stage/index.tsx | 7 ++-- web-app/stories/Stage.stories.tsx | 53 +++++++++++--------------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/web-app/src/components/Stage/index.tsx b/web-app/src/components/Stage/index.tsx index 5b3e065e..3145bc23 100644 --- a/web-app/src/components/Stage/index.tsx +++ b/web-app/src/components/Stage/index.tsx @@ -24,11 +24,10 @@ const styles = { interface Props { stage: T.Stage - complete: boolean onContinue(): void } -const Stage = ({ stage, onContinue, complete }: Props) => { +const Stage = ({ stage, onContinue }: Props) => { if (!stage.steps) { throw new Error('No Stage steps found') } @@ -50,7 +49,7 @@ const Stage = ({ stage, onContinue, complete }: Props) => { if (!step) { return null } - const hide = status === 'INCOMPLETE' + const hide = step.status === 'INCOMPLETE' return ( {
- {complete && ( + {stage.status === 'COMPLETE' && (
diff --git a/web-app/stories/Stage.stories.tsx b/web-app/stories/Stage.stories.tsx index 7b22dda1..b75636cb 100644 --- a/web-app/stories/Stage.stories.tsx +++ b/web-app/stories/Stage.stories.tsx @@ -1,9 +1,8 @@ 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' @@ -13,44 +12,38 @@ storiesOf('Tutorial SideBar', module) .addDecorator(withKnobs) .add('Stage', () => ( )) From c69b8680dc69b23152d3c219ea0f865efbf159bf Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 16:30:53 -0700 Subject: [PATCH 24/64] working stage container --- .../{LevelSummaryPage => LevelPage}/index.tsx | 0 .../queryLevel.ts | 0 .../{StageSummaryPage => StagePage}/index.tsx | 29 ++++++------------- .../queryStage.ts | 6 ++++ web-app/src/containers/Tutorial/index.tsx | 4 +-- web-app/stories/Level.stories.tsx | 2 +- web-app/stories/Stage.stories.tsx | 4 +++ 7 files changed, 22 insertions(+), 23 deletions(-) rename web-app/src/containers/Tutorial/{LevelSummaryPage => LevelPage}/index.tsx (100%) rename web-app/src/containers/Tutorial/{LevelSummaryPage => LevelPage}/queryLevel.ts (100%) rename web-app/src/containers/Tutorial/{StageSummaryPage => StagePage}/index.tsx (54%) rename web-app/src/containers/Tutorial/{StageSummaryPage => StagePage}/queryStage.ts (76%) diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx b/web-app/src/containers/Tutorial/LevelPage/index.tsx similarity index 100% rename from web-app/src/containers/Tutorial/LevelSummaryPage/index.tsx rename to web-app/src/containers/Tutorial/LevelPage/index.tsx diff --git a/web-app/src/containers/Tutorial/LevelSummaryPage/queryLevel.ts b/web-app/src/containers/Tutorial/LevelPage/queryLevel.ts similarity index 100% rename from web-app/src/containers/Tutorial/LevelSummaryPage/queryLevel.ts rename to web-app/src/containers/Tutorial/LevelPage/queryLevel.ts diff --git a/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx b/web-app/src/containers/Tutorial/StagePage/index.tsx similarity index 54% rename from web-app/src/containers/Tutorial/StageSummaryPage/index.tsx rename to web-app/src/containers/Tutorial/StagePage/index.tsx index 91ee700d..52778c64 100644 --- a/web-app/src/containers/Tutorial/StageSummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/index.tsx @@ -1,36 +1,19 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' -import * as T from 'typings/graphql' import Stage from 'components/Stage' import ErrorView from 'components/Error' import queryStage from './queryStage' interface PageProps { - stage: T.Stage send(action: string): void } -export const StageSummaryPage = ({ stage, send }: PageProps) => { - if (!stage) { - // may throw if no stage is supplied on restart - throw new Error('No stage provided') - } - - const stageComplete = stage.status === 'COMPLETE' - - const onContinue = (): void => { - send('STAGE_NEXT') - } - - return -} - -const StageSummaryPageContainer = props => { +const StageSummaryPageContainer = (props: PageProps) => { const { loading, error, data } = useQuery(queryStage, { variables: { tutorialId: '1', - version: '1.0.0', + version: '0.1.0', stageId: '1', }, }) @@ -42,9 +25,15 @@ const StageSummaryPageContainer = props => { return } + console.log('data', data) + const { stage } = data.tutorial.version - return + const onContinue = (): void => { + props.send('STAGE_NEXT') + } + + return } export default StageSummaryPageContainer diff --git a/web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts b/web-app/src/containers/Tutorial/StagePage/queryStage.ts similarity index 76% rename from web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts rename to web-app/src/containers/Tutorial/StagePage/queryStage.ts index de2d4df0..5b261720 100644 --- a/web-app/src/containers/Tutorial/StageSummaryPage/queryStage.ts +++ b/web-app/src/containers/Tutorial/StagePage/queryStage.ts @@ -12,6 +12,12 @@ export default gql` title text status @client + steps { + id + title + text + status @client + } } } } diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx index 35dd831a..db660874 100644 --- a/web-app/src/containers/Tutorial/index.tsx +++ b/web-app/src/containers/Tutorial/index.tsx @@ -4,8 +4,8 @@ import { send } from 'utils/vscode' import Router from 'components/Router' import LoadingPage from '../LoadingPage' import SummaryPage from './SummaryPage' -import LevelSummaryPage from './LevelSummaryPage' -import StageSummaryPage from './StageSummaryPage' +import LevelSummaryPage from './LevelPage' +import StageSummaryPage from './StagePage' import CompletedPage from './CompletedPage' const { Route } = Router diff --git a/web-app/stories/Level.stories.tsx b/web-app/stories/Level.stories.tsx index 0311ae01..a18ecb12 100644 --- a/web-app/stories/Level.stories.tsx +++ b/web-app/stories/Level.stories.tsx @@ -8,7 +8,7 @@ import SideBarDecorator from './utils/SideBarDecorator' import apolloProvider from './utils/ApolloDecorator' import Level from '../src/components/Level' -import LevelSummaryPageContainer, { LevelSummaryPage } from '../src/containers/Tutorial/LevelSummaryPage' +import LevelSummaryPageContainer, { LevelSummaryPage } from '../src/containers/Tutorial/LevelPage' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) diff --git a/web-app/stories/Stage.stories.tsx b/web-app/stories/Stage.stories.tsx index b75636cb..5390d26d 100644 --- a/web-app/stories/Stage.stories.tsx +++ b/web-app/stories/Stage.stories.tsx @@ -6,6 +6,8 @@ import { storiesOf } from '@storybook/react' import SideBarDecorator from './utils/SideBarDecorator' import Stage from '../src/components/Stage' +import StageContainer from '../src/containers/Tutorial/StagePage' +import ApolloDecorator from './utils/ApolloDecorator' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) @@ -47,3 +49,5 @@ storiesOf('Tutorial SideBar', module) onContinue={action('onContinue')} /> )) + .addDecorator(ApolloDecorator) + .add('Stage Summary Container', () => ) From 00b3550a7cf4a86809949e0b8c64e6f0b75a7f1b Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 16:40:34 -0700 Subject: [PATCH 25/64] cleanup storybook summary --- web-app/src/components/Summary/index.tsx | 27 +++++++-------- .../containers/Tutorial/StagePage/index.tsx | 2 +- .../src/containers/Tutorial/SummaryPage.tsx | 14 -------- .../containers/Tutorial/SummaryPage/index.tsx | 33 +++++++++++++++++++ .../Tutorial/SummaryPage/querySummary.ts | 15 +++++++++ web-app/stories/Summary.stories.tsx | 11 +------ 6 files changed, 62 insertions(+), 40 deletions(-) delete mode 100644 web-app/src/containers/Tutorial/SummaryPage.tsx create mode 100644 web-app/src/containers/Tutorial/SummaryPage/index.tsx create mode 100644 web-app/src/containers/Tutorial/SummaryPage/querySummary.ts diff --git a/web-app/src/components/Summary/index.tsx b/web-app/src/components/Summary/index.tsx index ee8d56a8..2daf7a38 100644 --- a/web-app/src/components/Summary/index.tsx +++ b/web-app/src/components/Summary/index.tsx @@ -1,6 +1,5 @@ import { Button } from '@alifd/next' import * as React from 'react' -import CR from 'typings' const styles = { card: { @@ -16,23 +15,21 @@ const styles = { } interface Props { - data: CR.TutorialData + title: string + text: string onNext(): void } -const Summary = ({ data, onNext }: Props) => { - const { summary } = data - return ( -
-
-

{summary.title}

-

{summary.description}

-
-
- -
+const Summary = ({ title, text, onNext }: Props) => ( +
+
+

{title}

+

{text}

- ) -} +
+ +
+
+) export default Summary diff --git a/web-app/src/containers/Tutorial/StagePage/index.tsx b/web-app/src/containers/Tutorial/StagePage/index.tsx index 52778c64..13b026d1 100644 --- a/web-app/src/containers/Tutorial/StagePage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/index.tsx @@ -18,7 +18,7 @@ const StageSummaryPageContainer = (props: PageProps) => { }, }) if (loading) { - return
Loading Levels...
+ return
Loading Stage...
} if (error) { diff --git a/web-app/src/containers/Tutorial/SummaryPage.tsx b/web-app/src/containers/Tutorial/SummaryPage.tsx deleted file mode 100644 index f9eb34f5..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/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/index.tsx new file mode 100644 index 00000000..75932113 --- /dev/null +++ b/web-app/src/containers/Tutorial/SummaryPage/index.tsx @@ -0,0 +1,33 @@ +import * as React from 'react' +import { useQuery } from '@apollo/react-hooks' + +import querySummary from './querySummary' +import Summary from 'components/Summary' +import ErrorView from 'components/Error' + +interface PageProps { + send(action: string): void +} + +const SummaryPage = (props: PageProps) => { + const { loading, error, data } = useQuery(querySummary, { + variables: { + tutorialId: '1', + }, + }) + + if (loading) { + return
Loading Summary...
+ } + + if (error) { + return + } + + const { title, text } = data.tutorial + const onNext = () => props.send('NEXT') + + return +} + +export default SummaryPage diff --git a/web-app/src/containers/Tutorial/SummaryPage/querySummary.ts b/web-app/src/containers/Tutorial/SummaryPage/querySummary.ts new file mode 100644 index 00000000..78dcf89a --- /dev/null +++ b/web-app/src/containers/Tutorial/SummaryPage/querySummary.ts @@ -0,0 +1,15 @@ +import { gql } from 'apollo-boost' + +export default gql` + query getSummary($tutorialId: ID!, $version: String) { + tutorial(id: $tutorialId) { + id + title + text + version(version: $version) { + version + coderoadVersion + } + } +} +` diff --git a/web-app/stories/Summary.stories.tsx b/web-app/stories/Summary.stories.tsx index 3b5d61ce..3798bda1 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' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) - .addDecorator(withKnobs) .add('Summary', () => ( - + )) From 223019ede305966e57b9635913a0e0600c1275d1 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 16:47:04 -0700 Subject: [PATCH 26/64] cleanup step stories --- web-app/stories/Step.stories.tsx | 64 ++++++++++++-------------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/web-app/stories/Step.stories.tsx b/web-app/stories/Step.stories.tsx index 982ad4b9..96027531 100644 --- a/web-app/stories/Step.stories.tsx +++ b/web-app/stories/Step.stories.tsx @@ -1,6 +1,6 @@ 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' @@ -9,46 +9,28 @@ import Step from '../src/components/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', () => ) From d0d2f07b5db837adcab74b9c7bea3b67810dc7ee Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 16:55:08 -0700 Subject: [PATCH 27/64] restructure single use components into containers --- .../New}/TutorialList/TutorialItem.tsx | 0 .../src/{components => containers/New}/TutorialList/index.tsx | 0 web-app/src/containers/New/index.tsx | 2 +- .../Tutorial/LevelPage}/Level/LevelStageSummary.tsx | 2 +- .../Tutorial/LevelPage}/Level/index.tsx | 2 +- web-app/src/containers/Tutorial/LevelPage/index.tsx | 2 +- .../Tutorial/StagePage}/Stage/StepDescription/index.tsx | 0 .../Tutorial/StagePage}/Stage/index.tsx | 2 +- web-app/src/containers/Tutorial/StagePage/index.tsx | 2 +- .../Tutorial/SummaryPage}/Summary/index.tsx | 0 web-app/src/containers/Tutorial/SummaryPage/index.tsx | 2 +- web-app/stories/Level.stories.tsx | 2 +- web-app/stories/New.stories.tsx | 4 ++-- web-app/stories/Stage.stories.tsx | 2 +- web-app/stories/Step.stories.tsx | 2 +- web-app/stories/Summary.stories.tsx | 2 +- 16 files changed, 13 insertions(+), 13 deletions(-) rename web-app/src/{components => containers/New}/TutorialList/TutorialItem.tsx (100%) rename web-app/src/{components => containers/New}/TutorialList/index.tsx (100%) rename web-app/src/{components => containers/Tutorial/LevelPage}/Level/LevelStageSummary.tsx (95%) rename web-app/src/{components => containers/Tutorial/LevelPage}/Level/index.tsx (98%) rename web-app/src/{components => containers/Tutorial/StagePage}/Stage/StepDescription/index.tsx (100%) rename web-app/src/{components => containers/Tutorial/StagePage}/Stage/index.tsx (97%) rename web-app/src/{components => containers/Tutorial/SummaryPage}/Summary/index.tsx (100%) diff --git a/web-app/src/components/TutorialList/TutorialItem.tsx b/web-app/src/containers/New/TutorialList/TutorialItem.tsx similarity index 100% rename from web-app/src/components/TutorialList/TutorialItem.tsx rename to web-app/src/containers/New/TutorialList/TutorialItem.tsx diff --git a/web-app/src/components/TutorialList/index.tsx b/web-app/src/containers/New/TutorialList/index.tsx similarity index 100% rename from web-app/src/components/TutorialList/index.tsx rename to web-app/src/containers/New/TutorialList/index.tsx diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 10ad4a4a..21efde9c 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -6,7 +6,7 @@ import queryTutorials from './queryTutorials' import { send } from 'utils/vscode' import LoadingPage from '../LoadingPage' import ErrorView from 'components/Error' -import TutorialList from 'components/TutorialList' +import TutorialList from './TutorialList' interface Props { tutorialList: T.Tutorial[] diff --git a/web-app/src/components/Level/LevelStageSummary.tsx b/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx similarity index 95% rename from web-app/src/components/Level/LevelStageSummary.tsx rename to web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx index 64f366c3..ec3cd81b 100644 --- a/web-app/src/components/Level/LevelStageSummary.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx @@ -2,7 +2,7 @@ import { Icon } from '@alifd/next' import * as React from 'react' import * as T from 'typings/graphql' -import Markdown from '../Markdown' +import Markdown from 'components/Markdown' const styles = { card: { diff --git a/web-app/src/components/Level/index.tsx b/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx similarity index 98% rename from web-app/src/components/Level/index.tsx rename to web-app/src/containers/Tutorial/LevelPage/Level/index.tsx index 027e92b9..9d043c4b 100644 --- a/web-app/src/components/Level/index.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx @@ -2,7 +2,7 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' import * as T from 'typings/graphql' -import Markdown from '../Markdown' +import Markdown from 'components/Markdown' import LevelStageSummary from './LevelStageSummary' const styles = { diff --git a/web-app/src/containers/Tutorial/LevelPage/index.tsx b/web-app/src/containers/Tutorial/LevelPage/index.tsx index 4725e832..780eb9df 100644 --- a/web-app/src/containers/Tutorial/LevelPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/index.tsx @@ -3,7 +3,7 @@ import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' import ErrorView from 'components/Error' -import Level from 'components/Level' +import Level from './Level' import queryLevel from './queryLevel' interface LevelProps { diff --git a/web-app/src/components/Stage/StepDescription/index.tsx b/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx similarity index 100% rename from web-app/src/components/Stage/StepDescription/index.tsx rename to web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx diff --git a/web-app/src/components/Stage/index.tsx b/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx similarity index 97% rename from web-app/src/components/Stage/index.tsx rename to web-app/src/containers/Tutorial/StagePage/Stage/index.tsx index 3145bc23..572c129c 100644 --- a/web-app/src/components/Stage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx @@ -2,7 +2,7 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' import * as T from 'typings/graphql' -import Markdown from '../Markdown' +import Markdown from 'components/Markdown' import StepDescription from './StepDescription' const styles = { diff --git a/web-app/src/containers/Tutorial/StagePage/index.tsx b/web-app/src/containers/Tutorial/StagePage/index.tsx index 13b026d1..ef78f5b4 100644 --- a/web-app/src/containers/Tutorial/StagePage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/index.tsx @@ -1,8 +1,8 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' -import Stage from 'components/Stage' import ErrorView from 'components/Error' +import Stage from './Stage' import queryStage from './queryStage' interface PageProps { diff --git a/web-app/src/components/Summary/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/Summary/index.tsx similarity index 100% rename from web-app/src/components/Summary/index.tsx rename to web-app/src/containers/Tutorial/SummaryPage/Summary/index.tsx diff --git a/web-app/src/containers/Tutorial/SummaryPage/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/index.tsx index 75932113..d0d2a2b0 100644 --- a/web-app/src/containers/Tutorial/SummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/SummaryPage/index.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import querySummary from './querySummary' -import Summary from 'components/Summary' +import Summary from './Summary' import ErrorView from 'components/Error' interface PageProps { diff --git a/web-app/stories/Level.stories.tsx b/web-app/stories/Level.stories.tsx index a18ecb12..46b8f7c1 100644 --- a/web-app/stories/Level.stories.tsx +++ b/web-app/stories/Level.stories.tsx @@ -7,7 +7,7 @@ import { storiesOf } from '@storybook/react' import SideBarDecorator from './utils/SideBarDecorator' import apolloProvider from './utils/ApolloDecorator' -import Level from '../src/components/Level' +import Level from '../src/containers/Tutorial/LevelPage/Level' import LevelSummaryPageContainer, { LevelSummaryPage } from '../src/containers/Tutorial/LevelPage' storiesOf('Tutorial SideBar', module) diff --git a/web-app/stories/New.stories.tsx b/web-app/stories/New.stories.tsx index e652ceab..4952ea37 100644 --- a/web-app/stories/New.stories.tsx +++ b/web-app/stories/New.stories.tsx @@ -4,8 +4,8 @@ import { action } from '@storybook/addon-actions' import * as T from '../../typings/graphql' import apolloProvider from './utils/ApolloDecorator' -import TutorialList from '../src/components/TutorialList' -import TutorialItem from '../src/components/TutorialList/TutorialItem' +import TutorialList from '../src/containers/New/TutorialList' +import TutorialItem from '../src/containers/New/TutorialList/TutorialItem' import NewContainer from '../src/containers/New' storiesOf('New', module) diff --git a/web-app/stories/Stage.stories.tsx b/web-app/stories/Stage.stories.tsx index 5390d26d..b4013fb2 100644 --- a/web-app/stories/Stage.stories.tsx +++ b/web-app/stories/Stage.stories.tsx @@ -5,7 +5,7 @@ import { object, withKnobs } from '@storybook/addon-knobs' import { storiesOf } from '@storybook/react' 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' diff --git a/web-app/stories/Step.stories.tsx b/web-app/stories/Step.stories.tsx index 96027531..dfede1c9 100644 --- a/web-app/stories/Step.stories.tsx +++ b/web-app/stories/Step.stories.tsx @@ -4,7 +4,7 @@ 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' diff --git a/web-app/stories/Summary.stories.tsx b/web-app/stories/Summary.stories.tsx index 3798bda1..df547406 100644 --- a/web-app/stories/Summary.stories.tsx +++ b/web-app/stories/Summary.stories.tsx @@ -4,7 +4,7 @@ import { linkTo } from '@storybook/addon-links' import { storiesOf } from '@storybook/react' import SideBarDecorator from './utils/SideBarDecorator' -import Summary from '../src/components/Summary' +import Summary from '../src/containers/Tutorial/SummaryPage/Summary' storiesOf('Tutorial SideBar', module) .addDecorator(SideBarDecorator) From b022179d219df7d44187bddcf12cd55415f8dc7d Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 18 Aug 2019 23:33:28 -0700 Subject: [PATCH 28/64] remove old web api --- web-app/src/services/api/index.tsx | 32 ------------------------------ 1 file changed, 32 deletions(-) delete mode 100644 web-app/src/services/api/index.tsx diff --git a/web-app/src/services/api/index.tsx b/web-app/src/services/api/index.tsx deleted file mode 100644 index 2bfdb83c..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 - 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') - } -} From 24eb6a68e219716223bcf7eed24a9518a197f6ad Mon Sep 17 00:00:00 2001 From: shmck Date: Mon, 19 Aug 2019 00:21:10 -0700 Subject: [PATCH 29/64] absolute paths not allowed --- web-app/package-lock.json | 3180 ++++++++++++----- web-app/package.json | 4 +- web-app/src/containers/Continue/index.tsx | 4 +- web-app/src/containers/New/index.tsx | 4 +- .../LevelPage/Level/LevelStageSummary.tsx | 2 +- .../Tutorial/LevelPage/Level/index.tsx | 2 +- .../containers/Tutorial/LevelPage/index.tsx | 2 +- .../StagePage/Stage/StepDescription/index.tsx | 2 +- .../Tutorial/StagePage/Stage/index.tsx | 2 +- .../containers/Tutorial/StagePage/index.tsx | 2 +- .../containers/Tutorial/SummaryPage/index.tsx | 2 +- web-app/src/containers/Tutorial/index.tsx | 4 +- web-app/tsconfig.paths.json | 7 +- 13 files changed, 2228 insertions(+), 989 deletions(-) diff --git a/web-app/package-lock.json b/web-app/package-lock.json index f65e1a8b..12227d51 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -41,48 +41,6 @@ } } }, - "@apollo/react-components": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@apollo/react-components/-/react-components-3.0.1.tgz", - "integrity": "sha512-IQwcwv+ItW/QHUeO2zQH+CJGnqepPwwShD9H6+v1ptLvixggodr7S4KalNKXgRUVJsoPBFiVgpTMoJe3h4+Eyg==", - "dev": true, - "requires": { - "@apollo/react-common": "^3.0.1", - "@apollo/react-hooks": "^3.0.1", - "prop-types": "^15.7.2", - "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==", - "dev": true - } - } - }, - "@apollo/react-hoc": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@apollo/react-hoc/-/react-hoc-3.0.1.tgz", - "integrity": "sha512-sKt0/xjr6jknJztJRWA0zX9wUY/xBq6lwyqPxrRM72hCatz/BSi1tgVv9LMHTA0aJPBK79pWXFq/EeiXW2LkVw==", - "dev": true, - "requires": { - "@apollo/react-common": "^3.0.1", - "@apollo/react-components": "^3.0.1", - "hoist-non-react-statics": "^3.3.0", - "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==", - "dev": true - } - } - }, "@apollo/react-hooks": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@apollo/react-hooks/-/react-hooks-3.0.1.tgz", @@ -101,25 +59,6 @@ } } }, - "@apollo/react-ssr": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@apollo/react-ssr/-/react-ssr-3.0.1.tgz", - "integrity": "sha512-eeAaajIH1zbMk+zigNAlEeyVH80ELrsjvRCcQxH80+THgnJx/hgkKfmhG2p1q2Djefyv6VfImAwd4xqX6/LRSA==", - "dev": true, - "requires": { - "@apollo/react-common": "^3.0.1", - "@apollo/react-hooks": "^3.0.1", - "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==", - "dev": true - } - } - }, "@babel/code-frame": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", @@ -261,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", @@ -420,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", @@ -455,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" @@ -464,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", @@ -676,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" @@ -859,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", @@ -869,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 } } }, @@ -1276,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": { @@ -1306,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": { @@ -1354,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", @@ -1365,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", @@ -1401,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", @@ -1433,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", @@ -1455,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", @@ -1505,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": { @@ -2634,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", @@ -2655,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", @@ -2670,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", @@ -2680,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" } @@ -2688,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", @@ -2701,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", @@ -2711,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", @@ -2752,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", @@ -2802,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", @@ -2870,12 +2862,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": "*", @@ -2886,6 +2880,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": "*" @@ -2898,9 +2893,17 @@ "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", @@ -2908,30 +2911,42 @@ "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" @@ -3150,22 +3165,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": { @@ -3174,15 +3191,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", @@ -3407,21 +3464,6 @@ "tslib": "^1.9.3" } }, - "apollo-storybook-core": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/apollo-storybook-core/-/apollo-storybook-core-0.5.2.tgz", - "integrity": "sha512-8CbKUbRMIxGnz5Ci1jx7dOSDmCcktykfID96wji+E/vFVzE+dvGunuvEJexiVjCOebXJinXe6dqWJZuETot+Sw==", - "dev": true - }, - "apollo-storybook-react": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/apollo-storybook-react/-/apollo-storybook-react-0.2.1.tgz", - "integrity": "sha512-xERyr0EQbiUOBLE3pLRuM27T4Fsh2dVIV8yRy0VZ3eIAsXQrcuxTuM4d5kV+UiYqBNgH9M14+C6OuF9DNMilRw==", - "dev": true, - "requires": { - "apollo-storybook-core": "^0.5.2" - } - }, "apollo-utilities": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.2.tgz", @@ -3471,6 +3513,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", @@ -3661,9 +3708,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", @@ -3679,6 +3726,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", @@ -3760,9 +3808,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", @@ -3834,29 +3882,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": { @@ -3869,6 +3925,7 @@ "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" } @@ -3902,19 +3959,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" } @@ -3923,6 +3981,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", @@ -4026,7 +4085,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", @@ -4137,12 +4197,12 @@ "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": { @@ -4180,6 +4240,7 @@ "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", @@ -4205,6 +4266,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", @@ -4226,6 +4288,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" @@ -4235,6 +4298,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", @@ -4250,6 +4314,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" } @@ -4258,6 +4323,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", @@ -4312,7 +4378,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 } } }, @@ -4345,7 +4412,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", @@ -4695,9 +4763,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" } @@ -4738,21 +4806,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" @@ -4875,7 +4944,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", @@ -5533,13 +5603,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": { @@ -5632,7 +5737,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", @@ -5654,6 +5760,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", @@ -5708,9 +5822,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", @@ -5802,7 +5916,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", @@ -6153,19 +6268,37 @@ "randomfill": "^1.0.3" } }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "requires": { - "postcss": "^7.0.5" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, + "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", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, "css-declaration-sorter": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", @@ -6375,14 +6508,14 @@ } }, "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" } @@ -6407,6 +6540,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", @@ -6596,12 +6738,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=", - "dev": true - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -6651,9 +6787,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", @@ -7008,18 +7144,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", @@ -7031,9 +7196,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", @@ -7056,75 +7221,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": { @@ -7152,9 +7454,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", @@ -7164,9 +7466,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" @@ -7234,28 +7536,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": { @@ -7368,14 +7678,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", @@ -7383,21 +7702,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": { @@ -7407,13 +7738,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", @@ -7425,9 +7764,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", @@ -7435,13 +7777,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": { @@ -7577,16 +7926,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": { @@ -7994,9 +8343,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", @@ -8058,6 +8407,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", @@ -8072,7 +8422,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 } } }, @@ -8146,9 +8497,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": { @@ -8448,19 +8799,6 @@ "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" }, - "graphql-tools": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.5.tgz", - "integrity": "sha512-kQCh3IZsMqquDx7zfIGWBau42xe46gmqabwYkpPlCLIjcEY1XK+auP7iGRD9/205BPyoQdY8hT96MPpgERdC9Q==", - "dev": true, - "requires": { - "apollo-link": "^1.2.3", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" - } - }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -8476,6 +8814,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" @@ -8618,6 +8957,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", @@ -8629,12 +8969,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", @@ -8946,16 +9288,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", @@ -8980,6 +9316,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", @@ -8999,12 +9336,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" } @@ -9099,7 +9438,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", @@ -9270,7 +9610,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", @@ -9306,7 +9647,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", @@ -9458,76 +9800,76 @@ "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", @@ -9537,46 +9879,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" } }, @@ -9590,6 +9932,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", @@ -9644,36 +9991,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" @@ -10163,55 +10510,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", @@ -10220,11 +10568,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": { @@ -10233,16 +10581,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", @@ -10250,47 +10598,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", @@ -10300,41 +10648,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", @@ -10344,35 +10692,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", @@ -10380,22 +10729,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", @@ -10418,22 +10767,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", @@ -10459,25 +10808,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": { @@ -10642,11 +10991,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": { @@ -10753,9 +11103,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", @@ -10897,26 +11247,21 @@ "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": { @@ -10936,9 +11281,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", @@ -11279,12 +11624,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", @@ -11556,6 +11898,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", @@ -11636,9 +11983,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", @@ -11650,7 +11997,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", @@ -11662,7 +12009,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": { @@ -11678,21 +12025,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==" } } }, @@ -11932,6 +12284,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", @@ -11955,7 +12312,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", @@ -12040,7 +12396,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" } @@ -12083,11 +12438,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" } }, @@ -12292,9 +12647,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", @@ -12444,11 +12799,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": { @@ -12478,9 +12833,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", @@ -12671,12 +13026,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": { @@ -12831,11 +13211,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" } }, @@ -13027,9 +13407,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" } @@ -13171,26 +13551,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", @@ -13212,6 +13592,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": { @@ -13354,9 +13811,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", @@ -13368,11 +13825,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" @@ -13420,9 +13877,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" } @@ -13455,12 +13912,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": { @@ -13477,6 +13934,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" } @@ -13669,30 +14127,29 @@ "prop-types": "^15.6.2" } }, - "react-apollo": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-apollo/-/react-apollo-3.0.1.tgz", - "integrity": "sha512-2hsSYBfxPqPquS8CupWq+U+6XuDfr/Rr1ssXwfOTYe5gCyTthdUqafIm+pyStur9X2W4ZNQMFyjVicsPNq2tnA==", - "dev": true, - "requires": { - "@apollo/react-common": "^3.0.1", - "@apollo/react-components": "^3.0.1", - "@apollo/react-hoc": "^3.0.1", - "@apollo/react-hooks": "^3.0.1", - "@apollo/react-ssr": "^3.0.1" - } - }, "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": { @@ -13722,6 +14179,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", @@ -13753,12 +14211,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", @@ -13769,6 +14229,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", @@ -13789,6 +14250,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" } @@ -13869,7 +14331,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", @@ -14028,190 +14491,774 @@ } }, "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==", - "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-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": { + "@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==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "highlight.js": "~9.12.0", + }, + "@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==" + }, + "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==" + }, + "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" + } + }, + "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==" + }, + "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", + "highlight.js": "~9.12.0", "lowlight": "~1.9.1", "prismjs": "^1.8.4", "refractor": "^2.4.1" @@ -14430,6 +15477,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", @@ -14486,6 +15538,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", @@ -14571,7 +15624,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", @@ -14649,11 +15703,6 @@ "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", @@ -14691,6 +15740,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", @@ -14705,6 +15801,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", @@ -14733,9 +15850,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", @@ -15025,7 +16142,6 @@ "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==", - "dev": true, "requires": { "clone-deep": "^4.0.1", "loader-utils": "^1.0.1", @@ -15038,7 +16154,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -15048,26 +16163,22 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "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==", - "dev": true, "requires": { "kind-of": "^6.0.2" } @@ -15080,11 +16191,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": { @@ -15456,9 +16567,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", @@ -15677,7 +16788,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", @@ -15708,9 +16820,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", @@ -15984,9 +17096,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", @@ -15997,6 +17109,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" @@ -16044,6 +17157,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", @@ -16071,9 +17189,9 @@ "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", @@ -16085,21 +17203,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", @@ -16211,13 +17345,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": { @@ -16228,24 +17362,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" + } } } }, @@ -16416,7 +17560,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", @@ -16446,9 +17591,9 @@ "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" } @@ -16471,6 +17616,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", @@ -16605,6 +17755,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", @@ -16620,6 +17771,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", @@ -16690,7 +17842,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", @@ -16786,6 +17939,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", @@ -16843,6 +17997,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", @@ -16876,6 +18035,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", @@ -16888,6 +18048,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" } @@ -16896,6 +18057,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" @@ -16907,17 +18069,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", @@ -16975,7 +18135,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", @@ -16983,34 +18144,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": { @@ -17071,6 +18268,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", @@ -17085,9 +18307,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", @@ -17420,13 +18642,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": { @@ -17529,7 +18751,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", @@ -17537,9 +18760,9 @@ "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", @@ -17562,35 +18785,56 @@ "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" diff --git a/web-app/package.json b/web-app/package.json index f78f431c..7b74826a 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -36,7 +36,7 @@ "moment": "^2.24.0", "react": "^16.9.0", "react-dom": "^16.9.0", - "react-scripts": "3.0.1", + "react-scripts": "^3.1.1", "typescript": "^3.5.3" }, "devDependencies": { @@ -53,7 +53,7 @@ "@types/react": "^16.9.2", "@types/react-dom": "^16.8.5", "@types/storybook__react": "^4.0.2", - "babel-loader": "^8.0.5", + "babel-loader": "^8.0.6", "babel-plugin-import": "^1.12.0", "node-sass": "^4.12.0", "sass-loader": "^7.2.0", diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index a1eaa39b..aefa695f 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -3,10 +3,10 @@ import { useQuery } from '@apollo/react-hooks' import { Button, Card } from '@alifd/next' import * as T from 'typings/graphql' -import { send } from 'utils/vscode' +import { send } from '../../utils/vscode' import LoadingPage from '../LoadingPage' import queryTutorial from './queryTutorial' -import ErrorView from 'components/Error' +import ErrorView from '../../components/Error' interface Props { tutorial: T.Tutorial diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 21efde9c..038d4d0f 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -3,9 +3,9 @@ import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' import queryTutorials from './queryTutorials' -import { send } from 'utils/vscode' +import { send } from '../../utils/vscode' import LoadingPage from '../LoadingPage' -import ErrorView from 'components/Error' +import ErrorView from '../../components/Error' import TutorialList from './TutorialList' interface Props { diff --git a/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx b/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx index ec3cd81b..6443ddbf 100644 --- a/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/Level/LevelStageSummary.tsx @@ -2,7 +2,7 @@ import { Icon } from '@alifd/next' import * as React from 'react' import * as T from 'typings/graphql' -import Markdown from 'components/Markdown' +import Markdown from '../../../../components/Markdown' const styles = { card: { diff --git a/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx b/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx index 9d043c4b..cb6eefa5 100644 --- a/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/Level/index.tsx @@ -2,7 +2,7 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' import * as T from 'typings/graphql' -import Markdown from 'components/Markdown' +import Markdown from '../../../../components/Markdown' import LevelStageSummary from './LevelStageSummary' const styles = { diff --git a/web-app/src/containers/Tutorial/LevelPage/index.tsx b/web-app/src/containers/Tutorial/LevelPage/index.tsx index 780eb9df..4eb5c2e8 100644 --- a/web-app/src/containers/Tutorial/LevelPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/index.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' -import ErrorView from 'components/Error' +import ErrorView from '../../../components/Error' import Level from './Level' import queryLevel from './queryLevel' diff --git a/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx b/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx index fc696f9d..5ecd71f8 100644 --- a/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/Stage/StepDescription/index.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import Markdown from 'components/Markdown' +import Markdown from '../../../../../components/Markdown' const styles = { // active: { diff --git a/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx b/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx index 572c129c..dd2a05cc 100644 --- a/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/Stage/index.tsx @@ -2,7 +2,7 @@ import { Button, Step } from '@alifd/next' import * as React from 'react' import * as T from 'typings/graphql' -import Markdown from 'components/Markdown' +import Markdown from '../../../../components/Markdown' import StepDescription from './StepDescription' const styles = { diff --git a/web-app/src/containers/Tutorial/StagePage/index.tsx b/web-app/src/containers/Tutorial/StagePage/index.tsx index ef78f5b4..7c9a2fe7 100644 --- a/web-app/src/containers/Tutorial/StagePage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' -import ErrorView from 'components/Error' +import ErrorView from '../../../components/Error' import Stage from './Stage' import queryStage from './queryStage' diff --git a/web-app/src/containers/Tutorial/SummaryPage/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/index.tsx index d0d2a2b0..ea229382 100644 --- a/web-app/src/containers/Tutorial/SummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/SummaryPage/index.tsx @@ -3,7 +3,7 @@ import { useQuery } from '@apollo/react-hooks' import querySummary from './querySummary' import Summary from './Summary' -import ErrorView from 'components/Error' +import ErrorView from '../../../components/Error' interface PageProps { send(action: string): void diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx index db660874..0709af3a 100644 --- a/web-app/src/containers/Tutorial/index.tsx +++ b/web-app/src/containers/Tutorial/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' -import { send } from 'utils/vscode' +import { send } from '../../utils/vscode' -import Router from 'components/Router' +import Router from '../../components/Router' import LoadingPage from '../LoadingPage' import SummaryPage from './SummaryPage' import LevelSummaryPage from './LevelPage' diff --git a/web-app/tsconfig.paths.json b/web-app/tsconfig.paths.json index b09fea6a..8b9fea6b 100644 --- a/web-app/tsconfig.paths.json +++ b/web-app/tsconfig.paths.json @@ -3,13 +3,8 @@ "baseUrl": "src", "rootDirs": ["src", "stories"], "paths": { - "components/*": ["./components/*"], - "containers/*": ["./containers/*"], - "services/*": ["./services/*"], - "styles/*": ["./styles/*"], "typings": ["../../typings/index.d.ts"], - "typings/graphql": ["../../typings/graphql.d.ts"], - "utils/*": ["./utils/*"] + "typings/graphql": ["../../typings/graphql.d.ts"] }, "allowSyntheticDefaultImports": true }, From be46fad7221f1306a42940aa4d7a721f593eee34 Mon Sep 17 00:00:00 2001 From: shmck Date: Mon, 19 Aug 2019 00:21:31 -0700 Subject: [PATCH 30/64] create setStatus mutation --- web-app/src/App.tsx | 34 ++++++----- .../src/containers/New/TutorialList/index.tsx | 4 +- web-app/src/services/apollo/index.ts | 56 ++----------------- web-app/src/services/apollo/mutations.ts | 7 +++ web-app/src/services/apollo/resolvers.ts | 53 ++++++++++++++++++ web-app/src/services/apollo/typeDefs.ts | 15 +++++ web-app/src/utils/DataContext.tsx | 22 -------- 7 files changed, 102 insertions(+), 89 deletions(-) create mode 100644 web-app/src/services/apollo/mutations.ts create mode 100644 web-app/src/services/apollo/resolvers.ts create mode 100644 web-app/src/services/apollo/typeDefs.ts delete mode 100644 web-app/src/utils/DataContext.tsx diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index e48c7cfe..75e8954d 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -1,11 +1,11 @@ import * as React from 'react' -import { ApolloProvider } from '@apollo/react-hooks' +import { ApolloProvider, useMutation } from '@apollo/react-hooks' import * as CR from 'typings' import client from './services/apollo' +import { SET_STATUS } from './services/apollo/mutations' import Debugger from './components/Debugger' import Routes from './Routes' -import DataContext, { initialData, initialState } from './utils/DataContext' import { send } from './utils/vscode' interface ReceivedEvent { @@ -13,18 +13,29 @@ interface ReceivedEvent { } const App = () => { + const initialState = { SelectTutorial: 'Initial ' } + + // set state machine state const [state, setState] = React.useState(initialState) - const [data, setData]: [CR.MachineContext, (data: CR.MachineContext) => void] = React.useState(initialData) + + // update level/stage/step status based on user progress & position + // TODO: model server more effeciently + const [setStatus] = useMutation(SET_STATUS) // update state based on response from editor const handleEvent = (event: ReceivedEvent): void => { const message = event.data // messages from core + const { progress, position } = message.payload.data + if (message.type === 'SET_STATE') { + // SET_STATE - set state machine state setState(message.payload.state) - setData(message.payload.data) + + setStatus({ variables: { progress, position } }) } else if (message.type === 'SET_DATA') { - setData(message.payload.data) + // SET_DATA - set state machine context + setStatus({ variables: { progress, position } }) } } @@ -44,20 +55,15 @@ const App = () => { 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 && } - -
-
+
+ {process.env.REACT_APP_DEBUG && } + +
) } diff --git a/web-app/src/containers/New/TutorialList/index.tsx b/web-app/src/containers/New/TutorialList/index.tsx index b88fedc3..c40dbacd 100644 --- a/web-app/src/containers/New/TutorialList/index.tsx +++ b/web-app/src/containers/New/TutorialList/index.tsx @@ -14,8 +14,8 @@ const TutorialList = (props: Props) => ( props.onNew(tutorial.id)} - title={tutorial.title} - text={tutorial.text} + title={tutorial.title || ''} + text={tutorial.text || ''} /> ))}
diff --git a/web-app/src/services/apollo/index.ts b/web-app/src/services/apollo/index.ts index 4fa5c194..c874d569 100644 --- a/web-app/src/services/apollo/index.ts +++ b/web-app/src/services/apollo/index.ts @@ -1,62 +1,16 @@ import ApolloClient, { InMemoryCache } from 'apollo-boost' +import typeDefs from './typeDefs' +import resolvers from './resolvers' + const client = new ApolloClient({ uri: process.env.REACT_APP_GQL_URI, headers: { Authorization: process.env.GQL_AUTH_TOKEN, }, cache: new InMemoryCache(), - resolvers: { - Mutation: { - setStatus: (_root, variables, { cache, getCacheKey }) => { - // TODO: optimize status setting to act on diffs - - // set local cache - function set(typename: string, id: string, status: 'ACTIVE' | 'COMPLETE') { - const writeId = getCacheKey({ __typename: typename, id }) - const data = { status } - cache.writeData({ id: writeId, data }) - } - - const { progress, position } = variables - - // set level progress & active - for (const levelId of Object.keys(progress.levels)) { - set('Level', levelId, 'COMPLETE') - } - set('Level', position.levelId, 'ACTIVE') - - // set stage progress & active - for (const stageId of Object.keys(progress.stages)) { - set('Stage', stageId, 'COMPLETE') - } - set('Stage', position.stageId, 'ACTIVE') - - // set step progress & active - for (const stepId of Object.keys(progress.steps)) { - set('Step', stepId, 'COMPLETE') - } - set('Step', position.stepId, 'ACTIVE') - - return null - }, - }, - Level: { - status() { - return 'INCOMPLETE' - } - }, - Stage: { - status() { - return 'INCOMPLETE' - } - }, - Step: { - status() { - return 'INCOMPLETE' - } - } - }, + typeDefs, + resolvers, }) export default client \ No newline at end of file diff --git a/web-app/src/services/apollo/mutations.ts b/web-app/src/services/apollo/mutations.ts new file mode 100644 index 00000000..f4a0c5ce --- /dev/null +++ b/web-app/src/services/apollo/mutations.ts @@ -0,0 +1,7 @@ +import { gql } from 'apollo-boost' + +export const SET_STATUS = gql` + mutation ToggleTodo($progress: Progress!, $position: Position) { + setStatus(progress: $progress, position: $position) @client + } +` \ No newline at end of file diff --git a/web-app/src/services/apollo/resolvers.ts b/web-app/src/services/apollo/resolvers.ts new file mode 100644 index 00000000..18e987c9 --- /dev/null +++ b/web-app/src/services/apollo/resolvers.ts @@ -0,0 +1,53 @@ +const resolvers = { + Mutation: { + setStatus: (_root, variables, { cache, getCacheKey }) => { + // TODO: optimize status setting to act on diffs + + // set local cache + function set(typename: string, id: string, status: 'ACTIVE' | 'COMPLETE') { + const writeId = getCacheKey({ __typename: typename, id }) + const data = { status } + cache.writeData({ id: writeId, data }) + } + + const { progress, position } = variables + + // set level progress & active + for (const levelId of Object.keys(progress.levels)) { + set('Level', levelId, 'COMPLETE') + } + set('Level', position.levelId, 'ACTIVE') + + // set stage progress & active + for (const stageId of Object.keys(progress.stages)) { + set('Stage', stageId, 'COMPLETE') + } + set('Stage', position.stageId, 'ACTIVE') + + // set step progress & active + for (const stepId of Object.keys(progress.steps)) { + set('Step', stepId, 'COMPLETE') + } + set('Step', position.stepId, 'ACTIVE') + + return null + }, + }, + Level: { + status() { + return 'INCOMPLETE' + } + }, + Stage: { + status() { + return 'INCOMPLETE' + } + }, + Step: { + status() { + return 'INCOMPLETE' + } + } +} + +export default resolvers \ No newline at end of file diff --git a/web-app/src/services/apollo/typeDefs.ts b/web-app/src/services/apollo/typeDefs.ts new file mode 100644 index 00000000..2142f0b7 --- /dev/null +++ b/web-app/src/services/apollo/typeDefs.ts @@ -0,0 +1,15 @@ +import { gql } from 'apollo-boost' + +const typeDefs = gql` + input Progress { + levels: JSONObject + stages: JSONObject + steps: JSONObject + } + input Position { + levelId: String + stageId: String + stepId: String + } +` +export default typeDefs \ No newline at end of file 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 From 26ae887ebc69793e9b9bc5bf7e74a201e82f790d Mon Sep 17 00:00:00 2001 From: shmck Date: Mon, 19 Aug 2019 00:23:47 -0700 Subject: [PATCH 31/64] resolve build issues --- web-app/src/containers/Continue/index.tsx | 2 +- web-app/src/containers/New/index.tsx | 2 +- web-app/src/services/apollo/resolvers.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web-app/src/containers/Continue/index.tsx b/web-app/src/containers/Continue/index.tsx index aefa695f..00279ac6 100644 --- a/web-app/src/containers/Continue/index.tsx +++ b/web-app/src/containers/Continue/index.tsx @@ -38,7 +38,7 @@ const ContinuePageContainer = () => { }) if (loading) { - return Loading + return } if (error) { diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 038d4d0f..560da00b 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -25,7 +25,7 @@ const Loading = () => const NewPageContainer = () => { const { data, loading, error } = useQuery(queryTutorials) if (loading) { - return Loading + return } if (error) { diff --git a/web-app/src/services/apollo/resolvers.ts b/web-app/src/services/apollo/resolvers.ts index 18e987c9..b34b5545 100644 --- a/web-app/src/services/apollo/resolvers.ts +++ b/web-app/src/services/apollo/resolvers.ts @@ -1,6 +1,6 @@ const resolvers = { Mutation: { - setStatus: (_root, variables, { cache, getCacheKey }) => { + setStatus: (_root: any, variables: any, { cache, getCacheKey }: any) => { // TODO: optimize status setting to act on diffs // set local cache From c39666a26a0c7f7facad55106d1914d3aba339e6 Mon Sep 17 00:00:00 2001 From: shmck Date: Mon, 19 Aug 2019 19:39:42 -0700 Subject: [PATCH 32/64] update deps --- package-lock.json | 62 +++++++++++++++++------------------------------ package.json | 6 ++--- 2 files changed, 25 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc42bfaa..83f09a3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,9 +46,9 @@ "dev": true }, "@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.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", "dev": true }, "agent-base": { @@ -242,20 +242,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": { @@ -332,9 +332,9 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "dotenv": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", - "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==" + "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", @@ -539,13 +539,10 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" }, "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", @@ -717,15 +714,6 @@ "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==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -900,9 +888,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" @@ -1451,12 +1439,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", diff --git a/package.json b/package.json index 50d9de6c..a52332dd 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "axios": "^0.19.0", - "dotenv": "^8.0.0", + "dotenv": "^8.1.0", "graphql": "^14.4.2", "vscode": "^1.1.36", "xstate": "^4.6.7" @@ -39,8 +39,8 @@ "@types/dotenv": "^6.1.1", "@types/graphql": "^14.2.3", "@types/mocha": "^5.2.7", - "@types/node": "^12.7.1", - "concurrently": "^4.1.1", + "@types/node": "^12.7.2", + "concurrently": "^4.1.2", "prettier": "^1.18.2", "tslint": "^5.18.0", "tslint-config-prettier": "^1.18.0", From 6c73657bdfd187b4c1d50ee5c360ec259b8e4439 Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 20:28:41 -0700 Subject: [PATCH 33/64] fix react webview script issue --- src/editor/ReactWebView.ts | 338 +++++++++++++++++++------------------ 1 file changed, 176 insertions(+), 162 deletions(-) diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 446b6a9a..0f42d801 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -2,173 +2,187 @@ import * as path from 'path' import * as CR from 'typings' import * as vscode from 'vscode' +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 */ 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 + 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 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 mainStyle = manifest.files['main.css'] + const stylePathOnDisk = vscode.Uri.file(path.join(this.extensionPath, 'build', mainStyle)) + const styleUri = stylePathOnDisk.with({scheme: 'vscode-resource'}) + + 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'}) + } + + // map over scripts + const scripts = [{ + file: './webpackBuild.js', + }, { + manifest: 'runtime~main.js', + }, { + manifest: 'main.js', + }, { + // grab first file that matches chunk + manifest: Object.keys(manifest.files).filter(f => f.match(/^static\/js\/.+\.js$/))[0], + }].map(script => ({ + nonce: getNonce(), + src: script.manifest ? getSrc(script.manifest) : script.file + })) + + + const indexHtml = ` - - - - - React App - - - - - - - - - - - - -
Loading...
- - - - - ` - } + + + + + React App + + + + + + + + + + + + +
Loading...
+ ${scripts.map(s => ``).join('\n')} + + ` + + console.log(indexHtml) + + return indexHtml + } + } export default ReactWebView From 36af36941e2d9433ed4d5705ff94401b1b40450f Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 20:41:28 -0700 Subject: [PATCH 34/64] create script for styles --- src/editor/ReactWebView.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 0f42d801..1156c42a 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -128,16 +128,18 @@ class ReactWebView { const manifest = require(path.join(this.extensionPath, 'build', 'asset-manifest.json')) - const mainStyle = manifest.files['main.css'] - const stylePathOnDisk = vscode.Uri.file(path.join(this.extensionPath, 'build', mainStyle)) - const styleUri = stylePathOnDisk.with({scheme: 'vscode-resource'}) - 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', @@ -146,8 +148,8 @@ class ReactWebView { }, { manifest: 'main.js', }, { - // grab first file that matches chunk - manifest: Object.keys(manifest.files).filter(f => f.match(/^static\/js\/.+\.js$/))[0], + // 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 @@ -165,7 +167,7 @@ class ReactWebView { - + ${styles.map(styleUri => ``).join('\n')} From a058eff07b8227ec8d9376b4352b875944a92532 Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 20:45:17 -0700 Subject: [PATCH 35/64] update deps --- package-lock.json | 6 +-- package.json | 2 +- web-app/package-lock.json | 84 ++++++++++++++++++++++++++++++--------- web-app/package.json | 8 ++-- 4 files changed, 74 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 83f09a3d..973a215f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1242,9 +1242,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", diff --git a/package.json b/package.json index a52332dd..af663e3f 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@types/node": "^12.7.2", "concurrently": "^4.1.2", "prettier": "^1.18.2", - "tslint": "^5.18.0", + "tslint": "^5.19.0", "tslint-config-prettier": "^1.18.0", "typescript": "^3.5.3" }, diff --git a/web-app/package-lock.json b/web-app/package-lock.json index 12227d51..99c5a12c 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.7", - "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.16.7.tgz", - "integrity": "sha512-TSmRNooTozOA2HDolqmCWEgaEjtat+ZObZTHJ0Qdyk9QPD2Dr3qu1nUqGRPyC0PA7hipa6S7FjibPH901ZwCxg==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@alifd/next/-/next-1.17.7.tgz", + "integrity": "sha512-6JEtZ5VzYj5E6eHHS4uiTAsX/jlHA3/j0oVQBek73okdwU6RQ4330eYwcbwuUpPnIK3rvztbWW5jPsYLWbEdvw==", "requires": { "babel-runtime": "^6.26.0", "classnames": "^2.2.3", @@ -2775,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": "*" @@ -2836,9 +2836,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": "*" @@ -15045,6 +15045,16 @@ "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", @@ -15106,6 +15116,11 @@ "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", @@ -15193,6 +15208,25 @@ "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", @@ -15207,6 +15241,14 @@ "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", @@ -16139,21 +16181,23 @@ } }, "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": "7.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", + "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", + "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" + "semver": "^6.3.0" }, "dependencies": { "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==", + "dev": true, "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -16163,22 +16207,26 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "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==" + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true }, "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": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, "requires": { "kind-of": "^6.0.2" } diff --git a/web-app/package.json b/web-app/package.json index 7b74826a..655455ed 100644 --- a/web-app/package.json +++ b/web-app/package.json @@ -26,7 +26,7 @@ "extends": "react-app" }, "dependencies": { - "@alifd/next": "^1.16.7", + "@alifd/next": "^1.17.7", "@apollo/react-hooks": "^3.0.1", "apollo-boost": "^0.4.4", "graphql": "^14.4.2", @@ -47,16 +47,16 @@ "@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.2", "@types/react": "^16.9.2", - "@types/react-dom": "^16.8.5", + "@types/react-dom": "^16.9.0", "@types/storybook__react": "^4.0.2", "babel-loader": "^8.0.6", "babel-plugin-import": "^1.12.0", "node-sass": "^4.12.0", - "sass-loader": "^7.2.0", + "sass-loader": "^7.3.1", "typescript-eslint-parser": "^22.0.0" } } From 8c72738e6959ecf6431b9925161fcb70e3566e46 Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 20:47:40 -0700 Subject: [PATCH 36/64] cleanup logs --- src/editor/ReactWebView.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 1156c42a..4609232b 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -137,7 +137,7 @@ class ReactWebView { const styles = [ 'main.css', // get style chunk - Object.keys(manifest.files).find(f => f.match(/^static\/css\/.+\.css$/)) || '' + // Object.keys(manifest.files).find(f => f.match(/^static\/css\/.+\.css$/)) || '' ].map(style => getSrc(style)) // map over scripts @@ -165,8 +165,7 @@ class ReactWebView { React App - - + ${styles.map(styleUri => ``).join('\n')} @@ -180,8 +179,6 @@ class ReactWebView { ` - console.log(indexHtml) - return indexHtml } From d784c57593fc3e3d967ae2a323a9483cd7d7aa22 Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 21:10:35 -0700 Subject: [PATCH 37/64] fix use effects --- web-app/src/App.tsx | 8 +++++--- web-app/src/Routes.tsx | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 75e8954d..9c5e54dc 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -46,16 +46,18 @@ const App = () => { return () => { window.removeEventListener(listener, handleEvent) } - }) + }, []) // trigger progress when webview loaded React.useEffect(() => { send('WEBVIEW_LOADED') - }) + }, []) const value = { state, - } + } + + console.log(client) // TODO: refactor cond to user and accept first route as if/else if return ( diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index fdded7cb..58c79a4c 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -37,7 +37,7 @@ const Routes = ({ state }: Props) => { return () => { clearInterval(dimensionsInterval) } - }) + }, []) return (
From f4e9877d7122f92082f500644736942789702236 Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 21:10:58 -0700 Subject: [PATCH 38/64] fix no route unclear object --- web-app/src/components/Router/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-app/src/components/Router/index.tsx b/web-app/src/components/Router/index.tsx index a865b937..893ab405 100644 --- a/web-app/src/components/Router/index.tsx +++ b/web-app/src/components/Router/index.tsx @@ -15,7 +15,7 @@ const Router = ({ state, children }: Props) => { return child.props.children } } - console.warn(`No Route matches for ${state}`) + console.warn(`No Route matches for ${JSON.stringify(state)}`) return null } From 6a13fcd7fc611d30745ef81a149935aa7a51a685 Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 21:11:14 -0700 Subject: [PATCH 39/64] update api url for src --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index b4851fcc..3f1de458 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -API_URL=http://localhost:3000/graphql \ No newline at end of file +API_URL=http://localhost:4000/graphql \ No newline at end of file From 39af55d36c0c71f70ff306e3ac42adf60e3063aa Mon Sep 17 00:00:00 2001 From: shmck Date: Wed, 21 Aug 2019 21:11:28 -0700 Subject: [PATCH 40/64] cleanup apollo server --- web-app/src/services/apollo/index.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/web-app/src/services/apollo/index.ts b/web-app/src/services/apollo/index.ts index c874d569..dbca44f2 100644 --- a/web-app/src/services/apollo/index.ts +++ b/web-app/src/services/apollo/index.ts @@ -1,16 +1,16 @@ -import ApolloClient, { InMemoryCache } from 'apollo-boost' +import ApolloClient, {InMemoryCache} from 'apollo-boost' import typeDefs from './typeDefs' import resolvers from './resolvers' const client = new ApolloClient({ - uri: process.env.REACT_APP_GQL_URI, - headers: { - Authorization: process.env.GQL_AUTH_TOKEN, - }, - cache: new InMemoryCache(), - typeDefs, - resolvers, + uri: process.env.REACT_APP_GQL_URI, + headers: { + Authorization: process.env.REACT_APP_GQL_AUTH_TOKEN, + }, + cache: new InMemoryCache(), + typeDefs, + resolvers, }) export default client \ No newline at end of file From 8740c1d9fe4de3ec7a952785665722863e0697ae Mon Sep 17 00:00:00 2001 From: shmck Date: Thu, 22 Aug 2019 20:46:38 -0700 Subject: [PATCH 41/64] migrate to graphql-request on server --- package-lock.json | 54 ++-- package.json | 3 +- src/editor/commands/index.ts | 257 ++++++++--------- src/services/api/api.ts | 13 - src/services/api/gql/query/tutorial.gql | 15 - src/services/api/gql/tutorial.ts | 53 ++++ src/services/api/index.ts | 40 +-- src/state/actions/index.ts | 358 ++++++++++++------------ tsconfig.json | 4 +- web-app/src/App.tsx | 2 - 10 files changed, 414 insertions(+), 385 deletions(-) delete mode 100644 src/services/api/api.ts delete mode 100644 src/services/api/gql/query/tutorial.gql create mode 100644 src/services/api/gql/tutorial.ts diff --git a/package-lock.json b/package-lock.json index 973a215f..9f09d3a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -122,15 +122,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, - "axios": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", - "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -280,6 +271,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", @@ -437,14 +437,6 @@ "locate-path": "^3.0.0" } }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -509,6 +501,19 @@ "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", @@ -598,11 +603,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" - }, "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", @@ -818,6 +818,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "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", @@ -1361,6 +1366,11 @@ "https-proxy-agent": "^2.2.1" } }, + "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", diff --git a/package.json b/package.json index af663e3f..614321fb 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,10 @@ "watch": "tsc -watch -p ./" }, "dependencies": { - "axios": "^0.19.0", "dotenv": "^8.1.0", "graphql": "^14.4.2", + "graphql-request": "^1.8.2", + "graphql-tag": "^2.10.1", "vscode": "^1.1.36", "xstate": "^4.6.7" }, diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index c6a00255..92047d3f 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -1,149 +1,154 @@ -import { join } from 'path' +import {join} from 'path' import * as CR from 'typings' +import * as G from 'typings/graphql' import * as vscode from 'vscode' import ReactWebView from '../ReactWebView' -import { setStorage } from '../storage' -import { isEmptyWorkspace } from '../workspace' +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', + 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 + 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 }], - }) + 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 +export const createCommands = ({context, machine, storage, git, position}: CreateCommandProps) => { + // React panel webview + let webview: any - return { - // initialize - [COMMANDS.START]: () => { + 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' - } + 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) + 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') + // 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: G.Tutorial) => { + console.log('launch tutorial') - await isEmptyWorkspace() + await isEmptyWorkspace() - await git.gitInitIfNotExists() + await git.gitInitIfNotExists() - // TODO: use actual tutorial repo - await Promise.all([git.gitSetupRemote(tutorial.meta.repo), storage.setTutorial(tutorial), storage.resetProgress()]) + if (!tutorial.repo || !tutorial.repo.uri) { + throw new Error('Tutorial repo uri not found') + } - 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') - }, - } + // TODO: use actual tutorial repo + await Promise.all([git.gitSetupRemote(tutorial.repo.uri), 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/services/api/api.ts b/src/services/api/api.ts deleted file mode 100644 index c51faa37..00000000 --- a/src/services/api/api.ts +++ /dev/null @@ -1,13 +0,0 @@ -import axios from 'axios' - -require('dotenv').config() - -const api = axios.create({ - baseURL: process.env.API_URL, - method: 'POST', - headers: { - 'Content-Type': 'application/graphql', - } -}) - -export default api \ No newline at end of file diff --git a/src/services/api/gql/query/tutorial.gql b/src/services/api/gql/query/tutorial.gql deleted file mode 100644 index 444f4a8b..00000000 --- a/src/services/api/gql/query/tutorial.gql +++ /dev/null @@ -1,15 +0,0 @@ -query getTutorial($tutorialId: ID!) { - tutorial(id: $tutorialId) { - id - testRunner - codingLanguage - repo { - uri - branch - } - version { - version - coderoadVersion - } - } -} diff --git a/src/services/api/gql/tutorial.ts b/src/services/api/gql/tutorial.ts new file mode 100644 index 00000000..878ec554 --- /dev/null +++ b/src/services/api/gql/tutorial.ts @@ -0,0 +1,53 @@ +import gql from 'graphql-tag' + +const getTutorial = gql` + query getTutorial($tutorialId: ID!) { + tutorial(id: $tutorialId) { + id + testRunner + codingLanguage + repo { + uri + branch + } + version { + version + coderoadVersion + levels { + id + setup { + id + files + commits + commands + } + stages { + id + setup { + id + files + commits + commands + } + steps { + id + setup { + id + files + commits + commands + } + solution { + id + files + commits + } + } + } + } + } + } + } +` + +export default getTutorial \ No newline at end of file diff --git a/src/services/api/index.ts b/src/services/api/index.ts index dbcac727..007afc49 100644 --- a/src/services/api/index.ts +++ b/src/services/api/index.ts @@ -1,31 +1,17 @@ -import * as CR from 'typings' +import * as dotenv from 'dotenv' +import {GraphQLClient} from 'graphql-request' -// temporary tutorials -import basicTutorial from '../../tutorials/basic' +dotenv.config() -interface Options { - resource: string - params?: any -} +const url: string = process.env.API_URL || '' +const token: string = process.env.API_AUTH_TOKEN || '' // dev only -const tutorialsData: { [key: string]: CR.Tutorial } = { - [basicTutorial.id]: basicTutorial, -} +// ... or create a GraphQL client instance to send requests +const client: GraphQLClient = new GraphQLClient(url, { + headers: { + 'Content-Type': 'application/graphql', + 'Authorization': token + } +}) -// TODO: replace with fetch resource in ./api.ts -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') - } -} +export default client \ No newline at end of file diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index bad7e107..291cef14 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -1,202 +1,204 @@ -import { assign } from 'xstate' +import {assign} from 'xstate' // NOTE: codesmell - importing machine -import { machine } from '../../extension' +import {machine} from '../../extension' import api from '../../services/api' import * as CR from 'typings' +import * as G from 'typings/graphql' +import tutorialQuery from '@gql/tutorial' import * as storage from '../../services/storage' import * as git from '../../services/git' -let currentTutorial: CR.Tutorial | undefined +let currentTutorial: G.Tutorial | undefined let currentProgress: CR.Progress = { - levels: {}, - stages: {}, - steps: {}, - complete: false, + 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 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, - } + const nextPosition: CR.Position = { + levelId, + stageId, + stepId, + } - return nextPosition + 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) + 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 - } + 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 }) + machine.send(canContinue ? 'CONTINUE' : 'NEW') + }, + async tutorialLaunch() { + const tutorial: G.Tutorial = await api.request(tutorialQuery, { + tutorialId: '1', // TODO: add selection of tutorial id + }) + currentTutorial = tutorial + console.log(tutorial) + dispatch('coderoad.tutorial_launch', tutorial) + }, + 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 + 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) + 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 nextStepId = currentStepIndex < stepList.length ? stepList[currentStepIndex + 1] : position.stepId - const nextPosition = { - ...context.position, - stepId: nextStepId, - } + 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] + 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 (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) - }, + // 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/tsconfig.json b/tsconfig.json index be561d2d..4ffebcd7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,9 @@ "experimentalDecorators": true, "emitDecoratorMetadata": true, "paths": { - "typings": ["../typings/index.d.ts"] + "typings": ["../typings/index.d.ts"], + "typings/graphql": ["../typings/graphql.d.ts"], + "@gql/*": ["services/api/gql/*"] }, "allowJs": true }, diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 9c5e54dc..0f9ddf47 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -57,8 +57,6 @@ const App = () => { state, } - console.log(client) - // TODO: refactor cond to user and accept first route as if/else if return ( From 57768778f25a217a7120508a79b156ad964e2ff5 Mon Sep 17 00:00:00 2001 From: shmck Date: Thu, 22 Aug 2019 21:52:50 -0700 Subject: [PATCH 42/64] tutorial command progress --- package-lock.json | 5 +++++ src/editor/commands/index.ts | 10 ++++++---- tsconfig.json | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f09d3a8..3eceab9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -996,6 +996,11 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, + "ramda": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", + "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" + }, "read-pkg": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index 92047d3f..cd603a44 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -96,14 +96,16 @@ export const createCommands = ({context, machine, storage, git, position}: Creat machine.send('TUTORIAL_LOADED') }, - [COMMANDS.TUTORIAL_SETUP]: async (tutorial: CR.Tutorial) => { + [COMMANDS.TUTORIAL_SETUP]: async (tutorial: G.Tutorial) => { + + // TODO: allow multiple coding languages in a tutorial console.log('tutorial setup', tutorial) // setup onSave hook - const languageIds = tutorial.meta.languages - console.log(`languageIds: ${languageIds.join(', ')}`) + const languageId = tutorial.codingLanguage + // 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') { + if (document.uri.scheme === 'file' && languageId === document.languageId) { // do work machine.send('TEST_RUN') } diff --git a/tsconfig.json b/tsconfig.json index 4ffebcd7..b6730a63 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,7 @@ "paths": { "typings": ["../typings/index.d.ts"], "typings/graphql": ["../typings/graphql.d.ts"], + "@api": ["services/api/index"], "@gql/*": ["services/api/gql/*"] }, "allowJs": true From 47224c4fb7b1f6f665b75a071674059b6dc9a40e Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 12:54:16 -0700 Subject: [PATCH 43/64] update deps --- package-lock.json | 22 ++++++++++------------ package.json | 4 ++-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3eceab9f..053f380a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,10 +34,13 @@ } }, "@types/graphql": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.2.3.tgz", - "integrity": "sha512-UoCovaxbJIxagCvVfalfK7YaNhmxj3BQFRQ2RHQKLiu+9wNXhJnlbspsLHt/YQM99IaLUUFJNzCwzc6W0ypMeQ==", - "dev": true + "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/mocha": { "version": "5.2.7", @@ -494,9 +497,9 @@ } }, "graphql": { - "version": "14.4.2", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.4.2.tgz", - "integrity": "sha512-6uQadiRgnpnSS56hdZUSvFrVcQ6OF9y6wkxJfKquFtHlnl7+KSuWwSJsdwiK1vybm1HgcdbpGkCpvhvsVQ0UZQ==", + "version": "14.5.3", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.3.tgz", + "integrity": "sha512-W8A8nt9BsMg0ZK2qA3DJIVU6muWhxZRYLTmc+5XGwzWzVdUdPVlAAg5hTBjiTISEnzsKL/onasu6vl3kgGTbYg==", "requires": { "iterall": "^1.2.2" } @@ -996,11 +999,6 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, - "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==" - }, "read-pkg": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", diff --git a/package.json b/package.json index 614321fb..c024f11b 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "dotenv": "^8.1.0", - "graphql": "^14.4.2", + "graphql": "^14.5.3", "graphql-request": "^1.8.2", "graphql-tag": "^2.10.1", "vscode": "^1.1.36", @@ -38,7 +38,7 @@ }, "devDependencies": { "@types/dotenv": "^6.1.1", - "@types/graphql": "^14.2.3", + "@types/graphql": "^14.5.0", "@types/mocha": "^5.2.7", "@types/node": "^12.7.2", "concurrently": "^4.1.2", From 7bbacd6d103fbeef1d3c32acaa0da5de54594106 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 12:54:28 -0700 Subject: [PATCH 44/64] update typings --- tslint.json | 2 +- typings/graphql.d.ts | 612 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 485 insertions(+), 129 deletions(-) diff --git a/tslint.json b/tslint.json index a4ffba90..dc7c70a8 100644 --- a/tslint.json +++ b/tslint.json @@ -19,6 +19,6 @@ "defaultSeverity": "warning", "linterOptions": { - "exclude": ["node_modules/**"] + "exclude": ["node_modules/**", "src/typings/graphql.d.ts"] } } diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index f58bb942..0d4217a1 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -1,208 +1,564 @@ -import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; +import {GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig} from 'graphql'; export type Maybe = T | null; -export type RequireFields = { [X in Exclude]?: T[X] } & { [P in K]-?: NonNullable }; +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 type AuthenticateUserPayload = { - __typename?: 'AuthenticateUserPayload', - user: User, - token: Scalars['String'], + 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' + Public = 'PUBLIC', + Private = 'PRIVATE' } +export type CreateTokenInput = { + accessToken: Scalars['String'], +}; + +export type CreateTokenOutput = { + __typename?: 'CreateTokenOutput', + token: Scalars['String'], +}; + export enum EnumCodingLanguage { - Javascript = 'JAVASCRIPT' + Javascript = 'JAVASCRIPT' } export enum EnumTestRunner { - Jest = 'JEST' + Jest = 'JEST' } export type GithubUser = { - __typename?: 'GithubUser', - id: Scalars['ID'], - name?: Maybe, - email?: Maybe, - location?: Maybe, - avatarUrl?: Maybe, + __typename?: 'GithubUser', + id: Scalars['ID'], + name?: Maybe, + email?: Maybe, + location?: Maybe, + avatarUrl?: Maybe, }; export type Level = { - __typename?: 'Level', - id: Scalars['ID'], - title?: Maybe, - text?: Maybe, - stages?: Maybe>>, - setup?: Maybe, - status?: 'INCOMPLETE' | 'COMPLETE' | 'ACTIVE', + __typename?: 'Level', + id: Scalars['ID'], + title: Scalars['String'], + text: Scalars['String'], + stage?: Maybe, + stages: Array, + setup?: Maybe, +}; + + +export type LevelStageArgs = { + stageId: Scalars['ID'] }; export type Mutation = { - __typename?: 'Mutation', - authenticate?: Maybe, + __typename?: 'Mutation', + createToken?: Maybe, }; -export type MutationAuthenticateArgs = { - accessToken: Scalars['String'] +export type MutationCreateTokenArgs = { + input: CreateTokenInput }; export type Query = { - __typename?: 'Query', - tutorial?: Maybe, - tutorials?: Maybe>>, - user?: Maybe, - level?: Maybe, - stage?: Maybe, - step?: Maybe, - stepActions?: Maybe, + __typename?: 'Query', + tutorial?: Maybe, + tutorials?: Maybe>>, + user?: Maybe, + level?: Maybe, + stage?: Maybe, + step?: Maybe, + stepActions?: Maybe, }; export type QueryTutorialArgs = { - id: Scalars['ID'] + id: Scalars['ID'] }; export type QueryLevelArgs = { - id: Scalars['ID'] + id: Scalars['ID'] }; export type QueryStageArgs = { - id: Scalars['ID'] + id: Scalars['ID'] }; export type QueryStepArgs = { - id: Scalars['ID'] + id: Scalars['ID'] }; export type QueryStepActionsArgs = { - id: Scalars['ID'] + id: Scalars['ID'] }; export enum Role { - Admin = 'ADMIN', - User = 'USER' + Admin = 'ADMIN', + User = 'USER' } export type Stage = { - __typename?: 'Stage', - id: Scalars['ID'], - title?: Maybe, - text?: Maybe, - steps?: Maybe>>, - setup?: Maybe, - status?: 'INCOMPLETE' | 'COMPLETE' | 'ACTIVE', + __typename?: 'Stage', + id: Scalars['ID'], + title: Scalars['String'], + text: Scalars['String'], + step?: Maybe, + steps: Array, + setup?: Maybe, +}; + + +export type StageStepArgs = { + stepId: Scalars['ID'] }; export type Step = { - __typename?: 'Step', - id: Scalars['ID'], - title?: Maybe, - text?: Maybe, - setup?: Maybe, - solution?: Maybe, - status?: 'INCOMPLETE' | 'COMPLETE' | 'ACTIVE' + __typename?: 'Step', + id: Scalars['ID'], + title: Scalars['String'], + text: Scalars['String'], + setup: StepActions, + solution: StepActions, }; export type StepActions = { - __typename?: 'StepActions', - id: Scalars['ID'], - commits?: Maybe>>, - files?: Maybe>>, - commands?: Maybe>>, + __typename?: 'StepActions', + id: Scalars['ID'], + commits: Array, + files: Array, + commands: Array, }; export type Tutorial = { - __typename?: 'Tutorial', - id: Scalars['ID'], - repo?: Maybe, - createdBy?: Maybe, - createdAt?: Maybe, - updatedBy?: Maybe, - updatedAt?: Maybe, - codingLanguage?: Maybe, - testRunner?: Maybe, - title?: Maybe, - text?: Maybe, - releasedAt?: Maybe, - releasedBy?: Maybe, - version?: Maybe, - versions?: Maybe>>, + __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?: Maybe, - branch?: Maybe, - name?: Maybe, - owner?: Maybe, + __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?: Maybe, - createdAt?: Maybe, - createdBy?: Maybe, - publishedAt?: Maybe, - publishedBy?: Maybe, - levels?: Maybe>>, - level?: Maybe, - stage?: Maybe, - step?: Maybe, + __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?: Maybe, - location?: Maybe, - avatarUrl?: Maybe, - createdAt?: Maybe, - updatedAt?: Maybe, - githubUser?: Maybe, + __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 + {__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; + }[]; + }[]; + }; +} + +const result: IntrospectionResultData = { + "__schema": { + "types": [] + } +}; + +export default result; From 0dd047f93bf359b8ef5546bb82e7fdbe619a4a2a Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 12:54:38 -0700 Subject: [PATCH 45/64] create Tutorial model --- src/services/tutorial/index.ts | 141 +++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 src/services/tutorial/index.ts diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts new file mode 100644 index 00000000..105a7b8b --- /dev/null +++ b/src/services/tutorial/index.ts @@ -0,0 +1,141 @@ +import * as G from 'typings/graphql' +import * as CR from 'typings' + +class Tutorial { + public repo: G.TutorialRepo + public config: {codingLanguage: G.EnumCodingLanguage, testRunner: G.EnumTestRunner} + private version: G.TutorialVersion + private position: CR.Position + private progress: CR.Progress + + constructor(tutorial: G.Tutorial) { + this.repo = tutorial.repo + this.config = { + codingLanguage: tutorial.codingLanguage, + testRunner: tutorial.testRunner, + } + // TODO: allow specific version, currently defaults to latest + this.version = tutorial.version + // set initial position + this.position = { + levelId: this.version.levels[0].id, + stageId: this.version.levels[0].stages[0].id, + stepId: this.version.levels[0].stages[0].steps[0].id, + } + // set empty initial progress + this.progress = { + levels: {}, + stages: {}, + steps: {}, + complete: false, + } + } + public load = () => { + // + } + public level = (levelId: string): G.Level | null => { + const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId) + if (!level) { + console.warn(`LevelId not found: ${levelId}`) + return null + } + return level + } + public stage = (stageId: string): G.Stage | null => { + const level: G.Level | null = this.level(this.position.levelId) + if (!level) { + return null + } + const stage: G.Stage | undefined = level.stages.find((s: G.Stage) => s.id === stageId) + if (!stage) { + console.warn(`StageId not found: ${stageId}`) + return null + } + return stage + } + public step = (stepId: string): G.Step | null => { + const stage: G.Stage | null = this.stage(this.position.stageId) + if (!stage) { + return null + } + const step: G.Step | undefined = stage.steps.find((s: G.Step) => s.id === stepId) + if (!step) { + console.warn(`StepId not found: ${stepId}`) + return null + } + return step + } + public updateProgress = (): {position: CR.Position, progress: CR.Progress} => { + const {levelId, stageId, stepId} = this.position + this.progress.levels[levelId] = true + this.progress.stages[stageId] = true + this.progress.steps[stepId] = true + return { + position: this.position, + progress: this.progress, + } + } + public nextPosition = (): CR.Position => { + const {levelId, stageId, stepId} = this.position + // TODO: calculate and return next position + + // is next step + const stage: G.Stage | null = this.stage(stageId) + if (!stage) { + throw new Error('Stage not found') + } + const {steps} = stage + const indexOfStep = steps.findIndex((s: G.Step): boolean => s.id === stepId) + if (indexOfStep === -1) { + throw new Error('Step not found') + } + if (indexOfStep < steps.length - 1) { + + return { + levelId, + stageId, + stepId: steps[indexOfStep + 1].id + } + } + + // is next stage + const level: G.Level | null = this.level(levelId) + if (!level) { + throw new Error('Level not found') + } + const {stages} = level + const indexOfStage = stages.findIndex((s: G.Stage): boolean => s.id === stageId) + if (indexOfStage === -1) { + throw new Error('Stage not found') + } + if (indexOfStage < stages.length - 1) { + // next stage + const nextStage = stages[indexOfStage + 1] + return { + levelId, + stageId: nextStage.id, + stepId: nextStage.steps[0].id + } + } + + // is next level + const levels = this.version.levels + const indexOfLevel = levels.findIndex((l: G.Level): boolean => l.id === levelId) + if (indexOfLevel === -1) { + throw new Error('Level not found') + } + if (indexOfLevel < levels.length - 1) { + const nextLevel = levels[indexOfLevel + 1] + const nextStage = nextLevel.stages[0] + return { + levelId: nextLevel.id, + stageId: nextStage.id, + stepId: nextStage.steps[0].id, + } + } + + throw new Error('Could not calculate next position') + } +} + +export default Tutorial \ No newline at end of file From 97b878a829d3b7ecbf15cf6fa66537c1d480948b Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 13:17:19 -0700 Subject: [PATCH 46/64] initialize state machine with tutorial model --- src/extension.ts | 10 ++-- src/services/tutorial/index.ts | 26 +++++++-- src/state/index.ts | 104 +++++++++++++++++---------------- tslint.json | 3 +- 4 files changed, 83 insertions(+), 60 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 403bb522..def09157 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,15 +1,17 @@ import * as vscode from 'vscode' -import { setWorkspaceRoot } from './services/node' +import {setWorkspaceRoot} from './services/node' +import Tutorial from './services/tutorial' import StateMachine from './state' import Editor from './editor' +export const tutorial = new Tutorial() // state machine that governs application logic -export const machine = new StateMachine({ dispatch: vscode.commands.executeCommand }) +export const machine = new StateMachine({dispatch: vscode.commands.executeCommand, tutorial}) // vscode editor export const editor = new Editor({ - machine, - setWorkspaceRoot, + machine, + setWorkspaceRoot, }) // activate run on vscode extension initialization diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index 105a7b8b..d55decfe 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -1,20 +1,34 @@ import * as G from 'typings/graphql' import * as CR from 'typings' +interface TutorialConfig { + codingLanguage: G.EnumCodingLanguage + testRunner: G.EnumTestRunner +} + class Tutorial { public repo: G.TutorialRepo - public config: {codingLanguage: G.EnumCodingLanguage, testRunner: G.EnumTestRunner} + public config: TutorialConfig private version: G.TutorialVersion private position: CR.Position private progress: CR.Progress - constructor(tutorial: G.Tutorial) { + constructor() { + // initialize types, will be assigned when tutorial is selected + this.repo = {} as G.TutorialRepo + this.config = {} as TutorialConfig + this.version = {} as G.TutorialVersion + this.position = {} as CR.Position + this.progress = {} as CR.Progress + } + + public init = (tutorial: G.Tutorial) => { this.repo = tutorial.repo this.config = { codingLanguage: tutorial.codingLanguage, testRunner: tutorial.testRunner, } - // TODO: allow specific version, currently defaults to latest + // version containing level data this.version = tutorial.version // set initial position this.position = { @@ -29,9 +43,11 @@ class Tutorial { steps: {}, complete: false, } + + // set position, progress, tutorial locally } - public load = () => { - // + public load = (tutorial: G.Tutorial) => { + // TODO: load from localStorage } public level = (levelId: string): G.Level | null => { const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId) diff --git a/src/state/index.ts b/src/state/index.ts index 0e37cf00..2da10916 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -1,4 +1,5 @@ -import { interpret, Interpreter } from 'xstate' +import {interpret, Interpreter} from 'xstate' +import Tutorial from '../services/tutorial' import * as CR from 'typings' import createMachine from './machine' @@ -7,61 +8,64 @@ import createMachine from './machine' // 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 '' + 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 + dispatch: CR.EditorDispatch + tutorial: Tutorial } 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) - } + private dispatch: CR.EditorDispatch + private tutorial: Tutorial + private machineOptions = { + devTools: true, + deferEvents: true, + execute: true, + } + private service: Interpreter + constructor({dispatch, tutorial}: Props) { + this.dispatch = dispatch + this.tutorial = tutorial + 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/tslint.json b/tslint.json index dc7c70a8..484ae6aa 100644 --- a/tslint.json +++ b/tslint.json @@ -14,7 +14,8 @@ "triple-equals": true, "forin": false, "no-console": false, - "no-submodule-imports": false + "no-submodule-imports": false, + "no-object-literal-type-assertion": false }, "defaultSeverity": "warning", From 57675e5a964ecf886d4e740ca7f1d39a79a8fc32 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 14:15:59 -0700 Subject: [PATCH 47/64] tutorialModel progress --- src/editor/commands/index.ts | 24 +- src/editor/commands/loadSolution.ts | 41 ++-- src/editor/index.ts | 100 ++++----- src/extension.ts | 4 +- src/services/storage.ts | 83 +++---- src/services/tutorial/index.ts | 67 +++++- src/state/actions/index.ts | 40 ++-- src/state/context/index.ts | 20 -- src/state/index.ts | 8 +- src/state/machine.ts | 331 ++++++++++++++-------------- typings/index.d.ts | 238 ++++++++++---------- 11 files changed, 489 insertions(+), 467 deletions(-) delete mode 100644 src/state/context/index.ts diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index cd603a44..8862c046 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -22,11 +22,9 @@ const COMMANDS = { } interface CreateCommandProps { - context: vscode.ExtensionContext + vscodeExt: vscode.ExtensionContext machine: CR.StateMachine - storage: any git: any - position: any } const resetLayout = () => { @@ -36,7 +34,7 @@ const resetLayout = () => { }) } -export const createCommands = ({context, machine, storage, git, position}: CreateCommandProps) => { +export const createCommands = ({vscodeExt, machine, git}: CreateCommandProps) => { // React panel webview let webview: any @@ -55,10 +53,10 @@ export const createCommands = ({context, machine, storage, git, position}: Creat webviewState = 'RESTARTING' } - setStorage(context.workspaceState) + setStorage(vscodeExt.workspaceState) // activate machine - webview = new ReactWebView(context.extensionPath) + webview = new ReactWebView(vscodeExt.extensionPath) if (webviewState === 'INITIALIZING') { machine.activate() } else if (webviewState === 'RESTARTING') { @@ -80,32 +78,30 @@ export const createCommands = ({context, machine, storage, git, position}: Creat }, // launch a new tutorial // NOTE: may be better to move into action as logic is primarily non-vscode - [COMMANDS.TUTORIAL_LAUNCH]: async (tutorial: G.Tutorial) => { + [COMMANDS.TUTORIAL_LAUNCH]: async (repo: G.TutorialRepo) => { console.log('launch tutorial') await isEmptyWorkspace() await git.gitInitIfNotExists() - if (!tutorial.repo || !tutorial.repo.uri) { + if (!repo || !repo.uri) { throw new Error('Tutorial repo uri not found') } - // TODO: use actual tutorial repo - await Promise.all([git.gitSetupRemote(tutorial.repo.uri), storage.setTutorial(tutorial), storage.resetProgress()]) + await git.gitSetupRemote(repo.uri) machine.send('TUTORIAL_LOADED') }, - [COMMANDS.TUTORIAL_SETUP]: async (tutorial: G.Tutorial) => { + [COMMANDS.TUTORIAL_SETUP]: async (codingLanguage: G.EnumCodingLanguage) => { // TODO: allow multiple coding languages in a tutorial - console.log('tutorial setup', tutorial) + // setup onSave hook - const languageId = tutorial.codingLanguage // console.log(`languageIds: ${languageIds.join(', ')}`) vscode.workspace.onDidSaveTextDocument((document: vscode.TextDocument) => { console.log('save document', document) - if (document.uri.scheme === 'file' && languageId === document.languageId) { + if (document.uri.scheme === 'file' && codingLanguage === document.languageId) { // do work machine.send('TEST_RUN') } diff --git a/src/editor/commands/loadSolution.ts b/src/editor/commands/loadSolution.ts index 02ef752e..c1c883a6 100644 --- a/src/editor/commands/loadSolution.ts +++ b/src/editor/commands/loadSolution.ts @@ -1,21 +1,32 @@ import * as CR from 'typings' +import * as G from 'typings/graphql' import * as storage from '../../services/storage' -import { gitLoadCommits, gitClear } from '../../services/git' +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 + const [position, tutorial]: [CR.Position, G.Tutorial | undefined] = await Promise.all([ + storage.getPosition(), + storage.getTutorial(), + ]) + if (!position) { + throw new Error('No tutorial position state found') + } + if (!tutorial || !tutorial.version || !tutorial.version.levels) { + throw new Error('Local tutorial not found') + } + // eslint-disable-next-line + + try { + const solution = tutorial.version + .levels.find((l: G.Level) => l.id === position.levelId) + .stages.find((s: G.Stage) => s.id === position.stageId) + .steps.find((s: G.Step) => s.id === position.stepId) + .solution + + await gitClear() + await gitLoadCommits(solution, dispatch) + } catch (error) { + throw new Error(error) + } - await gitClear() - await gitLoadCommits(solution, dispatch) } diff --git a/src/editor/index.ts b/src/editor/index.ts index 41003627..fca9104b 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -1,69 +1,67 @@ import * as vscode from 'vscode' import * as CR from 'typings' -import { createCommands } from './commands' +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 + machine: CR.StateMachine + setWorkspaceRoot(rootPath: string): void } class Editor { - // extension context set on activation - // @ts-ignore - private context: vscode.ExtensionContext - private machine: CR.StateMachine + // extension context set on activation + // @ts-ignore + private vscodeExt: vscode.ExtensionContext + private machine: CR.StateMachine - constructor({ machine, setWorkspaceRoot }: Props) { - this.machine = machine + 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() + // 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 = (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.context.subscriptions) { - disposable.dispose() - } - // shut down state machine - console.log('deactivate machine') - this.machine.deactivate() - } + // setup tasks or views here + } + public deactivate = (): void => { + console.log('DEACTIVATE!') + // cleanup subscriptions/tasks + for (const disposable of this.vscodeExt.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) - } + // 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) - } - } + private activateCommands = (): void => { + const commands = createCommands({ + vscodeExt: this.vscodeExt, + machine: this.machine, + git, + }) + 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/extension.ts b/src/extension.ts index def09157..473b424d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,10 +1,10 @@ import * as vscode from 'vscode' import {setWorkspaceRoot} from './services/node' -import Tutorial from './services/tutorial' +import Tutorial, {TutorialModel} from './services/tutorial' import StateMachine from './state' import Editor from './editor' -export const tutorial = new Tutorial() +export const tutorial: TutorialModel = new Tutorial() // state machine that governs application logic export const machine = new StateMachine({dispatch: vscode.commands.executeCommand, tutorial}) diff --git a/src/services/storage.ts b/src/services/storage.ts index d1df66fc..b52b07dc 100644 --- a/src/services/storage.ts +++ b/src/services/storage.ts @@ -1,77 +1,78 @@ import * as CR from 'typings' +import * as G from 'typings/graphql' 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 getTutorial(): Promise { + return storage.get(STORE_TUTORIAL) } -export async function setTutorial(tutorial: CR.Tutorial): Promise { - await storage.update(STORE_TUTORIAL, tutorial) +export async function setTutorial(tutorial: G.Tutorial): Promise { + await storage.update(STORE_TUTORIAL, tutorial) } // POSITION const STORE_POSITION = 'coderoad:position' -const defaultPosition = { levelId: '', stageId: '', stepId: '' } +const defaultPosition = {levelId: '', stageId: '', stepId: ''} export async function getPosition(): Promise { - const position: CR.Position | undefined = storage.get(STORE_POSITION) - return position || defaultPosition + 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) + await storage.update(STORE_POSITION, position) } // PROGRESS const STORE_PROGRESS = 'coderoad:progress' -const defaultProgress = { levels: {}, stages: {}, steps: {}, hints: {}, complete: false } +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 + const progress: CR.Progress | undefined = await storage.get(STORE_PROGRESS) + return progress || defaultProgress } export async function resetProgress(): Promise { - await storage.update(STORE_PROGRESS, defaultProgress) + await storage.update(STORE_PROGRESS, defaultProgress) } interface ProgressUpdate { - levels?: { - [levelId: string]: boolean - } - stages?: { - [stageid: string]: boolean - } - steps?: { - [stepId: string]: boolean - } + 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, - } - } + 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) + await storage.update(STORE_PROGRESS, progress) } diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index d55decfe..e550fd0a 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -1,17 +1,37 @@ import * as G from 'typings/graphql' import * as CR from 'typings' +import * as storage from '../storage' +import api from '../api' +import tutorialQuery from '@gql/tutorial' +import {timingSafeEqual} from 'crypto' interface TutorialConfig { codingLanguage: G.EnumCodingLanguage testRunner: G.EnumTestRunner } -class Tutorial { +export interface TutorialModel { + repo: G.TutorialRepo + config: TutorialConfig + version: G.TutorialVersion + position: CR.Position + progress: CR.Progress + init(tutorial: G.Tutorial): void + load(tutorialId: string): void + level(levelId: string): G.Level | null + stage(stageId: string): G.Stage | null + step(stepId: string): G.Step | null + updateProgress(): {position: CR.Position, progress: CR.Progress} + nextPosition(): CR.Position + hasExisting(): Promise +} + +class Tutorial implements TutorialModel { public repo: G.TutorialRepo public config: TutorialConfig - private version: G.TutorialVersion - private position: CR.Position - private progress: CR.Progress + public version: G.TutorialVersion + public position: CR.Position + public progress: CR.Progress constructor() { // initialize types, will be assigned when tutorial is selected @@ -20,6 +40,16 @@ class Tutorial { this.version = {} as G.TutorialVersion this.position = {} as CR.Position this.progress = {} as CR.Progress + + Promise.all([ + storage.getTutorial(), + storage.getProgress(), + ]).then((data) => { + const [tutorial, progress] = data + console.log('load continue tutorial') + console.log(tutorial, progress) + }) + } public init = (tutorial: G.Tutorial) => { @@ -44,10 +74,35 @@ class Tutorial { complete: false, } - // set position, progress, tutorial locally + // set tutorial, position, progress locally + // TODO: base position off of progress + Promise.all([ + storage.setTutorial(tutorial), + storage.setPosition(this.position), + storage.setProgress(this.progress) + ]) } - public load = (tutorial: G.Tutorial) => { + + public async hasExisting(): Promise { + const [tutorial, progress] = await Promise.all([ + storage.getTutorial(), + storage.getProgress(), + ]) + + return !!(tutorial && progress) + } + + public async load(tutorialId: string) { // TODO: load from localStorage + const tutorial: G.Tutorial | null = await api.request(tutorialQuery, { + tutorialId, // TODO: add selection of tutorial id + }) + + if (!tutorial) { + throw new Error(`Tutorial ${tutorialId} not found`) + } + + await this.init(tutorial) } public level = (levelId: string): G.Level | null => { const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId) diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index 291cef14..6fb05185 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -1,15 +1,13 @@ import {assign} from 'xstate' // NOTE: codesmell - importing machine import {machine} from '../../extension' -import api from '../../services/api' +import {TutorialModel} from '../../services/tutorial' import * as CR from 'typings' import * as G from 'typings/graphql' -import tutorialQuery from '@gql/tutorial' import * as storage from '../../services/storage' import * as git from '../../services/git' -let currentTutorial: G.Tutorial | undefined -let currentProgress: CR.Progress = { +const currentProgress: CR.Progress = { levels: {}, stages: {}, steps: {}, @@ -34,39 +32,37 @@ const calculatePosition = ({data, progress}: {data: CR.TutorialData, progress: C return nextPosition } -export default (dispatch: CR.EditorDispatch) => ({ +export default (dispatch: CR.EditorDispatch, tutorialModel: TutorialModel) => ({ createWebview() { dispatch('coderoad.open_webview') }, async newOrContinue() { - // verify that the user has a tutorial & progress + // verify that the user has an existing tutorial to continue + const hasExistingTutorial: boolean = await tutorialModel.hasExisting() + // verify git is setup with a coderoad remote - const [tutorial, progress, hasGit, hasGitRemote] = await Promise.all([ - storage.getTutorial(), - storage.getProgress(), + const [hasGit, hasGitRemote] = await Promise.all([ git.gitVersion(), git.gitCheckRemoteExists(), ]) - const canContinue = !!(tutorial && progress && hasGit && hasGitRemote) - if (canContinue) { - // continue - currentTutorial = tutorial - currentProgress = progress - } + const canContinue = !!(hasExistingTutorial && hasGit && hasGitRemote) + + // TODO: may need to clean up git remote if no existing tutorial machine.send(canContinue ? 'CONTINUE' : 'NEW') }, async tutorialLaunch() { - const tutorial: G.Tutorial = await api.request(tutorialQuery, { - tutorialId: '1', // TODO: add selection of tutorial id - }) - currentTutorial = tutorial - console.log(tutorial) - dispatch('coderoad.tutorial_launch', tutorial) + const tutorialId: string = '1' + // TODO: load tutorialId + await tutorialModel.load(tutorialId) + const repo: G.TutorialRepo = tutorialModel.repo + + dispatch('coderoad.tutorial_launch', repo) }, tutorialSetup() { - dispatch('coderoad.tutorial_setup', currentTutorial) + const codingLanguage: G.EnumCodingLanguage = tutorialModel.config.codingLanguage + dispatch('coderoad.tutorial_setup', codingLanguage) }, initializeNewTutorial: assign({ position: (context: any): CR.Position => { 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/index.ts b/src/state/index.ts index 2da10916..624827ba 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -1,5 +1,5 @@ import {interpret, Interpreter} from 'xstate' -import Tutorial from '../services/tutorial' +import {TutorialModel} from '../services/tutorial' import * as CR from 'typings' import createMachine from './machine' @@ -23,12 +23,11 @@ const stateToString = (state: string | object, str: string = ''): string => { interface Props { dispatch: CR.EditorDispatch - tutorial: Tutorial + tutorial: TutorialModel } class StateMachine { private dispatch: CR.EditorDispatch - private tutorial: Tutorial private machineOptions = { devTools: true, deferEvents: true, @@ -37,8 +36,7 @@ class StateMachine { private service: Interpreter constructor({dispatch, tutorial}: Props) { this.dispatch = dispatch - this.tutorial = tutorial - const machine = createMachine(dispatch) + const machine = createMachine(dispatch, tutorial) this.service = interpret(machine, this.machineOptions) // logging .onTransition(state => { diff --git a/src/state/machine.ts b/src/state/machine.ts index e8f3a0a8..6c0b2cec 100644 --- a/src/state/machine.ts +++ b/src/state/machine.ts @@ -1,174 +1,173 @@ -import { Machine } from 'xstate' +import {Machine} from 'xstate' import * as CR from 'typings' +import {TutorialModel} from '../services/tutorial' 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', - }, - ], - }, - }, +export const machine = (dispatch: CR.EditorDispatch, tutorial: TutorialModel) => + Machine( + { + id: 'root', + 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: {}, - }, - ) + 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, tutorial), + guards, + activities: {}, + }, + ) export default machine diff --git a/typings/index.d.ts b/typings/index.d.ts index f42a963c..37238898 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,181 +1,169 @@ -import { send } from 'xstate' +import {send} from 'xstate' +import TutorialModel from '../src/services/tutorial' 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: TutorialModel } export interface MachineEvent { - type: string - payload?: any + type: string + payload?: 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: { + SelectTutorial: { + states: { + Initial: {} + Startup: {} + NewTutorial: { + states: { + SelectTutorial: {} + InitializeTutorial: {} + } + } + 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 From a92d52fc757730712ec3babda640152c75328c45 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 15:17:43 -0700 Subject: [PATCH 48/64] heavy refactoring --- src/editor/commands/loadSolution.ts | 18 +- src/editor/index.ts | 2 - src/services/git/index.ts | 249 ++++++++++++++------------- src/services/position.ts | 65 ------- src/services/tutorial/index.ts | 37 ++-- src/state/actions/index.ts | 258 ++++++++++++---------------- src/state/guards/index.ts | 68 ++++---- src/state/index.ts | 2 +- src/state/machine.ts | 10 +- typings/graphql.d.ts | 8 +- typings/index.d.ts | 4 +- web-app/src/App.tsx | 44 ++--- 12 files changed, 333 insertions(+), 432 deletions(-) delete mode 100644 src/services/position.ts diff --git a/src/editor/commands/loadSolution.ts b/src/editor/commands/loadSolution.ts index c1c883a6..058f9500 100644 --- a/src/editor/commands/loadSolution.ts +++ b/src/editor/commands/loadSolution.ts @@ -1,9 +1,10 @@ import * as CR from 'typings' import * as G from 'typings/graphql' +import {TutorialModel} from '../../services/tutorial' import * as storage from '../../services/storage' import {gitLoadCommits, gitClear} from '../../services/git' -export default async function loadSolution(dispatch: CR.EditorDispatch): Promise { +export default async function loadSolution(dispatch: CR.EditorDispatch, tutorialModel: TutorialModel): Promise { const [position, tutorial]: [CR.Position, G.Tutorial | undefined] = await Promise.all([ storage.getPosition(), storage.getTutorial(), @@ -16,17 +17,10 @@ export default async function loadSolution(dispatch: CR.EditorDispatch): Promise } // eslint-disable-next-line - try { - const solution = tutorial.version - .levels.find((l: G.Level) => l.id === position.levelId) - .stages.find((s: G.Stage) => s.id === position.stageId) - .steps.find((s: G.Step) => s.id === position.stepId) - .solution + const step = tutorialModel.step() + const solution = step.solution - await gitClear() - await gitLoadCommits(solution, dispatch) - } catch (error) { - throw new Error(error) - } + await gitClear() + await gitLoadCommits(solution, dispatch) } diff --git a/src/editor/index.ts b/src/editor/index.ts index fca9104b..6f033db2 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -1,9 +1,7 @@ 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 diff --git a/src/services/git/index.ts b/src/services/git/index.ts index 1ec60bf4..c47aba71 100644 --- a/src/services/git/index.ts +++ b/src/services/git/index.ts @@ -1,35 +1,36 @@ +import * as G from 'typings/graphql' import * as CR from 'typings' -import { exec, exists } from '../node' +import {exec, exists} from '../node' import errorMessages from './errorMessages' 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 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 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 +39,38 @@ 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 async function gitLoadCommits(actions: G.StepActions, editorDispatch: 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) { + editorDispatch('coderoad.open_file', filePath) + } + } } /* @@ -78,96 +79,96 @@ export async function gitLoadCommits(actions: CR.TutorialAction, dispatch: CR.Ed */ 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) + 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 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') + 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 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') + 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') } async function gitInit(): Promise { - const { stderr } = await exec('git init') - if (stderr) { - throw new Error('Error initializing Gits') - } + const {stderr} = await exec('git init') + if (stderr) { + throw new Error('Error initializing Gits') + } } export async function gitInitIfNotExists(): Promise { - const hasGit = await gitVersion() + const hasGit = await gitVersion() - 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 = exists('.git') + if (!hasGitInit) { + await gitInit() + } } 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') - } - } + 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 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 - } + 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 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) - } + // check coderoad remote not taken + const hasRemote = await gitCheckRemoteExists() + // git remote add coderoad tutorial + // git fetch coderoad + if (!hasRemote) { + await gitAddRemote(repo) + } } 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/tutorial/index.ts b/src/services/tutorial/index.ts index e550fd0a..ecb1f5a5 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -18,9 +18,9 @@ export interface TutorialModel { progress: CR.Progress init(tutorial: G.Tutorial): void load(tutorialId: string): void - level(levelId: string): G.Level | null - stage(stageId: string): G.Stage | null - step(stepId: string): G.Step | null + level(levelId?: string): G.Level + stage(stageId?: string): G.Stage + step(stepId?: string): G.Step updateProgress(): {position: CR.Position, progress: CR.Progress} nextPosition(): CR.Position hasExisting(): Promise @@ -104,35 +104,26 @@ class Tutorial implements TutorialModel { await this.init(tutorial) } - public level = (levelId: string): G.Level | null => { - const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId) + public level = (levelId: string): G.Level => { + const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId || this.position.levelId) if (!level) { - console.warn(`LevelId not found: ${levelId}`) - return null + throw new Error('Level not found') } return level } - public stage = (stageId: string): G.Stage | null => { - const level: G.Level | null = this.level(this.position.levelId) - if (!level) { - return null - } - const stage: G.Stage | undefined = level.stages.find((s: G.Stage) => s.id === stageId) + public stage = (stageId?: string): G.Stage => { + const level: G.Level = this.level(this.position.levelId) + const stage: G.Stage | undefined = level.stages.find((s: G.Stage) => s.id === stageId || this.position.stageId) if (!stage) { - console.warn(`StageId not found: ${stageId}`) - return null + throw new Error('Stage not found') } return stage } - public step = (stepId: string): G.Step | null => { - const stage: G.Stage | null = this.stage(this.position.stageId) - if (!stage) { - return null - } - const step: G.Step | undefined = stage.steps.find((s: G.Step) => s.id === stepId) + public step = (stepId?: string): G.Step => { + const stage: G.Stage = this.stage(this.position.stageId) + const step: G.Step | undefined = stage.steps.find((s: G.Step) => s.id === stepId || this.position.stepId) if (!step) { - console.warn(`StepId not found: ${stepId}`) - return null + throw new Error('Step not found') } return step } diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index 6fb05185..62481a70 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -4,37 +4,12 @@ import {machine} from '../../extension' import {TutorialModel} from '../../services/tutorial' import * as CR from 'typings' import * as G from 'typings/graphql' -import * as storage from '../../services/storage' import * as git from '../../services/git' -const 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, tutorialModel: TutorialModel) => ({ +export default (editorDispatch: CR.EditorDispatch, tutorialModel: TutorialModel) => ({ createWebview() { - dispatch('coderoad.open_webview') + editorDispatch('coderoad.open_webview') }, async newOrContinue() { // verify that the user has an existing tutorial to continue @@ -58,143 +33,138 @@ export default (dispatch: CR.EditorDispatch, tutorialModel: TutorialModel) => ({ await tutorialModel.load(tutorialId) const repo: G.TutorialRepo = tutorialModel.repo - dispatch('coderoad.tutorial_launch', repo) + editorDispatch('coderoad.tutorial_launch', repo) }, tutorialSetup() { const codingLanguage: G.EnumCodingLanguage = tutorialModel.config.codingLanguage - dispatch('coderoad.tutorial_setup', codingLanguage) + editorDispatch('coderoad.tutorial_setup', codingLanguage) }, - 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 - }, - }), + // 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') + editorDispatch('coderoad.run_test') }, - testPass(context: CR.MachineContext): void { - dispatch('coderoad.test_pass') - git.gitSaveCommit(context.position) + testPass(): void { + editorDispatch('coderoad.test_pass') + git.gitSaveCommit(tutorialModel.position) }, testFail() { - dispatch('coderoad.test_fail') + editorDispatch('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] + progressUpdate() { + tutorialModel.updateProgress() + tutorialModel.nextPosition() + }, + // assign({ + // progress: (): 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(): void { + const level: G.Level = tutorialModel.level() // run level setup if it exists - if (level && level.actions && level.actions.setup) { - git.gitLoadCommits(level.actions.setup, dispatch) + if (level && level.setup) { + git.gitLoadCommits(level.setup, editorDispatch) } }, - stageLoadNext(context: CR.MachineContext) { + stageLoadNext() { console.log('stageLoadNext') - const {position} = context - console.log(position) + tutorialModel.nextPosition() }, - loadStage(context: CR.MachineContext): void { - const {data, position} = context - console.log('loadStage') - console.log(position) - const {stages} = data - const stage = stages[position.levelId] + loadStage(): void { + const stage: G.Stage = tutorialModel.stage() // run level setup if it exists - if (stage && stage.actions && stage.actions.setup) { - git.gitLoadCommits(stage.actions.setup, dispatch) + if (stage && stage.setup) { + git.gitLoadCommits(stage.setup, editorDispatch) } }, // @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) + // updatePosition: assign({ + // position: () => calculatePosition({ + // data: context.data, + // progress: context.progress, + // }), + // }), + stepLoadCommits(): void { + const step: G.Step = tutorialModel.step() + git.gitLoadCommits(step.setup, editorDispatch) }, }) diff --git a/src/state/guards/index.ts b/src/state/guards/index.ts index ffd9415e..fc2d8eb1 100644 --- a/src/state/guards/index.ts +++ b/src/state/guards/index.ts @@ -1,31 +1,41 @@ import * as CR from 'typings' +import {TutorialModel} from '../../services/tutorial' -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 - }, -} + +// TODO: refactor into a single calculation +export default (tutorialModel: TutorialModel) => ({ + hasNextStep: (): boolean => { + + const nextPosition: CR.Position = tutorialModel.nextPosition() + + const sameStage = nextPosition.stageId === tutorialModel.position.stageId + const sameStep = nextPosition.stepId === tutorialModel.position.stepId + + const hasNext: boolean = sameStage && sameStep + + console.log('GUARD: hasNextStep', hasNext) + return hasNext + }, + hasNextStage: (): boolean => { + const nextPosition: CR.Position = tutorialModel.nextPosition() + + const sameLevel = nextPosition.levelId === tutorialModel.position.levelId + const sameStage = nextPosition.stageId === tutorialModel.position.stageId + + const hasNext: boolean = sameLevel && sameStage + + console.log('GUARD: hasNextStage', hasNext) + return hasNext + }, + hasNextLevel: (): boolean => { + const nextPosition: CR.Position = tutorialModel.nextPosition() + + const sameLevel = nextPosition.levelId === tutorialModel.position.levelId + + const hasNext: boolean = sameLevel + + // TODO: ensure this accounts for end + console.log('GUARD: hasNextLevel', hasNext) + return hasNext + }, +}) diff --git a/src/state/index.ts b/src/state/index.ts index 624827ba..1438a4ae 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -33,7 +33,7 @@ class StateMachine { deferEvents: true, execute: true, } - private service: Interpreter + private service: Interpreter<{}, CR.MachineStateSchema, CR.MachineEvent> constructor({dispatch, tutorial}: Props) { this.dispatch = dispatch const machine = createMachine(dispatch, tutorial) diff --git a/src/state/machine.ts b/src/state/machine.ts index 6c0b2cec..74eadd16 100644 --- a/src/state/machine.ts +++ b/src/state/machine.ts @@ -3,10 +3,10 @@ import * as CR from 'typings' import {TutorialModel} from '../services/tutorial' import createActions from './actions' -import guards from './guards' +import createGuards from './guards' -export const machine = (dispatch: CR.EditorDispatch, tutorial: TutorialModel) => - Machine( +export const machine = (editorDispatch: CR.EditorDispatch, tutorialModel: TutorialModel) => + Machine<{}, CR.MachineStateSchema, CR.MachineEvent>( { id: 'root', initial: 'SelectTutorial', @@ -164,8 +164,8 @@ export const machine = (dispatch: CR.EditorDispatch, tutorial: TutorialModel) => }, }, { - actions: createActions(dispatch, tutorial), - guards, + actions: createActions(editorDispatch, tutorialModel), + guards: createGuards(tutorialModel), activities: {}, }, ) diff --git a/typings/graphql.d.ts b/typings/graphql.d.ts index 0d4217a1..fc51b35f 100644 --- a/typings/graphql.d.ts +++ b/typings/graphql.d.ts @@ -69,6 +69,7 @@ export type Level = { stage?: Maybe, stages: Array, setup?: Maybe, + status: string }; @@ -135,6 +136,7 @@ export type Stage = { step?: Maybe, steps: Array, setup?: Maybe, + status: string }; @@ -149,6 +151,7 @@ export type Step = { text: Scalars['String'], setup: StepActions, solution: StepActions, + status: string }; export type StepActions = { @@ -555,9 +558,10 @@ export interface IntrospectionResultData { }; } +// @ts-ignore const result: IntrospectionResultData = { - "__schema": { - "types": [] + __schema: { + types: [] } }; diff --git a/typings/index.d.ts b/typings/index.d.ts index 37238898..60f7d0c4 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -114,9 +114,7 @@ export interface Action { meta?: any } -export interface MachineContext { - tutorial: TutorialModel -} +export interface MachineContext {} export interface MachineEvent { type: string diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 0f9ddf47..61dba8e2 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -16,31 +16,31 @@ const App = () => { const initialState = { SelectTutorial: 'Initial ' } // set state machine state - const [state, setState] = React.useState(initialState) - - // update level/stage/step status based on user progress & position - // TODO: model server more effeciently - const [setStatus] = useMutation(SET_STATUS) - - // update state based on response from editor - const handleEvent = (event: ReceivedEvent): void => { - const message = event.data - // messages from core - const { progress, position } = message.payload.data - - if (message.type === 'SET_STATE') { - // SET_STATE - set state machine state - setState(message.payload.state) - - setStatus({ variables: { progress, position } }) - } else if (message.type === 'SET_DATA') { - // SET_DATA - set state machine context - setStatus({ variables: { progress, position } }) - } - } + const [state, setState] = React.useState(initialState) + + // update level/stage/step status based on user progress & position + // TODO: model server more effeciently + const [setStatus] = useMutation(SET_STATUS) // event bus listener React.useEffect(() => { + // update state based on response from editor + const handleEvent = (event: ReceivedEvent): void => { + const message = event.data + // messages from core + const { progress, position } = message.payload.data + + if (message.type === 'SET_STATE') { + // SET_STATE - set state machine state + setState(message.payload.state) + + setStatus({ variables: { progress, position } }) + } else if (message.type === 'SET_DATA') { + // SET_DATA - set state machine context + setStatus({ variables: { progress, position } }) + } + } + const listener = 'message' window.addEventListener(listener, handleEvent) return () => { From 46d1e27bec48176b2d52d91ea77f69a6be06a30e Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 15:54:20 -0700 Subject: [PATCH 49/64] fix launch errors --- src/editor/commands/index.ts | 5 +-- src/editor/commands/loadSolution.ts | 15 +-------- src/editor/storage.ts | 31 +++++++++++-------- .../api/gql/{tutorial.ts => getTutorial.ts} | 0 src/services/storage.ts | 2 +- src/services/tutorial/index.ts | 19 ++++++------ 6 files changed, 32 insertions(+), 40 deletions(-) rename src/services/api/gql/{tutorial.ts => getTutorial.ts} (100%) diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index 8862c046..7cfbccf8 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -3,7 +3,7 @@ import * as CR from 'typings' import * as G from 'typings/graphql' import * as vscode from 'vscode' import ReactWebView from '../ReactWebView' -import {setStorage} from '../storage' +import storage from '../storage' import {isEmptyWorkspace} from '../workspace' import runTest from './runTest' @@ -53,7 +53,8 @@ export const createCommands = ({vscodeExt, machine, git}: CreateCommandProps) => webviewState = 'RESTARTING' } - setStorage(vscodeExt.workspaceState) + // ini + storage.init(vscodeExt.workspaceState) // activate machine webview = new ReactWebView(vscodeExt.extensionPath) diff --git a/src/editor/commands/loadSolution.ts b/src/editor/commands/loadSolution.ts index 058f9500..24e8b939 100644 --- a/src/editor/commands/loadSolution.ts +++ b/src/editor/commands/loadSolution.ts @@ -1,23 +1,10 @@ import * as CR from 'typings' import * as G from 'typings/graphql' import {TutorialModel} from '../../services/tutorial' -import * as storage from '../../services/storage' import {gitLoadCommits, gitClear} from '../../services/git' export default async function loadSolution(dispatch: CR.EditorDispatch, tutorialModel: TutorialModel): Promise { - const [position, tutorial]: [CR.Position, G.Tutorial | undefined] = await Promise.all([ - storage.getPosition(), - storage.getTutorial(), - ]) - if (!position) { - throw new Error('No tutorial position state found') - } - if (!tutorial || !tutorial.version || !tutorial.version.levels) { - throw new Error('Local tutorial not found') - } - // eslint-disable-next-line - - const step = tutorialModel.step() + const step: G.Step = tutorialModel.step() const solution = step.solution await gitClear() diff --git a/src/editor/storage.ts b/src/editor/storage.ts index e8af1e36..a3595070 100644 --- a/src/editor/storage.ts +++ b/src/editor/storage.ts @@ -1,17 +1,22 @@ -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) +class Storage { + private storage: vscode.Memento + constructor() { + this.storage = {} as vscode.Memento + } + public init = (storage: vscode.Memento): void => { + console.log('setStorage workspace') + this.storage = storage + } + public get = (key: string): T | undefined => { + console.log(`called get ${key}`) + return this.storage.get(key) + } + public update = (key: string, value: string | object): Thenable => { + console.log(`called update on ${key}`) + return this.storage.update(key, value) + } } -export function update(key: string, value: string | object): Thenable { - return storage.update(key, value) -} +export default new Storage() diff --git a/src/services/api/gql/tutorial.ts b/src/services/api/gql/getTutorial.ts similarity index 100% rename from src/services/api/gql/tutorial.ts rename to src/services/api/gql/getTutorial.ts diff --git a/src/services/storage.ts b/src/services/storage.ts index b52b07dc..61eaeddd 100644 --- a/src/services/storage.ts +++ b/src/services/storage.ts @@ -1,6 +1,6 @@ import * as CR from 'typings' import * as G from 'typings/graphql' -import * as storage from '../editor/storage' +import storage from '../editor/storage' // TUTORIAL const STORE_TUTORIAL = 'coderoad:tutorial' diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index ecb1f5a5..95ae8acc 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -2,8 +2,7 @@ import * as G from 'typings/graphql' import * as CR from 'typings' import * as storage from '../storage' import api from '../api' -import tutorialQuery from '@gql/tutorial' -import {timingSafeEqual} from 'crypto' +import tutorialQuery from '../../services/api/gql/getTutorial' interface TutorialConfig { codingLanguage: G.EnumCodingLanguage @@ -41,14 +40,14 @@ class Tutorial implements TutorialModel { this.position = {} as CR.Position this.progress = {} as CR.Progress - Promise.all([ - storage.getTutorial(), - storage.getProgress(), - ]).then((data) => { - const [tutorial, progress] = data - console.log('load continue tutorial') - console.log(tutorial, progress) - }) + // Promise.all([ + // storage.getTutorial(), + // storage.getProgress(), + // ]).then((data) => { + // const [tutorial, progress] = data + // console.log('load continue tutorial') + // console.log(tutorial, progress) + // }) } From 98c9cc92e22d73077906d6190716876160ce723d Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 15:56:52 -0700 Subject: [PATCH 50/64] remove unusued loading tutorial --- src/tutorials/basic.ts | 180 --------------------------------- web-app/src/tutorials/basic.ts | 180 --------------------------------- 2 files changed, 360 deletions(-) delete mode 100644 src/tutorials/basic.ts delete mode 100644 web-app/src/tutorials/basic.ts 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/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 From b358130948815e5811571e81546dc03015f3d4ab Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 16:10:06 -0700 Subject: [PATCH 51/64] fix send data to client --- src/extension.ts | 4 ++++ src/services/tutorial/index.ts | 21 ++++++++++++++++++++- src/state/index.ts | 8 +++----- web-app/src/App.tsx | 5 ++--- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 473b424d..1531a77e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -14,6 +14,10 @@ export const editor = new Editor({ setWorkspaceRoot, }) +// TODO: refactor tutorial & editor relationships +// code here is a bit smelly +tutorial.setClientDispatch(editor.dispatch) + // activate run on vscode extension initialization export const activate = editor.activate diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index 95ae8acc..fcaa5094 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -9,6 +9,11 @@ interface TutorialConfig { testRunner: G.EnumTestRunner } +interface PositionProgress { + position: CR.Position + progress: CR.Progress +} + export interface TutorialModel { repo: G.TutorialRepo config: TutorialConfig @@ -20,9 +25,10 @@ export interface TutorialModel { level(levelId?: string): G.Level stage(stageId?: string): G.Stage step(stepId?: string): G.Step - updateProgress(): {position: CR.Position, progress: CR.Progress} + updateProgress(): PositionProgress nextPosition(): CR.Position hasExisting(): Promise + setClientDispatch(editorDispatch: CR.EditorDispatch): void } class Tutorial implements TutorialModel { @@ -31,9 +37,13 @@ class Tutorial implements TutorialModel { public version: G.TutorialVersion public position: CR.Position public progress: CR.Progress + private clientDispatch: (props: PositionProgress) => void constructor() { // initialize types, will be assigned when tutorial is selected + this.clientDispatch = (props: PositionProgress) => { + throw new Error('Tutorial client dispatch yet initialized') + } this.repo = {} as G.TutorialRepo this.config = {} as TutorialConfig this.version = {} as G.TutorialVersion @@ -51,6 +61,10 @@ class Tutorial implements TutorialModel { } + public setClientDispatch(editorDispatch: CR.EditorDispatch) { + this.clientDispatch = ({progress, position}: PositionProgress) => editorDispatch('SEND_DATA', {progress, position}) + } + public init = (tutorial: G.Tutorial) => { this.repo = tutorial.repo this.config = { @@ -73,6 +87,11 @@ class Tutorial implements TutorialModel { complete: false, } + this.clientDispatch({ + position: this.position, + progress: this.progress + }) + // set tutorial, position, progress locally // TODO: base position off of progress Promise.all([ diff --git a/src/state/index.ts b/src/state/index.ts index 1438a4ae..21e88e53 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -42,9 +42,7 @@ class StateMachine { .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}) + dispatch('coderoad.send_state', {state: state.value}) } }) } @@ -58,8 +56,8 @@ class StateMachine { 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}) + const {value} = this.service.state + this.dispatch('coderoad.send_state', {state: value}) } public send(action: string | CR.Action) { this.service.send(action) diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 61dba8e2..a3d6e8b6 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -28,15 +28,14 @@ const App = () => { const handleEvent = (event: ReceivedEvent): void => { const message = event.data // messages from core - const { progress, position } = message.payload.data if (message.type === 'SET_STATE') { // SET_STATE - set state machine state setState(message.payload.state) - - setStatus({ variables: { progress, position } }) + } else if (message.type === 'SET_DATA') { // SET_DATA - set state machine context + const { progress, position } = message.payload.data setStatus({ variables: { progress, position } }) } } From b6ec3e8b0628b1c55f60126491cb2e848dab3463 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 16:45:08 -0700 Subject: [PATCH 52/64] cleanup env vars & fix request --- .env | 1 - .gitignore | 4 ++++ src/environment.ts | 11 +++++++++++ src/services/api/gql/getTutorial.ts | 4 +--- src/services/api/index.ts | 12 ++++-------- src/services/tutorial/index.ts | 4 ++-- 6 files changed, 22 insertions(+), 14 deletions(-) delete mode 100644 .env create mode 100644 src/environment.ts diff --git a/.env b/.env deleted file mode 100644 index 3f1de458..00000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -API_URL=http://localhost:4000/graphql \ No newline at end of file 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/src/environment.ts b/src/environment.ts new file mode 100644 index 00000000..2e6886ab --- /dev/null +++ b/src/environment.ts @@ -0,0 +1,11 @@ +import * as path from 'path' +import * as dotenv from 'dotenv' + +dotenv.config({ + path: path.join(__dirname, '../.env') +}) + +export const api = { + url: process.env.API_URL || '', + token: process.env.API_AUTH_TOKEN || '', // dev only +} \ No newline at end of file diff --git a/src/services/api/gql/getTutorial.ts b/src/services/api/gql/getTutorial.ts index 878ec554..b2ce9154 100644 --- a/src/services/api/gql/getTutorial.ts +++ b/src/services/api/gql/getTutorial.ts @@ -1,6 +1,4 @@ -import gql from 'graphql-tag' - -const getTutorial = gql` +const getTutorial = ` query getTutorial($tutorialId: ID!) { tutorial(id: $tutorialId) { id diff --git a/src/services/api/index.ts b/src/services/api/index.ts index 007afc49..4b302b52 100644 --- a/src/services/api/index.ts +++ b/src/services/api/index.ts @@ -1,16 +1,12 @@ -import * as dotenv from 'dotenv' import {GraphQLClient} from 'graphql-request' +import * as environment from '../../environment' -dotenv.config() - -const url: string = process.env.API_URL || '' -const token: string = process.env.API_AUTH_TOKEN || '' // dev only // ... or create a GraphQL client instance to send requests -const client: GraphQLClient = new GraphQLClient(url, { +const client: GraphQLClient = new GraphQLClient(environment.api.url, { headers: { - 'Content-Type': 'application/graphql', - 'Authorization': token + 'Content-Type': 'application/json', + 'Authorization': environment.api.token } }) diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index fcaa5094..bac54478 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -62,7 +62,7 @@ class Tutorial implements TutorialModel { } public setClientDispatch(editorDispatch: CR.EditorDispatch) { - this.clientDispatch = ({progress, position}: PositionProgress) => editorDispatch('SEND_DATA', {progress, position}) + this.clientDispatch = ({progress, position}: PositionProgress) => editorDispatch('coderoad.send_data', {progress, position}) } public init = (tutorial: G.Tutorial) => { @@ -112,7 +112,7 @@ class Tutorial implements TutorialModel { public async load(tutorialId: string) { // TODO: load from localStorage - const tutorial: G.Tutorial | null = await api.request(tutorialQuery, { + const {tutorial}: {tutorial: G.Tutorial | null} = await api.request(tutorialQuery, { tutorialId, // TODO: add selection of tutorial id }) From bf0ad9b0884b6460bdda0abc3a74ad5869d548b4 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 16:50:53 -0700 Subject: [PATCH 53/64] clenaup typings --- src/editor/ReactWebView.ts | 6 +++--- src/editor/commands/index.ts | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 4609232b..77620f50 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -21,7 +21,6 @@ class ReactWebView { private panel: vscode.WebviewPanel private extensionPath: string private disposables: vscode.Disposable[] = [] - private onReceive: any // TODO: properly type public constructor(extensionPath: string) { this.extensionPath = extensionPath @@ -42,6 +41,7 @@ class ReactWebView { if (action === 'WEBVIEW_LOADED') { this.loaded = true } else { + console.log('onReceive', action) vscode.commands.executeCommand('coderoad.receive_action', action) } } @@ -56,7 +56,7 @@ class ReactWebView { } // prevents new panels from going ontop of coderoad panel - vscode.window.onDidChangeActiveTextEditor((textEditor) => { + vscode.window.onDidChangeActiveTextEditor((textEditor?: vscode.TextEditor) => { console.log('onDidChangeActiveTextEditor') console.log(textEditor) if (!textEditor || textEditor.viewColumn !== vscode.ViewColumn.Two) { @@ -64,7 +64,7 @@ class ReactWebView { } }) // // prevents moving coderoad panel on top of left panel - vscode.window.onDidChangeVisibleTextEditors((textEditor) => { + vscode.window.onDidChangeVisibleTextEditors((textEditor: vscode.TextEditor[]) => { console.log('onDidChangeVisibleTextEditors') updateWindows() }) diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index 7cfbccf8..75c052f4 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -135,6 +135,7 @@ export const createCommands = ({vscodeExt, machine, git}: CreateCommandProps) => }, [COMMANDS.RECEIVE_ACTION]: (action: string | CR.Action) => { // send received actions from web-app into state machine + console.log('receive action', action) machine.send(action) }, [COMMANDS.RUN_TEST]: () => { From 0ad9d2c5b665ec678452313555d5ffa2c6a78079 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 17:28:17 -0700 Subject: [PATCH 54/64] add additional logging --- src/services/git/index.ts | 4 +++ src/services/tutorial/index.ts | 2 ++ src/state/actions/index.ts | 16 ++-------- web-app/src/App.tsx | 8 +++-- web-app/src/Routes.tsx | 27 +++++++++++++--- web-app/src/containers/Tutorial/index.tsx | 39 ----------------------- 6 files changed, 38 insertions(+), 58 deletions(-) delete mode 100644 web-app/src/containers/Tutorial/index.tsx diff --git a/src/services/git/index.ts b/src/services/git/index.ts index c47aba71..2d1a8957 100644 --- a/src/services/git/index.ts +++ b/src/services/git/index.ts @@ -42,6 +42,10 @@ const cherryPickCommit = async (commit: string, count = 0): Promise => { export async function gitLoadCommits(actions: G.StepActions, editorDispatch: CR.EditorDispatch): Promise { const {commits, commands, files} = actions + console.log(`load commits: ${commits.join(', ')}`) + console.log(`commands: ${commands.join(', ')}`) + console.log(`files ${files.join(', s')}`) + for (const commit of commits) { // pull a commit from tutorial repo console.log(`try cherry-pick ${commit}`) diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index bac54478..d135c2b4 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -87,6 +87,8 @@ class Tutorial implements TutorialModel { complete: false, } + console.log('this.position', JSON.stringify(this.position)) + this.clientDispatch({ position: this.position, progress: this.progress diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index 62481a70..4935476f 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -39,19 +39,9 @@ export default (editorDispatch: CR.EditorDispatch, tutorialModel: TutorialModel) const codingLanguage: G.EnumCodingLanguage = tutorialModel.config.codingLanguage editorDispatch('coderoad.tutorial_setup', codingLanguage) }, - // 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, - // } - // }, - // }), + initializeNewTutorial: () => { + console.log('initializeNewTutorial') + }, // tutorialContinue: assign({ // // load initial data, progress & position // data(): CR.TutorialData { diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index a3d6e8b6..1d2d9579 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -13,10 +13,11 @@ interface ReceivedEvent { } const App = () => { - const initialState = { SelectTutorial: 'Initial ' } + const initialState = { SelectTutorial: 'Initial' } // set state machine state const [state, setState] = React.useState(initialState) + const [debuggerInfo, setDebuggerInfo] = React.useState({}) // update level/stage/step status based on user progress & position // TODO: model server more effeciently @@ -36,6 +37,9 @@ const App = () => { } else if (message.type === 'SET_DATA') { // SET_DATA - set state machine context const { progress, position } = message.payload.data + if (process.env.REACT_APP_DEBUG) { + setDebuggerInfo({ progress, position }) + } setStatus({ variables: { progress, position } }) } } @@ -60,7 +64,7 @@ const App = () => { return (
- {process.env.REACT_APP_DEBUG && } + {process.env.REACT_APP_DEBUG && }
diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index 58c79a4c..fb8af220 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -1,10 +1,14 @@ import * as React from 'react' +import { send } from './utils/vscode' 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 @@ -54,10 +58,25 @@ const Routes = ({ state }: Props) => { - - + + -
+ + + + + + + + + + + + + + + +
) } diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx deleted file mode 100644 index 0709af3a..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 LevelSummaryPage from './LevelPage' -import StageSummaryPage from './StagePage' -import CompletedPage from './CompletedPage' - -const { Route } = Router - -interface Props { - state: any -} - -const Tutorial = (props: Props) => { - return ( - - - - - - - - - - - - - - - - - - ) -} - -export default Tutorial From f462b39c92e75564f80360b2f972ca9eef59896d Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 25 Aug 2019 22:09:28 -0700 Subject: [PATCH 55/64] heavy refactor --- src/editor/commands/index.ts | 31 ++++----------- src/editor/index.ts | 2 - src/editor/storage.ts | 4 +- src/services/tutorial/index.ts | 47 +++++++++++------------ src/state/actions/index.ts | 24 +++++++++--- src/state/machine.ts | 2 +- web-app/src/App.tsx | 12 +++--- web-app/src/components/Debugger/index.tsx | 14 ++++--- 8 files changed, 65 insertions(+), 71 deletions(-) diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index 75c052f4..7aa5e775 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -4,13 +4,12 @@ import * as G from 'typings/graphql' import * as vscode from 'vscode' import ReactWebView from '../ReactWebView' import storage from '../storage' -import {isEmptyWorkspace} from '../workspace' import runTest from './runTest' +import {isEmptyWorkspace} from '../workspace' const COMMANDS = { START: 'coderoad.start', - TUTORIAL_LAUNCH: 'coderoad.tutorial_launch', - TUTORIAL_SETUP: 'coderoad.tutorial_setup', + TEST_RUNNER_SETUP: 'coderoad.test_runner_setup', OPEN_WEBVIEW: 'coderoad.open_webview', SEND_STATE: 'coderoad.send_state', SEND_DATA: 'coderoad.send_data', @@ -24,7 +23,6 @@ const COMMANDS = { interface CreateCommandProps { vscodeExt: vscode.ExtensionContext machine: CR.StateMachine - git: any } const resetLayout = () => { @@ -34,13 +32,15 @@ const resetLayout = () => { }) } -export const createCommands = ({vscodeExt, machine, git}: CreateCommandProps) => { +export const createCommands = ({vscodeExt, machine}: CreateCommandProps) => { // React panel webview let webview: any return { // initialize - [COMMANDS.START]: () => { + [COMMANDS.START]: async () => { + + await isEmptyWorkspace() let webviewState: 'INITIALIZING' | 'RESTARTING' if (!webview) { @@ -77,24 +77,7 @@ export const createCommands = ({vscodeExt, machine, git}: CreateCommandProps) => } 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 (repo: G.TutorialRepo) => { - console.log('launch tutorial') - - await isEmptyWorkspace() - - await git.gitInitIfNotExists() - - if (!repo || !repo.uri) { - throw new Error('Tutorial repo uri not found') - } - - await git.gitSetupRemote(repo.uri) - - machine.send('TUTORIAL_LOADED') - }, - [COMMANDS.TUTORIAL_SETUP]: async (codingLanguage: G.EnumCodingLanguage) => { + [COMMANDS.TEST_RUNNER_SETUP]: async (codingLanguage: G.EnumCodingLanguage) => { // TODO: allow multiple coding languages in a tutorial diff --git a/src/editor/index.ts b/src/editor/index.ts index 6f033db2..799d8dc5 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -1,7 +1,6 @@ import * as vscode from 'vscode' import * as CR from 'typings' import {createCommands} from './commands' -import * as git from '../services/git' interface Props { machine: CR.StateMachine @@ -53,7 +52,6 @@ class Editor { const commands = createCommands({ vscodeExt: this.vscodeExt, machine: this.machine, - git, }) for (const cmd in commands) { const command: vscode.Disposable = vscode.commands.registerCommand(cmd, commands[cmd]) diff --git a/src/editor/storage.ts b/src/editor/storage.ts index a3595070..b63c8562 100644 --- a/src/editor/storage.ts +++ b/src/editor/storage.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode' -class Storage { +class EditorStorage { private storage: vscode.Memento constructor() { this.storage = {} as vscode.Memento @@ -19,4 +19,4 @@ class Storage { } } -export default new Storage() +export default new EditorStorage() diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index d135c2b4..03355b04 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -9,7 +9,8 @@ interface TutorialConfig { testRunner: G.EnumTestRunner } -interface PositionProgress { +interface MessageData { + tutorial?: {id: string} position: CR.Position progress: CR.Progress } @@ -20,12 +21,11 @@ export interface TutorialModel { version: G.TutorialVersion position: CR.Position progress: CR.Progress - init(tutorial: G.Tutorial): void - load(tutorialId: string): void + launch(tutorialId: string): void level(levelId?: string): G.Level stage(stageId?: string): G.Stage step(stepId?: string): G.Step - updateProgress(): PositionProgress + updateProgress(): void nextPosition(): CR.Position hasExisting(): Promise setClientDispatch(editorDispatch: CR.EditorDispatch): void @@ -37,11 +37,11 @@ class Tutorial implements TutorialModel { public version: G.TutorialVersion public position: CR.Position public progress: CR.Progress - private clientDispatch: (props: PositionProgress) => void + private clientDispatch: (props: MessageData) => void constructor() { // initialize types, will be assigned when tutorial is selected - this.clientDispatch = (props: PositionProgress) => { + this.clientDispatch = (props: MessageData) => { throw new Error('Tutorial client dispatch yet initialized') } this.repo = {} as G.TutorialRepo @@ -62,10 +62,18 @@ class Tutorial implements TutorialModel { } public setClientDispatch(editorDispatch: CR.EditorDispatch) { - this.clientDispatch = ({progress, position}: PositionProgress) => editorDispatch('coderoad.send_data', {progress, position}) + this.clientDispatch = ({progress, position}: MessageData) => editorDispatch('coderoad.send_data', {progress, position}) } - public init = (tutorial: G.Tutorial) => { + public async launch(tutorialId: string) { + const {tutorial}: {tutorial: G.Tutorial | null} = await api.request(tutorialQuery, { + tutorialId, // TODO: add selection of tutorial id + }) + + if (!tutorial) { + throw new Error(`Tutorial ${tutorialId} not found`) + } + this.repo = tutorial.repo this.config = { codingLanguage: tutorial.codingLanguage, @@ -90,6 +98,7 @@ class Tutorial implements TutorialModel { console.log('this.position', JSON.stringify(this.position)) this.clientDispatch({ + tutorial: {id: tutorial.id}, position: this.position, progress: this.progress }) @@ -111,19 +120,6 @@ class Tutorial implements TutorialModel { return !!(tutorial && progress) } - - public async load(tutorialId: string) { - // TODO: load from localStorage - const {tutorial}: {tutorial: G.Tutorial | null} = await api.request(tutorialQuery, { - tutorialId, // TODO: add selection of tutorial id - }) - - if (!tutorial) { - throw new Error(`Tutorial ${tutorialId} not found`) - } - - await this.init(tutorial) - } public level = (levelId: string): G.Level => { const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId || this.position.levelId) if (!level) { @@ -147,15 +143,16 @@ class Tutorial implements TutorialModel { } return step } - public updateProgress = (): {position: CR.Position, progress: CR.Progress} => { + public updateProgress = () => { const {levelId, stageId, stepId} = this.position this.progress.levels[levelId] = true this.progress.stages[stageId] = true this.progress.steps[stepId] = true - return { - position: this.position, + + this.clientDispatch({ progress: this.progress, - } + position: this.position, // TODO: calculate next position + }) } public nextPosition = (): CR.Position => { const {levelId, stageId, stepId} = this.position diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index 4935476f..20757bad 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -1,4 +1,3 @@ -import {assign} from 'xstate' // NOTE: codesmell - importing machine import {machine} from '../../extension' import {TutorialModel} from '../../services/tutorial' @@ -30,18 +29,33 @@ export default (editorDispatch: CR.EditorDispatch, tutorialModel: TutorialModel) async tutorialLaunch() { const tutorialId: string = '1' // TODO: load tutorialId - await tutorialModel.load(tutorialId) + await tutorialModel.launch(tutorialId) + + // git setup const repo: G.TutorialRepo = tutorialModel.repo - editorDispatch('coderoad.tutorial_launch', repo) + console.log('launch tutorial') + + await git.gitInitIfNotExists() + + if (!repo || !repo.uri) { + throw new Error('Tutorial repo uri not found') + } + + await git.gitSetupRemote(repo.uri) + + machine.send('TUTORIAL_LOADED') }, - tutorialSetup() { + testRunnerSetup() { const codingLanguage: G.EnumCodingLanguage = tutorialModel.config.codingLanguage - editorDispatch('coderoad.tutorial_setup', codingLanguage) + editorDispatch('coderoad.test_runner_setup', codingLanguage) }, initializeNewTutorial: () => { console.log('initializeNewTutorial') }, + tutorialContinue() { + console.log('tutorial continue') + }, // tutorialContinue: assign({ // // load initial data, progress & position // data(): CR.TutorialData { diff --git a/src/state/machine.ts b/src/state/machine.ts index 74eadd16..0fa7be7b 100644 --- a/src/state/machine.ts +++ b/src/state/machine.ts @@ -54,7 +54,7 @@ export const machine = (editorDispatch: CR.EditorDispatch, tutorialModel: Tutori Tutorial: { id: 'tutorial', initial: 'Initialize', - onEntry: ['tutorialSetup'], + onEntry: ['testRunnerSetup'], on: { WEBVIEW_INITIALIZED: '#tutorial-load-next' }, diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 1d2d9579..32c5b06e 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -17,7 +17,10 @@ const App = () => { // set state machine state const [state, setState] = React.useState(initialState) - const [debuggerInfo, setDebuggerInfo] = React.useState({}) + const [debuggerInfo, setDebuggerInfo] = React.useState({ + progress: { levels: {}, stages: {}, steps: {}, complete: false}, + position: { levelId: '', stageId: '', stepId: ''}, + }) // update level/stage/step status based on user progress & position // TODO: model server more effeciently @@ -38,6 +41,7 @@ const App = () => { // SET_DATA - set state machine context const { progress, position } = message.payload.data if (process.env.REACT_APP_DEBUG) { + console.log(`Position: ${position.levelId}/${position.stageId}/${position.stepId}`) setDebuggerInfo({ progress, position }) } setStatus({ variables: { progress, position } }) @@ -56,15 +60,11 @@ const App = () => { send('WEBVIEW_LOADED') }, []) - const value = { - state, - } - // TODO: refactor cond to user and accept first route as if/else if return (
- {process.env.REACT_APP_DEBUG && } + {process.env.REACT_APP_DEBUG && }
diff --git a/web-app/src/components/Debugger/index.tsx b/web-app/src/components/Debugger/index.tsx index 7d6329c3..8a54bdbc 100644 --- a/web-app/src/components/Debugger/index.tsx +++ b/web-app/src/components/Debugger/index.tsx @@ -1,15 +1,17 @@ import * as React from 'react' +import * as CR from 'typings' interface Props { - value: any + state: object + position: CR.Position + progress: CR.Progress } -const Debugger = ({ value }: Props) => ( +const Debugger = ({ state, position, progress }: Props) => (
-

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

-

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

-

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

-

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

+

state: {JSON.stringify(state)}

+

position: {JSON.stringify(position)}

+

progress: {JSON.stringify(progress)}

) From 1253177e0410b9bb9fdb0ca29197cdf88c6a095d Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 17:05:43 -0700 Subject: [PATCH 56/64] Refactor editor dispatch uses --- src/extension.ts | 10 ++---- src/services/git/index.ts | 2 +- src/services/tutorial/index.ts | 37 +++++++--------------- src/state/actions/index.ts | 3 +- src/state/index.ts | 29 ++++++++++------- src/state/machine.ts | 4 +-- typings/index.d.ts | 11 ++++++- web-app/src/App.tsx | 2 +- web-app/src/components/Cond/index.tsx | 17 ---------- web-app/src/components/Cond/utils/state.ts | 19 ----------- web-app/src/components/Router/index.tsx | 5 ++- 11 files changed, 50 insertions(+), 89 deletions(-) delete mode 100644 web-app/src/components/Cond/index.tsx delete mode 100644 web-app/src/components/Cond/utils/state.ts diff --git a/src/extension.ts b/src/extension.ts index 1531a77e..3c0c1499 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,9 +4,9 @@ import Tutorial, {TutorialModel} from './services/tutorial' import StateMachine from './state' import Editor from './editor' -export const tutorial: TutorialModel = new Tutorial() +export const tutorialModel: TutorialModel = new Tutorial(vscode.commands.executeCommand) // state machine that governs application logic -export const machine = new StateMachine({dispatch: vscode.commands.executeCommand, tutorial}) +export const machine = new StateMachine(tutorialModel, vscode.commands.executeCommand) // vscode editor export const editor = new Editor({ @@ -14,12 +14,8 @@ export const editor = new Editor({ setWorkspaceRoot, }) -// TODO: refactor tutorial & editor relationships -// code here is a bit smelly -tutorial.setClientDispatch(editor.dispatch) - // 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/git/index.ts b/src/services/git/index.ts index 2d1a8957..3db43e81 100644 --- a/src/services/git/index.ts +++ b/src/services/git/index.ts @@ -58,7 +58,7 @@ export async function gitLoadCommits(actions: G.StepActions, editorDispatch: CR. const {stdout, stderr} = await exec(command) if (stderr) { console.error(stderr) - // langauge specific error messages from running commands + // language specific error messages from running commands for (const message of Object.keys(errorMessages.js)) { if (stderr.match(message)) { // ignored error diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index 03355b04..c48cc932 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -9,12 +9,6 @@ interface TutorialConfig { testRunner: G.EnumTestRunner } -interface MessageData { - tutorial?: {id: string} - position: CR.Position - progress: CR.Progress -} - export interface TutorialModel { repo: G.TutorialRepo config: TutorialConfig @@ -28,7 +22,7 @@ export interface TutorialModel { updateProgress(): void nextPosition(): CR.Position hasExisting(): Promise - setClientDispatch(editorDispatch: CR.EditorDispatch): void + syncClient(): void } class Tutorial implements TutorialModel { @@ -37,19 +31,21 @@ class Tutorial implements TutorialModel { public version: G.TutorialVersion public position: CR.Position public progress: CR.Progress - private clientDispatch: (props: MessageData) => void + public syncClient: () => void - constructor() { + constructor(editorDispatch: CR.EditorDispatch) { // initialize types, will be assigned when tutorial is selected - this.clientDispatch = (props: MessageData) => { - throw new Error('Tutorial client dispatch yet initialized') - } + this.repo = {} as G.TutorialRepo this.config = {} as TutorialConfig this.version = {} as G.TutorialVersion this.position = {} as CR.Position this.progress = {} as CR.Progress - + this.syncClient = () => editorDispatch('coderoad.send_data', { + tutorial: {id: this.version.tutorialId}, + progress: this.progress, + position: this.position, + }) // Promise.all([ // storage.getTutorial(), // storage.getProgress(), @@ -61,10 +57,6 @@ class Tutorial implements TutorialModel { } - public setClientDispatch(editorDispatch: CR.EditorDispatch) { - this.clientDispatch = ({progress, position}: MessageData) => editorDispatch('coderoad.send_data', {progress, position}) - } - public async launch(tutorialId: string) { const {tutorial}: {tutorial: G.Tutorial | null} = await api.request(tutorialQuery, { tutorialId, // TODO: add selection of tutorial id @@ -97,11 +89,7 @@ class Tutorial implements TutorialModel { console.log('this.position', JSON.stringify(this.position)) - this.clientDispatch({ - tutorial: {id: tutorial.id}, - position: this.position, - progress: this.progress - }) + this.syncClient() // set tutorial, position, progress locally // TODO: base position off of progress @@ -149,10 +137,7 @@ class Tutorial implements TutorialModel { this.progress.stages[stageId] = true this.progress.steps[stepId] = true - this.clientDispatch({ - progress: this.progress, - position: this.position, // TODO: calculate next position - }) + this.syncClient() } public nextPosition = (): CR.Position => { const {levelId, stageId, stepId} = this.position diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index 20757bad..dc1263f6 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -1,4 +1,3 @@ -// NOTE: codesmell - importing machine import {machine} from '../../extension' import {TutorialModel} from '../../services/tutorial' import * as CR from 'typings' @@ -6,7 +5,7 @@ import * as G from 'typings/graphql' import * as git from '../../services/git' -export default (editorDispatch: CR.EditorDispatch, tutorialModel: TutorialModel) => ({ +export default (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) => ({ createWebview() { editorDispatch('coderoad.open_webview') }, diff --git a/src/state/index.ts b/src/state/index.ts index 21e88e53..051de61d 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -21,28 +21,31 @@ const stateToString = (state: string | object, str: string = ''): string => { return '' } -interface Props { - dispatch: CR.EditorDispatch - tutorial: TutorialModel -} class StateMachine { - private dispatch: CR.EditorDispatch private machineOptions = { devTools: true, deferEvents: true, execute: true, } private service: Interpreter<{}, CR.MachineStateSchema, CR.MachineEvent> - constructor({dispatch, tutorial}: Props) { - this.dispatch = dispatch - const machine = createMachine(dispatch, tutorial) + + constructor(tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) { + const machine = createMachine(tutorialModel, editorDispatch) + + // format state as a string and send it to the client + this.syncState = (state: any): void => { + const stateValue: CR.MessageState = stateToString(state.value) + console.log(`STATE: ${stateValue}`) + editorDispatch('send_data', stateValue) + } + + // callback on all state changes 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}) + this.syncState(state) } }) } @@ -56,12 +59,14 @@ class StateMachine { public refresh() { console.log('service refresh') console.log(this.service.state) - const {value} = this.service.state - this.dispatch('coderoad.send_state', {state: value}) + this.syncState(this.service.state) } public send(action: string | CR.Action) { this.service.send(action) } + // @ts-ignore + private syncState(state: any): void + } export default StateMachine diff --git a/src/state/machine.ts b/src/state/machine.ts index 0fa7be7b..bc1be2e2 100644 --- a/src/state/machine.ts +++ b/src/state/machine.ts @@ -5,7 +5,7 @@ import {TutorialModel} from '../services/tutorial' import createActions from './actions' import createGuards from './guards' -export const machine = (editorDispatch: CR.EditorDispatch, tutorialModel: TutorialModel) => +export const machine = (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) => Machine<{}, CR.MachineStateSchema, CR.MachineEvent>( { id: 'root', @@ -164,7 +164,7 @@ export const machine = (editorDispatch: CR.EditorDispatch, tutorialModel: Tutori }, }, { - actions: createActions(editorDispatch, tutorialModel), + actions: createActions(tutorialModel, editorDispatch), guards: createGuards(tutorialModel), activities: {}, }, diff --git a/typings/index.d.ts b/typings/index.d.ts index 60f7d0c4..61dbb84a 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -164,4 +164,13 @@ export interface StateMachine { send(action: string | Action): void } -export type EditorDispatch = (type: string, payload?: any) => void +interface MessageData { + tutorial?: {id: string} + position: Position + progress: Progress +} + +type MessageState = string + + +export type EditorDispatch = (type: string, payload?: MessageData | MessageState) => void diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 32c5b06e..54b8b25e 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -23,7 +23,7 @@ const App = () => { }) // update level/stage/step status based on user progress & position - // TODO: model server more effeciently + // TODO: model server more efficiently const [setStatus] = useMutation(SET_STATUS) // event bus listener 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/Router/index.tsx b/web-app/src/components/Router/index.tsx index 893ab405..21a3a53e 100644 --- a/web-app/src/components/Router/index.tsx +++ b/web-app/src/components/Router/index.tsx @@ -1,12 +1,15 @@ import * as React from 'react' import Route from './Route' -import { stateMatch } from '../Cond/utils/state' interface Props { state: string children: any } +const stateMatch = (state: string, path: string) => { + return !!(new RegExp(`^${state}`).exec(path)) +} + // router finds first state match of const Router = ({ state, children }: Props) => { const childArray = React.Children.toArray(children) From c32d6700bb8d14ce0e8a8dff591f503ea00e59d6 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 17:41:17 -0700 Subject: [PATCH 57/64] add jest --- jest.config.js | 7 + package-lock.json | 4360 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 6 +- 3 files changed, 4203 insertions(+), 170 deletions(-) create mode 100644 jest.config.js diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..44342108 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,7 @@ +module.exports = { + roots: ['/src'], + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + testPathIgnorePatterns: ['node_modules', 'src/test'], +} diff --git a/package-lock.json b/package-lock.json index 053f380a..60ec84ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,118 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/core": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", + "dev": true, + "requires": { + "@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.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + } + }, "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", @@ -24,6 +136,321 @@ "js-tokens": "^4.0.0" } }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "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" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@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.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": "^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", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@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.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "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", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "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.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "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==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@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.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.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.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", + "write-file-atomic": "2.4.1" + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/babel__core": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", + "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, "@types/dotenv": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", @@ -42,6 +469,46 @@ "graphql": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "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": "*" + } + }, + "@types/jest-diff": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", + "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", + "dev": true + }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", @@ -54,6 +521,63 @@ "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", "dev": true }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "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==", + "dev": true + }, + "abab": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "dev": true, + "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==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -73,6 +597,12 @@ "uri-js": "^4.2.2" } }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -88,6 +618,16 @@ "color-convert": "^1.9.0" } }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -97,6 +637,36 @@ "sprintf-js": "~1.0.2" } }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -110,11 +680,35 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -125,33 +719,204 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "requires": { + "@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.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "babel-plugin-istanbul": { + "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==", + "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "babel-plugin-jest-hoist": { + "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==", + "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/babel__traverse": "^7.0.6" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", + "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -163,12 +928,44 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -185,6 +982,35 @@ "supports-color": "^5.3.0" } }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -196,12 +1022,28 @@ "wrap-ansi": "^2.0.0" } }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -230,6 +1072,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -269,6 +1117,29 @@ } } }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -296,6 +1167,21 @@ "which": "^1.2.9" } }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -304,6 +1190,30 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, "date-fns": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", @@ -324,16 +1234,99 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "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" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, "dotenv": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz", @@ -348,6 +1341,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", @@ -366,6 +1365,31 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "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-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -384,18 +1408,51 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -411,26 +1468,214 @@ "strip-eof": "^1.0.0" } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.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" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -440,6 +1685,12 @@ "locate-path": "^3.0.0" } }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -455,189 +1706,1741 @@ "mime-types": "^2.1.12" } }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "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", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "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 + }, + "graphql": { + "version": "14.5.3", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.3.tgz", + "integrity": "sha512-W8A8nt9BsMg0ZK2qA3DJIVU6muWhxZRYLTmc+5XGwzWzVdUdPVlAAg5hTBjiTISEnzsKL/onasu6vl3kgGTbYg==", + "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", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "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 + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "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-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "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==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "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.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.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 + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "requires": { + "@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.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "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.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.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.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.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { - "pump": "^3.0.0" + "detect-newline": "^2.1.0" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, "requires": { - "assert-plus": "^1.0.0" + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" } }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@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" } }, - "graphql": { - "version": "14.5.3", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.3.tgz", - "integrity": "sha512-W8A8nt9BsMg0ZK2qA3DJIVU6muWhxZRYLTmc+5XGwzWzVdUdPVlAAg5hTBjiTISEnzsKL/onasu6vl3kgGTbYg==", + "jest-environment-node": { + "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==", + "dev": true, "requires": { - "iterall": "^1.2.2" + "@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" } }, - "graphql-request": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz", - "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==", + "jest-get-type": { + "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==", + "dev": true + }, + "jest-haste-map": { + "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==", + "dev": true, "requires": { - "cross-fetch": "2.2.2" + "@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.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" } }, - "graphql-tag": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", - "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==" + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.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.9.0", + "is-generator-fn": "^2.0.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" + } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "jest-matcher-utils": { + "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==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "@babel/code-frame": "^7.0.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", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "jest-mock": { + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true }, - "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "jest-regex-util": { + "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==", "dev": true }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "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==", + "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@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" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" } }, - "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "@jest/console": "^24.7.1", + "@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.9.0", + "jest-docblock": "^24.3.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" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@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.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.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": "^13.3.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 + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "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.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "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=", + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "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.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "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", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, + "requires": { + "@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.9.0", + "string-length": "^2.0.0" + } }, - "iterall": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz", - "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, "js-tokens": { "version": "4.0.0", @@ -660,6 +3463,46 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -681,6 +3524,23 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -692,13 +3552,59 @@ "verror": "1.10.0" } }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -717,6 +3623,54 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -726,6 +3680,21 @@ "p-defer": "^1.0.0" } }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", @@ -737,6 +3706,33 @@ "p-is-promise": "^2.0.0" } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", @@ -769,6 +3765,27 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -815,6 +3832,44 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -826,6 +3881,31 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -838,6 +3918,15 @@ "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -853,11 +3942,82 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -866,6 +4026,38 @@ "wrappy": "1" } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -883,6 +4075,15 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -913,6 +4114,12 @@ "p-limit": "^2.0.0" } }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -929,6 +4136,18 @@ "json-parse-better-errors": "^1.0.1" } }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -952,6 +4171,15 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -963,12 +4191,78 @@ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "prettier": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", "dev": true }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "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 + } + } + }, + "prompts": { + "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==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, "psl": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", @@ -999,6 +4293,12 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, + "react-is": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "dev": true + }, "read-pkg": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", @@ -1010,6 +4310,66 @@ "pify": "^3.0.0" } }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -1037,6 +4397,26 @@ "uuid": "^3.3.2" } }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1063,6 +4443,48 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "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" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -1077,10 +4499,50 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true }, "semver": { "version": "5.7.0", @@ -1093,6 +4555,29 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -1108,17 +4593,170 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "sisteransi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, "source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -1128,6 +4766,12 @@ "source-map": "^0.6.0" } }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -1166,6 +4810,15 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1188,6 +4841,49 @@ "tweetnacl": "~0.14.0" } }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -1207,6 +4903,12 @@ "ansi-regex": "^3.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -1221,6 +4923,92 @@ "has-flag": "^3.0.0" } }, + "symbol-tree": { + "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==", + "dev": true + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -1237,12 +5025,61 @@ } } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "tree-kill": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", "dev": true }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-jest": { + "version": "24.0.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", + "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -1298,12 +5135,93 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "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==", "dev": true }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -1312,6 +5230,12 @@ "punycode": "^2.1.0" } }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, "url-parse": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", @@ -1321,6 +5245,22 @@ "requires-port": "^1.0.0" } }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -1369,11 +5309,61 @@ "https-proxy-agent": "^2.2.1" } }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, "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==" }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -1389,6 +5379,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -1441,6 +5437,32 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xstate": { "version": "4.6.7", "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.6.7.tgz", diff --git a/package.json b/package.json index c024f11b..f7acde1b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "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": "npm run build && node ./node_modules/vscode/bin/test", + "test": "jest", "vscode:prepublish": "npm run build", "watch": "tsc -watch -p ./" }, @@ -39,10 +40,13 @@ "devDependencies": { "@types/dotenv": "^6.1.1", "@types/graphql": "^14.5.0", + "@types/jest": "^24.0.18", "@types/mocha": "^5.2.7", "@types/node": "^12.7.2", "concurrently": "^4.1.2", + "jest": "^24.9.0", "prettier": "^1.18.2", + "ts-jest": "^24.0.2", "tslint": "^5.19.0", "tslint-config-prettier": "^1.18.0", "typescript": "^3.5.3" From 38869212dee54bbcd476a7f1c7048dce4bdec78d Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 17:41:24 -0700 Subject: [PATCH 58/64] fix stateToString function --- src/state/index.ts | 20 +++---------------- src/state/utils/stateToString.test.ts | 28 +++++++++++++++++++++++++++ src/state/utils/stateToString.ts | 15 ++++++++++++++ 3 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 src/state/utils/stateToString.test.ts create mode 100644 src/state/utils/stateToString.ts diff --git a/src/state/index.ts b/src/state/index.ts index 051de61d..063b883e 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -2,26 +2,11 @@ import {interpret, Interpreter} from 'xstate' import {TutorialModel} from '../services/tutorial' import * as CR from 'typings' import createMachine from './machine' +import stateToString from './utils/stateToString' // 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 '' -} - - class StateMachine { private machineOptions = { devTools: true, @@ -35,9 +20,10 @@ class StateMachine { // format state as a string and send it to the client this.syncState = (state: any): void => { + console.log(state) const stateValue: CR.MessageState = stateToString(state.value) console.log(`STATE: ${stateValue}`) - editorDispatch('send_data', stateValue) + editorDispatch('coderoad.send_state', stateValue) } // callback on all state changes diff --git a/src/state/utils/stateToString.test.ts b/src/state/utils/stateToString.test.ts new file mode 100644 index 00000000..1190678b --- /dev/null +++ b/src/state/utils/stateToString.test.ts @@ -0,0 +1,28 @@ +// +// 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 stateToString from './stateToString' + +// 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 +describe('StateToString', () => { + + test('no levels deep', () => { + expect(stateToString('first')).toBe('first') + }) + // Defines a Mocha unit test + test('one level deep', () => { + expect(stateToString({first: 'second'})).toBe('first.second') + }) + + test('two levels deep', () => { + expect(stateToString({first: {second: 'third'}})).toBe('first.second.third') + }) +}) diff --git a/src/state/utils/stateToString.ts b/src/state/utils/stateToString.ts new file mode 100644 index 00000000..5f690a6e --- /dev/null +++ b/src/state/utils/stateToString.ts @@ -0,0 +1,15 @@ +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 str.length ? `${str}.${state}` : state + } + return '' +} + +export default stateToString From 63f28db395add9c4e11321a05dafec20beada5c5 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 17:47:56 -0700 Subject: [PATCH 59/64] fix jest mismatch build errors --- package-lock.json | 8 ++++---- package.json | 3 +-- src/test/extension.test.ts | 16 ++++++++-------- tsconfig.json | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60ec84ba..c5709641 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2839,13 +2839,13 @@ "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==" }, "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "jest-cli": "^24.8.0" }, "dependencies": { "ansi-regex": { diff --git a/package.json b/package.json index f7acde1b..da11be7e 100644 --- a/package.json +++ b/package.json @@ -41,10 +41,9 @@ "@types/dotenv": "^6.1.1", "@types/graphql": "^14.5.0", "@types/jest": "^24.0.18", - "@types/mocha": "^5.2.7", "@types/node": "^12.7.2", "concurrently": "^4.1.2", - "jest": "^24.9.0", + "jest": "24.8.0", "prettier": "^1.18.2", "ts-jest": "^24.0.2", "tslint": "^5.19.0", diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 75db3826..193dd793 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -4,7 +4,7 @@ // // The module 'assert' provides assertion methods from node -import * as assert from 'assert' +// 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 @@ -12,10 +12,10 @@ import * as assert from 'assert' // 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)) - }) -}) +// 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/tsconfig.json b/tsconfig.json index b6730a63..e62adc7c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,5 +26,5 @@ }, "allowJs": true }, - "exclude": ["node_modules", ".vscode-test", "build", "resources", "web-app"] + "exclude": ["node_modules", ".vscode-test", "build", "resources", "web-app", "*.js", "*.test.ts"] } From 0d50ab683ad3b16de4a48951ec778cf74bd14b5c Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 17:49:13 -0700 Subject: [PATCH 60/64] update deps --- package-lock.json | 24 +++++++++--------------- package.json | 6 +++--- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5709641..1286d646 100644 --- a/package-lock.json +++ b/package-lock.json @@ -509,16 +509,10 @@ "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", "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 - }, "@types/node": { - "version": "12.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz", - "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", + "version": "12.7.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.3.tgz", + "integrity": "sha512-3SiLAIBkDWDg6vFo0+5YJyHPWU9uwu40Qe+v+0MH8wRKYBimHvvAOyk3EzMrD/TrIlLYfXrqDqrg913PynrMJQ==", "dev": true }, "@types/stack-utils": { @@ -2329,9 +2323,9 @@ "dev": true }, "graphql": { - "version": "14.5.3", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.3.tgz", - "integrity": "sha512-W8A8nt9BsMg0ZK2qA3DJIVU6muWhxZRYLTmc+5XGwzWzVdUdPVlAAg5hTBjiTISEnzsKL/onasu6vl3kgGTbYg==", + "version": "14.5.4", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.5.4.tgz", + "integrity": "sha512-dPLvHoxy5m9FrkqWczPPRnH0X80CyvRE6e7Fa5AWEqEAzg9LpxHvKh24po/482E6VWHigOkAmb4xCp6P9yT9gw==", "requires": { "iterall": "^1.2.2" } @@ -5145,9 +5139,9 @@ } }, "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 }, "uglify-js": { diff --git a/package.json b/package.json index da11be7e..1f78d872 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ }, "dependencies": { "dotenv": "^8.1.0", - "graphql": "^14.5.3", + "graphql": "^14.5.4", "graphql-request": "^1.8.2", "graphql-tag": "^2.10.1", "vscode": "^1.1.36", @@ -41,14 +41,14 @@ "@types/dotenv": "^6.1.1", "@types/graphql": "^14.5.0", "@types/jest": "^24.0.18", - "@types/node": "^12.7.2", + "@types/node": "^12.7.3", "concurrently": "^4.1.2", "jest": "24.8.0", "prettier": "^1.18.2", "ts-jest": "^24.0.2", "tslint": "^5.19.0", "tslint-config-prettier": "^1.18.0", - "typescript": "^3.5.3" + "typescript": "^3.6.2" }, "engines": { "vscode": "^1.34.0" From 44cf7d73b67005f3dc53deccc6f4d32840276b2f Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 17:57:25 -0700 Subject: [PATCH 61/64] cleanup client state --- src/state/index.ts | 5 ++--- typings/index.d.ts | 7 +++++-- web-app/src/App.tsx | 2 +- web-app/src/components/Debugger/index.tsx | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/state/index.ts b/src/state/index.ts index 063b883e..b4277c50 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -20,10 +20,9 @@ class StateMachine { // format state as a string and send it to the client this.syncState = (state: any): void => { - console.log(state) - const stateValue: CR.MessageState = stateToString(state.value) + const stateValue: string = stateToString(state.value) console.log(`STATE: ${stateValue}`) - editorDispatch('coderoad.send_state', stateValue) + editorDispatch('coderoad.send_state', {state: stateValue}) } // callback on all state changes diff --git a/typings/index.d.ts b/typings/index.d.ts index 61dbb84a..0e24792e 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -170,7 +170,10 @@ interface MessageData { progress: Progress } -type MessageState = string +interface MessageState { + state: string +} -export type EditorDispatch = (type: string, payload?: MessageData | MessageState) => void +// todo: type each string param and payload +export type EditorDispatch = (type: string, payload?: MessageData | MessageState | any) => void diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index 54b8b25e..fcc4788c 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -13,7 +13,7 @@ interface ReceivedEvent { } const App = () => { - const initialState = { SelectTutorial: 'Initial' } + const initialState = 'SelectTutorial.Initial' // set state machine state const [state, setState] = React.useState(initialState) diff --git a/web-app/src/components/Debugger/index.tsx b/web-app/src/components/Debugger/index.tsx index 8a54bdbc..268909f9 100644 --- a/web-app/src/components/Debugger/index.tsx +++ b/web-app/src/components/Debugger/index.tsx @@ -2,14 +2,14 @@ import * as React from 'react' import * as CR from 'typings' interface Props { - state: object + state: string position: CR.Position progress: CR.Progress } const Debugger = ({ state, position, progress }: Props) => (
-

state: {JSON.stringify(state)}

+

state: {state}

position: {JSON.stringify(position)}

progress: {JSON.stringify(progress)}

From 957d05b1a7f0ef9ba1990f43649a23e376df0943 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 31 Aug 2019 19:44:26 -0700 Subject: [PATCH 62/64] rename select to start --- src/state/machine.ts | 4 ++-- typings/index.d.ts | 2 +- web-app/src/App.tsx | 2 +- web-app/src/Routes.tsx | 8 ++++---- web-app/src/components/Error/index.tsx | 2 +- web-app/src/containers/New/index.tsx | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/state/machine.ts b/src/state/machine.ts index bc1be2e2..d673bc05 100644 --- a/src/state/machine.ts +++ b/src/state/machine.ts @@ -9,9 +9,9 @@ export const machine = (tutorialModel: TutorialModel, editorDispatch: CR.EditorD Machine<{}, CR.MachineStateSchema, CR.MachineEvent>( { id: 'root', - initial: 'SelectTutorial', + initial: 'Start', states: { - SelectTutorial: { + Start: { onEntry: ['createWebview'], initial: 'Initial', states: { diff --git a/typings/index.d.ts b/typings/index.d.ts index 0e24792e..861a5c32 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -123,7 +123,7 @@ export interface MachineEvent { export interface MachineStateSchema { states: { - SelectTutorial: { + Start: { states: { Initial: {} Startup: {} diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index fcc4788c..ecae47c7 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -13,7 +13,7 @@ interface ReceivedEvent { } const App = () => { - const initialState = 'SelectTutorial.Initial' + const initialState = 'Start.Initial' // set state machine state const [state, setState] = React.useState(initialState) diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index fb8af220..54dedbc0 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -46,16 +46,16 @@ const Routes = ({ state }: Props) => { return (
- + - + - + - + diff --git a/web-app/src/components/Error/index.tsx b/web-app/src/components/Error/index.tsx index 124c4934..cffa3f08 100644 --- a/web-app/src/components/Error/index.tsx +++ b/web-app/src/components/Error/index.tsx @@ -15,7 +15,7 @@ interface Props { } const ErrorView = ({ error }: Props) => { - console.log('ERROR:', error) + console.log(error) return (

Error

diff --git a/web-app/src/containers/New/index.tsx b/web-app/src/containers/New/index.tsx index 560da00b..8b142258 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -34,7 +34,7 @@ const NewPageContainer = () => { return ( - send('TUTORIAL_START')} tutorialList={data.tutorials} /> + send('TUTORIAL_START')} tutorialList={data.tutorials} /> ) } From 0133ab8b64d410dfae1073f118d6473aabf21f05 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 1 Sep 2019 10:12:30 -0700 Subject: [PATCH 63/64] migrate git into tutorial model --- src/editor/ReactWebView.ts | 31 ++- src/editor/commands/index.ts | 6 +- src/editor/commands/runTest.ts | 246 +++++++++--------- src/services/git/index.ts | 4 +- src/services/tutorial/index.ts | 53 +++- src/state/actions/index.ts | 52 +--- .../New/TutorialList/TutorialItem.tsx | 4 +- .../src/containers/New/TutorialList/index.tsx | 16 +- web-app/src/containers/New/index.tsx | 5 +- web-app/src/services/apollo/mutations.ts | 4 +- web-app/stories/New.stories.tsx | 6 +- 11 files changed, 224 insertions(+), 203 deletions(-) diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 77620f50..9c86c072 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -12,9 +12,7 @@ const getNonce = (): string => { } -/** - * Manages React webview panels - */ +// Manages webview panel class ReactWebView { // @ts-ignore public loaded: boolean @@ -28,7 +26,7 @@ class ReactWebView { // Create and show a new webview panel this.panel = this.createWebviewPanel(vscode.ViewColumn.Two) - // Set the webview's initial html content + // Set the webview initial html content this.panel.webview.html = this.getHtmlForWebview() // Listen for when the panel is disposed @@ -37,12 +35,21 @@ class ReactWebView { // 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 { - console.log('onReceive', action) - vscode.commands.executeCommand('coderoad.receive_action', action) + const actionType: string = typeof action === 'string' ? action : action.type + switch (actionType) { + case 'WEBVIEW_LOADED': + // await loading of webview in React before proceeding with loaded state + this.loaded = true + break + case 'TUTORIAL_START': + console.log('TUTORIAL_START called') + console.log(action) + break + // add other cases + default: + // send to state machine + console.log('onReceive', action) + vscode.commands.executeCommand('coderoad.receive_machine_action', action) } } this.panel.webview.onDidReceiveMessage(onReceive, null, this.disposables) @@ -55,7 +62,7 @@ class ReactWebView { }) } - // prevents new panels from going ontop of coderoad panel + // prevents new panels from going on top of coderoad panel vscode.window.onDidChangeActiveTextEditor((textEditor?: vscode.TextEditor) => { console.log('onDidChangeActiveTextEditor') console.log(textEditor) @@ -115,7 +122,7 @@ class ReactWebView { const config = { // Enable javascript in the webview enableScripts: true, - // And restric the webview to only loading content from our extension's `media` directory. + // 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, diff --git a/src/editor/commands/index.ts b/src/editor/commands/index.ts index 7aa5e775..a0a8a00a 100644 --- a/src/editor/commands/index.ts +++ b/src/editor/commands/index.ts @@ -13,7 +13,7 @@ const COMMANDS = { OPEN_WEBVIEW: 'coderoad.open_webview', SEND_STATE: 'coderoad.send_state', SEND_DATA: 'coderoad.send_data', - RECEIVE_ACTION: 'coderoad.receive_action', + RECEIVE_MACHINE_ACTION: 'coderoad.receive_machine_action', OPEN_FILE: 'coderoad.open_file', RUN_TEST: 'coderoad.run_test', TEST_PASS: 'coderoad.test_pass', @@ -102,7 +102,7 @@ export const createCommands = ({vscodeExt, machine}: CreateCommandProps) => { 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 + // 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) { @@ -116,7 +116,7 @@ export const createCommands = ({vscodeExt, machine}: CreateCommandProps) => { [COMMANDS.SEND_DATA]: (payload: {data: any}) => { webview.postMessage({type: 'SET_DATA', payload}) }, - [COMMANDS.RECEIVE_ACTION]: (action: string | CR.Action) => { + [COMMANDS.RECEIVE_MACHINE_ACTION]: (action: string | CR.Action) => { // send received actions from web-app into state machine console.log('receive action', action) machine.send(action) diff --git a/src/editor/commands/runTest.ts b/src/editor/commands/runTest.ts index 4a6627c6..bcc0dbb0 100644 --- a/src/editor/commands/runTest.ts +++ b/src/editor/commands/runTest.ts @@ -1,5 +1,5 @@ import * as vscode from 'vscode' -import { exec } from '../../services/node' +import {exec} from '../../services/node' import * as storage from '../../services/storage' // ensure only latest run_test action is taken @@ -8,135 +8,135 @@ 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 + return currentId !== processId } -let _channel: vscode.OutputChannel +let channel: vscode.OutputChannel const getOutputChannel = (name: string): vscode.OutputChannel => { - if (!_channel) { - _channel = vscode.window.createOutputChannel(name) - } - return _channel + if (!channel) { + channel = vscode.window.createOutputChannel(name) + } + return channel } interface Props { - onSuccess(): void - onFail(): void + 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); - // } - } +export default async function runTest({onSuccess, onFail}: Props): Promise { + // increment process id + const 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') + // } + + const 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) { + 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 + const 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); + // } + } } diff --git a/src/services/git/index.ts b/src/services/git/index.ts index 3db43e81..8166024b 100644 --- a/src/services/git/index.ts +++ b/src/services/git/index.ts @@ -39,7 +39,7 @@ 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: G.StepActions, editorDispatch: CR.EditorDispatch): Promise { +export async function gitLoadCommits(actions: G.StepActions, openFile: (file: string) => void): Promise { const {commits, commands, files} = actions console.log(`load commits: ${commits.join(', ')}`) @@ -72,7 +72,7 @@ export async function gitLoadCommits(actions: G.StepActions, editorDispatch: CR. if (files) { for (const filePath of files) { - editorDispatch('coderoad.open_file', filePath) + openFile(filePath) } } } diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index c48cc932..e629995f 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -1,5 +1,6 @@ import * as G from 'typings/graphql' import * as CR from 'typings' +import * as git from '../../services/git' import * as storage from '../storage' import api from '../api' import tutorialQuery from '../../services/api/gql/getTutorial' @@ -23,6 +24,7 @@ export interface TutorialModel { nextPosition(): CR.Position hasExisting(): Promise syncClient(): void + triggerCurrent(type: 'STEP' | 'STAGE' | 'LEVEL'): void } class Tutorial implements TutorialModel { @@ -32,6 +34,7 @@ class Tutorial implements TutorialModel { public position: CR.Position public progress: CR.Progress public syncClient: () => void + public openFile: (file: string) => void constructor(editorDispatch: CR.EditorDispatch) { // initialize types, will be assigned when tutorial is selected @@ -46,6 +49,7 @@ class Tutorial implements TutorialModel { progress: this.progress, position: this.position, }) + this.openFile = (file: string) => editorDispatch('coderoad.open_file', file) // Promise.all([ // storage.getTutorial(), // storage.getProgress(), @@ -56,8 +60,9 @@ class Tutorial implements TutorialModel { // }) } - public async launch(tutorialId: string) { + console.log('launch tutorial') + const {tutorial}: {tutorial: G.Tutorial | null} = await api.request(tutorialQuery, { tutorialId, // TODO: add selection of tutorial id }) @@ -67,6 +72,11 @@ class Tutorial implements TutorialModel { } this.repo = tutorial.repo + + if (!this.repo || !this.repo.uri) { + throw new Error('Tutorial repo uri not found') + } + this.config = { codingLanguage: tutorial.codingLanguage, testRunner: tutorial.testRunner, @@ -87,9 +97,13 @@ class Tutorial implements TutorialModel { complete: false, } + // setup git, git remote + await git.gitInitIfNotExists() + await git.gitSetupRemote(this.repo.uri) + console.log('this.position', JSON.stringify(this.position)) - this.syncClient() + await this.syncClient() // set tutorial, position, progress locally // TODO: base position off of progress @@ -98,6 +112,7 @@ class Tutorial implements TutorialModel { storage.setPosition(this.position), storage.setProgress(this.progress) ]) + // machine.send('TUTORIAL_LOADED') } public async hasExisting(): Promise { @@ -106,9 +121,18 @@ class Tutorial implements TutorialModel { storage.getProgress(), ]) - return !!(tutorial && progress) + // verify git is setup with a coderoad remote + const [hasGit, hasGitRemote] = await Promise.all([ + git.gitVersion(), + git.gitCheckRemoteExists(), + ]) + // TODO: may need to clean up git remote if no existing tutorial + + const canContinue = !!(tutorial && progress && hasGit && hasGitRemote) + + return canContinue } - public level = (levelId: string): G.Level => { + public level = (levelId?: string): G.Level => { const level: G.Level | undefined = this.version.levels.find((l: G.Level) => l.id === levelId || this.position.levelId) if (!level) { throw new Error('Level not found') @@ -131,6 +155,27 @@ class Tutorial implements TutorialModel { } return step } + public triggerCurrent = (type: 'STEP' | 'STAGE' | 'LEVEL') => { + let target: G.Step | G.Stage | G.Level | null = null + switch (type) { + case 'STEP': + target = this.step() + break + case 'STAGE': + target = this.stage() + break + case 'LEVEL': + target = this.level() + break + default: + throw new Error(`Type ${type} not found`) + } + if (!target || !target.setup) { + // no stepAction + return + } + git.gitLoadCommits(target.setup, this.openFile) + } public updateProgress = () => { const {levelId, stageId, stepId} = this.position this.progress.levels[levelId] = true diff --git a/src/state/actions/index.ts b/src/state/actions/index.ts index dc1263f6..17f71dd7 100644 --- a/src/state/actions/index.ts +++ b/src/state/actions/index.ts @@ -2,7 +2,6 @@ import {machine} from '../../extension' import {TutorialModel} from '../../services/tutorial' import * as CR from 'typings' import * as G from 'typings/graphql' -import * as git from '../../services/git' export default (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) => ({ @@ -12,38 +11,7 @@ export default (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) async newOrContinue() { // verify that the user has an existing tutorial to continue const hasExistingTutorial: boolean = await tutorialModel.hasExisting() - - // verify git is setup with a coderoad remote - const [hasGit, hasGitRemote] = await Promise.all([ - git.gitVersion(), - git.gitCheckRemoteExists(), - ]) - - const canContinue = !!(hasExistingTutorial && hasGit && hasGitRemote) - - // TODO: may need to clean up git remote if no existing tutorial - - machine.send(canContinue ? 'CONTINUE' : 'NEW') - }, - async tutorialLaunch() { - const tutorialId: string = '1' - // TODO: load tutorialId - await tutorialModel.launch(tutorialId) - - // git setup - const repo: G.TutorialRepo = tutorialModel.repo - - console.log('launch tutorial') - - await git.gitInitIfNotExists() - - if (!repo || !repo.uri) { - throw new Error('Tutorial repo uri not found') - } - - await git.gitSetupRemote(repo.uri) - - machine.send('TUTORIAL_LOADED') + machine.send(hasExistingTutorial ? 'CONTINUE' : 'NEW') }, testRunnerSetup() { const codingLanguage: G.EnumCodingLanguage = tutorialModel.config.codingLanguage @@ -85,7 +53,7 @@ export default (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) }, testPass(): void { editorDispatch('coderoad.test_pass') - git.gitSaveCommit(tutorialModel.position) + // git.gitSaveCommit(tutorialModel.position) }, testFail() { editorDispatch('coderoad.test_fail') @@ -141,23 +109,14 @@ export default (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) // }, // }), loadLevel(): void { - const level: G.Level = tutorialModel.level() - // run level setup if it exists - if (level && level.setup) { - git.gitLoadCommits(level.setup, editorDispatch) - } + tutorialModel.triggerCurrent('LEVEL') }, stageLoadNext() { console.log('stageLoadNext') tutorialModel.nextPosition() }, loadStage(): void { - const stage: G.Stage = tutorialModel.stage() - - // run level setup if it exists - if (stage && stage.setup) { - git.gitLoadCommits(stage.setup, editorDispatch) - } + tutorialModel.triggerCurrent('STAGE') }, // @ts-ignore // updatePosition: assign({ @@ -167,7 +126,6 @@ export default (tutorialModel: TutorialModel, editorDispatch: CR.EditorDispatch) // }), // }), stepLoadCommits(): void { - const step: G.Step = tutorialModel.step() - git.gitLoadCommits(step.setup, editorDispatch) + tutorialModel.triggerCurrent('STEP') }, }) diff --git a/web-app/src/containers/New/TutorialList/TutorialItem.tsx b/web-app/src/containers/New/TutorialList/TutorialItem.tsx index 71a3e0bb..f7e22370 100644 --- a/web-app/src/containers/New/TutorialList/TutorialItem.tsx +++ b/web-app/src/containers/New/TutorialList/TutorialItem.tsx @@ -4,14 +4,14 @@ import { Button } from '@alifd/next' interface Props { title?: string text?: string - onNew(): void + onSelect(): void } const TutorialItem = (props: Props) => (

{props.title || 'Title'}

{props.text || 'Description'}

- +
) diff --git a/web-app/src/containers/New/TutorialList/index.tsx b/web-app/src/containers/New/TutorialList/index.tsx index c40dbacd..b06fff85 100644 --- a/web-app/src/containers/New/TutorialList/index.tsx +++ b/web-app/src/containers/New/TutorialList/index.tsx @@ -1,24 +1,34 @@ import * as React from 'react' +import * as CR from 'typings' import * as T from 'typings/graphql' import TutorialItem from './TutorialItem' interface Props { tutorialList: T.Tutorial[] - onNew(id: string): void + onNew(Action: CR.Action): void } -const TutorialList = (props: Props) => ( +const TutorialList = (props: Props) => { + const onSelect = (tutorial: T.Tutorial) => props.onNew({ + type: 'TUTORIAL_START', + payload: { + id: tutorial.id, + version: tutorial.version, + } + }) + return (
{props.tutorialList.map((tutorial: T.Tutorial) => ( props.onNew(tutorial.id)} + onSelect={() => 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 8b142258..0483d9f7 100644 --- a/web-app/src/containers/New/index.tsx +++ b/web-app/src/containers/New/index.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' +import * as CR from 'typings' import queryTutorials from './queryTutorials' import { send } from '../../utils/vscode' @@ -10,7 +11,7 @@ import TutorialList from './TutorialList' interface Props { tutorialList: T.Tutorial[] - onNew(tutorialId: string): void + onNew(action: CR.Action): void } export const NewPage = (props: Props) => ( @@ -34,7 +35,7 @@ const NewPageContainer = () => { return ( - send('TUTORIAL_START')} tutorialList={data.tutorials} /> + ) } diff --git a/web-app/src/services/apollo/mutations.ts b/web-app/src/services/apollo/mutations.ts index f4a0c5ce..2d3f1bcf 100644 --- a/web-app/src/services/apollo/mutations.ts +++ b/web-app/src/services/apollo/mutations.ts @@ -1,7 +1,7 @@ -import { gql } from 'apollo-boost' +import {gql} from 'apollo-boost' export const SET_STATUS = gql` - mutation ToggleTodo($progress: Progress!, $position: Position) { + mutation SetStatus($progress: Progress!, $position: Position) { setStatus(progress: $progress, position: $position) @client } ` \ No newline at end of file diff --git a/web-app/stories/New.stories.tsx b/web-app/stories/New.stories.tsx index 4952ea37..f8a9eeee 100644 --- a/web-app/stories/New.stories.tsx +++ b/web-app/stories/New.stories.tsx @@ -10,15 +10,15 @@ import NewContainer from '../src/containers/New' storiesOf('New', module) .add('Tutorial', () => { - const tutorial: T.Tutorial = { + const tutorial = { id: '1', title: 'Tutorial 1', text: 'The first one', } - return + return }) .add('TutorialList', () => { - const tutorialList: T.Tutorial[] = [ + const tutorialList = [ { id: '1', title: 'Tutorial 1', From 50cad589f3342128b5463556a09059411d682a5f Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 1 Sep 2019 11:16:40 -0700 Subject: [PATCH 64/64] setup initial start/loaded actions --- src/editor/ReactWebView.ts | 5 +++ src/services/tutorial/index.ts | 12 ++++- web-app/src/App.tsx | 7 ++- .../src/containers/New/TutorialList/index.tsx | 45 +++++++++++-------- .../containers/Tutorial/LevelPage/index.tsx | 8 ++-- .../containers/Tutorial/StagePage/index.tsx | 8 ++-- .../containers/Tutorial/SummaryPage/index.tsx | 4 +- web-app/src/services/current/index.ts | 38 ++++++++++++++++ 8 files changed, 98 insertions(+), 29 deletions(-) create mode 100644 web-app/src/services/current/index.ts diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index 9c86c072..b5f246bf 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -1,6 +1,7 @@ import * as path from 'path' import * as CR from 'typings' import * as vscode from 'vscode' +import {tutorialModel} from '../extension' const getNonce = (): string => { let text = '' @@ -44,6 +45,10 @@ class ReactWebView { case 'TUTORIAL_START': console.log('TUTORIAL_START called') console.log(action) + if (typeof action === 'string' || !action.payload || !action.payload.id) { + throw new Error('No tutorial id on tutorial start action') + } + tutorialModel.launch(action.payload.id) break // add other cases default: diff --git a/src/services/tutorial/index.ts b/src/services/tutorial/index.ts index e629995f..7ab284a0 100644 --- a/src/services/tutorial/index.ts +++ b/src/services/tutorial/index.ts @@ -1,6 +1,7 @@ import * as G from 'typings/graphql' import * as CR from 'typings' import * as git from '../../services/git' +import {machine} from '../../extension' import * as storage from '../storage' import api from '../api' import tutorialQuery from '../../services/api/gql/getTutorial' @@ -60,13 +61,16 @@ class Tutorial implements TutorialModel { // }) } - public async launch(tutorialId: string) { + public launch = async (tutorialId: string) => { console.log('launch tutorial') + machine.send('TUTORIAL_START') const {tutorial}: {tutorial: G.Tutorial | null} = await api.request(tutorialQuery, { tutorialId, // TODO: add selection of tutorial id }) + console.log('tutorial', tutorial) + if (!tutorial) { throw new Error(`Tutorial ${tutorialId} not found`) } @@ -83,6 +87,8 @@ class Tutorial implements TutorialModel { } // version containing level data this.version = tutorial.version + console.log('version', this.version) + // set initial position this.position = { levelId: this.version.levels[0].id, @@ -112,7 +118,9 @@ class Tutorial implements TutorialModel { storage.setPosition(this.position), storage.setProgress(this.progress) ]) - // machine.send('TUTORIAL_LOADED') + + console.log('tutorial loaded') + machine.send('TUTORIAL_LOADED') } public async hasExisting(): Promise { diff --git a/web-app/src/App.tsx b/web-app/src/App.tsx index ecae47c7..1c89f534 100644 --- a/web-app/src/App.tsx +++ b/web-app/src/App.tsx @@ -4,6 +4,7 @@ import * as CR from 'typings' import client from './services/apollo' import { SET_STATUS } from './services/apollo/mutations' +import currentTutorial from './services/current' import Debugger from './components/Debugger' import Routes from './Routes' import { send } from './utils/vscode' @@ -39,11 +40,15 @@ const App = () => { } else if (message.type === 'SET_DATA') { // SET_DATA - set state machine context - const { progress, position } = message.payload.data + console.log('DATA') + const { progress, position } = message.payload if (process.env.REACT_APP_DEBUG) { console.log(`Position: ${position.levelId}/${position.stageId}/${position.stepId}`) setDebuggerInfo({ progress, position }) } + console.log('set currentTutorial') + currentTutorial.set({ position }) + console.log('setStatus') setStatus({ variables: { progress, position } }) } } diff --git a/web-app/src/containers/New/TutorialList/index.tsx b/web-app/src/containers/New/TutorialList/index.tsx index b06fff85..896aa365 100644 --- a/web-app/src/containers/New/TutorialList/index.tsx +++ b/web-app/src/containers/New/TutorialList/index.tsx @@ -1,5 +1,6 @@ import * as React from 'react' +import currentTutorial from '../../../services/current' import * as CR from 'typings' import * as T from 'typings/graphql' import TutorialItem from './TutorialItem' @@ -10,25 +11,31 @@ interface Props { } const TutorialList = (props: Props) => { - const onSelect = (tutorial: T.Tutorial) => props.onNew({ - type: 'TUTORIAL_START', - payload: { - id: tutorial.id, - version: tutorial.version, - } - }) + const onSelect = (tutorial: T.Tutorial) => { + currentTutorial.set({ + tutorialId: tutorial.id, + version: tutorial.version.version, + }) + props.onNew({ + type: 'TUTORIAL_START', + payload: { + id: tutorial.id, + version: tutorial.version.version, + } + }) + } return ( -
- {props.tutorialList.map((tutorial: T.Tutorial) => ( - onSelect(tutorial)} - title={tutorial.title || ''} - text={tutorial.text || ''} - /> - ))} -
-) - } +
+ {props.tutorialList.map((tutorial: T.Tutorial) => ( + onSelect(tutorial)} + title={tutorial.title || ''} + text={tutorial.text || ''} + /> + ))} +
+ ) +} export default TutorialList diff --git a/web-app/src/containers/Tutorial/LevelPage/index.tsx b/web-app/src/containers/Tutorial/LevelPage/index.tsx index 4eb5c2e8..bfba1e5c 100644 --- a/web-app/src/containers/Tutorial/LevelPage/index.tsx +++ b/web-app/src/containers/Tutorial/LevelPage/index.tsx @@ -2,6 +2,7 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' import * as T from 'typings/graphql' +import currentTutorial from '../../../services/current' import ErrorView from '../../../components/Error' import Level from './Level' import queryLevel from './queryLevel' @@ -26,11 +27,12 @@ interface ContainerProps { } const LevelSummaryPageContainer = (props: ContainerProps) => { + const { tutorialId, version, position: { levelId } } = currentTutorial.get() const { loading, error, data } = useQuery(queryLevel, { variables: { - tutorialId: '1', - version: '0.1.0', - levelId: '1', + tutorialId, + version, + levelId, }, }) diff --git a/web-app/src/containers/Tutorial/StagePage/index.tsx b/web-app/src/containers/Tutorial/StagePage/index.tsx index 7c9a2fe7..f20dcdc3 100644 --- a/web-app/src/containers/Tutorial/StagePage/index.tsx +++ b/web-app/src/containers/Tutorial/StagePage/index.tsx @@ -1,6 +1,7 @@ import * as React from 'react' import { useQuery } from '@apollo/react-hooks' +import currentTutorial from '../../../services/current' import ErrorView from '../../../components/Error' import Stage from './Stage' import queryStage from './queryStage' @@ -10,11 +11,12 @@ interface PageProps { } const StageSummaryPageContainer = (props: PageProps) => { + const { tutorialId, version, position: { stageId } } = currentTutorial.get() const { loading, error, data } = useQuery(queryStage, { variables: { - tutorialId: '1', - version: '0.1.0', - stageId: '1', + tutorialId, + version, + stageId, }, }) if (loading) { diff --git a/web-app/src/containers/Tutorial/SummaryPage/index.tsx b/web-app/src/containers/Tutorial/SummaryPage/index.tsx index ea229382..c8fce580 100644 --- a/web-app/src/containers/Tutorial/SummaryPage/index.tsx +++ b/web-app/src/containers/Tutorial/SummaryPage/index.tsx @@ -3,6 +3,7 @@ import { useQuery } from '@apollo/react-hooks' import querySummary from './querySummary' import Summary from './Summary' +import currentTutorial from '../../../services/current' import ErrorView from '../../../components/Error' interface PageProps { @@ -10,9 +11,10 @@ interface PageProps { } const SummaryPage = (props: PageProps) => { + const { tutorialId } = currentTutorial.get() const { loading, error, data } = useQuery(querySummary, { variables: { - tutorialId: '1', + tutorialId, }, }) diff --git a/web-app/src/services/current/index.ts b/web-app/src/services/current/index.ts new file mode 100644 index 00000000..9541c202 --- /dev/null +++ b/web-app/src/services/current/index.ts @@ -0,0 +1,38 @@ +import * as CR from 'typings' + +interface CurrentTutorialParams { + tutorialId: string + version: string + position: CR.Position +} + +interface SetCurrentTutorialParams { + tutorialId?: string + version?: string + position?: CR.Position +} + +class CurrentTutorial { + private tutorialId = '' + private version = '' + private position: CR.Position = {levelId: '', stageId: '', stepId: ''} + public set({tutorialId, version, position}: SetCurrentTutorialParams) { + this.tutorialId = tutorialId || this.tutorialId + this.version = version || this.version + this.position = position || this.position + } + public get(): CurrentTutorialParams { + return { + tutorialId: this.tutorialId, + version: this.version, + position: this.position, + } + } + public clear() { + this.tutorialId = '' + this.version = '' + this.position = {levelId: '', stageId: '', stepId: ''} + } +} + +export default new CurrentTutorial()