From 431c407b3098bba067fedc20cf4ca60a32b890ea Mon Sep 17 00:00:00 2001 From: Xiao Gui <xgui3783@gmail.com> Date: Tue, 5 Apr 2022 12:14:22 +0200 Subject: [PATCH] fix: unit tests fix: add stories interactions todo: temporarily disable plugin api tests chore: removed pure constant svc, and reorg constants chore: updated some dep --- .storybook/main.js | 5 +- package-lock.json | 7245 +++++++++++++++-- package.json | 14 +- src/atlasComponents/sapi/sapi.service.ts | 1 - .../parcellation.smartChip.stories.ts | 35 +- .../parcellation.smartChip.template.html | 6 +- .../atlasViewer.apiService.service.spec.ts | 490 +- src/atlasViewer/atlasViewer.component.ts | 17 +- src/auth/auth.service.spec.ts | 19 +- src/auth/auth.service.ts | 5 +- src/main.module.ts | 9 +- src/messaging/service.spec.ts | 3 - .../atlasViewer.pluginService.service.spec.ts | 18 +- .../atlasViewer.pluginService.service.ts | 8 +- .../routeStateTransform.service.spec.ts | 191 + .../routeStateTransform.service.ts | 4 +- src/routerModule/router.service.spec.ts | 342 +- src/routerModule/router.service.ts | 7 +- src/routerModule/util.spec.ts | 159 +- src/state/effects/TODO.md | 3 - .../effects/viewerState.useEffect.spec.ts | 218 - src/state/plugins/effects.spec.ts | 42 +- src/ui/help/about/about.component.ts | 10 +- .../helpOnePager.component.spec.ts | 7 - .../helpOnePager/helpOnePager.component.ts | 12 +- .../logoContainer/logoContainer.component.ts | 10 +- src/util/index.ts | 1 - src/util/pureConstant.service.spec.ts | 85 - src/util/pureConstant.service.ts | 559 -- src/viewerModule/constants.ts | 1 - src/viewerModule/index.ts | 3 +- .../layerCtrl.service.spec.ts | 15 +- .../nehuba/mesh.service/mesh.service.spec.ts | 103 +- .../nehuba/mesh.service/mesh.service.ts | 14 +- .../nehubaViewer.component.spec.ts | 133 +- .../nehubaViewerGlue.component.spec.ts | 88 +- .../nehubaViewerGlue.component.ts | 4 +- .../nehubaViewerInterface.directive.spec.ts | 83 +- .../nehubaViewerInterface.directive.ts | 14 +- .../statusCard/statusCard.component.spec.ts | 59 +- .../nehuba/statusCard/statusCard.component.ts | 19 +- src/viewerModule/nehuba/util.ts | 30 - .../viewerCtrlCmp.component.spec.ts | 43 +- 43 files changed, 7505 insertions(+), 2629 deletions(-) create mode 100644 src/routerModule/routeStateTransform.service.spec.ts delete mode 100644 src/state/effects/TODO.md delete mode 100644 src/state/effects/viewerState.useEffect.spec.ts delete mode 100644 src/util/pureConstant.service.spec.ts delete mode 100644 src/util/pureConstant.service.ts diff --git a/.storybook/main.js b/.storybook/main.js index 73edfadba..e42013844 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -12,5 +12,8 @@ module.exports = { "framework": "@storybook/angular", "core": { "builder": "webpack5" - } + }, + features: { + interactionsDebugger: true, + }, } diff --git a/package-lock.json b/package-lock.json index d084a7ade..909b797f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4628,6 +4628,12 @@ "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", "dev": true }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -5082,6 +5088,16 @@ "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, "@npmcli/git": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", @@ -5195,17 +5211,17 @@ } }, "@storybook/addon-actions": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.19.tgz", - "integrity": "sha512-GpSvP8xV8GfNkmtGJjfCgaOx6mbjtyTK0aT9FqX9pU0s+KVMmoCTrBh43b7dWrwxxas01yleBK9VpYggzhi/Fw==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-6.4.20.tgz", + "integrity": "sha512-5kW4orA6rOHzrDSvGwGL+uevsK9OzJRXq36eje3hCj+E5TGE8hApi+PIIBXI8bIkeJ3zkAS5kjMFdOk+8moT0g==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.20", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", "global": "^4.4.0", @@ -5218,247 +5234,165 @@ "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2", "uuid-browser": "^3.1.0" - } - }, - "@storybook/addon-backgrounds": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.19.tgz", - "integrity": "sha512-yn8MTE7lctO48Rdw+DmmA1wKdf5eyAbA/vrug5ske/U2WPgGc65sApzwT8BItZfuyAMjuT5RnCWwd7o6hGRgGQ==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", - "core-js": "^3.8.2", - "global": "^4.4.0", - "memoizerific": "^1.11.3", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - } - }, - "@storybook/addon-controls": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.4.19.tgz", - "integrity": "sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", - "core-js": "^3.8.2", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-docs": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.19.tgz", - "integrity": "sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==", - "dev": true, - "requires": { - "@babel/core": "^7.12.10", - "@babel/generator": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/plugin-transform-react-jsx": "^7.12.12", - "@babel/preset-env": "^7.12.11", - "@jest/transform": "^26.6.2", - "@mdx-js/loader": "^1.6.22", - "@mdx-js/mdx": "^1.6.22", - "@mdx-js/react": "^1.6.22", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/postinstall": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/source-loader": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "core-js": "^3.8.2", - "doctrine": "^3.0.0", - "escodegen": "^2.0.0", - "fast-deep-equal": "^3.1.3", - "global": "^4.4.0", - "html-tags": "^3.1.0", - "js-string-escape": "^1.0.1", - "loader-utils": "^2.0.0", - "lodash": "^4.17.21", - "nanoid": "^3.1.23", - "p-limit": "^3.1.0", - "prettier": ">=2.2.1 <=2.3.0", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^14.3.4", - "regenerator-runtime": "^0.13.7", - "remark-external-links": "^8.0.0", - "remark-slug": "^6.0.0", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" }, "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", "dev": true, "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "core-js": "^3.8.2" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" } }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", "dev": true, "requires": { - "yocto-queue": "^0.1.0" + "core-js": "^3.6.5", + "find-up": "^4.1.0" } }, - "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 + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "optional": true + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "p-locate": "^4.1.0" } - } - } - }, - "@storybook/addon-essentials": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.4.19.tgz", - "integrity": "sha512-vbV8sjepMVEuwhTDBHjO3E6vXluG7RiEeozV1QVuS9lGhjQdvUPdZ9rDNUcP6WHhTdEkS/ffTMaGIy1v8oZd7g==", - "dev": true, - "requires": { - "@storybook/addon-actions": "6.4.19", - "@storybook/addon-backgrounds": "6.4.19", - "@storybook/addon-controls": "6.4.19", - "@storybook/addon-docs": "6.4.19", - "@storybook/addon-measure": "6.4.19", - "@storybook/addon-outline": "6.4.19", - "@storybook/addon-toolbars": "6.4.19", - "@storybook/addon-viewport": "6.4.19", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/node-logger": "6.4.19", - "core-js": "^3.8.2", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - } - }, - "@storybook/addon-interactions": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-6.4.19.tgz", - "integrity": "sha512-oKXxRkKL2deUI7nOLm9UvihtPaTQ2p8Y5gL2CQvJgHhTpKmUxW+e26GYNlcFUOjsx2ifXyzqNEscsZUP83BCUw==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/instrumenter": "6.4.19", - "@storybook/theming": "6.4.19", - "global": "^4.4.0", - "jest-mock": "^27.0.6", - "polished": "^4.0.5", - "ts-dedent": "^2.2.0" - } - }, - "@storybook/addon-links": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.4.19.tgz", - "integrity": "sha512-ebFHYlGDQkHSmI5QEJb1NxGNToVOLgjKkxXUe+JXX7AfHvrWiXVrN/57aOtBPZzj4h2jRPRTZgwR5glhPIlfEQ==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/router": "6.4.19", - "@types/qs": "^6.9.5", - "core-js": "^3.8.2", - "global": "^4.4.0", - "prop-types": "^15.7.2", - "qs": "^6.10.0", - "regenerator-runtime": "^0.13.7", - "ts-dedent": "^2.0.0" - }, - "dependencies": { + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -5467,74 +5401,3030 @@ "requires": { "side-channel": "^1.0.4" } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, - "@storybook/addon-measure": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.4.19.tgz", - "integrity": "sha512-PXeU0AlpnGEvnzBQ6snkzmlIpwE0ci8LdFtL1Vz1V1Xk5fbuETWYuEkPuk1oZ7L9igB9cfT32SyJlE5MC1iaGg==", + "@storybook/addon-backgrounds": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-6.4.20.tgz", + "integrity": "sha512-7zjCJSrnhq1xtyChpwjtYOdrDKxxD7Rs82qF38p8qMAzSvKBNhm3dK8C+iWHt7pu4+cwMpXou1cvWJJVx+qGvA==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.20", "core-js": "^3.8.2", - "global": "^4.4.0" - } - }, - "@storybook/addon-outline": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.4.19.tgz", - "integrity": "sha512-7ZDXo8qrms6dx0KRP9PInXIie82h5g9XCNrGOUdfZkQPvgofJVj0kNv6p+WOiGiaVfKPC5KMgIofqzBTFV+k6Q==", - "dev": true, - "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@storybook/addon-controls": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-6.4.20.tgz", + "integrity": "sha512-Tqq66SCbi2WIiKrkHu3edtg4r8QIdm/RbNB/PwnFuXwkJVt5mAoV9QQUt1zkbzdknU8xTwwgM4cEEfYLfBVm9Q==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/node-logger": "6.4.20", + "@storybook/store": "6.4.20", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@storybook/addon-docs": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-6.4.20.tgz", + "integrity": "sha512-Rz001irN1TRKLNKVhvNNSGVWRnFHJxOaRHDbY+4dr8kPCLKM+Abd2lGvj1VdxFo6/sB7H01ihc+ofm6fIv4T3w==", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@jest/transform": "^26.6.2", + "@mdx-js/loader": "^1.6.22", + "@mdx-js/mdx": "^1.6.22", + "@mdx-js/react": "^1.6.22", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/builder-webpack4": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/csf-tools": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/postinstall": "6.4.20", + "@storybook/preview-web": "6.4.20", + "@storybook/source-loader": "6.4.20", + "@storybook/store": "6.4.20", + "@storybook/theming": "6.4.20", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "core-js": "^3.8.2", + "doctrine": "^3.0.0", + "escodegen": "^2.0.0", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "html-tags": "^3.1.0", + "js-string-escape": "^1.0.1", + "loader-utils": "^2.0.0", + "lodash": "^4.17.21", + "nanoid": "^3.1.23", + "p-limit": "^3.1.0", + "prettier": ">=2.2.1 <=2.3.0", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^14.3.4", + "regenerator-runtime": "^0.13.7", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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 + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "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" + } + } + } + }, + "@storybook/addon-essentials": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-6.4.20.tgz", + "integrity": "sha512-BiEICsj4uA5S/qUw7cBImiDB7Q0TNBd2PK3HkhRE7WOd4NxxPPzXwpE4FX/kPmejYo+cIzYPSiISevkdN6cCvw==", + "dev": true, + "requires": { + "@storybook/addon-actions": "6.4.20", + "@storybook/addon-backgrounds": "6.4.20", + "@storybook/addon-controls": "6.4.20", + "@storybook/addon-docs": "6.4.20", + "@storybook/addon-measure": "6.4.20", + "@storybook/addon-outline": "6.4.20", + "@storybook/addon-toolbars": "6.4.20", + "@storybook/addon-viewport": "6.4.20", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/node-logger": "6.4.20", + "core-js": "^3.8.2", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@storybook/addon-interactions": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-6.4.20.tgz", + "integrity": "sha512-m+Cw8AYfPb3vgQ93b65fxv0kk8jwtdrxTtJiA3oF9QGt9sjYUazd3JVgtdUsPkD5XLk3CCZ5fh35DOcU+sEh2w==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/instrumenter": "6.4.20", + "@storybook/theming": "6.4.20", + "global": "^4.4.0", + "jest-mock": "^27.0.6", + "polished": "^4.0.5", + "ts-dedent": "^2.2.0" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "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 + } + } + }, + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/components": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.20.tgz", + "integrity": "sha512-5JN1pqpkvFuwZNF8bKr+BHttmoCoIYL7TOB4tCb/O8Puu5IKXa0fuCGMGVwUNhheR3lKVmV3C+FdEdl1Gt3xXQ==", + "dev": true, + "requires": { + "@popperjs/core": "^2.6.0", + "@storybook/client-logger": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.20", + "@types/color-convert": "^2.0.0", + "@types/overlayscrollbars": "^1.12.0", + "@types/react-syntax-highlighter": "11.0.5", + "color-convert": "^2.0.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.3", + "memoizerific": "^1.11.3", + "overlayscrollbars": "^1.13.1", + "polished": "^4.0.5", + "prop-types": "^15.7.2", + "react-colorful": "^5.1.2", + "react-popper-tooltip": "^3.1.1", + "react-syntax-highlighter": "^13.5.3", + "react-textarea-autosize": "^8.3.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/core-common": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.20.tgz", + "integrity": "sha512-+jSPpMwWvoyDufLKhYslF9N2y/5gqbgE/bPnqy6TZhC1ia+Lr5S4uK60zAT1OpB6kgXWDbo203NP148uMxJ3VA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.4.20", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/instrumenter": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-6.4.20.tgz", + "integrity": "sha512-eexBNKG+G1hTdh35VlwaZR/BXg+TCWKfMlydDpJbFdYit+QfmSBNhbCslR2ILoSbdzhmpKfRGSBsGpg3JM/YMw==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "global": "^4.4.0" + } + }, + "@storybook/node-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.20.tgz", + "integrity": "sha512-8E34tK4NPkXn+Ga20d5Oba0mVem9w60B2bBQk66TMGXJdZnAqO9xrBlVYEQkeb58g4Mb2WVBFTY6fsDVHwzZyw==", + "dev": true, + "requires": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.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" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "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.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "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-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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" + } + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "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" + } + }, + "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": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + } + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "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" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.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==", + "dev": true + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.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" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@storybook/addon-links": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-6.4.20.tgz", + "integrity": "sha512-TyRuEd/3yRn2N9xasCKuE2bsY0dTRjAquGeg5WEtvHvr8V6QBLYAC4caXwPxIHSTcRQyO5IYYiVzEJ/+219neA==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@types/qs": "^6.9.5", + "core-js": "^3.8.2", + "global": "^4.4.0", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@storybook/addon-measure": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-6.4.20.tgz", + "integrity": "sha512-Tt2kwXa8OXqJ3cFO2xZKMJSpaoMTM1JuhlOitpHy1tXvuRxmUuJJhohAFubnrS/p0JhIV7AD5G4cJcS0qPteQA==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@storybook/addon-outline": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-6.4.20.tgz", + "integrity": "sha512-c/wcoBPySUyjjNP6seaAPbUyGn2oGSLGa6cujbV7yoC3726VM5M15b0ZtWDDJTelO8Hx4D2sPvCAGUl7qvShjg==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "global": "^4.4.0", "regenerator-runtime": "^0.13.7", "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@storybook/addon-toolbars": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.4.19.tgz", - "integrity": "sha512-2UtuX9yB1rD/CAZv1etnOnunfPTvsEKEg/J2HYMKE1lhenWC5muIUXvDXCXvwDC65WviPJ56nFNKaKK1Zz7JDg==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-6.4.20.tgz", + "integrity": "sha512-oEZT57uqKrZTqBuxyNKx23ZhWVm4ZQHIzG7BdFI9uTeNV+kDgx07cLH5YAoZSzWcdUfgImdsJLN2YfOeLfmfww==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/theming": "6.4.20", "core-js": "^3.8.2", "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@storybook/addon-viewport": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.4.19.tgz", - "integrity": "sha512-T1hdImxbLj8suQSTbp6HSA1LLHOlqaNK5jjnqzEOoAxY0O8LNPXMJ2jKIeT2fPQ0v+tWGU3tbwf+3xFq0parVQ==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-6.4.20.tgz", + "integrity": "sha512-iDeIg+QX6doDR5rzaxPzG3tEnSD+UWVrcY8euHPLBjrsJkiTMaAf4M86sQjEBhY8xEZ+f//QBt8nT4tqBbR9zA==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/theming": "6.4.20", "core-js": "^3.8.2", "global": "^4.4.0", "memoizerific": "^1.11.3", "prop-types": "^15.7.2", "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@storybook/addons": { @@ -5557,20 +8447,20 @@ } }, "@storybook/angular": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-6.4.19.tgz", - "integrity": "sha512-CyJg9reKbk69gkYK1QJhzPydVMeelJ1Fj2VvK5qKL6xEwHSj9buYmbS631i8AC0c9vIWv5lk2BENCLyGqdPYwQ==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-6.4.20.tgz", + "integrity": "sha512-ihKjiA4w1Ar3/SjFFCTgVw4lcoz/8ALlOMiTK3KHqi1cyWqifuyZpT5i4+Mq67wJNrELFfSoQt5ygSWk3GzxLA==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/core": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/core": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/node-logger": "6.4.19", + "@storybook/node-logger": "6.4.20", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.20", "@types/webpack-env": "^1.16.0", "autoprefixer": "^9.8.6", "core-js": "^3.8.2", @@ -5594,6 +8484,588 @@ "webpack": "4" }, "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", + "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "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 + } + } + }, + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/builder-webpack4": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.20.tgz", + "integrity": "sha512-Lekx2T0P5tLD0Xd2+6t2dicbZ2oTX/lW1bc+Uxz6QROLqh4/H84CTyofVLJYmZUtgnLQee/cqz5JVkpoA72ebA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/preview-web": "6.4.20", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.4.20", + "@storybook/theming": "6.4.20", + "@storybook/ui": "6.4.20", + "@types/node": "^14.0.10", + "@types/webpack": "^4.41.26", + "autoprefixer": "^9.8.6", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "file-loader": "^6.2.0", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^4.1.6", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "global": "^4.4.0", + "html-webpack-plugin": "^4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "^7.0.36", + "postcss-flexbugs-fixes": "^4.2.1", + "postcss-loader": "^4.2.0", + "raw-loader": "^4.0.2", + "stable": "^0.1.8", + "style-loader": "^1.3.0", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-filter-warnings-plugin": "^1.2.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.2.2" + } + }, + "@storybook/channel-postmessage": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.20.tgz", + "integrity": "sha512-rKgQZ74WZhcpQY8I9SyMMADWbQ2GQopfzvE35qYJl/7mpEggXjY2nSP6PdQ7uIZzUSiwZFQ3tesCT5frEjF/DA==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "core-js": "^3.8.2", + "global": "^4.4.0", + "qs": "^6.10.0", + "telejson": "^5.3.2" + } + }, + "@storybook/channel-websocket": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.20.tgz", + "integrity": "sha512-PYQAX53oTaY2zmHzd+GuDjRVDg34Z9Igo648qmBmpbUypWj54QmHeAcLMN8/RZpcsmjtj/gGkS8TwHGew4soZA==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "global": "^4.4.0", + "telejson": "^5.3.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.20.tgz", + "integrity": "sha512-+AKAj+HoW2PVB58bDON+K484CHuywZegKMztoOzOltGP6c02gSf3Y/tiHg2ybRnq2qGNrypGgMKrX401yMEBmg==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/store": "6.4.20", + "@types/qs": "^6.9.5", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/components": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.20.tgz", + "integrity": "sha512-5JN1pqpkvFuwZNF8bKr+BHttmoCoIYL7TOB4tCb/O8Puu5IKXa0fuCGMGVwUNhheR3lKVmV3C+FdEdl1Gt3xXQ==", + "dev": true, + "requires": { + "@popperjs/core": "^2.6.0", + "@storybook/client-logger": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.20", + "@types/color-convert": "^2.0.0", + "@types/overlayscrollbars": "^1.12.0", + "@types/react-syntax-highlighter": "11.0.5", + "color-convert": "^2.0.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.3", + "memoizerific": "^1.11.3", + "overlayscrollbars": "^1.13.1", + "polished": "^4.0.5", + "prop-types": "^15.7.2", + "react-colorful": "^5.1.2", + "react-popper-tooltip": "^3.1.1", + "react-syntax-highlighter": "^13.5.3", + "react-textarea-autosize": "^8.3.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/core": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.20.tgz", + "integrity": "sha512-CQ3aaTHoHVV9BRUjqdr33cKv+/q1DMWBrtvEuZpW6gKq/CUuDXLQrAUARD18H/I5BlIJGbP5ccwkZNiY34QWKg==", + "dev": true, + "requires": { + "@storybook/core-client": "6.4.20", + "@storybook/core-server": "6.4.20" + } + }, + "@storybook/core-client": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.20.tgz", + "integrity": "sha512-pDaCGMdGD4OmC+YzghTXd86SLHfnX+/3lqprVtWSUzV2SbpCrdr0ySa01jbRmDaZIdA3YXxt+vW0VrMWnQ+20A==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channel-websocket": "6.4.20", + "@storybook/client-api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/preview-web": "6.4.20", + "@storybook/store": "6.4.20", + "@storybook/ui": "6.4.20", + "airbnb-js-shims": "^2.2.1", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/core-common": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.20.tgz", + "integrity": "sha512-+jSPpMwWvoyDufLKhYslF9N2y/5gqbgE/bPnqy6TZhC1ia+Lr5S4uK60zAT1OpB6kgXWDbo203NP148uMxJ3VA==", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-decorators": "^7.12.12", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.12", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/register": "^7.12.1", + "@storybook/node-logger": "6.4.20", + "@storybook/semver": "^7.3.2", + "@types/node": "^14.0.10", + "@types/pretty-hrtime": "^1.0.0", + "babel-loader": "^8.0.0", + "babel-plugin-macros": "^3.0.1", + "babel-plugin-polyfill-corejs3": "^0.1.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.0.4", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "handlebars": "^4.7.7", + "interpret": "^2.2.0", + "json5": "^2.1.3", + "lazy-universal-dotenv": "^3.0.1", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "webpack": "4" + }, + "dependencies": { + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", + "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } + } + } + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/core-server": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.20.tgz", + "integrity": "sha512-AqpTjZE3/23IdDN5i6Srky3zdapQKSnHqlibl1mppRscf1IZe6OJJWtCHACpJKJwnOpPV/WxL8oron4mUjvrbA==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-webpack4": "6.4.20", + "@storybook/core-client": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/csf-tools": "6.4.20", + "@storybook/manager-webpack4": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/store": "6.4.20", + "@types/node": "^14.0.10", + "@types/node-fetch": "^2.5.7", + "@types/pretty-hrtime": "^1.0.0", + "@types/webpack": "^4.41.26", + "better-opn": "^2.1.1", + "boxen": "^5.1.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "commander": "^6.2.1", + "compression": "^1.7.4", + "core-js": "^3.8.2", + "cpy": "^8.1.2", + "detect-port": "^1.3.0", + "express": "^4.17.1", + "file-system-cache": "^1.0.5", + "fs-extra": "^9.0.1", + "globby": "^11.0.2", + "ip": "^1.1.5", + "lodash": "^4.17.21", + "node-fetch": "^2.6.1", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "regenerator-runtime": "^0.13.7", + "serve-favicon": "^2.5.0", + "slash": "^3.0.0", + "telejson": "^5.3.3", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "webpack": "4", + "ws": "^8.2.3" + } + }, + "@storybook/csf-tools": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.20.tgz", + "integrity": "sha512-RM/VN7Tt6FVSlDwAEe6fHCJuv3coeupnqhq+K7tjomTCrcoa1Lk6RX9H0Qk50uSoQZCOgRBjL682yBs27VzUbw==", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/generator": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/plugin-transform-react-jsx": "^7.12.12", + "@babel/preset-env": "^7.12.11", + "@babel/traverse": "^7.12.11", + "@babel/types": "^7.12.11", + "@mdx-js/mdx": "^1.6.22", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "core-js": "^3.8.2", + "fs-extra": "^9.0.1", + "global": "^4.4.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.21", + "prettier": ">=2.2.1 <=2.3.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/manager-webpack4": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.20.tgz", + "integrity": "sha512-4Q9ZJNT64Omn0shD8JfXi1yccjQVWruBxKoELbn4zLOUtmb5/ETmBHkek/nBnLo7i5J6ZkyB66L9qokfC/WsxQ==", + "dev": true, + "requires": { + "@babel/core": "^7.12.10", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/preset-react": "^7.12.10", + "@storybook/addons": "6.4.20", + "@storybook/core-client": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/theming": "6.4.20", + "@storybook/ui": "6.4.20", + "@types/node": "^14.0.10", + "@types/webpack": "^4.41.26", + "babel-loader": "^8.0.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "css-loader": "^3.6.0", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "file-system-cache": "^1.0.5", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", + "html-webpack-plugin": "^4.0.0", + "node-fetch": "^2.6.1", + "pnp-webpack-plugin": "1.6.4", + "read-pkg-up": "^7.0.1", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0", + "style-loader": "^1.3.0", + "telejson": "^5.3.2", + "terser-webpack-plugin": "^4.2.3", + "ts-dedent": "^2.0.0", + "url-loader": "^4.1.1", + "util-deprecate": "^1.0.2", + "webpack": "4", + "webpack-dev-middleware": "^3.7.3", + "webpack-virtual-modules": "^0.2.2" + } + }, + "@storybook/node-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.20.tgz", + "integrity": "sha512-8E34tK4NPkXn+Ga20d5Oba0mVem9w60B2bBQk66TMGXJdZnAqO9xrBlVYEQkeb58g4Mb2WVBFTY6fsDVHwzZyw==", + "dev": true, + "requires": { + "@types/npmlog": "^4.1.2", + "chalk": "^4.1.0", + "core-js": "^3.8.2", + "npmlog": "^5.0.1", + "pretty-hrtime": "^1.0.3" + } + }, + "@storybook/preview-web": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.20.tgz", + "integrity": "sha512-rn06XQRLdlwGtmbqTRRq6fEWaNruxA2pQzdOqBSww30u6PMV8IE7RiAHYDbGwJOk5DatliU+16duRNVR4QoHcw==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/store": "6.4.20", + "ansi-to-html": "^0.6.11", + "core-js": "^3.8.2", + "global": "^4.4.0", + "lodash": "^4.17.21", + "qs": "^6.10.0", + "regenerator-runtime": "^0.13.7", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "unfetch": "^4.2.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, "@storybook/semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", @@ -5616,6 +9088,91 @@ } } }, + "@storybook/store": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.20.tgz", + "integrity": "sha512-TXrjlBnXgarqZ+Z8Apg8UVkHbKHRkBJmsrlTRucwf8N9mE6EQxRfpqvghcQW3yj2NR1QFdtn13WKF+ZBeHAqgQ==", + "dev": true, + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "slash": "^3.0.0", + "stable": "^0.1.8", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/ui": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.20.tgz", + "integrity": "sha512-QY077l+S79RtdIdBahF2zu1lKqGlBqHeyB3k4W2nCUKJpqmFyzEV6SihkOZyKKe6dX0xDLQvOHIgsSK9+rACfg==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "copy-to-clipboard": "^3.3.1", + "core-js": "^3.8.2", + "core-js-pure": "^3.8.2", + "downshift": "^6.0.15", + "emotion-theming": "^10.0.27", + "fuse.js": "^3.6.1", + "global": "^4.4.0", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.3", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "qs": "^6.10.0", + "react-draggable": "^4.4.3", + "react-helmet-async": "^1.0.7", + "react-sizeme": "^3.0.1", + "regenerator-runtime": "^0.13.7", + "resolve-from": "^5.0.0", + "store2": "^2.12.0" + } + }, + "@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -5753,6 +9310,41 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", + "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.1.5", + "core-js-compat": "^3.8.1" + } + }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", @@ -5805,18 +9397,72 @@ "y18n": "^4.0.0" } }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.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 + } + } + }, "enhanced-resolve": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", @@ -5837,6 +9483,21 @@ "errno": "^0.1.3", "readable-stream": "^2.0.1" } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } } } }, @@ -5882,6 +9543,51 @@ "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "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" + } + } } }, "find-up": { @@ -5923,27 +9629,121 @@ } } }, - "fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "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==", - "dev": true - } + "postcss": "^7.0.14" } }, "is-number": { @@ -5972,13 +9772,15 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" } }, "loader-runner": { @@ -5987,6 +9789,28 @@ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -6044,13 +9868,31 @@ "to-regex": "^3.0.2" } }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, "p-locate": { @@ -6075,48 +9917,12 @@ "dev": true }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } + "find-up": "^5.0.0" } }, "postcss": { @@ -6140,8 +9946,99 @@ "loader-utils": "^2.0.0", "schema-utils": "^3.0.0", "semver": "^7.3.4" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -6151,17 +10048,52 @@ "glob": "^7.1.3" } }, - "sass-loader": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.1.tgz", - "integrity": "sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA==", + "sass-loader": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.1.tgz", + "integrity": "sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" } }, "serialize-javascript": { @@ -6188,6 +10120,47 @@ "figgy-pudding": "^3.5.1" } }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "style-loader": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", + "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", @@ -6203,35 +10176,219 @@ "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" }, "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "terser": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, @@ -6245,18 +10402,6 @@ "repeat-string": "^1.6.1" } }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, "webpack": { "version": "4.46.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", @@ -6288,17 +10433,6 @@ "webpack-sources": "^1.4.1" }, "dependencies": { - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -6309,9 +10443,57 @@ "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } } } }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -6392,9 +10574,9 @@ } }, "@storybook/builder-webpack4": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.19.tgz", - "integrity": "sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack4/-/builder-webpack4-6.4.20.tgz", + "integrity": "sha512-Lekx2T0P5tLD0Xd2+6t2dicbZ2oTX/lW1bc+Uxz6QROLqh4/H84CTyofVLJYmZUtgnLQee/cqz5JVkpoA72ebA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -6418,22 +10600,22 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/preview-web": "6.4.20", + "@storybook/router": "6.4.20", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/store": "6.4.20", + "@storybook/theming": "6.4.20", + "@storybook/ui": "6.4.20", "@types/node": "^14.0.10", "@types/webpack": "^4.41.26", "autoprefixer": "^9.8.6", @@ -6492,6 +10674,99 @@ } } }, + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, "@storybook/semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", @@ -6514,6 +10789,26 @@ } } }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "@types/node": { "version": "14.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", @@ -6997,12 +11292,12 @@ "dev": true }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "p-locate": { @@ -7095,13 +11390,10 @@ }, "dependencies": { "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "loader-utils": { "version": "2.0.2", @@ -7168,6 +11460,21 @@ "postcss": "^7.0.6" } }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -7223,13 +11530,10 @@ }, "dependencies": { "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "loader-utils": { "version": "2.0.2", @@ -7457,9 +11761,9 @@ } }, "@storybook/builder-webpack5": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.4.19.tgz", - "integrity": "sha512-AWM4YMN1gPaf7jfntqZTCGpIQ1tF6YRU1JtczPG4ox28rTaO6NMfOBi9aRhBre/59pPOh9bF6u2gu/MIHmRW+w==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-6.4.20.tgz", + "integrity": "sha512-VFhXNYfveUjsDlVdtPIq2heqmG2ISES/idg/2o29yK4BvqNLA7ojYttJJl1XKiW5QDwG4WdL/fM8BYMwfN5+zg==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -7482,21 +11786,21 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/preview-web": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/preview-web": "6.4.20", + "@storybook/router": "6.4.20", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", - "@storybook/theming": "6.4.19", + "@storybook/store": "6.4.20", + "@storybook/theming": "6.4.20", "@types/node": "^14.0.10", "babel-loader": "^8.0.0", "babel-plugin-macros": "^3.0.1", @@ -7545,6 +11849,99 @@ } } }, + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, "@storybook/semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", @@ -7555,6 +11952,26 @@ "find-up": "^4.1.0" } }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -7595,9 +12012,9 @@ } }, "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -7699,6 +12116,15 @@ "renderkid": "^3.0.0" } }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -7712,6 +12138,12 @@ "strip-ansi": "^6.0.1" } }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7748,9 +12180,9 @@ } }, "terser": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", - "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { "acorn": "^8.5.0", @@ -7796,20 +12228,50 @@ } }, "@storybook/channel-postmessage": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.19.tgz", - "integrity": "sha512-E5h/itFzQ/6M08LR4kqlgqqmeO3tmavI+nUAlZrkCrotpJFNMHE2i0PQHg0TkFJrRDpYcrwD+AjUW4IwdqrisQ==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.4.20.tgz", + "integrity": "sha512-rKgQZ74WZhcpQY8I9SyMMADWbQ2GQopfzvE35qYJl/7mpEggXjY2nSP6PdQ7uIZzUSiwZFQ3tesCT5frEjF/DA==", "dev": true, "requires": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", "core-js": "^3.8.2", "global": "^4.4.0", "qs": "^6.10.0", "telejson": "^5.3.2" }, "dependencies": { + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -7822,16 +12284,39 @@ } }, "@storybook/channel-websocket": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.19.tgz", - "integrity": "sha512-cXKwQjIXttfdUyZlcHORelUmJ5nUKswsnCA/qy7IRWpZjD8yQJcNk1dYC+tTHDVqFgdRT89pL0hRRB1rlaaR8Q==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-6.4.20.tgz", + "integrity": "sha512-PYQAX53oTaY2zmHzd+GuDjRVDg34Z9Igo648qmBmpbUypWj54QmHeAcLMN8/RZpcsmjtj/gGkS8TwHGew4soZA==", "dev": true, "requires": { - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", "core-js": "^3.8.2", "global": "^4.4.0", "telejson": "^5.3.2" + }, + "dependencies": { + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + } } }, "@storybook/channels": { @@ -7846,18 +12331,18 @@ } }, "@storybook/client-api": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.19.tgz", - "integrity": "sha512-OCrT5Um3FDvZnimQKwWtwsaI+5agPwq2i8YiqlofrI/NPMKp0I7DEkCGwE5IRD1Q8BIKqHcMo5tTmfYi0AxyOg==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-6.4.20.tgz", + "integrity": "sha512-+AKAj+HoW2PVB58bDON+K484CHuywZegKMztoOzOltGP6c02gSf3Y/tiHg2ybRnq2qGNrypGgMKrX401yMEBmg==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.20", "@types/qs": "^6.9.5", "@types/webpack-env": "^1.16.0", "core-js": "^3.8.2", @@ -7873,6 +12358,163 @@ "util-deprecate": "^1.0.2" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -7881,6 +12523,12 @@ "requires": { "side-channel": "^1.0.4" } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, @@ -7895,15 +12543,15 @@ } }, "@storybook/components": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.19.tgz", - "integrity": "sha512-q/0V37YAJA7CNc+wSiiefeM9+3XVk8ixBNylY36QCGJgIeGQ5/79vPyUe6K4lLmsQwpmZsIq1s1Ad5+VbboeOA==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.20.tgz", + "integrity": "sha512-5JN1pqpkvFuwZNF8bKr+BHttmoCoIYL7TOB4tCb/O8Puu5IKXa0fuCGMGVwUNhheR3lKVmV3C+FdEdl1Gt3xXQ==", "dev": true, "requires": { "@popperjs/core": "^2.6.0", - "@storybook/client-logger": "6.4.19", + "@storybook/client-logger": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.20", "@types/color-convert": "^2.0.0", "@types/overlayscrollbars": "^1.12.0", "@types/react-syntax-highlighter": "11.0.5", @@ -7926,6 +12574,36 @@ "util-deprecate": "^1.0.2" }, "dependencies": { + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7940,35 +12618,41 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, "@storybook/core": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.19.tgz", - "integrity": "sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-6.4.20.tgz", + "integrity": "sha512-CQ3aaTHoHVV9BRUjqdr33cKv+/q1DMWBrtvEuZpW6gKq/CUuDXLQrAUARD18H/I5BlIJGbP5ccwkZNiY34QWKg==", "dev": true, "requires": { - "@storybook/core-client": "6.4.19", - "@storybook/core-server": "6.4.19" + "@storybook/core-client": "6.4.20", + "@storybook/core-server": "6.4.20" } }, "@storybook/core-client": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.19.tgz", - "integrity": "sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-6.4.20.tgz", + "integrity": "sha512-pDaCGMdGD4OmC+YzghTXd86SLHfnX+/3lqprVtWSUzV2SbpCrdr0ySa01jbRmDaZIdA3YXxt+vW0VrMWnQ+20A==", "dev": true, - "requires": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/channel-websocket": "6.4.19", - "@storybook/client-api": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "requires": { + "@storybook/addons": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/channel-websocket": "6.4.20", + "@storybook/client-api": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/preview-web": "6.4.19", - "@storybook/store": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/preview-web": "6.4.20", + "@storybook/store": "6.4.20", + "@storybook/ui": "6.4.20", "airbnb-js-shims": "^2.2.1", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", @@ -7981,6 +12665,163 @@ "util-deprecate": "^1.0.2" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -7989,13 +12830,19 @@ "requires": { "side-channel": "^1.0.4" } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, "@storybook/core-common": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.19.tgz", - "integrity": "sha512-X1pJJkO48DFxl6iyEemIKqRkJ7j9/cBh3BRBUr+xZHXBvnD0GKDXIocwh0PjSxSC6XSu3UCQnqtKi3PbjRl8Dg==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-6.4.20.tgz", + "integrity": "sha512-+jSPpMwWvoyDufLKhYslF9N2y/5gqbgE/bPnqy6TZhC1ia+Lr5S4uK60zAT1OpB6kgXWDbo203NP148uMxJ3VA==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -8019,7 +12866,7 @@ "@babel/preset-react": "^7.12.10", "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.1", - "@storybook/node-logger": "6.4.19", + "@storybook/node-logger": "6.4.20", "@storybook/semver": "^7.3.2", "@types/node": "^14.0.10", "@types/pretty-hrtime": "^1.0.0", @@ -8552,16 +13399,6 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -8648,12 +13485,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "p-locate": { @@ -8783,12 +13620,6 @@ "repeat-string": "^1.6.1" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -8850,22 +13681,22 @@ } }, "@storybook/core-server": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.19.tgz", - "integrity": "sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-6.4.20.tgz", + "integrity": "sha512-AqpTjZE3/23IdDN5i6Srky3zdapQKSnHqlibl1mppRscf1IZe6OJJWtCHACpJKJwnOpPV/WxL8oron4mUjvrbA==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-webpack4": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/builder-webpack4": "6.4.20", + "@storybook/core-client": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/csf-tools": "6.4.19", - "@storybook/manager-webpack4": "6.4.19", - "@storybook/node-logger": "6.4.19", + "@storybook/csf-tools": "6.4.20", + "@storybook/manager-webpack4": "6.4.20", + "@storybook/node-logger": "6.4.20", "@storybook/semver": "^7.3.2", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.20", "@types/node": "^14.0.10", "@types/node-fetch": "^2.5.7", "@types/pretty-hrtime": "^1.0.0", @@ -8899,6 +13730,15 @@ "ws": "^8.2.3" }, "dependencies": { + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, "@storybook/semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", @@ -9280,16 +14120,6 @@ "minimist": "^1.2.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -9365,12 +14195,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, "p-locate": { @@ -9538,12 +14368,6 @@ "repeat-string": "^1.6.1" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, "webpack": { "version": "4.46.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", @@ -9613,9 +14437,9 @@ } }, "@storybook/csf-tools": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.19.tgz", - "integrity": "sha512-gf/zRhGoAVsFwSyV2tc+jeJfZQkxF6QsaZgbUSe24/IUvGFCT/PS/jZq1qy7dECAwrTOfykgu8juyBtj6WhWyw==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-6.4.20.tgz", + "integrity": "sha512-RM/VN7Tt6FVSlDwAEe6fHCJuv3coeupnqhq+K7tjomTCrcoa1Lk6RX9H0Qk50uSoQZCOgRBjL682yBs27VzUbw==", "dev": true, "requires": { "@babel/core": "^7.12.10", @@ -9648,22 +14472,6 @@ "jsonfile": "^6.0.1", "universalify": "^2.0.0" } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true } } }, @@ -9680,20 +14488,20 @@ } }, "@storybook/manager-webpack4": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.19.tgz", - "integrity": "sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack4/-/manager-webpack4-6.4.20.tgz", + "integrity": "sha512-4Q9ZJNT64Omn0shD8JfXi1yccjQVWruBxKoELbn4zLOUtmb5/ETmBHkek/nBnLo7i5J6ZkyB66L9qokfC/WsxQ==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/core-client": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/theming": "6.4.20", + "@storybook/ui": "6.4.20", "@types/node": "^14.0.10", "@types/webpack": "^4.41.26", "babel-loader": "^8.0.0", @@ -9723,6 +14531,141 @@ "webpack-virtual-modules": "^0.2.2" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + } + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "@types/node": { "version": "14.18.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", @@ -9960,6 +14903,14 @@ "postcss-value-parser": "^4.1.0", "schema-utils": "^2.7.0", "semver": "^6.3.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 + } } }, "enhanced-resolve": { @@ -10026,6 +14977,35 @@ "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } } }, "fs-extra": { @@ -10101,16 +15081,6 @@ "minimist": "^1.2.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -10129,12 +15099,12 @@ } }, "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" } }, "lru-cache": { @@ -10188,34 +15158,25 @@ "mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "yocto-queue": "^0.1.0" + "minimist": "^1.2.6" } }, "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" } }, "path-exists": { @@ -10258,15 +15219,6 @@ "path-exists": "^3.0.0" } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -10335,6 +15287,15 @@ "postcss": "^7.0.6" } }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -10361,12 +15322,6 @@ "ajv-keywords": "^3.5.2" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "serialize-javascript": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", @@ -10402,13 +15357,10 @@ }, "dependencies": { "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "loader-utils": { "version": "2.0.2", @@ -10455,6 +15407,15 @@ "webpack-sources": "^1.4.3" }, "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -10478,12 +15439,6 @@ "repeat-string": "^1.6.1" } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -10633,20 +15588,20 @@ } }, "@storybook/manager-webpack5": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.4.19.tgz", - "integrity": "sha512-hVjWhWAOgWaymBy0HeRskN+MfKLpqLP4Txfw+3Xqg1qplgexV0w2O4BQrS/SNEH4V/1qF9h8XTsk3L3oQIj3Mg==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/manager-webpack5/-/manager-webpack5-6.4.20.tgz", + "integrity": "sha512-I6oviMt5eqBrDPgQ/AcJ6G3/oqBENnZnBIh0X1SP5EtxHy9pEPJcUbfp2NdoeQDN8MAJcGQFbus0CzP2B+bg/A==", "dev": true, "requires": { "@babel/core": "^7.12.10", "@babel/plugin-transform-template-literals": "^7.12.1", "@babel/preset-react": "^7.12.10", - "@storybook/addons": "6.4.19", - "@storybook/core-client": "6.4.19", - "@storybook/core-common": "6.4.19", - "@storybook/node-logger": "6.4.19", - "@storybook/theming": "6.4.19", - "@storybook/ui": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/core-client": "6.4.20", + "@storybook/core-common": "6.4.20", + "@storybook/node-logger": "6.4.20", + "@storybook/theming": "6.4.20", + "@storybook/ui": "6.4.20", "@types/node": "^14.0.10", "babel-loader": "^8.0.0", "case-sensitive-paths-webpack-plugin": "^2.3.0", @@ -10673,6 +15628,141 @@ "webpack-virtual-modules": "^0.4.1" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + } + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -10711,9 +15801,9 @@ } }, "clean-css": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", - "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -10766,6 +15856,35 @@ "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } } }, "fs-extra": { @@ -10814,41 +15933,22 @@ "tapable": "^2.0.0" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "yocto-queue": "^0.1.0" + "p-locate": "^4.1.0" } }, "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" } }, "path-exists": { @@ -10867,6 +15967,15 @@ "renderkid": "^3.0.0" } }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -10931,9 +16040,9 @@ } }, "terser": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", - "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { "acorn": "^8.5.0", @@ -10956,12 +16065,6 @@ } } }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, "webpack-dev-middleware": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.3.0.tgz", @@ -10985,9 +16088,9 @@ } }, "@storybook/node-logger": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.19.tgz", - "integrity": "sha512-hO2Aar3PgPnPtNq2fVgiuGlqo3EEVR6TKVBXMq7foL3tN2k4BQFKLDHbm5qZQQntyYKurKsRUGKPJFPuI1ov/w==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-6.4.20.tgz", + "integrity": "sha512-8E34tK4NPkXn+Ga20d5Oba0mVem9w60B2bBQk66TMGXJdZnAqO9xrBlVYEQkeb58g4Mb2WVBFTY6fsDVHwzZyw==", "dev": true, "requires": { "@types/npmlog": "^4.1.2", @@ -11047,12 +16150,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "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==", - "dev": true - }, "gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -11076,12 +16173,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "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==", - "dev": true - }, "npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -11105,17 +16196,6 @@ "util-deprecate": "^1.0.1" } }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -11137,26 +16217,26 @@ } }, "@storybook/postinstall": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.4.19.tgz", - "integrity": "sha512-/0tHHxyIV82zt1rw4BW70GmrQbDVu9IJPAxOqFzGjC1fNojwJ53mK6FfUsOzbhG5mWk5p0Ip5+zr74moP119AA==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-6.4.20.tgz", + "integrity": "sha512-BcDNLfW5F265VMntFfLzBnlOf/EYRWwM8puoQgjZGCHCEErJZ89BvWx/lOGY/t3yc5Go0QXp86Ybq30kNFHGwg==", "dev": true, "requires": { "core-js": "^3.8.2" } }, "@storybook/preview-web": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.19.tgz", - "integrity": "sha512-jqltoBv5j7lvnxEfV9w8dLX9ASWGuvgz97yg8Yo5FqkftEwrHJenyvMGcTgDJKJPorF+wiz/9aIqnmd3LCAcZQ==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/preview-web/-/preview-web-6.4.20.tgz", + "integrity": "sha512-rn06XQRLdlwGtmbqTRRq6fEWaNruxA2pQzdOqBSww30u6PMV8IE7RiAHYDbGwJOk5DatliU+16duRNVR4QoHcw==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/channel-postmessage": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/channel-postmessage": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", - "@storybook/store": "6.4.19", + "@storybook/store": "6.4.20", "ansi-to-html": "^0.6.11", "core-js": "^3.8.2", "global": "^4.4.0", @@ -11169,6 +16249,163 @@ "util-deprecate": "^1.0.2" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", @@ -11177,6 +16414,12 @@ "requires": { "side-channel": "^1.0.4" } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, @@ -11211,13 +16454,13 @@ } }, "@storybook/source-loader": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.4.19.tgz", - "integrity": "sha512-XqTsqddRglvfW7mhyjwoqd/B8L6samcBehhO0OEbsFp6FPWa9eXuObCxtRYIcjcSIe+ksbW3D/54ppEs1L/g1Q==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-6.4.20.tgz", + "integrity": "sha512-mBnfZrwCBxMFdAI5NSs+oxQKLIv4IOM2U3V5n/4NjPvVDmfPt5ozQ/v/1yyVFsuneAXw6xfpS24cI4M9GenUgQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/client-logger": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "estraverse": "^5.2.0", @@ -11228,23 +16471,195 @@ "regenerator-runtime": "^0.13.7" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, "@storybook/store": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.19.tgz", - "integrity": "sha512-N9/ZjemRHGfT3InPIbqQqc6snkcfnf3Qh9oOr0smbfaVGJol//KOX65kzzobtzFcid0WxtTDZ3HmgFVH+GvuhQ==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/store/-/store-6.4.20.tgz", + "integrity": "sha512-TXrjlBnXgarqZ+Z8Apg8UVkHbKHRkBJmsrlTRucwf8N9mE6EQxRfpqvghcQW3yj2NR1QFdtn13WKF+ZBeHAqgQ==", "dev": true, "requires": { - "@storybook/addons": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/core-events": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", "@storybook/csf": "0.0.2--canary.87bc651.0", "core-js": "^3.8.2", "fast-deep-equal": "^3.1.3", @@ -11257,6 +16672,180 @@ "synchronous-promise": "^2.0.15", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" + }, + "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + } + }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "@storybook/testing-library": { @@ -11301,21 +16890,21 @@ } }, "@storybook/ui": { - "version": "6.4.19", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.19.tgz", - "integrity": "sha512-gFwdn5LA2U6oQ4bfUFLyHZnNasGQ01YVdwjbi+l6yjmnckBNtZfJoVTZ1rzGUbxSE9rK48InJRU+latTsr7xAg==", + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-6.4.20.tgz", + "integrity": "sha512-QY077l+S79RtdIdBahF2zu1lKqGlBqHeyB3k4W2nCUKJpqmFyzEV6SihkOZyKKe6dX0xDLQvOHIgsSK9+rACfg==", "dev": true, "requires": { "@emotion/core": "^10.1.1", - "@storybook/addons": "6.4.19", - "@storybook/api": "6.4.19", - "@storybook/channels": "6.4.19", - "@storybook/client-logger": "6.4.19", - "@storybook/components": "6.4.19", - "@storybook/core-events": "6.4.19", - "@storybook/router": "6.4.19", + "@storybook/addons": "6.4.20", + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/components": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/router": "6.4.20", "@storybook/semver": "^7.3.2", - "@storybook/theming": "6.4.19", + "@storybook/theming": "6.4.20", "copy-to-clipboard": "^3.3.1", "core-js": "^3.8.2", "core-js-pure": "^3.8.2", @@ -11336,6 +16925,99 @@ "store2": "^2.12.0" }, "dependencies": { + "@storybook/addons": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.20.tgz", + "integrity": "sha512-NbsLjDSkE9v2fOr0M7r2hpdYnlYs789ALkXemdTz2y0NUYSPdRfzVVQNXWrgmXivWQRL0aJ3bOjCOc668PPYjg==", + "dev": true, + "requires": { + "@storybook/api": "6.4.20", + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/theming": "6.4.20", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + } + }, + "@storybook/api": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.20.tgz", + "integrity": "sha512-YatZjb8HlJFE9umDzd7aqabn5oXvAculX76pTZWMxm53GROMZVeICGOYtSasJZYlkv9fLx/Gy/ksrKQnA719ig==", + "dev": true, + "requires": { + "@storybook/channels": "6.4.20", + "@storybook/client-logger": "6.4.20", + "@storybook/core-events": "6.4.20", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.20", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/channels": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.20.tgz", + "integrity": "sha512-BXvI2/bQIvtQ0LPJCEQwrYm0iMkXD0Pu4WuUGfRCbyqhyw6/VnxOP0x92mvFbtBvjHhyNwk9kZloHyI5zJ3STg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + } + }, + "@storybook/client-logger": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.20.tgz", + "integrity": "sha512-vbEivQvLQm05tuqSAb4s9RCc82YF1HcAvRneOYUGI7T/wSoijZzauIstKtb3LHEBBYpsELf4hJ3GuE5xZW3wXg==", + "dev": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + } + }, + "@storybook/core-events": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.20.tgz", + "integrity": "sha512-POizjsPSA4SeBRKaIMpH/M2Mtw3ZPp1hCdIXTxK+S2M1j2rt3ZvNnG2y4IJM+dYjkL1Qwl3WJusa7qcDCS2+dA==", + "dev": true, + "requires": { + "core-js": "^3.8.2" + } + }, + "@storybook/router": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.20.tgz", + "integrity": "sha512-lwTBtuq9gNywkVs1rye50dPF6pJEGHhZ+2MOTMtASjuM8KIL/wI3OYwRDnDf/98FcinFAeBcEPrEHmV5sAW73w==", + "dev": true, + "requires": { + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + } + }, "@storybook/semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", @@ -11346,6 +17028,26 @@ "find-up": "^4.1.0" } }, + "@storybook/theming": { + "version": "6.4.20", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.20.tgz", + "integrity": "sha512-sVGpRYyJHbdme8ozd9AT70VZ24ug6eypAKT7P+cfzImlYJABjmcfaJ+V4rlavoJF1sGnmauJmGoOf40b1U5JZQ==", + "dev": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.20", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -12573,9 +18275,9 @@ "dev": true }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" }, "ansi-styles": { "version": "3.2.1", @@ -20930,9 +26632,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minipass": { "version": "3.1.5", @@ -27083,14 +32785,14 @@ "dev": true }, "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.1", - "minimist": "^1.2.0", + "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { @@ -28392,6 +34094,34 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "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" + } + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -28445,6 +34175,7 @@ "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.2" diff --git a/package.json b/package.json index b05fd47fc..5d8ce9d1a 100644 --- a/package.json +++ b/package.json @@ -29,13 +29,13 @@ "@angular/compiler-cli": "^12.2.13", "@babel/core": "^7.17.5", "@compodoc/compodoc": "^1.1.19", - "@storybook/addon-actions": "^6.4.19", - "@storybook/addon-essentials": "^6.4.19", - "@storybook/addon-interactions": "^6.4.19", - "@storybook/addon-links": "^6.4.19", - "@storybook/angular": "^6.4.19", - "@storybook/builder-webpack5": "^6.4.19", - "@storybook/manager-webpack5": "^6.4.19", + "@storybook/addon-actions": "^6.4.20", + "@storybook/addon-essentials": "^6.4.20", + "@storybook/addon-interactions": "^6.4.20", + "@storybook/addon-links": "^6.4.20", + "@storybook/angular": "^6.4.20", + "@storybook/builder-webpack5": "^6.4.20", + "@storybook/manager-webpack5": "^6.4.20", "@storybook/testing-library": "0.0.9", "@types/jasmine": "~3.8.0", "@types/node": "^12.11.1", diff --git a/src/atlasComponents/sapi/sapi.service.ts b/src/atlasComponents/sapi/sapi.service.ts index de44e86da..5f80668aa 100644 --- a/src/atlasComponents/sapi/sapi.service.ts +++ b/src/atlasComponents/sapi/sapi.service.ts @@ -114,7 +114,6 @@ export class SAPI{ public http: HttpClient, private snackbar: MatSnackBar, private workerSvc: AtlasWorkerService, - // @Inject(BS_ENDPOINT) public bsEndpoint: string, ){ this.atlases$.subscribe(atlases => { for (const atlas of atlases) { diff --git a/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.stories.ts b/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.stories.ts index beab85bcc..054c0c70e 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.stories.ts +++ b/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.stories.ts @@ -1,6 +1,6 @@ import { CommonModule } from "@angular/common" import { HttpClientModule } from "@angular/common/http" -import { Component, EventEmitter, Input, Output } from "@angular/core" +import { Component, Input } from "@angular/core" import { Meta, moduleMetadata, Story } from "@storybook/angular" import { action } from "@storybook/addon-actions" import { SAPI, SapiParcellationModel } from "src/atlasComponents/sapi" @@ -8,6 +8,10 @@ import { atlasId, getAtlas, provideDarkTheme, getParc, getAtlases } from "src/at import { AngularMaterialModule } from "src/sharedModules" import { SapiViewsCoreParcellationModule } from "../module" import { provideMockStore } from "@ngrx/store/testing" +import { within, userEvent } from '@storybook/testing-library'; +import { ARIA_LABELS } from "common/constants" +import { ParcellationVisibilityService } from "../parcellationVis.service" +import { of } from "rxjs" @Component({ selector: `parc-smart-chip-wrapper`, @@ -68,6 +72,7 @@ const Template: Story<ParcSmartChipWrapper> = (args: ParcSmartChipWrapper, { loa const { parcRecords } = loaded + const { providers = [] } = parameters return ({ props: { @@ -75,6 +80,9 @@ const Template: Story<ParcSmartChipWrapper> = (args: ParcSmartChipWrapper, { loa selectParcellation: action("selectParcellation"), parcRecords }, + moduleMetadata: { + providers + } }) } Template.loaders = [] @@ -108,3 +116,28 @@ Default.loaders = [ } } ] + +export const TestInteraction = Template.bind({}) +TestInteraction.loaders = [ + ...Default.loaders +] +TestInteraction.parameters = { + providers: [ + { + provide: ParcellationVisibilityService, + useValue: { + setVisibility: action('setVisibility'), + toggleVisibility: action('toggleVisibility'), + visibility$: of(true) + } + } + ] +} +TestInteraction.play = async ({ args, canvasElement }) => { + const canvas = within(canvasElement) + + await userEvent.click(canvas.getByText("human")) + const allEye = canvas.getAllByText(ARIA_LABELS.TOGGLE_DELINEATION) + await userEvent.hover(allEye[0]) + await userEvent.click(allEye[0]) +} diff --git a/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.template.html b/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.template.html index 88cde9507..f792f5ce1 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.template.html +++ b/src/atlasComponents/sapiViews/core/parcellation/smartChip/parcellation.smartChip.template.html @@ -34,8 +34,12 @@ (iav-key-event)="toggleParcellationVisibility()" (click)="toggleParcellationVisibility()"> <i class="fas" - [ngClass]="(parcellationVisibility$ | async) ? 'fa-eye': 'fa-eye-slash'"> + [ngClass]="(parcellationVisibility$ | async) ? 'fa-eye': 'fa-eye-slash'" + aria-hidden="true"> </i> + <span class="sr-only"> + {{ ARIA_LABELS.TOGGLE_DELINEATION }} + </span> </button> </div> diff --git a/src/atlasViewer/atlasViewer.apiService.service.spec.ts b/src/atlasViewer/atlasViewer.apiService.service.spec.ts index 2f510f5d9..c4800524b 100644 --- a/src/atlasViewer/atlasViewer.apiService.service.spec.ts +++ b/src/atlasViewer/atlasViewer.apiService.service.spec.ts @@ -1,7 +1,6 @@ import { AtlasViewerAPIServices } from "src/atlasViewer/atlasViewer.apiService.service"; import { async, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { provideMockStore } from "@ngrx/store/testing"; -import { defaultRootState } from "src/services/stateStore.service"; import { AngularMaterialModule } from "src/sharedModules"; import { WidgetModule } from 'src/widget'; import { HttpClientTestingModule, HttpTestingController } from "@angular/common/http/testing"; @@ -9,271 +8,274 @@ import { PluginServices } from "src/plugin"; import { CANCELLABLE_DIALOG } from "src/util/interfaces"; describe('atlasViewer.apiService.service.ts', () => { - - describe('AtlasViewerAPIServices', () => { - - const cancelTokenSpy = jasmine.createSpy('cancelToken') - const cancellableDialogSpy = jasmine.createSpy('openCallableDialog').and.returnValue(cancelTokenSpy) - - afterEach(() => { - cancelTokenSpy.calls.reset() - cancellableDialogSpy.calls.reset() - - const ctrl = TestBed.inject(HttpTestingController) - ctrl.verify() - }) - - beforeEach(async(() => { - TestBed.configureTestingModule({ - imports: [ - AngularMaterialModule, - HttpClientTestingModule, - WidgetModule, - ], - providers: [ - AtlasViewerAPIServices, - provideMockStore({ initialState: defaultRootState }), - { - provide: CANCELLABLE_DIALOG, - useValue: cancellableDialogSpy - }, - { - provide: PluginServices, - useValue: {} - } - ] - }).compileComponents() - })) - - it('service exists', () => { - const service = TestBed.inject(AtlasViewerAPIServices) - expect(service).not.toBeNull() - }) - - describe('uiHandle', () => { - - describe('getUserToSelectARegion', () => { - - it('on init, expect getUserToSelectRegion to be length 0', () => { - const service = TestBed.inject(AtlasViewerAPIServices) - expect(service.getUserToSelectRegion.length).toEqual(0) - }) - it('calling getUserToSelectARegion() populates getUserToSelectRegion', () => { - const service = TestBed.inject(AtlasViewerAPIServices) - - const pr = service.interactiveViewer.uiHandle.getUserToSelectARegion('hello world') + /** + * TODO + * plugin api to be redesigned + */ + // describe('AtlasViewerAPIServices', () => { + + // const cancelTokenSpy = jasmine.createSpy('cancelToken') + // const cancellableDialogSpy = jasmine.createSpy('openCallableDialog').and.returnValue(cancelTokenSpy) + + // afterEach(() => { + // cancelTokenSpy.calls.reset() + // cancellableDialogSpy.calls.reset() + + // const ctrl = TestBed.inject(HttpTestingController) + // ctrl.verify() + // }) + + // beforeEach(async(() => { + // TestBed.configureTestingModule({ + // imports: [ + // AngularMaterialModule, + // HttpClientTestingModule, + // WidgetModule, + // ], + // providers: [ + // AtlasViewerAPIServices, + // provideMockStore(), + // { + // provide: CANCELLABLE_DIALOG, + // useValue: cancellableDialogSpy + // }, + // { + // provide: PluginServices, + // useValue: {} + // } + // ] + // }).compileComponents() + // })) + + // it('service exists', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) + // expect(service).not.toBeNull() + // }) + + // describe('uiHandle', () => { + + // describe('getUserToSelectARegion', () => { + + // it('on init, expect getUserToSelectRegion to be length 0', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) + // expect(service.getUserToSelectRegion.length).toEqual(0) + // }) + // it('calling getUserToSelectARegion() populates getUserToSelectRegion', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) + + // const pr = service.interactiveViewer.uiHandle.getUserToSelectARegion('hello world') - expect(service.getUserToSelectRegion.length).toEqual(1) - const { promise, message, rs, rj } = service.getUserToSelectRegion[0] - expect(promise).toEqual(pr) - expect(message).toEqual('hello world') + // expect(service.getUserToSelectRegion.length).toEqual(1) + // const { promise, message, rs, rj } = service.getUserToSelectRegion[0] + // expect(promise).toEqual(pr) + // expect(message).toEqual('hello world') - expect(rs).not.toBeUndefined() - expect(rs).not.toBeNull() - - expect(rj).not.toBeUndefined() - expect(rj).not.toBeNull() - }) - }) - - describe('> getUserToSelectRoi', () => { - it('> calling getUserToSelectRoi without spec throws error', () => { - const service = TestBed.inject(AtlasViewerAPIServices) - expect(() => { - service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world') - }).toThrow() - }) - - it('> calling getUserToSelectRoi without spec.type throws', () => { - const service = TestBed.inject(AtlasViewerAPIServices) - expect(() => { - service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world', { foo: 'bar' } as any) - }).toThrow() - }) - - it('> calling getUserToSelectRoi populates getUserToSelectRegion with malformed spec.type is fine', () => { - const service = TestBed.inject(AtlasViewerAPIServices) - expect(() => { - service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world', { type: 'foobar' }) - }).not.toThrow() - }) - it('> calling getUserToSelectRoi populates getUserToSelectRegion', () => { - - const service = TestBed.inject(AtlasViewerAPIServices) - - const pr = service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world', { type: 'POINT' }) + // expect(rs).not.toBeUndefined() + // expect(rs).not.toBeNull() + + // expect(rj).not.toBeUndefined() + // expect(rj).not.toBeNull() + // }) + // }) + + // describe('> getUserToSelectRoi', () => { + // it('> calling getUserToSelectRoi without spec throws error', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) + // expect(() => { + // service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world') + // }).toThrow() + // }) + + // it('> calling getUserToSelectRoi without spec.type throws', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) + // expect(() => { + // service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world', { foo: 'bar' } as any) + // }).toThrow() + // }) + + // it('> calling getUserToSelectRoi populates getUserToSelectRegion with malformed spec.type is fine', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) + // expect(() => { + // service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world', { type: 'foobar' }) + // }).not.toThrow() + // }) + // it('> calling getUserToSelectRoi populates getUserToSelectRegion', () => { + + // const service = TestBed.inject(AtlasViewerAPIServices) + + // const pr = service.interactiveViewer.uiHandle.getUserToSelectRoi('hello world', { type: 'POINT' }) - expect(service.getUserToSelectRegion.length).toEqual(1) - const { promise, message, spec, rs, rj } = service.getUserToSelectRegion[0] - expect(promise).toEqual(pr) - expect(message).toEqual('hello world') - expect(spec).toEqual({ type: 'POINT' }) + // expect(service.getUserToSelectRegion.length).toEqual(1) + // const { promise, message, spec, rs, rj } = service.getUserToSelectRegion[0] + // expect(promise).toEqual(pr) + // expect(message).toEqual('hello world') + // expect(spec).toEqual({ type: 'POINT' }) - expect(rs).not.toBeFalsy() - expect(rj).not.toBeFalsy() - }) - }) - - describe('cancelPromise', () => { - it('calling cancelPromise removes pr from getUsertoSelectRegion', done => { - - const service = TestBed.inject(AtlasViewerAPIServices) - const pr = service.interactiveViewer.uiHandle.getUserToSelectARegion('test') - pr.catch(e => { - expect(e.userInitiated).toEqual(false) - expect(service.getUserToSelectRegion.length).toEqual(0) - done() - }) - service.interactiveViewer.uiHandle.cancelPromise(pr) - }) - - it('alling cancelPromise on non existing promise, throws ', () => { - - const service = TestBed.inject(AtlasViewerAPIServices) - const pr = service.interactiveViewer.uiHandle.getUserToSelectARegion('test') - service.interactiveViewer.uiHandle.cancelPromise(pr) - expect(() => { - service.interactiveViewer.uiHandle.cancelPromise(pr) - }).toThrow() - }) - }) - - describe('getUserToSelectARegion, cancelPromise and userCancel', () => { - it('if token is provided, on getUserToSelectRegionUI$ next should follow by call to injected function', () => { - const service = TestBed.inject(AtlasViewerAPIServices) + // expect(rs).not.toBeFalsy() + // expect(rj).not.toBeFalsy() + // }) + // }) + + // describe('cancelPromise', () => { + // it('calling cancelPromise removes pr from getUsertoSelectRegion', done => { + + // const service = TestBed.inject(AtlasViewerAPIServices) + // const pr = service.interactiveViewer.uiHandle.getUserToSelectARegion('test') + // pr.catch(e => { + // expect(e.userInitiated).toEqual(false) + // expect(service.getUserToSelectRegion.length).toEqual(0) + // done() + // }) + // service.interactiveViewer.uiHandle.cancelPromise(pr) + // }) + + // it('alling cancelPromise on non existing promise, throws ', () => { + + // const service = TestBed.inject(AtlasViewerAPIServices) + // const pr = service.interactiveViewer.uiHandle.getUserToSelectARegion('test') + // service.interactiveViewer.uiHandle.cancelPromise(pr) + // expect(() => { + // service.interactiveViewer.uiHandle.cancelPromise(pr) + // }).toThrow() + // }) + // }) + + // describe('getUserToSelectARegion, cancelPromise and userCancel', () => { + // it('if token is provided, on getUserToSelectRegionUI$ next should follow by call to injected function', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) - const rsSpy = jasmine.createSpy('rs') - const rjSpy = jasmine.createSpy('rj') - const mockObj = { - message: 'test', - promise: new Promise((rs, rj) => {}), - rs: rsSpy, - rj: rjSpy, - } - service.getUserToSelectRegionUI$.next([ mockObj ]) + // const rsSpy = jasmine.createSpy('rs') + // const rjSpy = jasmine.createSpy('rj') + // const mockObj = { + // message: 'test', + // promise: new Promise((rs, rj) => {}), + // rs: rsSpy, + // rj: rjSpy, + // } + // service.getUserToSelectRegionUI$.next([ mockObj ]) - expect(cancellableDialogSpy).toHaveBeenCalled() + // expect(cancellableDialogSpy).toHaveBeenCalled() - const arg = cancellableDialogSpy.calls.mostRecent().args - expect(arg[0]).toEqual('test') - expect(arg[1].userCancelCallback).toBeTruthy() - }) + // const arg = cancellableDialogSpy.calls.mostRecent().args + // expect(arg[0]).toEqual('test') + // expect(arg[1].userCancelCallback).toBeTruthy() + // }) - it('if multiple regionUIs are provided, only the last one is used', () => { - const service = TestBed.inject(AtlasViewerAPIServices) + // it('if multiple regionUIs are provided, only the last one is used', () => { + // const service = TestBed.inject(AtlasViewerAPIServices) - const rsSpy = jasmine.createSpy('rs') - const rjSpy = jasmine.createSpy('rj') - const mockObj1 = { - message: 'test1', - promise: new Promise((rs, rj) => {}), - rs: rsSpy, - rj: rjSpy, - } - const mockObj2 = { - message: 'test2', - promise: new Promise((rs, rj) => {}), - rs: rsSpy, - rj: rjSpy, - } - service.getUserToSelectRegionUI$.next([ mockObj1, mockObj2 ]) + // const rsSpy = jasmine.createSpy('rs') + // const rjSpy = jasmine.createSpy('rj') + // const mockObj1 = { + // message: 'test1', + // promise: new Promise((rs, rj) => {}), + // rs: rsSpy, + // rj: rjSpy, + // } + // const mockObj2 = { + // message: 'test2', + // promise: new Promise((rs, rj) => {}), + // rs: rsSpy, + // rj: rjSpy, + // } + // service.getUserToSelectRegionUI$.next([ mockObj1, mockObj2 ]) - expect(cancellableDialogSpy).toHaveBeenCalled() + // expect(cancellableDialogSpy).toHaveBeenCalled() - const arg = cancellableDialogSpy.calls.mostRecent().args - expect(arg[0]).toEqual('test2') - expect(arg[1].userCancelCallback).toBeTruthy() - }) + // const arg = cancellableDialogSpy.calls.mostRecent().args + // expect(arg[0]).toEqual('test2') + // expect(arg[1].userCancelCallback).toBeTruthy() + // }) - describe('calling userCacellationCb', () => { + // describe('calling userCacellationCb', () => { - it('correct usage => in removeBasedOnPr called, rj with userini as true', fakeAsync(() => { - const service = TestBed.inject(AtlasViewerAPIServices) + // it('correct usage => in removeBasedOnPr called, rj with userini as true', fakeAsync(() => { + // const service = TestBed.inject(AtlasViewerAPIServices) - const rsSpy = jasmine.createSpy('rs') - const rjSpy = jasmine.createSpy('rj') - const promise = new Promise((rs, rj) => {}) - const mockObj = { - message: 'test', - promise, - rs: rsSpy, - rj: rjSpy, - } - - const removeBaseOnPr = spyOn(service, 'removeBasedOnPr').and.returnValue(null) - - service.getUserToSelectRegionUI$.next([ mockObj ]) - const arg = cancellableDialogSpy.calls.mostRecent().args - const cb = arg[1].userCancelCallback - cb() - tick(100) - expect(rjSpy).toHaveBeenCalledWith({ userInitiated: true }) - expect(removeBaseOnPr).toHaveBeenCalledWith(promise, { userInitiated: true }) + // const rsSpy = jasmine.createSpy('rs') + // const rjSpy = jasmine.createSpy('rj') + // const promise = new Promise((rs, rj) => {}) + // const mockObj = { + // message: 'test', + // promise, + // rs: rsSpy, + // rj: rjSpy, + // } + + // const removeBaseOnPr = spyOn(service, 'removeBasedOnPr').and.returnValue(null) + + // service.getUserToSelectRegionUI$.next([ mockObj ]) + // const arg = cancellableDialogSpy.calls.mostRecent().args + // const cb = arg[1].userCancelCallback + // cb() + // tick(100) + // expect(rjSpy).toHaveBeenCalledWith({ userInitiated: true }) + // expect(removeBaseOnPr).toHaveBeenCalledWith(promise, { userInitiated: true }) - })) + // })) - it('incorrect usage (resolve) => removebasedonpr, rj not called', fakeAsync(() => { + // it('incorrect usage (resolve) => removebasedonpr, rj not called', fakeAsync(() => { - const service = TestBed.inject(AtlasViewerAPIServices) + // const service = TestBed.inject(AtlasViewerAPIServices) - const dummyObj = { - hello:'world' - } - - const rsSpy = jasmine.createSpy('rs') - const rjSpy = jasmine.createSpy('rj') - const promise = Promise.resolve(dummyObj) - const mockObj = { - message: 'test', - promise, - rs: rsSpy, - rj: rjSpy, - } - - const removeBaseOnPr = spyOn(service, 'removeBasedOnPr').and.returnValue(null) - - service.getUserToSelectRegionUI$.next([ mockObj ]) - const arg = cancellableDialogSpy.calls.mostRecent().args - const cb = arg[1].userCancelCallback - cb() - tick(100) - expect(rjSpy).not.toHaveBeenCalled() - expect(removeBaseOnPr).not.toHaveBeenCalled() + // const dummyObj = { + // hello:'world' + // } + + // const rsSpy = jasmine.createSpy('rs') + // const rjSpy = jasmine.createSpy('rj') + // const promise = Promise.resolve(dummyObj) + // const mockObj = { + // message: 'test', + // promise, + // rs: rsSpy, + // rj: rjSpy, + // } + + // const removeBaseOnPr = spyOn(service, 'removeBasedOnPr').and.returnValue(null) + + // service.getUserToSelectRegionUI$.next([ mockObj ]) + // const arg = cancellableDialogSpy.calls.mostRecent().args + // const cb = arg[1].userCancelCallback + // cb() + // tick(100) + // expect(rjSpy).not.toHaveBeenCalled() + // expect(removeBaseOnPr).not.toHaveBeenCalled() - })) + // })) - it('incorrect usage (reject) => removebasedonpr, rj not called', fakeAsync(() => { + // it('incorrect usage (reject) => removebasedonpr, rj not called', fakeAsync(() => { - const service = TestBed.inject(AtlasViewerAPIServices) + // const service = TestBed.inject(AtlasViewerAPIServices) - const dummyObj = { - hello:'world' - } - - const rsSpy = jasmine.createSpy('rs') - const rjSpy = jasmine.createSpy('rj') - const promise = Promise.reject(dummyObj) - const mockObj = { - message: 'test', - promise, - rs: rsSpy, - rj: rjSpy, - } - - const removeBaseOnPr = spyOn(service, 'removeBasedOnPr').and.returnValue(null) - - service.getUserToSelectRegionUI$.next([ mockObj ]) - const arg = cancellableDialogSpy.calls.mostRecent().args - const cb = arg[1].userCancelCallback - cb() - tick(100) - expect(rjSpy).not.toHaveBeenCalled() - expect(removeBaseOnPr).not.toHaveBeenCalled() + // const dummyObj = { + // hello:'world' + // } + + // const rsSpy = jasmine.createSpy('rs') + // const rjSpy = jasmine.createSpy('rj') + // const promise = Promise.reject(dummyObj) + // const mockObj = { + // message: 'test', + // promise, + // rs: rsSpy, + // rj: rjSpy, + // } + + // const removeBaseOnPr = spyOn(service, 'removeBasedOnPr').and.returnValue(null) + + // service.getUserToSelectRegionUI$.next([ mockObj ]) + // const arg = cancellableDialogSpy.calls.mostRecent().args + // const cb = arg[1].userCancelCallback + // cb() + // tick(100) + // expect(rjSpy).not.toHaveBeenCalled() + // expect(removeBaseOnPr).not.toHaveBeenCalled() - })) - }) - }) - }) - }) + // })) + // }) + // }) + // }) + // }) }) diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts index 055079aa1..15dbb4942 100644 --- a/src/atlasViewer/atlasViewer.component.ts +++ b/src/atlasViewer/atlasViewer.component.ts @@ -21,11 +21,11 @@ import {MatDialog, MatDialogRef} from "@angular/material/dialog"; import { ARIA_LABELS, CONST } from 'common/constants' import { SlServiceService } from "src/spotlight/sl-service.service"; -import { PureContantService } from "src/util"; import { ClickInterceptorService } from "src/glue"; import { environment } from 'src/environments/environment' import { DOCUMENT } from "@angular/common"; import { userPreference } from "src/state" +import { DARKTHEME } from "src/util/injectionTokens"; /** * TODO @@ -72,14 +72,14 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit { constructor( private store: Store<any>, - private pureConstantService: PureContantService, private matDialog: MatDialog, private rd: Renderer2, private snackbar: MatSnackBar, private el: ElementRef, private slService: SlServiceService, private clickIntService: ClickInterceptorService, - @Inject(DOCUMENT) private document, + @Inject(DOCUMENT) private document: Document, + @Inject(DARKTHEME) private darktheme$: Observable<boolean> ) { const error = this.el.nativeElement.getAttribute('data-error') @@ -117,11 +117,13 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit { } this.subscriptions.push( - this.pureConstantService.useTouchUI$.subscribe(bool => this.ismobile = bool), + this.store.pipe( + select(userPreference.selectors.useMobileUi), + ).subscribe(bool => this.ismobile = bool), ) this.subscriptions.push( - this.pureConstantService.darktheme$.subscribe(flag => { + this.darktheme$.subscribe(flag => { this.rd.setAttribute(this.document.body, 'darktheme', this.meetsRequirement && flag.toString()) }), ) @@ -196,14 +198,15 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit { ) } + private supportEmailAddress = `support@ebrains.eu` public quickTourFinale = { order: 1e6, descriptionMd: `That's it! We hope you enjoy your stay. --- -If you have any comments or need further support, please contact us at [${this.pureConstantService.supportEmailAddress}](mailto:${this.pureConstantService.supportEmailAddress})`, - description: `That's it! We hope you enjoy your stay. If you have any comments or need further support, please contact us at ${this.pureConstantService.supportEmailAddress}`, +If you have any comments or need further support, please contact us at [${this.supportEmailAddress}](mailto:${this.supportEmailAddress})`, + description: `That's it! We hope you enjoy your stay. If you have any comments or need further support, please contact us at ${this.supportEmailAddress}`, position: 'center' } diff --git a/src/auth/auth.service.spec.ts b/src/auth/auth.service.spec.ts index 504e7299c..b23dc32ce 100644 --- a/src/auth/auth.service.spec.ts +++ b/src/auth/auth.service.spec.ts @@ -1,7 +1,7 @@ import { HttpClientTestingModule, HttpTestingController } from "@angular/common/http/testing" +import { APP_INITIALIZER } from "@angular/core" import { TestBed } from "@angular/core/testing" import { hot } from "jasmine-marbles" -import { PureContantService } from "src/util" import { AuthService } from "./auth.service" describe('>auth.service.ts', () => { @@ -14,10 +14,13 @@ describe('>auth.service.ts', () => { providers: [ AuthService, { - provide: PureContantService, - useValue: { - backendUrl: `http://localhost:3000/` - } + provide: APP_INITIALIZER, + useFactory: (authSvc: AuthService) => { + authSvc.authReloadState() + return () => Promise.resolve() + }, + multi: true, + deps: [ AuthService ] } ] }) @@ -38,7 +41,7 @@ describe('>auth.service.ts', () => { it('> if http response errors, user$ should be stream of null', () => { - const resp = ctrl.expectOne('http://localhost:3000/user') + const resp = ctrl.expectOne('user') resp.error(null, { status: 404, }) @@ -53,7 +56,7 @@ describe('>auth.service.ts', () => { it('> if http response contains truthy error key, user should return stream of null', () => { - const resp = ctrl.expectOne('http://localhost:3000/user') + const resp = ctrl.expectOne('user') resp.flush({ error: true }) @@ -72,7 +75,7 @@ describe('>auth.service.ts', () => { name: 'foobar', id: 'baz' } - const resp = ctrl.expectOne('http://localhost:3000/user') + const resp = ctrl.expectOne('user') resp.flush(mockUser) expect( diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index bb610dace..487fb0d5e 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -2,8 +2,6 @@ import { HttpClient } from "@angular/common/http"; import { Injectable, OnDestroy } from "@angular/core"; import { Observable, of, Subscription } from "rxjs"; import { catchError, map, shareReplay } from "rxjs/operators"; -import { PureContantService } from "src/util"; -import { BACKENDURL } from "src/util/constants"; const IV_REDIRECT_TOKEN = `IV_REDIRECT_TOKEN` @@ -38,9 +36,8 @@ export class AuthService implements OnDestroy { constructor( private httpClient: HttpClient, - private constantSvc: PureContantService, ) { - this.user$ = this.httpClient.get<TUserRouteResp>(`${this.constantSvc.backendUrl}user`).pipe( + this.user$ = this.httpClient.get<TUserRouteResp>(`user`).pipe( map(json => { if (json.error) { throw new Error(json.message || 'User not loggedin.') diff --git a/src/main.module.ts b/src/main.module.ts index c468717ba..bf993e757 100644 --- a/src/main.module.ts +++ b/src/main.module.ts @@ -17,7 +17,7 @@ import { ConfirmDialogComponent } from "./components/confirmDialog/confirmDialog import { DialogComponent } from "./components/dialog/dialog.component"; import { DialogService } from "./services/dialogService.service"; import { UIService } from "./services/uiService.service"; -import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR, PureContantService, UtilModule } from "src/util"; +import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR, UtilModule } from "src/util"; import { SpotLightModule } from 'src/spotlight/spot-light.module' import { TryMeComponent } from "./ui/tryme/tryme.component"; import { TemplateCoordinatesTransformation } from "src/services/templateCoordinatesTransformation.service"; @@ -30,7 +30,7 @@ import 'src/theme.scss' import { ClickInterceptorService } from './glue'; import { TOS_OBS_INJECTION_TOKEN } from './ui/kgtos'; import { MesssagingModule } from './messaging/module'; -import { ViewerModule, VIEWERMODULE_DARKTHEME } from './viewerModule'; +import { ViewerModule } from './viewerModule'; import { CookieModule } from './ui/cookieAgreement/module'; import { KgTosModule } from './ui/kgtos/module'; import { AtlasViewerRouterModule } from './routerModule'; @@ -167,11 +167,6 @@ import { CONST } from "common/constants" ClickInterceptorService ] }, - { - provide: VIEWERMODULE_DARKTHEME, - useFactory: (pureConstantService: PureContantService) => pureConstantService.darktheme$, - deps: [ PureContantService ] - }, { provide: WINDOW_MESSAGING_HANDLER_TOKEN, useClass: MessagingGlue diff --git a/src/messaging/service.spec.ts b/src/messaging/service.spec.ts index 5ee3b0811..2ba18423e 100644 --- a/src/messaging/service.spec.ts +++ b/src/messaging/service.spec.ts @@ -1,7 +1,6 @@ import { TestBed } from "@angular/core/testing" import { MockStore, provideMockStore } from "@ngrx/store/testing" import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service" -import { viewerStateFetchedAtlasesSelector } from "src/services/state/viewerState/selectors" import { AngularMaterialModule } from "src/sharedModules" import { getUuid } from "src/util/fn" import { IAV_POSTMESSAGE_NAMESPACE, MessagingService } from "./service" @@ -39,8 +38,6 @@ describe('> service.ts', () => { ] }) - const mockStore = TestBed.inject(MockStore) - mockStore.overrideSelector(viewerStateFetchedAtlasesSelector, []) }) it('> can be inst', () => { diff --git a/src/plugin/atlasViewer.pluginService.service.spec.ts b/src/plugin/atlasViewer.pluginService.service.spec.ts index 56d8cfc10..7735fcf8e 100644 --- a/src/plugin/atlasViewer.pluginService.service.spec.ts +++ b/src/plugin/atlasViewer.pluginService.service.spec.ts @@ -6,7 +6,6 @@ import { ComponentsModule } from "src/components" import { DialogService } from "src/services/dialogService.service" import { AngularMaterialModule } from "src/sharedModules" import { userPreference } from "src/state" -import { PureContantService } from "src/util" import { APPEND_SCRIPT_TOKEN, REMOVE_SCRIPT_TOKEN } from "src/util/constants" import { WidgetModule, WidgetServices } from "src/widget" import { PluginServices } from "./atlasViewer.pluginService.service" @@ -15,7 +14,8 @@ import { PluginModule } from "./plugin.module" const MOCK_PLUGIN_MANIFEST = { name: 'fzj.xg.MOCK_PLUGIN_MANIFEST', templateURL: 'http://localhost:10001/template.html', - scriptURL: 'http://localhost:10001/script.js' + scriptURL: 'http://localhost:10001/script.js', + version: '0.1.0' } const spyfn = { @@ -58,12 +58,6 @@ describe('> atlasViewer.pluginService.service.ts', () => { getUserConfirm: () => Promise.resolve() } }, - { - provide: PureContantService, - useValue: { - backendUrl: `http://localhost:3000/` - } - } ] }).compileComponents() @@ -85,7 +79,7 @@ describe('> atlasViewer.pluginService.service.ts', () => { } } as any - httpMock.expectOne('http://localhost:3000/plugins/manifests').flush('[]') + httpMock.expectOne('plugins/manifests').flush('[]') const widgetService = TestBed.inject(WidgetServices) /** @@ -197,7 +191,7 @@ describe('> atlasViewer.pluginService.service.ts', () => { describe('> if user permission has been given', () => { beforeEach(fakeAsync(() => { - mockStore.overrideSelector(userPreference.selectors.userCsp, { 'fzj.xg.MOCK_PLUGIN_MANIFEST': {} }) + mockStore.overrideSelector(userPreference.selectors.userCsp, { [`${MOCK_PLUGIN_MANIFEST.name}::${MOCK_PLUGIN_MANIFEST.version}`]: {} }) userConfirmSpy.and.callFake(() => Promise.reject()) pluginService.launchPlugin({ ...cspManifest @@ -252,7 +246,7 @@ describe('> atlasViewer.pluginService.service.ts', () => { it('> calls /POST user/pluginPermissions', () => { httpMock.expectOne({ method: 'POST', - url: 'http://localhost:3000/user/pluginPermissions' + url: 'user/pluginPermissions' }) }) }) @@ -273,7 +267,7 @@ describe('> atlasViewer.pluginService.service.ts', () => { it('> calls /POST user/pluginPermissions', () => { httpMock.expectNone({ method: 'POST', - url: 'http://localhost:3000/user/pluginPermissions' + url: 'user/pluginPermissions' }) }) }) diff --git a/src/plugin/atlasViewer.pluginService.service.ts b/src/plugin/atlasViewer.pluginService.service.ts index a050e4312..9dc142ad0 100644 --- a/src/plugin/atlasViewer.pluginService.service.ts +++ b/src/plugin/atlasViewer.pluginService.service.ts @@ -11,7 +11,6 @@ import { PluginFactoryDirective } from './pluginFactory.directive'; import { DialogService } from 'src/services/dialogService.service'; import { DomSanitizer } from '@angular/platform-browser'; import { MatSnackBar } from '@angular/material/snack-bar'; -import { PureContantService } from 'src/util'; import { actions } from "src/state/plugins" import { userPreference } from 'src/state'; @@ -69,7 +68,6 @@ export class PluginServices { private http: HttpClient, private log: LoggingService, private sanitizer: DomSanitizer, - private constantSvc: PureContantService, @Inject(APPEND_SCRIPT_TOKEN) private appendSrc: (src: string) => Promise<HTMLScriptElement>, @Inject(REMOVE_SCRIPT_TOKEN) private removeSrc: (src: HTMLScriptElement) => void, ) { @@ -79,7 +77,7 @@ export class PluginServices { /** * TODO convert to rxjs streams, instead of Promise.all */ - const pluginManifestsUrl = `${this.constantSvc.backendUrl}plugins/manifests` + const pluginManifestsUrl = `plugins/manifests` this.http.get<IPluginManifest[]>(pluginManifestsUrl, { responseType: 'json', @@ -175,7 +173,7 @@ export class PluginServices { }) this.http.delete( - `${this.constantSvc.backendUrl}user/pluginPermissions/${encodeURIComponent(pluginKey)}`, + `user/pluginPermissions/${encodeURIComponent(pluginKey)}`, { headers: getHttpHeader() } @@ -253,7 +251,7 @@ export class PluginServices { catchError(() => of(false)), filter(v => !!v), switchMapTo( - this.http.post(`${this.constantSvc.backendUrl}user/pluginPermissions`, + this.http.post(`user/pluginPermissions`, { [pluginKey]: csp }, { responseType: 'json', diff --git a/src/routerModule/routeStateTransform.service.spec.ts b/src/routerModule/routeStateTransform.service.spec.ts new file mode 100644 index 000000000..699e2b118 --- /dev/null +++ b/src/routerModule/routeStateTransform.service.spec.ts @@ -0,0 +1,191 @@ +import { TestBed } from "@angular/core/testing" +import { of } from "rxjs" +import { SAPI } from "src/atlasComponents/sapi" +import { RouteStateTransformSvc } from "./routeStateTransform.service" +import { DefaultUrlSerializer } from "@angular/router" +import * as nehubaConfigService from "src/viewerModule/nehuba/config.service" +import { atlasSelection } from "src/state" +import { encodeNumber } from "./cipher" + +const serializer = new DefaultUrlSerializer() + +describe("> routeStateTransform.service.ts", () => { + describe("> RouteStateTransformSvc", () => { + let svc: RouteStateTransformSvc + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + RouteStateTransformSvc, + { + provide: SAPI, + useValue: { + atlases$: of([]), + getSpaceDetail: jasmine.createSpy('getSpaceDetail'), + getParcDetail: jasmine.createSpy('getParcDetail'), + getParcRegions: jasmine.createSpy('getParcRegions'), + } + } + ] + }) + svc = TestBed.inject(RouteStateTransformSvc) + }) + + describe("> cvtRouteToState", () => { + describe("> decode region", () => { + + }) + + describe("> decode sv", () => { + let sv: string[] + beforeEach(async () => { + const searchParam = new URLSearchParams() + searchParam.set('standaloneVolumes', '["precomputed://https://object.cscs.ch/v1/AUTH_08c08f9f119744cbbf77e216988da3eb/imgsvc-46d9d64f-bdac-418e-a41b-b7f805068c64"]') + const url = `foo/bar?${searchParam.toString()}` + const urlTree = serializer.parse(url) + const state = await svc.cvtRouteToState(urlTree) + sv = state["[state.atlasSelection]"].standAloneVolumes + }) + + it('> sv should be truthy', () => { + expect(sv).toBeTruthy() + }) + + it('> sv should be array', () => { + expect( + Array.isArray(sv) + ).toBeTrue() + }) + + it('> sv should have length 1', () => { + expect(sv.length).toEqual(1) + }) + + it('> sv[0] should be expected value', () => { + expect(sv[0]).toEqual( + 'precomputed://https://object.cscs.ch/v1/AUTH_08c08f9f119744cbbf77e216988da3eb/imgsvc-46d9d64f-bdac-418e-a41b-b7f805068c64' + ) + }) + }) + + describe("> decode navigation", () => { + beforeEach(() => { + }) + // it('> if not present, should show something palatable', async () => { + + // const scale = 0.25 + + // const url = `/a:juelich:iav:atlas:v1.0.0:1/t:minds:core:referencespace:v1.0.0:dafcffc5-4826-4bf1-8ff6-46b8a31ff8e2/p:minds:core:parcellationatlas:v1.0.0:94c1125b-b87e-45e4-901c-00daee7f2579-290` + + // const urlTree = serializer.parse(url) + // const state = await svc.cvtRouteToState(urlTree) + + // const { navigation } = state["[state.atlasSelection]"] + // const { + // orientation, + // perspectiveOrientation, + // position, + // zoom, + // perspectiveZoom, + // } = navigation + + // expect(orientation).toEqual([0,0,0,1]) + // expect(perspectiveOrientation).toEqual([ + // 0.3140767216682434, + // -0.7418519854545593, + // 0.4988985061645508, + // -0.3195493221282959 + // ]) + // expect(position).toEqual([0,0,0]) + // expect(zoom).toEqual(350000 * scale) + // expect(perspectiveZoom).toEqual(1922235.5293810747 * scale) + // }) + }) + }) + + describe("> cvtStateToRoute", () => { + + describe('> should be able encode region properly', () => { + let getRegionLabelIndexSpy: jasmine.Spy = jasmine.createSpy('getRegionLabelIndex') + let getParcNgId: jasmine.Spy = jasmine.createSpy('getParcNgId') + let atlasSelectionSpy: Record<string, jasmine.Spy> = { + selectedAtlas: jasmine.createSpy('selectedAtlas'), + selectedParcellation: jasmine.createSpy('selectedParcellation'), + selectedTemplate: jasmine.createSpy('selectedTemplate'), + selectedRegions: jasmine.createSpy('selectedRegions'), + standaloneVolumes: jasmine.createSpy('standaloneVolumes'), + navigation: jasmine.createSpy('navigation'), + } + + const altasObj = {"@id": 'foo-bar-a'} + const templObj = {"@id": 'foo-bar-t'} + const parcObj = {"@id": 'foo-bar-p'} + const regions = [{}] + const standAloneVolumes = [] + const navigation = null + + beforeEach(() => { + spyOnProperty(nehubaConfigService, 'getRegionLabelIndex').and.returnValue(getRegionLabelIndexSpy) + spyOnProperty(nehubaConfigService, 'getParcNgId').and.returnValue(getParcNgId) + spyOnProperty(atlasSelection, 'selectors').and.returnValue(atlasSelectionSpy) + + atlasSelectionSpy.selectedAtlas.and.returnValue(altasObj) + atlasSelectionSpy.selectedParcellation.and.returnValue(templObj) + atlasSelectionSpy.selectedTemplate.and.returnValue(parcObj) + atlasSelectionSpy.selectedRegions.and.returnValue(regions) + atlasSelectionSpy.standaloneVolumes.and.returnValue(standAloneVolumes) + atlasSelectionSpy.navigation.and.returnValue(navigation) + + }) + + afterEach(() => { + getRegionLabelIndexSpy.calls.reset() + getParcNgId.calls.reset() + for (const key in atlasSelectionSpy) { + atlasSelectionSpy[key].calls.reset() + } + }) + + it('> calls correct functions', () => { + + getRegionLabelIndexSpy.and.returnValue(11) + getParcNgId.and.returnValue('foo-bar') + + const state = {} + const svc = TestBed.inject(RouteStateTransformSvc) + const s = svc.cvtStateToRoute(state as any) + + for (const key in atlasSelectionSpy) { + expect(atlasSelectionSpy[key]).toHaveBeenCalledTimes(1) + } + }) + + it('> regular ngId', () => { + const ngId = 'foobar' + const labelIndex = 124 + + getRegionLabelIndexSpy.and.returnValue(labelIndex) + getParcNgId.and.returnValue(ngId) + + const state = {} + const svc = TestBed.inject(RouteStateTransformSvc) + const s = svc.cvtStateToRoute(state as any) + + expect(s).toContain(`r:${ngId}::${encodeNumber(labelIndex, { float: false })}`) + }) + + it('> ngId containing ()', () => { + const ngId = 'foobar(1)' + const labelIndex = 124 + + getRegionLabelIndexSpy.and.returnValue(labelIndex) + getParcNgId.and.returnValue(ngId) + + const state = {} + const svc = TestBed.inject(RouteStateTransformSvc) + const s = svc.cvtStateToRoute(state as any) + expect(s).toContain(`r:foobar%25281%2529::${encodeNumber(labelIndex, { float: false })}`) + }) + }) + }) + }) +}) diff --git a/src/routerModule/routeStateTransform.service.ts b/src/routerModule/routeStateTransform.service.ts index f28834de5..532d5a0d3 100644 --- a/src/routerModule/routeStateTransform.service.ts +++ b/src/routerModule/routeStateTransform.service.ts @@ -243,9 +243,9 @@ export class RouteStateTransformSvc { // for atlas a: selectedAtlas && encodeId(selectedAtlas['@id']), // for template - t: selectedTemplate && encodeId(selectedTemplate['@id'] || selectedTemplate['fullId']), + t: selectedTemplate && encodeId(selectedTemplate['@id']), // for parcellation - p: selectedParcellation && encodeId(selectedParcellation['@id'] || selectedParcellation['fullId']), + p: selectedParcellation && encodeId(selectedParcellation['@id']), // for regions r: selectedRegionsString && encodeURIFull(selectedRegionsString), // nav diff --git a/src/routerModule/router.service.spec.ts b/src/routerModule/router.service.spec.ts index a06a700ff..f85b0beea 100644 --- a/src/routerModule/router.service.spec.ts +++ b/src/routerModule/router.service.spec.ts @@ -1,199 +1,193 @@ import { APP_BASE_HREF, Location } from "@angular/common" import { discardPeriodicTasks, fakeAsync, TestBed, tick } from "@angular/core/testing" -import { Router } from "@angular/router" -import { RouterTestingModule } from '@angular/router/testing' +import { DefaultUrlSerializer, NavigationEnd, Router } from "@angular/router" import { MockStore, provideMockStore } from "@ngrx/store/testing" import { cold } from "jasmine-marbles" -import { of } from "rxjs" -import { PureContantService } from "src/util" +import { of, Subject } from "rxjs" +import { SAPI } from "src/atlasComponents/sapi" import { RouterService } from "./router.service" +import { RouteStateTransformSvc } from "./routeStateTransform.service" import * as util from './util' -const { routes, DummyCmp } = util -const dummyPureConstantService = { - allFetchingReady$: of(true) +const { DummyCmp } = util + +let cvtStateToRouteSpy: jasmine.Spy +let cvtRouteToStateSpy: jasmine.Spy +const mockRouter = { + events: new Subject(), + parseUrl: (url: string) => { + return new DefaultUrlSerializer().parse(url) + }, + url: '/', + navigate: jasmine.createSpy('navigate'), + navigateByUrl: jasmine.createSpy('navigateByUrl') } -let cvtStateToHashedRoutesSpy: jasmine.Spy -let cvtFullRouteToStateSpy: jasmine.Spy -let location: Location -let router: Router - describe('> router.service.ts', () => { describe('> RouterService', () => { beforeEach(() => { - cvtStateToHashedRoutesSpy = jasmine.createSpy('cvtStateToHashedRoutesSpy') - cvtFullRouteToStateSpy = jasmine.createSpy('cvtFullRouteToState') - - spyOnProperty(util, 'cvtStateToHashedRoutes').and.returnValue(cvtStateToHashedRoutesSpy) - spyOnProperty(util, 'cvtFullRouteToState').and.returnValue(cvtFullRouteToStateSpy) + cvtStateToRouteSpy = jasmine.createSpy('cvtStateToRouteSpy') + cvtRouteToStateSpy = jasmine.createSpy('cvtFullRouteToState') TestBed.configureTestingModule({ - imports: [ - RouterTestingModule.withRoutes(routes, { - useHash: true - }), - ], + imports: [], declarations: [ DummyCmp, ], providers: [ provideMockStore(), - { - provide: PureContantService, - useValue: dummyPureConstantService - }, { provide: APP_BASE_HREF, useValue: '/' + }, + { + provide: SAPI, + useValue: { + atlases$: of([]) + } + }, + { + provide: RouteStateTransformSvc, + useValue: { + cvtRouteToState: cvtRouteToStateSpy, + cvtStateToRoute: cvtStateToRouteSpy + } + }, + { + provide: Router, + useValue: mockRouter } ] }) }) afterEach(() => { - cvtStateToHashedRoutesSpy.calls.reset() - cvtFullRouteToStateSpy.calls.reset() + cvtStateToRouteSpy.calls.reset() + cvtRouteToStateSpy.calls.reset() + mockRouter.navigateByUrl.calls.reset() + mockRouter.navigate.calls.reset() }) describe('> on state set', () => { + const fakeState = { + foo: 'bar' + } + beforeEach(() => { - it('> should call cvtStateToHashedRoutes', fakeAsync(() => { - cvtStateToHashedRoutesSpy.and.callFake(() => ``) - const service = TestBed.inject(RouterService) + cvtRouteToStateSpy.and.resolveTo({ + url: '/', + stateFromRoute: fakeState + }) const store = TestBed.inject(MockStore) - const fakeState = { - foo: 'bar' - } store.setState(fakeState) - tick(320) - expect(cvtStateToHashedRoutesSpy).toHaveBeenCalledWith(fakeState) + const service = TestBed.inject(RouterService) + }) + + it('> should call cvtStateToHashedRoutes', fakeAsync(() => { + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + expect(cvtStateToRouteSpy).toHaveBeenCalledWith(fakeState) })) - it('> if cvtStateToHashedRoutes throws, should navigate to home', fakeAsync(() => { - cvtStateToHashedRoutesSpy.and.callFake(() => { + it('> if cvtStateToRoute throws, should navigate to home', fakeAsync(() => { + cvtStateToRouteSpy.and.callFake(() => { throw new Error(`foo bar`) }) - const service = TestBed.inject(RouterService) - const store = TestBed.inject(MockStore) - const fakeState = { - foo: 'bar' - } - store.setState(fakeState) - tick(320) - location = TestBed.inject(Location) - expect( - location.path() - ).toBe('/') + const baseHref = TestBed.inject(APP_BASE_HREF) + + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + expect(mockRouter.navigate).toHaveBeenCalledWith([baseHref]) })) it('> if cvtStateToHashedRoutes returns, should navigate to expected location', fakeAsync(() => { - cvtStateToHashedRoutesSpy.and.callFake(() => { - return `foo/bar` - }) - const service = TestBed.inject(RouterService) - const store = TestBed.inject(MockStore) - const fakeState = { - foo: 'bar' - } - store.setState(fakeState) - tick(320) - location = TestBed.inject(Location) - expect( - location.path() - ).toBe('/foo/bar') + cvtStateToRouteSpy.and.returnValue(`foo/bar`) + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + expect(mockRouter.navigateByUrl).toHaveBeenCalledWith('/foo/bar') })) describe('> does not excessively call navigateByUrl', () => { - let navigateSpy: jasmine.Spy - let navigateByUrlSpy: jasmine.Spy - beforeEach(() => { - const router = TestBed.inject(Router) - navigateSpy = spyOn(router, 'navigate').and.callThrough() - navigateByUrlSpy = spyOn(router, 'navigateByUrl').and.callThrough() - }) - afterEach(() => { - navigateSpy.calls.reset() - navigateByUrlSpy.calls.reset() - }) it('> navigate calls navigateByUrl', fakeAsync(() => { - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtStateToRouteSpy.and.callFake(() => { return `foo/bar` }) - TestBed.inject(RouterService) - const store = TestBed.inject(MockStore) - store.setState({ - 'hello': 'world' - }) - tick(320) - expect(cvtStateToHashedRoutesSpy).toHaveBeenCalledTimes(1 + 1) - expect(navigateByUrlSpy).toHaveBeenCalledTimes(1) + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + expect(cvtStateToRouteSpy).toHaveBeenCalledTimes(1 + 1) + expect(mockRouter.navigateByUrl).toHaveBeenCalledTimes(1) })) it('> same state should not navigate', fakeAsync(() => { - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtStateToRouteSpy.and.callFake(() => { return `foo/bar` }) - - TestBed.inject(RouterService) - const router = TestBed.inject(Router) - router.navigate(['foo', 'bar']) - const store = TestBed.inject(MockStore) - store.setState({ - 'hello': 'world' - }) - tick(320) - expect(cvtStateToHashedRoutesSpy).toHaveBeenCalledTimes(1 + 1) - expect(navigateByUrlSpy).toHaveBeenCalledTimes(1) + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + expect(cvtStateToRouteSpy).toHaveBeenCalledTimes(1 + 1) + expect(mockRouter.navigateByUrl).toHaveBeenCalledTimes(1) })) it('> should handle queryParam gracefully', fakeAsync(() => { const searchParam = new URLSearchParams() const sv = '["precomputed://https://object.cscs.ch/v1/AUTH_08c08f9f119744cbbf77e216988da3eb/imgsvc-46d9d64f-bdac-418e-a41b-b7f805068c64"]' searchParam.set('standaloneVolumes', sv) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtStateToRouteSpy.and.callFake(() => { return `foo/bar?${searchParam.toString()}` }) - TestBed.inject(RouterService) - const store = TestBed.inject(MockStore) - - TestBed.inject(RouterService) - const router = TestBed.inject(Router) - router.navigate(['foo', `bar`], { queryParams: { standaloneVolumes: sv }}) - store.setState({ - 'hello': 'world' - }) - tick(320) - expect(cvtStateToHashedRoutesSpy).toHaveBeenCalledTimes(1 + 1) - expect(navigateByUrlSpy).toHaveBeenCalledTimes(1) + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + expect(cvtStateToRouteSpy).toHaveBeenCalledTimes(1 + 1) + expect(mockRouter.navigateByUrl).toHaveBeenCalledTimes(1) })) }) }) describe('> on route change', () => { - describe('> compares new state and previous state', () => { + const fakeState = { + foo: 'bar' + } + beforeEach(fakeAsync(() => { + cvtRouteToStateSpy.and.resolveTo(fakeState) + TestBed.inject(RouterService) + const store = TestBed.inject(MockStore) + store.setState(fakeState) + mockRouter.events.next( + new NavigationEnd(1, '/', '/') + ) + tick(400) + })) - it('> calls cvtFullRouteToState', fakeAsync(() => { + describe('> compares new state and previous state', () => { + it('> calls cvtRouteToState', fakeAsync(() => { const fakeParsedState = { bizz: 'buzz' } - cvtFullRouteToStateSpy.and.callFake(() => fakeParsedState) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtRouteToStateSpy.and.resolveTo(fakeParsedState) + cvtStateToRouteSpy.and.callFake(() => { return ['bizz', 'buzz'] }) - router = TestBed.inject(Router) - router.navigate(['foo', 'bar']) - - const service = TestBed.inject(RouterService) - - tick() - - expect(cvtFullRouteToStateSpy).toHaveBeenCalledWith( - router.parseUrl('/foo/bar'), {}, service['logError'] + mockRouter.events.next( + new NavigationEnd(1, '/foo/bar', '/foo/bar') ) - discardPeriodicTasks() + tick(160) + expect(cvtRouteToStateSpy).toHaveBeenCalledWith( + new DefaultUrlSerializer().parse('/foo/bar') + ) })) it('> calls cvtStateToHashedRoutes with current state', fakeAsync(() => { @@ -203,23 +197,20 @@ describe('> router.service.ts', () => { const fakeState = { foo: 'bar' } - cvtFullRouteToStateSpy.and.callFake(() => fakeParsedState) + cvtRouteToStateSpy.and.resolveTo(fakeParsedState) const store = TestBed.inject(MockStore) store.setState(fakeState) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtStateToRouteSpy.and.callFake(() => { return ['bizz', 'buzz'] }) - router = TestBed.inject(Router) - router.navigate(['foo', 'bar']) - - TestBed.inject(RouterService) + mockRouter.events.next( + new NavigationEnd(1, '/foo/bar', '/foo/bar') + ) - tick() + tick(160) - expect(cvtStateToHashedRoutesSpy).toHaveBeenCalledWith(fakeState) - - discardPeriodicTasks() + expect(cvtStateToRouteSpy).toHaveBeenCalledWith(fakeState) })) describe('> when cvtStateToHashedRoutes ...', () => { @@ -227,44 +218,42 @@ describe('> router.service.ts', () => { const fakeParsedState = { bizz: 'buzz' } - cvtFullRouteToStateSpy.and.callFake(() => fakeParsedState) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtRouteToStateSpy.and.resolveTo(fakeParsedState) + cvtStateToRouteSpy.and.callFake(() => { throw new Error(`fizz buzz`) }) - router = TestBed.inject(Router) - router.navigate(['foo', 'bar']) + + mockRouter.events.next( + new NavigationEnd(1, '/foo/bar', '/foo/bar') + ) - TestBed.inject(RouterService) const store = TestBed.inject(MockStore) const dispatchSpy = spyOn(store, 'dispatch') - tick() + tick(160) expect(dispatchSpy).toHaveBeenCalled() - - discardPeriodicTasks() })) it('> ... returns different value, dispatches', fakeAsync(() => { const fakeParsedState = { bizz: 'buzz' } - cvtFullRouteToStateSpy.and.callFake(() => fakeParsedState) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtRouteToStateSpy.and.resolveTo(fakeParsedState) + cvtStateToRouteSpy.and.callFake(() => { return `fizz/buzz` }) - router = TestBed.inject(Router) - router.navigate(['foo', 'bar']) + mockRouter.events.next( + new NavigationEnd(1, '/foo/bar', '/foo/bar') + ) TestBed.inject(RouterService) const store = TestBed.inject(MockStore) const dispatchSpy = spyOn(store, 'dispatch') - tick(320) + tick(160) expect(dispatchSpy).toHaveBeenCalled() - - discardPeriodicTasks() })) describe('> returns the same value', () => { @@ -272,30 +261,31 @@ describe('> router.service.ts', () => { const fakeParsedState = { bizz: 'buzz' } - cvtFullRouteToStateSpy.and.callFake(() => fakeParsedState) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtRouteToStateSpy.and.resolveTo(fakeParsedState) + cvtStateToRouteSpy.and.callFake(() => { return `foo/bar` }) - router = TestBed.inject(Router) - router.navigate(['foo', 'bar']) + + mockRouter.events.next( + new NavigationEnd(1, '/foo/bar', '/foo/bar') + ) const service = TestBed.inject(RouterService) const store = TestBed.inject(MockStore) const dispatchSpy = spyOn(store, 'dispatch') - tick(320) + tick(160) expect(dispatchSpy).not.toHaveBeenCalled() - discardPeriodicTasks() })) it('> takes into account of customRoute', fakeAsync(() => { const fakeParsedState = { bizz: 'buzz' } - cvtFullRouteToStateSpy.and.callFake(() => fakeParsedState) - cvtStateToHashedRoutesSpy.and.callFake(() => { + cvtRouteToStateSpy.and.resolveTo(fakeParsedState) + cvtStateToRouteSpy.and.callFake(() => { return `foo/bar` }) @@ -304,8 +294,10 @@ describe('> router.service.ts', () => { 'x-foo': 'hello' }) - router = TestBed.inject(Router) - router.navigate(['foo', 'bar', 'x-foo:hello']) + + mockRouter.events.next( + new NavigationEnd(1, '/foo/bar/x-foo:hello', '/foo/bar/x-foo:hello') + ) const store = TestBed.inject(MockStore) const dispatchSpy = spyOn(store, 'dispatch') @@ -313,8 +305,6 @@ describe('> router.service.ts', () => { tick(320) expect(dispatchSpy).not.toHaveBeenCalled() - - discardPeriodicTasks() })) }) }) @@ -323,11 +313,24 @@ describe('> router.service.ts', () => { describe('> customRoute$', () => { let decodeCustomStateSpy: jasmine.Spy + + const fakeState = { + foo: 'bar' + } + let rService: RouterService beforeEach(() => { + cvtRouteToStateSpy.and.resolveTo({ + url: '/', + stateFromRoute: fakeState + }) + const store = TestBed.inject(MockStore) + store.setState(fakeState) + rService = TestBed.inject(RouterService) decodeCustomStateSpy = jasmine.createSpy('decodeCustomState') spyOnProperty(util, 'decodeCustomState').and.returnValue(decodeCustomStateSpy) - - router = TestBed.inject(Router) + mockRouter.events.next( + new NavigationEnd(0, '/', '/') + ) }) afterEach(() => { @@ -339,10 +342,11 @@ describe('> router.service.ts', () => { 'x-foo': 'bar' } decodeCustomStateSpy.and.returnValue(value) - const rService = TestBed.inject(RouterService) - router.navigate(['foo']) - tick(320) + mockRouter.events.next( + new NavigationEnd(1, '/foo', '/foo') + ) + tick(400) expect(rService.customRoute$).toBeObservable( cold('a', { a: { @@ -350,7 +354,6 @@ describe('> router.service.ts', () => { } }) ) - discardPeriodicTasks() })) it('> merges observable from _customRoutes$', fakeAsync(() => { decodeCustomStateSpy.and.returnValue({}) @@ -374,9 +377,8 @@ describe('> router.service.ts', () => { 'x-foo': 'bar' } decodeCustomStateSpy.and.returnValue(value) - const rService = TestBed.inject(RouterService) rService.setCustomRoute('x-fizz', 'buzz') - tick(320) + tick(400) expect(rService.customRoute$).toBeObservable( cold('(ba)', { @@ -389,15 +391,10 @@ describe('> router.service.ts', () => { } }) ) - discardPeriodicTasks() })) it('> subsequent emits overwrites', fakeAsync(() => { decodeCustomStateSpy.and.returnValue({}) - const rService = TestBed.inject(RouterService) - spyOn(router, 'navigateByUrl').and.callFake((() => { - console.log('navigate by url') - }) as any) const customRouteSpy = jasmine.createSpy('customRouteSpy') rService.customRoute$.subscribe(customRouteSpy) @@ -426,7 +423,6 @@ describe('> router.service.ts', () => { for (const c in expectedCalls) { expect(customRouteSpy).toHaveBeenCalledWith(expectedCalls[c]) } - discardPeriodicTasks() })) }) }) diff --git a/src/routerModule/router.service.ts b/src/routerModule/router.service.ts index b089d055e..288849e98 100644 --- a/src/routerModule/router.service.ts +++ b/src/routerModule/router.service.ts @@ -222,7 +222,12 @@ export class RouterService { ) ) ).subscribe(routePath => { - if (routePath === '') { + /** + * routePath may be falsy + * or empty string + * both can be caught by !routePath + */ + if (!routePath) { router.navigate([ baseHref ]) } else { diff --git a/src/routerModule/util.spec.ts b/src/routerModule/util.spec.ts index 35e0baefc..95971bb00 100644 --- a/src/routerModule/util.spec.ts +++ b/src/routerModule/util.spec.ts @@ -1,163 +1,6 @@ -import { TestBed } from '@angular/core/testing' -import { MockStore, provideMockStore } from '@ngrx/store/testing' -import { uiStatePreviewingDatasetFilesSelector } from 'src/services/state/uiState/selectors' -import { viewerStateGetSelectedAtlas, viewerStateSelectedParcellationSelector, viewerStateSelectedRegionsSelector, viewerStateSelectedTemplateSelector, viewerStateSelectorNavigation, viewerStateSelectorStandaloneVolumes } from 'src/services/state/viewerState/selectors' -import { cvtFullRouteToState, cvtStateToHashedRoutes, DummyCmp, encodeCustomState, routes, verifyCustomState } from './util' -import { encodeNumber } from './cipher' -import { Router } from '@angular/router' -import { RouterTestingModule } from '@angular/router/testing' -import * as parsedRoute from './parseRouteToTmplParcReg' -import { spaceMiscInfoMap } from 'src/util/pureConstant.service' +import { encodeCustomState, verifyCustomState } from './util' describe('> util.ts', () => { - describe('> cvtFullRouteToState', () => { - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - RouterTestingModule.withRoutes(routes, { - useHash: true - }) - ], - declarations: [ - DummyCmp - ] - }) - }) - beforeEach(() => { - }) - it('> should be able to decode region properly', () => { - - }) - - describe('> decode sv', () => { - let sv: any - beforeEach(() => { - const searchParam = new URLSearchParams() - searchParam.set('standaloneVolumes', '["precomputed://https://object.cscs.ch/v1/AUTH_08c08f9f119744cbbf77e216988da3eb/imgsvc-46d9d64f-bdac-418e-a41b-b7f805068c64"]') - const svRoute = `/?${searchParam.toString()}` - const router = TestBed.inject(Router) - const parsedUrl = router.parseUrl(svRoute) - const returnState = cvtFullRouteToState(parsedUrl, {}) - sv = returnState?.viewerState?.standaloneVolumes - }) - - it('> sv should be truthy', () => { - expect(sv).toBeTruthy() - }) - - it('> sv should be array', () => { - expect( - Array.isArray(sv) - ).toBeTrue() - }) - - it('> sv should have length 1', () => { - expect(sv.length).toEqual(1) - }) - - it('> sv[0] should be expected value', () => { - expect(sv[0]).toEqual( - 'precomputed://https://object.cscs.ch/v1/AUTH_08c08f9f119744cbbf77e216988da3eb/imgsvc-46d9d64f-bdac-418e-a41b-b7f805068c64' - ) - }) - }) - - describe('> navigation', () => { - let parseSpy: jasmine.Spy - let mapGetSpy: jasmine.Spy - beforeEach(() => { - parseSpy = spyOnProperty(parsedRoute, 'parseSearchParamForTemplateParcellationRegion') - mapGetSpy = spyOn(spaceMiscInfoMap, 'get') - }) - it('> if not present, should show something palatable', () => { - parseSpy.and.returnValue(() => ({ - parcellationSelected: { - id: 'dummpy-id-parc' - }, - regionsSelected: [], - templateSelected: { - id: 'dummpy-id-tmpl-sel' - }, - })) - - const scale = 0.25 - - mapGetSpy.and.returnValue({ scale }) - - const router = TestBed.inject(Router) - const route = `/a:juelich:iav:atlas:v1.0.0:1/t:minds:core:referencespace:v1.0.0:dafcffc5-4826-4bf1-8ff6-46b8a31ff8e2/p:minds:core:parcellationatlas:v1.0.0:94c1125b-b87e-45e4-901c-00daee7f2579-290` - const parsedUrl = router.parseUrl(route) - const { viewerState = {} } = cvtFullRouteToState(parsedUrl, {}) || {} - const { navigation } = viewerState - const { - orientation, - perspectiveOrientation, - position, - zoom, - perspectiveZoom, - } = navigation - - expect(orientation).toEqual([0,0,0,1]) - expect(perspectiveOrientation).toEqual([ - 0.3140767216682434, - -0.7418519854545593, - 0.4988985061645508, - -0.3195493221282959 - ]) - expect(position).toEqual([0,0,0]) - expect(zoom).toEqual(350000 * scale) - expect(perspectiveZoom).toEqual(1922235.5293810747 * scale) - }) - }) - }) - - describe('> cvtStateToHashedRoutes', () => { - let mockStore: MockStore - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - provideMockStore() - ] - }) - - mockStore = TestBed.inject(MockStore) - - mockStore.overrideSelector(viewerStateGetSelectedAtlas, null) - mockStore.overrideSelector(viewerStateSelectedTemplateSelector, null) - mockStore.overrideSelector(viewerStateSelectedParcellationSelector, null) - mockStore.overrideSelector(viewerStateSelectedRegionsSelector, []) - mockStore.overrideSelector(viewerStateSelectorStandaloneVolumes, []) - mockStore.overrideSelector(viewerStateSelectorNavigation, null) - - mockStore.overrideSelector(uiStatePreviewingDatasetFilesSelector, []) - }) - describe('> should be able encode region properly', () => { - - it('> regular ngId', () => { - const ngId = 'foobar' - const labelIndex = 124 - mockStore.overrideSelector(viewerStateSelectedRegionsSelector, [{ - labelIndex, - ngId - }]) - const s = cvtStateToHashedRoutes({}) - expect(s).toContain(`r:${ngId}::${encodeNumber(labelIndex, { float: false })}`) - }) - - it('> ngId containing ()', () => { - - const ngId = 'foobar(1)' - const labelIndex = 124 - mockStore.overrideSelector(viewerStateSelectedRegionsSelector, [{ - labelIndex, - ngId - }]) - const s = cvtStateToHashedRoutes({}) - expect(s).toContain(`r:foobar%25281%2529::${encodeNumber(labelIndex, { float: false })}`) - }) - }) - }) describe('> verifyCustomState', () => { it('> should return false on bad custom state', () => { diff --git a/src/state/effects/TODO.md b/src/state/effects/TODO.md deleted file mode 100644 index 0fd8e3c71..000000000 --- a/src/state/effects/TODO.md +++ /dev/null @@ -1,3 +0,0 @@ -# TODO - -migrate ASAP \ No newline at end of file diff --git a/src/state/effects/viewerState.useEffect.spec.ts b/src/state/effects/viewerState.useEffect.spec.ts deleted file mode 100644 index 180223fc1..000000000 --- a/src/state/effects/viewerState.useEffect.spec.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { cvtNehubaConfigToNavigationObj, ViewerStateControllerUseEffect, defaultNavigationObject, defaultNehubaConfigObject } from './viewerState.useEffect' -import { Observable, of, throwError } from 'rxjs' -import { TestBed } from '@angular/core/testing' -import { provideMockActions } from '@ngrx/effects/testing' -import { MockStore, provideMockStore } from '@ngrx/store/testing' -import { defaultRootState } from 'src/services/stateStore.service' -import { Injectable } from '@angular/core' -import { TemplateCoordinatesTransformation, ITemplateCoordXformResp } from 'src/services/templateCoordinatesTransformation.service' -import { AngularMaterialModule } from 'src/sharedModules' -import { HttpClientModule } from '@angular/common/http' -import { PureContantService } from 'src/util' - - -let returnPosition = null -const dummyParc1 = { - name: 'dummyParc1' -} as any -const dummyTmpl1 = { - '@id': 'dummyTmpl1-id', - name: 'dummyTmpl1', - parcellations: [dummyParc1], - nehubaConfig: { - dataset: { - initialNgState: { - ...defaultNehubaConfigObject - } - } - } -} as any - -const dummyParc2 = { - name: 'dummyParc2' -} -const dummyTmpl2 = { - '@id': 'dummyTmpl2-id', - name: 'dummyTmpl2', - parcellations: [dummyParc2], - nehubaConfig: { - dataset: { - initialNgState: { - ...defaultNehubaConfigObject - } - } - } -} - -@Injectable() -class MockCoordXformService{ - getPointCoordinatesForTemplate(src:string, tgt: string, pos: [number, number, number]): Observable<ITemplateCoordXformResp>{ - return returnPosition - ? of({ status: 'completed', result: returnPosition } as ITemplateCoordXformResp) - : of({ status: 'error', statusText: 'Failing query' } as ITemplateCoordXformResp) - } -} - -const initialState = JSON.parse(JSON.stringify( defaultRootState )) -const mockFetchedTemplates = [ - dummyTmpl2, - dummyTmpl1 -] -initialState.viewerState.fetchedTemplates = mockFetchedTemplates -initialState.viewerState.templateSelected = dummyTmpl2 -const currentNavigation = { - position: [4, 5, 6], - orientation: [0, 0, 0, 1], - perspectiveOrientation: [ 0, 0, 0, 1], - perspectiveZoom: 2e5, - zoom: 1e5 -} -initialState.viewerState.navigation = currentNavigation - -class MockPureConstantService{ - allFetchingReady$ = of(true) - initFetchTemplate$ = of([]) - - getRegionDetail(){ - return of(null) - } -} - -const mockPureConstantService = new MockPureConstantService() -describe('> viewerState.useEffect.ts', () => { - describe('> ViewerStateControllerUseEffect', () => { - let actions$: Observable<any> - let spy: jasmine.Spy - let mockStore: MockStore - beforeEach(() => { - - const mock = new MockCoordXformService() - spy = spyOn(mock, 'getPointCoordinatesForTemplate').and.callThrough() - returnPosition = null - - TestBed.configureTestingModule({ - imports: [ - AngularMaterialModule, - HttpClientModule, - ], - providers: [ - ViewerStateControllerUseEffect, - provideMockActions(() => actions$), - provideMockStore({ initialState }), - { - provide: TemplateCoordinatesTransformation, - useValue: mock - }, - { - provide: PureContantService, - useValue: mockPureConstantService - } - ] - }) - - mockStore = TestBed.inject(MockStore) - }) - - - describe('> onSelectAtlasSelectTmplParc$', () => { - let mockStore: MockStore - beforeEach(() => { - mockStore = TestBed.inject(MockStore) - }) - - it('> if atlas not found, return general error', () => { - - }) - - describe('> if atlas found', () => { - const mockParc1 = { - ['@id']: 'parc-1', - availableIn: [{ - ['@id']: 'test-1' - }] - } - const mockParc0 = { - ['@id']: 'parc-0', - availableIn: [{ - ['@id']: 'hello world' - }] - } - const mockTmplSpc = { - ['@id']: 'hello world', - availableIn: [ mockParc0 ] - } - const mockTmplSpc1 = { - ['@id']: 'test-1', - availableIn: [ mockParc1 ] - } - - describe('> if template key val is not provided', () => { - describe('> will try to find the id of the first tmpl', () => { - - it('> if fails, will return general error', () => { - - }) - - it('> if succeeds, will dispatch new viewer', () => { - - }) - - }) - }) - - describe('> if template key val is provided', () => { - - const completeMockTmpl = { - ...mockTmplSpc, - parcellations: [ mockParc0 ] - } - const completeMocktmpl1 = { - ...mockTmplSpc1, - parcellations: [ mockParc1 ] - } - beforeEach(() => { - - }) - it('> will select template.@id', () => { - - }) - - it('> if template.@id is not defined, will fallback to first template', () => { - - }) - }) - }) - }) - }) - - describe('> cvtNehubaConfigToNavigationObj', () => { - describe('> returns default obj when input is malformed', () => { - it('> if no arg is provided', () => { - - const obj = cvtNehubaConfigToNavigationObj() - expect(obj).toEqual(defaultNavigationObject) - }) - it('> if null or undefined is provided', () => { - - const obj = cvtNehubaConfigToNavigationObj(null) - expect(obj).toEqual(defaultNavigationObject) - - const obj2 = cvtNehubaConfigToNavigationObj(undefined) - expect(obj2).toEqual(defaultNavigationObject) - }) - it('> if malformed', () => { - - const obj = cvtNehubaConfigToNavigationObj(dummyTmpl2) - expect(obj).toEqual(defaultNavigationObject) - - const obj2 = cvtNehubaConfigToNavigationObj({}) - expect(obj2).toEqual(defaultNavigationObject) - }) - }) - it('> converts nehubaConfig object to navigation object', () => { - const obj = cvtNehubaConfigToNavigationObj(dummyTmpl2.nehubaConfig.dataset.initialNgState) - expect(obj).toEqual(defaultNavigationObject) - }) - }) - -}) diff --git a/src/state/plugins/effects.spec.ts b/src/state/plugins/effects.spec.ts index 0acf2f75a..fb7436211 100644 --- a/src/state/plugins/effects.spec.ts +++ b/src/state/plugins/effects.spec.ts @@ -1,18 +1,20 @@ -import { TestBed } from "@angular/core/testing"; +import { fakeAsync, TestBed, tick } from "@angular/core/testing"; import { HttpClientModule, HTTP_INTERCEPTORS, HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse, HttpHeaders } from "@angular/common/http"; import { Effects } from "./effects"; import { Observable, of } from "rxjs"; import { Action } from "@ngrx/store"; import { provideMockActions } from "@ngrx/effects/testing"; -import { provideMockStore } from "@ngrx/store/testing"; +import { MockStore, provideMockStore } from "@ngrx/store/testing"; import { Injectable } from "@angular/core"; import { getRandomHex } from 'common/util' import { PluginServices } from "src/plugin"; import { AngularMaterialModule } from "src/sharedModules"; import { hot } from "jasmine-marbles"; -import { BS_ENDPOINT } from "src/util/constants"; import * as actions from "./actions" import { INIT_MANIFEST_SRC } from "./const" +import { DialogService } from "src/services/dialogService.service"; +import { selectors } from "."; +import * as constants from "./const" const actions$: Observable<Action> = of({type: 'TEST'}) @@ -75,7 +77,8 @@ class MockPluginService{ describe('pluginUseEffect.ts', () => { - let spy + let spy: jasmine.Spy + let mockStore: MockStore beforeEach(() => { TestBed.configureTestingModule({ imports: [ @@ -94,26 +97,35 @@ describe('pluginUseEffect.ts', () => { { provide: PluginServices, useClass: MockPluginService - }, - { - provide: BS_ENDPOINT, - useValue: `http://localhost:1234` + },{ + provide: DialogService, + useValue: { + getUserConfirm() { + return Promise.resolve() + } + } } ] - }).compileComponents() - const pluginServices = TestBed.get(PluginServices) + }) + mockStore = TestBed.inject(MockStore) + mockStore.overrideSelector(selectors.initManfests, { [constants.INIT_MANIFEST_SRC]: "http://localhost:12345/manifest.json" }) + const pluginServices = TestBed.inject(PluginServices) spy = spyOn(pluginServices, 'launchNewWidget') }) - it('initManifests should fetch manifest.json', () => { + it('initManifests should fetch manifest.json', fakeAsync(() => { const effect = TestBed.inject(Effects) + effect.initManLaunch.subscribe() expect( effect.initManClear ).toBeObservable( - hot('a', actions.clearInitManifests({ - nameSpace: INIT_MANIFEST_SRC - })) + hot('a', { + a: actions.clearInitManifests({ + nameSpace: INIT_MANIFEST_SRC + }) + }) ) + tick(16) expect(spy).toHaveBeenCalledWith(manifest) - }) + })) }) diff --git a/src/ui/help/about/about.component.ts b/src/ui/help/about/about.component.ts index 77dd5c431..1f0203246 100644 --- a/src/ui/help/about/about.component.ts +++ b/src/ui/help/about/about.component.ts @@ -1,5 +1,4 @@ import { Component } from '@angular/core' -import { PureContantService } from 'src/util'; @Component({ selector: 'iav-about', @@ -10,14 +9,13 @@ import { PureContantService } from 'src/util'; }) export class AboutCmp { - public contactEmailHref: string = `mailto:${this.constantService.supportEmailAddress}?Subject=[InteractiveAtlasViewer]%20Queries` - public supportEmailAddress: string = this.constantService.supportEmailAddress + public supportEmailAddress: string = `support@ebrains.eu` + public contactEmailHref: string = `mailto:${this.supportEmailAddress}?Subject=[siibra-explorer]%20Queries` - public userDoc: string = this.constantService.docUrl - public repoUrl = this.constantService.repoUrl + public userDoc = `https://siibra-explorer.readthedocs.io/en/latest/` + public repoUrl = `https://github.com/FZJ-INM1-BDA/siibra-explorer` constructor( - private constantService: PureContantService, ) { } } diff --git a/src/ui/help/helpOnePager/helpOnePager.component.spec.ts b/src/ui/help/helpOnePager/helpOnePager.component.spec.ts index 08f17969c..ea3ceeba5 100644 --- a/src/ui/help/helpOnePager/helpOnePager.component.spec.ts +++ b/src/ui/help/helpOnePager/helpOnePager.component.spec.ts @@ -3,7 +3,6 @@ import { TestBed } from '@angular/core/testing' import { ComponentsModule } from 'src/components' import { AngularMaterialModule } from 'src/sharedModules' import { QuickTourModule } from 'src/ui/quickTour' -import { PureContantService } from 'src/util' import { UtilModule } from 'src/util/util.module' import { HelpOnePager } from './helpOnePager.component' @@ -24,12 +23,6 @@ describe('> helpOnePager.component.ts', () => { declarations: [ HelpOnePager, ], - providers: [ - { - provide: PureContantService, - useValue: {} - } - ] }).compileComponents() }) it('> should render a table', () => { diff --git a/src/ui/help/helpOnePager/helpOnePager.component.ts b/src/ui/help/helpOnePager/helpOnePager.component.ts index 7f0473186..ce8e5b984 100644 --- a/src/ui/help/helpOnePager/helpOnePager.component.ts +++ b/src/ui/help/helpOnePager/helpOnePager.component.ts @@ -1,5 +1,4 @@ -import { Component, Optional } from "@angular/core"; -import { PureContantService } from "src/util"; +import { Component } from "@angular/core"; import { ARIA_LABELS } from 'common/constants' // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -17,13 +16,8 @@ export class HelpOnePager{ public ARIA_LABELS = ARIA_LABELS public QUICK_STARTER_MD = QUICK_STARTER public extQuickStarter: string - public userDoc: string - constructor( - @Optional() pConstService: PureContantService - ){ + public userDoc: string = `https://siibra-explorer.readthedocs.io/en/latest/` + constructor(){ this.extQuickStarter = `quickstart.html` - if (pConstService) { - this.userDoc = pConstService.docUrl - } } } diff --git a/src/ui/logoContainer/logoContainer.component.ts b/src/ui/logoContainer/logoContainer.component.ts index f07321c93..3cc1e6d94 100644 --- a/src/ui/logoContainer/logoContainer.component.ts +++ b/src/ui/logoContainer/logoContainer.component.ts @@ -1,7 +1,7 @@ -import { Component } from "@angular/core"; -import { PureContantService } from "src/util"; -import { Subscription } from "rxjs"; +import { Component, Inject } from "@angular/core"; +import { Observable, Subscription } from "rxjs"; import { distinctUntilChanged } from "rxjs/operators"; +import { DARKTHEME } from "src/util/injectionTokens"; const imageDark = 'assets/logo/ebrains-logo-dark.svg' const imageLight = 'assets/logo/ebrains-logo-light.svg' @@ -24,10 +24,10 @@ export class LogoContainer { private subscriptions: Subscription[] = [] constructor( - pureConstantService: PureContantService + @Inject(DARKTHEME) darktheme$: Observable<boolean> ){ this.subscriptions.push( - pureConstantService.darktheme$.pipe( + darktheme$.pipe( distinctUntilChanged() ).subscribe(flag => { this.containerStyle = { diff --git a/src/util/index.ts b/src/util/index.ts index 21b7d4d11..37bf9c0b4 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,5 +1,4 @@ export { UtilModule } from './util.module' -export { PureContantService } from './pureConstant.service' export { CLICK_INTERCEPTOR_INJECTOR, ClickInterceptor, CONTEXT_MENU_ITEM_INJECTOR, TClickInterceptorConfig, TContextMenu } from './injectionTokens' export { DoublyLinkedList, diff --git a/src/util/pureConstant.service.spec.ts b/src/util/pureConstant.service.spec.ts deleted file mode 100644 index fa9ccf741..000000000 --- a/src/util/pureConstant.service.spec.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { HttpClientTestingModule, HttpTestingController } from "@angular/common/http/testing" -import { TestBed } from "@angular/core/testing" -import { MatSnackBarModule } from "@angular/material/snack-bar" -import { MockStore, provideMockStore } from "@ngrx/store/testing" -import { BS_ENDPOINT } from "src/atlasComponents/regionalFeatures/bsFeatures" -import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service" -import { viewerStateFetchedAtlasesSelector, viewerStateFetchedTemplatesSelector } from "src/services/state/viewerState/selectors" -import { PureContantService, SIIBRA_API_VERSION_HEADER_KEY, SIIBRA_API_VERSION } from "./pureConstant.service" -import { TAtlas } from "./siibraApiConstants/types" - -const MOCK_BS_ENDPOINT = `http://localhost:1234` - -describe('> pureConstant.service.ts', () => { - describe('> PureContantService', () => { - let httpController: HttpTestingController - beforeEach(() => { - TestBed.configureTestingModule({ - imports:[ - HttpClientTestingModule, - MatSnackBarModule, - ], - providers: [ - provideMockStore(), - { - provide: AtlasWorkerService, - useValue: { - worker: null - } - }, - { - provide: BS_ENDPOINT, - useValue: MOCK_BS_ENDPOINT - } - ] - }) - - const mockStore = TestBed.inject(MockStore) - mockStore.overrideSelector(viewerStateFetchedTemplatesSelector, []) - mockStore.overrideSelector(viewerStateFetchedAtlasesSelector, []) - httpController = TestBed.inject(HttpTestingController) - }) - - afterEach(() => { - httpController.verify() - }) - - it('> can be init', () => { - const service = TestBed.inject(PureContantService) - const exp = httpController.expectOne(`${MOCK_BS_ENDPOINT}/atlases`) - exp.flush([]) - expect(service).toBeTruthy() - }) - describe('> allFetchingReady$', () => { - const mockAtlas: TAtlas = { - id: 'mockatlas id', - name: 'mockatlas name', - links: { - parcellations: { - href: `${MOCK_BS_ENDPOINT}/mockatlas-parcellation-href` - }, - spaces: { - href: `${MOCK_BS_ENDPOINT}/atlas-spaces` - } - } - } - it('> can be init, and configuration emits allFetchingReady$', () => { - const service = TestBed.inject(PureContantService) - const exp = httpController.expectOne(`${MOCK_BS_ENDPOINT}/atlases`) - exp.flush([mockAtlas], { - headers: { - [SIIBRA_API_VERSION_HEADER_KEY]: SIIBRA_API_VERSION - } - }) - service.allFetchingReady$.subscribe() - - const expT1 = httpController.expectOne(`${MOCK_BS_ENDPOINT}/atlases/${encodeURIComponent(mockAtlas.id)}/spaces`) - expT1.flush([]) - - const expP1 = httpController.expectOne(`${MOCK_BS_ENDPOINT}/atlases/${encodeURIComponent(mockAtlas.id)}/parcellations`) - expP1.flush([]) - }) - - }) - }) -}) diff --git a/src/util/pureConstant.service.ts b/src/util/pureConstant.service.ts deleted file mode 100644 index 477a7c7a6..000000000 --- a/src/util/pureConstant.service.ts +++ /dev/null @@ -1,559 +0,0 @@ -import { Inject, Injectable, OnDestroy } from "@angular/core"; -import { Store, select } from "@ngrx/store"; -import { Observable, Subscription, of, forkJoin, from } from "rxjs"; -import { shareReplay, switchMap, map } from "rxjs/operators"; -import { HttpClient } from "@angular/common/http"; -import { LoggingService } from "src/logging"; -import { BS_ENDPOINT, BACKENDURL } from "src/util/constants"; -import { TId, TParc, TRegionDetail, TRegionSummary, TSpaceFull, TSpaceSummary } from "./siibraApiConstants/types"; -import { MultiDimMap, recursiveMutate, mutateDeepMerge } from "./fn"; -import { patchRegions } from './patchPureConstants' -import { MatSnackBar } from "@angular/material/snack-bar"; -import { atlasSelection, userPreference } from "src/state"; - -const validVolumeType = new Set([ - 'neuroglancer/precomputed', - 'neuroglancer/precompmesh', - 'threesurfer/gii', - 'threesurfer/gii-label', -]) - -function getNgId(atlasId: string, tmplId: string, parcId: string, regionKey: string){ - const proxyId = MultiDimMap.GetProxyKeyMatch(atlasId, tmplId, parcId, regionKey) - if (proxyId) return proxyId - return '_' + MultiDimMap.GetKey(atlasId, tmplId, parcId, regionKey) -} - -function parseId(id: TId){ - if (typeof id === 'string') return id - return `${id.kg.kgSchema}/${id.kg.kgId}` -} - -type THasId = { - ['@id']: string - name: string -} - -type TIAVAtlas = { - templateSpaces: ({ availableIn: THasId[] } & THasId)[] - parcellations: ({ - availableIn: THasId[] - baseLayer: boolean - '@version': { - name: string - '@next': string - '@previous': string - '@this': string - } - } & THasId)[] -} & THasId - -type TNehubaConfig = Record<string, { - source: string - transform: number[][] - type: 'segmentation' | 'image' -}> - -type TViewerConfig = TNehubaConfig - -/** - * key value pair of - * atlasId -> templateId -> viewerConfig - */ -type TAtlasTmplViewerConfig = Record<string, Record<string, TViewerConfig>> - -export const spaceMiscInfoMap = new Map([ - ['minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588', { - name: 'bigbrain', - scale: 1, - }], - ['minds/core/referencespace/v1.0.0/dafcffc5-4826-4bf1-8ff6-46b8a31ff8e2', { - name: 'icbm2009c', - scale: 1, - }], - ['minds/core/referencespace/v1.0.0/7f39f7be-445b-47c0-9791-e971c0b6d992', { - name: 'colin27', - scale: 1, - }], - ['minds/core/referencespace/v1.0.0/265d32a0-3d84-40a5-926f-bf89f68212b9', { - name: 'allen-mouse', - scale: 0.1, - }], - ['minds/core/referencespace/v1.0.0/d5717c4a-0fa1-46e6-918c-b8003069ade8', { - name: 'waxholm', - scale: 0.1, - }], -]) - -@Injectable({ - providedIn: 'root' -}) - -export class PureContantService implements OnDestroy{ - - private subscriptions: Subscription[] = [] - public repoUrl = `https://github.com/HumanBrainProject/interactive-viewer` - public supportEmailAddress = `support@ebrains.eu` - public docUrl = `https://interactive-viewer.readthedocs.io/en/latest/` - - public showHelpSupportText: string = `Did you encounter an issue? -Send us an email: <a target = "_blank" href = "mailto:${this.supportEmailAddress}">${this.supportEmailAddress}</a> - -Raise/track issues at github repo: <a target = "_blank" href = "${this.repoUrl}">${this.repoUrl}</a> -` - - public useTouchUI$: Observable<boolean> - public darktheme$: Observable<boolean> - - public totalAtlasesLength: number - - private _backendUrl = (BACKENDURL && `${BACKENDURL}/`.replace(/\/\/$/, '/')) || `${window.location.origin}${window.location.pathname}` - get backendUrl() { - console.warn(`something is using backendUrl`) - return this._backendUrl - } - - public getRegionDetail(atlasId: string, parcId: string, spaceId: string, region: any) { - return this.http.get<TRegionDetail>( - `${this.bsEndpoint}/atlases/${encodeURIComponent(atlasId)}/parcellations/${encodeURIComponent(parcId)}/regions/${encodeURIComponent(region.name)}`, - { - params: { - 'space_id': spaceId - }, - responseType: 'json' - } - ) - } - - constructor( - private store: Store<any>, - private http: HttpClient, - private log: LoggingService, - private snackbar: MatSnackBar, - @Inject(BS_ENDPOINT) private bsEndpoint: string, - ){ - - // TODO how do we find out which theme to use now? - this.darktheme$ = this.store.pipe( - select(atlasSelection.selectors.selectedTemplate), - map(tmpl => !!(tmpl && tmpl["@id"] !== 'minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588')) - ) - - this.useTouchUI$ = this.store.pipe( - select(userPreference.selectors.useMobileUi), - shareReplay(1) - ) - - // this.allFetchingReady$ = combineLatest([ - // this.initFetchTemplate$.pipe( - // filter(v => !!v), - // map(arr => arr.length), - // ), - // this.store.pipe( - // select(viewerStateFetchedTemplatesSelector), - // map(arr => arr.length), - // ), - // this.store.pipe( - // select(viewerStateFetchedAtlasesSelector), - // map(arr => arr.length), - // ) - // ]).pipe( - // map(([ expNumTmpl, actNumTmpl, actNumAtlas ]) => { - // return expNumTmpl === actNumTmpl && actNumAtlas === this.totalAtlasesLength - // }), - // distinctUntilChanged(), - // shareReplay(1), - // ) - } - - // public fetchedAtlases$: Observable<TIAVAtlas[]> = this.getAtlases$.pipe( - // switchMap(atlases => { - // return forkJoin( - // atlases.map( - // atlas => this.getSpacesAndParc(atlas.id).pipe( - // map(({ templateSpaces, parcellations }) => { - // return { - // '@id': atlas.id, - // name: atlas.name, - // templateSpaces: templateSpaces.map(tmpl => { - // return { - // '@id': tmpl.id, - // name: tmpl.name, - // availableIn: tmpl.availableParcellations.map(parc => { - // return { - // '@id': parc.id, - // name: parc.name - // } - // }), - // originDatainfos: (tmpl._dataset_specs || []).filter(spec => spec["@type"] === 'fzj/tmp/simpleOriginInfo/v0.0.1') - // } - // }), - // parcellations: parcellations.filter(p => { - // if (p.version?.deprecated) return false - // return true - // }).map(parc => { - // return { - // '@id': parseId(parc.id), - // name: parc.name, - // baseLayer: parc.modality === 'cytoarchitecture', - // '@version': { - // '@next': parc.version?.next, - // '@previous': parc.version?.prev, - // 'name': parc.version?.name, - // '@this': parseId(parc.id) - // }, - // groupName: parc.modality || null, - // availableIn: parc.availableSpaces.map(space => { - // return { - // '@id': space.id, - // name: space.name, - // /** - // * TODO need original data format - // */ - // // originalDatasetFormats: [{ - // // name: "probability map" - // // }] - // } - // }), - // originDatainfos: [...(parc.infos || []), ...(parc._dataset_specs || []).filter(spec => spec["@type"] === 'fzj/tmp/simpleOriginInfo/v0.0.1')] - // } - // }) - // } - // }), - // catchError((err, obs) => { - // console.error(err) - // return of(null) - // }) - // ) - // ) - // ) - // }), - // catchError((err, obs) => of([])), - // tap((arr: any[]) => this.totalAtlasesLength = arr.length), - // scan((acc, curr) => acc.concat(curr).sort((a, b) => (a.order || 0) - (b.order || 0)), []), - // shareReplay(1) - // ) - - private atlasTmplConfig: TAtlasTmplViewerConfig = {} - - async getViewerConfig(atlasId: string, templateId: string, parcId: string) { - const atlasLayers = this.atlasTmplConfig[atlasId] - const templateLayers = atlasLayers && atlasLayers[templateId] - return templateLayers || {} - } - - // public initFetchTemplate$ = this.fetchedAtlases$.pipe( - // switchMap(atlases => { - // return forkJoin( - // atlases.map(atlas => this.getSpacesAndParc(atlas['@id']).pipe( - // switchMap(({ templateSpaces, parcellations }) => { - // this.atlasTmplConfig[atlas["@id"]] = {} - // return forkJoin( - // templateSpaces.map( - // tmpl => { - // // hardcode - // // see https://github.com/FZJ-INM1-BDA/siibra-python/issues/98 - // if ( - // tmpl.id === 'minds/core/referencespace/v1.0.0/tmp-fsaverage' - // && !tmpl.availableParcellations.find(p => p.id === 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290') - // ) { - // tmpl.availableParcellations.push({ - // id: 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290', - // name: 'Julich-Brain Probabilistic Cytoarchitectonic Maps (v2.9)' - // }) - // } - // this.atlasTmplConfig[atlas["@id"]][tmpl.id] = {} - // return tmpl.availableParcellations.map( - // parc => this.getRegions(atlas['@id'], parc.id, tmpl.id).pipe( - // tap(regions => { - // recursiveMutate( - // regions, - // region => region.children, - // region => { - // /** - // * individual map(s) - // * this should work for both fully mapped and interpolated - // * in the case of interpolated, it sucks that the ngLayerObj will be set multiple times - // */ - - // const dedicatedMap = region._dataset_specs.filter( - // spec => spec["@type"] === 'fzj/tmp/volume_type/v0.0.1' - // && spec.space_id === tmpl.id - // && spec['volume_type'] === 'neuroglancer/precomputed' - // ) as TVolumeSrc<'neuroglancer/precomputed'>[] - // if (dedicatedMap.length === 1) { - // const ngId = getNgId(atlas['@id'], tmpl.id, parc.id, dedicatedMap[0]['@id']) - // region['ngId'] = ngId - // region['labelIndex'] = dedicatedMap[0].detail['neuroglancer/precomputed'].labelIndex - // this.atlasTmplConfig[atlas["@id"]][tmpl.id][ngId] = { - // source: `precomputed://${dedicatedMap[0].url}`, - // type: "segmentation", - // transform: dedicatedMap[0].detail['neuroglancer/precomputed'].transform - // } - // } - - // /** - // * if label index is defined - // */ - // if (!!region.labelIndex) { - // const hemisphereKey = /left hemisphere|left/.test(region.name) - // // these two keys are, unfortunately, more or less hardcoded - // // which is less than ideal - // ? 'left hemisphere' - // : /right hemisphere|right/.test(region.name) - // ? 'right hemisphere' - // : 'whole brain' - - // if (!region['ngId']) { - // const hemispheredNgId = getNgId(atlas['@id'], tmpl.id, parc.id, hemisphereKey) - // region['ngId'] = hemispheredNgId - // } - // } - // } - // ) - // this.atlasParcSpcRegionMap.set( - // atlas['@id'], tmpl.id, parc.id, regions - // ) - - // /** - // * populate maps for parc - // */ - // for (const parc of parcellations) { - // const precomputedVols = parc._dataset_specs.filter( - // spec => spec["@type"] === 'fzj/tmp/volume_type/v0.0.1' - // && spec.volume_type === 'neuroglancer/precomputed' - // && spec.space_id === tmpl.id - // ) as TVolumeSrc<'neuroglancer/precomputed'>[] - - // if (precomputedVols.length === 1) { - // const vol = precomputedVols[0] - // const key = 'whole brain' - - // const ngIdKey = getNgId(atlas['@id'], tmpl.id, parseId(parc.id), key) - // this.atlasTmplConfig[atlas["@id"]][tmpl.id][ngIdKey] = { - // source: `precomputed://${vol.url}`, - // type: "segmentation", - // transform: vol.detail['neuroglancer/precomputed'].transform - // } - // } - - // if (precomputedVols.length === 2) { - // const mapIndexKey = [{ - // mapIndex: 0, - // key: 'left hemisphere' - // }, { - // mapIndex: 1, - // key: 'right hemisphere' - // }] - // for (const { key, mapIndex } of mapIndexKey) { - // const ngIdKey = getNgId(atlas['@id'], tmpl.id, parseId(parc.id), key) - // this.atlasTmplConfig[atlas["@id"]][tmpl.id][ngIdKey] = { - // source: `precomputed://${precomputedVols[mapIndex].url}`, - // type: "segmentation", - // transform: precomputedVols[mapIndex].detail['neuroglancer/precomputed'].transform - // } - // } - // } - - // if (precomputedVols.length > 2) { - // console.error(`precomputedVols.length > 0, most likely an error`) - // } - // } - // }), - // catchError((err, obs) => { - // return of(null) - // }) - // ) - // ) - // } - // ).reduce(flattenReducer, []) - // ).pipe( - // mapTo({ templateSpaces, parcellations, ngLayerObj: this.atlasTmplConfig }) - // ) - // }), - // map(({ templateSpaces, parcellations, ngLayerObj }) => { - // return templateSpaces.map(tmpl => { - - // // configuring three-surfer - // let threeSurferConfig = {} - // const volumes = tmpl._dataset_specs.filter(v => v["@type"] === 'fzj/tmp/volume_type/v0.0.1') as TVolumeSrc<keyof IVolumeTypeDetail>[] - // const threeSurferVolSrc = volumes.find(v => v.volume_type === 'threesurfer/gii') - // if (threeSurferVolSrc) { - // const foundP = parcellations.find(p => { - // return p._dataset_specs.some(spec => spec["@type"] === 'fzj/tmp/volume_type/v0.0.1' && spec.space_id === tmpl.id) - // }) - // const url = threeSurferVolSrc.url - // const { surfaces } = threeSurferVolSrc.detail['threesurfer/gii'] as { surfaces: {mode: string, hemisphere: 'left' | 'right', url: string}[] } - // const modObj = {} - // for (const surface of surfaces) { - - // const hemisphereKey = surface.hemisphere === 'left' - // ? 'left hemisphere' - // : 'right hemisphere' - - - // /** - // * concating all available gii maps - // */ - // // const allFreesurferLabels = foundP.volumeSrc[tmpl.id][hemisphereKey].filter(v => v.volume_type === 'threesurfer/gii-label') - // // for (const lbl of allFreesurferLabels) { - // // const modeToConcat = { - // // mesh: surface.url, - // // hemisphere: surface.hemisphere, - // // colormap: lbl.url - // // } - - // // const key = `${surface.mode} - ${lbl.name}` - // // if (!modObj[key]) { - // // modObj[key] = [] - // // } - // // modObj[key].push(modeToConcat) - // // } - - // /** - // * only concat first matching gii map - // */ - // const mapIndex = hemisphereKey === 'left hemisphere' - // ? 0 - // : 1 - // const labelMaps = foundP._dataset_specs.filter(spec => spec["@type"] === 'fzj/tmp/volume_type/v0.0.1' && spec.volume_type === 'threesurfer/gii-label') as TVolumeSrc<'threesurfer/gii-label'>[] - // const key = surface.mode - // const modeToConcat = { - // mesh: surface.url, - // hemisphere: surface.hemisphere, - // colormap: (() => { - // const lbl = labelMaps[mapIndex] - // return lbl?.url - // })() - // } - // if (!modObj[key]) { - // modObj[key] = [] - // } - // modObj[key].push(modeToConcat) - - // } - // foundP[tmpl.id] - // threeSurferConfig = { - // "three-surfer": { - // '@context': { - // root: url - // }, - // modes: Object.keys(modObj).map(name => { - // return { - // name, - // meshes: modObj[name] - // } - // }) - // }, - // nehubaConfig: null, - // nehubaConfigURL: null, - // useTheme: 'dark' - // } - // } - // const darkTheme = tmpl.src_volume_type === 'mri' - // const nehubaConfig = getNehubaConfig(tmpl) - // const initialLayers = nehubaConfig.dataset.initialNgState.layers - - // const tmplAuxMesh = `${tmpl.name} auxmesh` - - // const precomputedArr = tmpl._dataset_specs.filter(src => src['@type'] === 'fzj/tmp/volume_type/v0.0.1' && src.volume_type === 'neuroglancer/precomputed') as TVolumeSrc<'neuroglancer/precomputed'>[] - // let visible = true - // let tmplNgId: string - // const templateImages: TTemplateImage[] = [] - // for (const precomputedItem of precomputedArr) { - // const ngIdKey = MultiDimMap.GetKey(precomputedItem["@id"]) - // const precomputedUrl = 'https://neuroglancer.humanbrainproject.eu/precomputed/data-repo-ng-bot/20211001-mebrain/precomputed/images/MEBRAINS_T1.masked' === precomputedItem.url - // ? 'https://neuroglancer.humanbrainproject.eu/precomputed/data-repo-ng-bot/20211018-mebrains-masked-templates/precomputed/images/MEBRAINS_T1_masked' - // : precomputedItem.url - // initialLayers[ngIdKey] = { - // type: "image", - // source: `precomputed://${precomputedUrl}`, - // transform: precomputedItem.detail['neuroglancer/precomputed'].transform, - // visible - // } - // templateImages.push({ - // "@id": precomputedItem['@id'], - // name: precomputedItem.name, - // ngId: ngIdKey, - // visible - // }) - // if (visible) { - // tmplNgId = ngIdKey - // } - // visible = false - // } - - // // TODO - // // siibra-python accidentally left out volume type of precompmesh - // // https://github.com/FZJ-INM1-BDA/siibra-python/pull/55 - // // use url to determine for now - // // const precompmesh = tmpl.volume_src.find(src => src.volume_type === 'neuroglancer/precompmesh') - // const precompmesh = tmpl._dataset_specs.find(src => src["@type"] === 'fzj/tmp/volume_type/v0.0.1' && !!src.detail?.['neuroglancer/precompmesh']) as TVolumeSrc<'neuroglancer/precompmesh'> - // const auxMeshes = [] - // if (precompmesh){ - // initialLayers[tmplAuxMesh] = { - // source: `precompmesh://${precompmesh.url}`, - // type: "segmentation", - // transform: precompmesh.detail['neuroglancer/precompmesh'].transform - // } - // for (const auxMesh of precompmesh.detail['neuroglancer/precompmesh'].auxMeshes) { - - // auxMeshes.push({ - // ...auxMesh, - // ngId: tmplAuxMesh, - // '@id': `${tmplAuxMesh} ${auxMesh.name}`, - // visible: true - // }) - // } - // } - - // for (const key in (ngLayerObj[atlas["@id"]][tmpl.id] || {})) { - // initialLayers[key] = ngLayerObj[atlas["@id"]][tmpl.id][key] - // } - - // return { - // name: tmpl.name, - // '@id': tmpl.id, - // fullId: tmpl.id, - // useTheme: darkTheme ? 'dark' : 'light', - // ngId: tmplNgId, - // nehubaConfig, - // templateImages, - // auxMeshes, - // /** - // * only populate the parcelltions made available - // */ - // parcellations: tmpl.availableParcellations.filter( - // p => parcellations.some(p2 => parseId(p2.id) === p.id) - // ).map(parc => { - // const fullParcInfo = parcellations.find(p => parseId(p.id) === parc.id) - // const regions = this.atlasParcSpcRegionMap.get(atlas['@id'], tmpl.id, parc.id) || [] - // return { - // fullId: parc.id, - // '@id': parc.id, - // name: parc.name, - // regions, - // originDatainfos: [...fullParcInfo.infos, ...(fullParcInfo?._dataset_specs || []).filter(spec => spec["@type"] === 'fzj/tmp/simpleOriginInfo/v0.0.1')] - // } - // }), - // ...threeSurferConfig - // } - // }) - // }) - // )) - // ) - // }), - // map(arr => { - // return arr.reduce(flattenReducer, []) - // }), - // catchError((err) => { - // this.log.warn(`fetching templates error`, err) - // return of(null) - // }), - // shareReplay(1), - // ) - - ngOnDestroy(){ - while(this.subscriptions.length > 0) this.subscriptions.pop().unsubscribe() - } -} diff --git a/src/viewerModule/constants.ts b/src/viewerModule/constants.ts index 8fa2d2523..4c9836908 100644 --- a/src/viewerModule/constants.ts +++ b/src/viewerModule/constants.ts @@ -1,4 +1,3 @@ import { InjectionToken } from "@angular/core"; import { Observable } from "rxjs"; -export const VIEWERMODULE_DARKTHEME = new InjectionToken<Observable<boolean>>('VIEWERMODULE_DARKTHEME') diff --git a/src/viewerModule/index.ts b/src/viewerModule/index.ts index 53f950d54..6e5c74fbe 100644 --- a/src/viewerModule/index.ts +++ b/src/viewerModule/index.ts @@ -1,2 +1 @@ -export { ViewerModule } from "./module" -export { VIEWERMODULE_DARKTHEME } from './constants' \ No newline at end of file +export { ViewerModule } from "./module" \ No newline at end of file diff --git a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts index 8f6e2d646..22cbde945 100644 --- a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts +++ b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.spec.ts @@ -3,8 +3,12 @@ import { MockStore, provideMockStore } from "@ngrx/store/testing" import { NehubaLayerControlService } from "./layerCtrl.service" import * as layerCtrlUtil from '../constants' import { + annotation, + atlasAppearance, atlasSelection } from "src/state" +import { LayerCtrlEffects } from "./layerCtrl.effects" +import { NEVER } from "rxjs" describe('> layerctrl.service.ts', () => { describe('> NehubaLayerControlService', () => { @@ -15,7 +19,13 @@ describe('> layerctrl.service.ts', () => { TestBed.configureTestingModule({ providers: [ NehubaLayerControlService, - provideMockStore() + provideMockStore(), + { + provide: LayerCtrlEffects, + useValue: { + onATPDebounceNgLayers$: NEVER + } + } ] }) @@ -25,6 +35,9 @@ describe('> layerctrl.service.ts', () => { layerCtrlUtil, 'getMultiNgIdsRegionsLabelIndexMap' ).and.returnValue(() => getMultiNgIdsRegionsLabelIndexMapReturnVal) + mockStore.overrideSelector(atlasAppearance.selectors.customLayers, []) + mockStore.overrideSelector(atlasAppearance.selectors.showDelineation, true) + mockStore.overrideSelector(annotation.selectors.annotations, []) mockStore.overrideSelector(atlasSelection.selectors.selectedRegions, []) mockStore.overrideSelector(atlasSelection.selectors.selectedTemplate, {} as any) mockStore.overrideSelector(atlasSelection.selectors.selectedParcellation, {} as any) diff --git a/src/viewerModule/nehuba/mesh.service/mesh.service.spec.ts b/src/viewerModule/nehuba/mesh.service/mesh.service.spec.ts index b5a1e065e..62a4ce09e 100644 --- a/src/viewerModule/nehuba/mesh.service/mesh.service.spec.ts +++ b/src/viewerModule/nehuba/mesh.service/mesh.service.spec.ts @@ -1,57 +1,70 @@ import { TestBed } from "@angular/core/testing" import { MockStore, provideMockStore } from "@ngrx/store/testing" import { hot } from "jasmine-marbles" -import { viewerStateSelectedParcellationSelector, viewerStateSelectedRegionsSelector, viewerStateSelectedTemplateSelector } from "src/services/state/viewerState/selectors" import { NehubaMeshService } from "./mesh.service" +import { atlasSelection } from "src/state" +import { SapiRegionModel } from "src/atlasComponents/sapi" +import * as configSvc from "../config.service" +import { LayerCtrlEffects } from "../layerCtrl.service/layerCtrl.effects" +import { NEVER, of, pipe } from "rxjs" +import { mapTo } from "rxjs/operators" +import { selectorAuxMeshes } from "../store" -const fits1 = { - ngId: 'foobar', - labelIndex: 123, - children: [] +const fits1 = {} as SapiRegionModel +const auxMesh = { + "@id": 'bla', + labelIndicies: [1,2,3], + name: 'bla', + ngId: 'bla', + rgb: [255, 255, 255] as [number, number, number], + visible: true, + displayName: 'bla' } -const fits1_1 = { - ngId: 'foobar', - labelIndex: 5, - children: [] -} - -const fits2 = { - ngId: 'helloworld', - labelIndex: 567, - children: [] -} - -const fits2_1 = { - ngId: 'helloworld', - labelIndex: 11, - children: [] -} - -const nofit1 = { - ngId: 'bazz', - children: [] -} +describe('> mesh.service.ts', () => { + let getParcNgIdSpy: jasmine.Spy = jasmine.createSpy('getParcNgId') + let getRegionLabelIndexSpy: jasmine.Spy = jasmine.createSpy('getRegionLabelIndexSpy') + let getATPSpy: jasmine.Spy = jasmine.createSpy('distinctATP') -const nofit2 = { - ngId: 'but', - children: [] -} - -describe('> mesh.server.ts', () => { + const mockAtlas = { + '@id': 'mockAtlas' + } + const mockTmpl = { + '@id': 'mockTmpl' + } + const mockParc = { + '@id': 'mockParc' + } + beforeEach(() => { + spyOnProperty(configSvc, 'getParcNgId').and.returnValue(getParcNgIdSpy) + spyOnProperty(configSvc, 'getRegionLabelIndex').and.returnValue(getRegionLabelIndexSpy) + getATPSpy = spyOn(atlasSelection.fromRootStore, 'distinctATP') + getATPSpy.and.returnValue( + pipe( + mapTo({ + atlas: mockAtlas, + parcellation: mockParc, + template: mockTmpl + }) + ) + ) + }) describe('> NehubaMeshService', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [ provideMockStore(), NehubaMeshService, + { + provide: LayerCtrlEffects, + useValue: { + onATPDebounceNgLayers$: NEVER + } + } ] }) - const mockStore = TestBed.inject(MockStore) - mockStore.overrideSelector(viewerStateSelectedParcellationSelector, {}) - mockStore.overrideSelector(viewerStateSelectedTemplateSelector, {}) }) it('> can be init', () => { @@ -61,24 +74,32 @@ describe('> mesh.server.ts', () => { it('> mixes in auxillaryMeshIndices', () => { const mockStore = TestBed.inject(MockStore) - mockStore.overrideSelector(viewerStateSelectedRegionsSelector, [ fits1 ]) + mockStore.overrideSelector(atlasSelection.selectors.selectedRegions, [ fits1 ]) + mockStore.overrideSelector(atlasSelection.selectors.selectedParcAllRegions, []) + mockStore.overrideSelector(selectorAuxMeshes, [auxMesh]) + + const ngId = 'blabla' + const labelIndex = 12 + getParcNgIdSpy.and.returnValue(ngId) + getRegionLabelIndexSpy.and.returnValue(labelIndex) const service = TestBed.inject(NehubaMeshService) + expect( service.loadMeshes$ ).toBeObservable( hot('(ab)', { a: { layer: { - name: fits1.ngId + name: ngId }, - labelIndicies: [ fits1.labelIndex ] + labelIndicies: [ labelIndex ] }, b: { layer: { - name: fits2.ngId, + name: auxMesh.ngId, }, - labelIndicies: [11, 22] + labelIndicies: auxMesh.labelIndicies } }) ) diff --git a/src/viewerModule/nehuba/mesh.service/mesh.service.ts b/src/viewerModule/nehuba/mesh.service/mesh.service.ts index 6313ccba3..c44774976 100644 --- a/src/viewerModule/nehuba/mesh.service/mesh.service.ts +++ b/src/viewerModule/nehuba/mesh.service/mesh.service.ts @@ -33,8 +33,6 @@ export class NehubaMeshService implements OnDestroy { map(({ tmplAuxNgLayers }) => tmplAuxNgLayers) ) - private ngLayers$ = this.effect.onATPDebounceNgLayers$ - public loadMeshes$: Observable<IMeshesToLoad> = merge( combineLatest([ this.store$.pipe( @@ -48,11 +46,6 @@ export class NehubaMeshService implements OnDestroy { ) ]).pipe( switchMap(([{ atlas, template, parcellation }, regions, selectedRegions]) => { - const tree = new Tree( - regions, - (c, p) => (c.hasParent || []).some(_p => _p["@id"] === p["@id"]) - ) - const ngIdRecord: Record<string, number[]> = {} if (selectedRegions.length > 0) { for (const r of selectedRegions) { @@ -64,6 +57,11 @@ export class NehubaMeshService implements OnDestroy { ngIdRecord[ngId].push(regionLabelIndex) } } else { + const tree = new Tree( + regions, + (c, p) => (c.hasParent || []).some(_p => _p["@id"] === p["@id"]) + ) + for (const r of regions) { const regionLabelIndex = getRegionLabelIndex( atlas, template, parcellation, r ) if (!regionLabelIndex) { @@ -82,7 +80,7 @@ export class NehubaMeshService implements OnDestroy { } } const arr: IMeshesToLoad[] = [] - + for (const ngId in ngIdRecord) { const labelIndicies = ngIdRecord[ngId] arr.push({ diff --git a/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.spec.ts b/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.spec.ts index 304ef3b4b..c6437fc7c 100644 --- a/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.spec.ts +++ b/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.spec.ts @@ -1,12 +1,10 @@ -import { TestBed, async, fakeAsync, tick, ComponentFixture } from "@angular/core/testing" -import { CommonModule, DOCUMENT } from "@angular/common" +import { TestBed, fakeAsync, tick, ComponentFixture } from "@angular/core/testing" +import { CommonModule } from "@angular/common" import { NehubaViewerUnit, IMPORT_NEHUBA_INJECT_TOKEN, scanFn } from "./nehubaViewer.component" -import { importNehubaFactory } from "../util" import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service" import { LoggingModule, LoggingService } from "src/logging" -import { APPEND_SCRIPT_TOKEN, appendScriptFactory } from "src/util/constants" import { IMeshesToLoad, SET_MESHES_TO_LOAD } from "../constants" -import { ReplaySubject, Subject } from "rxjs" +import { Subject } from "rxjs" import { IColorMap, SET_COLORMAP_OBS, SET_LAYER_VISIBILITY } from "../layerCtrl.service" describe('> nehubaViewer.component.ts', () => { @@ -78,14 +76,12 @@ describe('> nehubaViewer.component.ts', () => { }) describe('> NehubaViewerUnit', () => { - let provideSetMeshToLoadCtrl = true - let provideLayerVisibility = true - let provideSetColorObs = true const setMeshToLoadCtl$ = new Subject<IMeshesToLoad>() - let setLayerVisibility$: Subject<string[]> - let setcolorMap$: Subject<IColorMap> - beforeEach(async(() => { - TestBed.configureTestingModule({ + let setLayerVisibility$: Subject<string[]> = new Subject() + let setcolorMap$: Subject<IColorMap> = new Subject() + let fixture: ComponentFixture<NehubaViewerUnit> + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [ CommonModule, LoggingModule @@ -100,111 +96,41 @@ describe('> nehubaViewer.component.ts', () => { }, { provide: SET_MESHES_TO_LOAD, - useFactory: () => provideSetMeshToLoadCtrl - ? setMeshToLoadCtl$ - : null + useFactory: () => setMeshToLoadCtl$ }, { provide: SET_LAYER_VISIBILITY, - useFactory: () => { - setLayerVisibility$ = provideLayerVisibility - ? new ReplaySubject(1) - : null - return setLayerVisibility$ - } + useValue: setLayerVisibility$ }, { provide: SET_COLORMAP_OBS, - useFactory: () => { - setcolorMap$ = provideSetColorObs - ? new ReplaySubject(1) - : null - return setcolorMap$ - } + useValue: setcolorMap$ }, AtlasWorkerService, LoggingService, ] }).compileComponents() - })) + }) it('> creates component', () => { - const fixture = TestBed.createComponent(NehubaViewerUnit) + fixture = TestBed.createComponent(NehubaViewerUnit) expect(fixture.componentInstance).toBeTruthy() }) - describe('> on create', () => { - it('> calls onInit lifecycle param properly', () => { - const onInitSpy = jasmine.createSpy('onInit') - const fixture = TestBed.createComponent(NehubaViewerUnit) - fixture.componentInstance.lifecycle = { - onInit: onInitSpy - } - - fixture.detectChanges() - - expect(onInitSpy).toHaveBeenCalled() - }) - }) - describe('> loading meshes', () => { - describe('> native', () => { - beforeAll(() => { - provideSetMeshToLoadCtrl = false - }) - it('> on loadMeshes$ emit, calls nehubaViewer.setMeshesToLoad', fakeAsync(() => { - - const fixture = TestBed.createComponent(NehubaViewerUnit) - fixture.componentInstance.nehubaViewer = { - setMeshesToLoad: jasmine.createSpy('setMeshesToLoad').and.returnValue(null), - dispose: () => {} - } - - fixture.detectChanges() - fixture.componentInstance['loadMeshes$'].next({ - layer: { - name: 'foo-bar' - }, - labelIndicies: [1,2,3] - }) - tick(1000) - expect(fixture.componentInstance.nehubaViewer.setMeshesToLoad).toHaveBeenCalledWith([1,2,3], { name: 'foo-bar' }) - })) + beforeEach(() => { + fixture = TestBed.createComponent(NehubaViewerUnit) + fixture.componentInstance.nehubaViewer = { + setMeshesToLoad: jasmine.createSpy('setMeshesToLoad').and.returnValue(null), + dispose: () => {} + } + fixture.componentInstance['_nehubaReady'] = true }) describe('> injecting SET_MESHES_TO_LOAD', () => { - beforeAll(() => { - provideSetMeshToLoadCtrl = true - }) - it('> navtive loadMeshes method will not trigger loadMesh call',fakeAsync(() => { - - const fixture = TestBed.createComponent(NehubaViewerUnit) - fixture.detectChanges() - const setMeshToLoadSpy = jasmine.createSpy('setMeshesToLoad').and.returnValue(null) - fixture.componentInstance.nehubaViewer = { - setMeshesToLoad: setMeshToLoadSpy, - dispose: () => {} - } - - fixture.detectChanges() - fixture.componentInstance['loadMeshes$'].next({ - layer: { - name: 'foo-bar' - }, - labelIndicies: [1,2,3] - }) - tick(1000) - expect(setMeshToLoadSpy).not.toHaveBeenCalledWith([1,2,3], { name: 'foo-bar' }) - })) it('> when injected obs emits, will trigger loadMesh call', fakeAsync(() => { - const fixture = TestBed.createComponent(NehubaViewerUnit) - fixture.componentInstance.nehubaViewer = { - setMeshesToLoad: jasmine.createSpy('setMeshesToLoad').and.returnValue(null), - dispose: () => {} - } - fixture.detectChanges() setMeshToLoadCtl$.next({ labelIndicies: [1,2,3], @@ -212,7 +138,7 @@ describe('> nehubaViewer.component.ts', () => { name: 'foo-bar' } }) - tick(1000) + tick(400) expect(fixture.componentInstance.nehubaViewer.setMeshesToLoad).toHaveBeenCalledWith([1,2,3], { name: 'foo-bar' }) })) }) @@ -250,12 +176,12 @@ describe('> nehubaViewer.component.ts', () => { dispose: () => {} } - provideLayerVisibility = true + fixture = TestBed.createComponent(NehubaViewerUnit) + fixture.componentInstance.nehubaViewer = nehubaViewerSpy + fixture.componentInstance['_nehubaReady'] = true }) it('> if provided obs does not emit, does not call manage layers', fakeAsync(() => { - const fixture = TestBed.createComponent(NehubaViewerUnit) - fixture.componentInstance.nehubaViewer = nehubaViewerSpy fixture.detectChanges() tick(320) expect(managedLayersSpy).not.toHaveBeenCalled() @@ -264,9 +190,7 @@ describe('> nehubaViewer.component.ts', () => { describe('> if provided obs does emit', () => { const setup = (emit = []) => { - const fixture = TestBed.createComponent(NehubaViewerUnit) setLayerVisibility$.next(emit) - fixture.componentInstance.nehubaViewer = nehubaViewerSpy fixture.detectChanges() tick(640) } @@ -311,11 +235,13 @@ describe('> nehubaViewer.component.ts', () => { let prvSetCMSpy: jasmine.Spy const setup = () => { - const fixture = TestBed.createComponent(NehubaViewerUnit) + fixture = TestBed.createComponent(NehubaViewerUnit) + fixture.componentInstance['_nehubaReady'] = true + /** * set nehubaViewer, since some methods check viewer is loaded */ - fixture.componentInstance.nehubaViewer = { + fixture.componentInstance.nehubaViewer = { ngviewer: {}, dispose: () => {} } @@ -323,9 +249,6 @@ describe('> nehubaViewer.component.ts', () => { prvSetCMSpy = spyOn<any>(fixture.componentInstance, 'setColorMap').and.callFake(() => {}) } - beforeEach(() => { - provideSetColorObs = true - }) describe('> obs does not emit', () => { beforeEach(fakeAsync(() => { setup() diff --git a/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.spec.ts b/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.spec.ts index 3d1e7d077..a67987386 100644 --- a/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.spec.ts +++ b/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.spec.ts @@ -17,9 +17,11 @@ import { NehubaMeshService } from "../mesh.service" import { NehubaViewerTouchDirective } from "../nehubaViewerInterface/nehubaViewerTouch.directive" import { selectorAuxMeshes } from "../store" import { NehubaGlueCmp } from "./nehubaViewerGlue.component" -import { HarnessLoader } from "@angular/cdk/testing" import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service" -import { userInterface, atlasSelection, userPreference, atlasAppearance } from "src/state" +import { userInterface, atlasSelection, userPreference, atlasAppearance, annotation, userInteraction } from "src/state" +import { SapiAtlasModel, SAPIModule, SapiParcellationModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi" +import { LayerCtrlEffects } from "../layerCtrl.service/layerCtrl.effects" +import { NEHUBA_INSTANCE_INJTKN } from "../util" @Component({ selector: 'viewer-ctrl-component', @@ -47,22 +49,28 @@ class MockNehubaViewerContainerDirective{ describe('> nehubaViewerGlue.component.ts', () => { let mockStore: MockStore - let rootLoader: HarnessLoader let fixture: ComponentFixture<NehubaGlueCmp> + const selectedATPR$ = new Subject<{ + atlas: SapiAtlasModel, + parcellation: SapiParcellationModel, + template: SapiSpaceModel, + regions: SapiRegionModel[], + }>() beforeEach( async () => { await TestBed.configureTestingModule({ imports: [ CommonModule, AngularMaterialModule, - LayoutModule, - Landmark2DModule, + FormsModule, + ReactiveFormsModule, + QuickTourModule, ComponentsModule, UtilModule, WindowResizeModule, - FormsModule, - ReactiveFormsModule, - // NehubaModule, + LayoutModule, + Landmark2DModule, + SAPIModule, ], declarations: [ NehubaGlueCmp, @@ -77,11 +85,7 @@ describe('> nehubaViewerGlue.component.ts', () => { * TODO, figureout which dependency is selecting viewerState.parcellationSelected * then remove the inital state */ - provideMockStore({ - initialState: { - viewerState: {} - } - }), + provideMockStore(), { provide: CLICK_INTERCEPTOR_INJECTOR, useFactory: (clickIntService: ClickInterceptorService) => { @@ -100,6 +104,7 @@ describe('> nehubaViewerGlue.component.ts', () => { visibleLayer$: new Subject(), segmentVis$: new Subject(), ngLayersController$: new Subject(), + selectedATPR$ } }, { provide: NehubaMeshService, @@ -118,6 +123,15 @@ describe('> nehubaViewerGlue.component.ts', () => { } } } + },{ + provide: NEHUBA_INSTANCE_INJTKN, + useValue: NEVER + }, + { + provide: LayerCtrlEffects, + useValue: { + onATPDebounceNgLayers$: NEVER + } } ] }).compileComponents() @@ -128,8 +142,18 @@ describe('> nehubaViewerGlue.component.ts', () => { mockStore.overrideSelector(userInterface.selectors.panelMode, "FOUR_PANEL") mockStore.overrideSelector(userInterface.selectors.panelOrder, '0123') mockStore.overrideSelector(atlasAppearance.selectors.octantRemoval, true) + + mockStore.overrideSelector(atlasSelection.selectors.selectedAtlas, null) + mockStore.overrideSelector(atlasSelection.selectors.selectedTemplate, null) + mockStore.overrideSelector(atlasSelection.selectors.selectedParcellation, null) mockStore.overrideSelector(atlasSelection.selectors.selectedRegions, []) + mockStore.overrideSelector(atlasSelection.selectors.selectedParcAllRegions, []) + mockStore.overrideSelector(userInteraction.selectors.mousingOverRegions, []) + mockStore.overrideSelector(atlasSelection.selectors.navigation, null) + mockStore.overrideSelector(atlasAppearance.selectors.showDelineation, true) + mockStore.overrideSelector(atlasAppearance.selectors.customLayers, []) + mockStore.overrideSelector(annotation.selectors.annotations, []) mockStore.overrideSelector(selectorAuxMeshes, []) }) @@ -222,14 +246,14 @@ describe('> nehubaViewerGlue.component.ts', () => { }) describe('> handleFileDrop', () => { - let addNgLayerSpy: jasmine.Spy - let removeNgLayersSpy: jasmine.Spy + let dispatchSpy: jasmine.Spy let workerSendMessageSpy: jasmine.Spy let dummyFile1: File let dummyFile2: File let input: File[] beforeEach(() => { + dispatchSpy = spyOn(mockStore, 'dispatch') dummyFile1 = (() => { const bl: any = new Blob([], { type: 'text' }) bl.name = 'filename1.txt' @@ -247,13 +271,6 @@ describe('> nehubaViewerGlue.component.ts', () => { fixture = TestBed.createComponent(NehubaGlueCmp) fixture.detectChanges() - addNgLayerSpy = spyOn(fixture.componentInstance['layerCtrlService'], 'addNgLayer').and.callFake(() => { - - }) - removeNgLayersSpy = spyOn(fixture.componentInstance['layerCtrlService'], 'removeNgLayers').and.callFake(() => { - - }) - workerSendMessageSpy = spyOn(fixture.componentInstance['worker'], 'sendMessage').and.callFake(async () => { return { result: { @@ -263,8 +280,7 @@ describe('> nehubaViewerGlue.component.ts', () => { }) }) afterEach(() => { - addNgLayerSpy.calls.reset() - removeNgLayersSpy.calls.reset() + dispatchSpy.calls.reset() workerSendMessageSpy.calls.reset() }) @@ -287,8 +303,7 @@ describe('> nehubaViewerGlue.component.ts', () => { }) it('> should not call addnglayer', () => { - expect(removeNgLayersSpy).not.toHaveBeenCalled() - expect(addNgLayerSpy).not.toHaveBeenCalled() + expect(dispatchSpy).not.toHaveBeenCalled() }) // TODO having a difficult time getting snackbar harness @@ -322,15 +337,28 @@ describe('> nehubaViewerGlue.component.ts', () => { }) it('> should call addNgLayer', () => { - expect(removeNgLayersSpy).not.toHaveBeenCalled() - expect(addNgLayerSpy).toHaveBeenCalledTimes(1) + expect(dispatchSpy).toHaveBeenCalledTimes(1) + const arg = dispatchSpy.calls.argsFor(0) + expect(arg.length).toEqual(1) + expect(arg[0].type).toBe(atlasAppearance.actions.addCustomLayer.type) }) it('> on repeated input, both remove nglayer and remove ng layer called', async () => { const cmp = fixture.componentInstance await cmp.handleFileDrop(input) - expect(removeNgLayersSpy).toHaveBeenCalledTimes(1) - expect(addNgLayerSpy).toHaveBeenCalledTimes(2) + expect(dispatchSpy).toHaveBeenCalledTimes(3) + + const arg0 = dispatchSpy.calls.argsFor(0) + expect(arg0.length).toEqual(1) + expect(arg0[0].type).toBe(atlasAppearance.actions.addCustomLayer.type) + + const arg1 = dispatchSpy.calls.argsFor(1) + expect(arg1.length).toEqual(1) + expect(arg1[0].type).toBe(atlasAppearance.actions.removeCustomLayer.type) + + const arg2 = dispatchSpy.calls.argsFor(2) + expect(arg2.length).toEqual(1) + expect(arg2[0].type).toBe(atlasAppearance.actions.addCustomLayer.type) }) }) }) diff --git a/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts b/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts index 707a473bf..0efb76e7e 100644 --- a/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts +++ b/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts @@ -187,14 +187,12 @@ export class NehubaGlueCmp implements IViewer<'nehuba'>, OnDestroy, AfterViewIni constructor( private store$: Store<any>, - private log: LoggingService, private snackbar: MatSnackBar, private dialog: MatDialog, private worker: AtlasWorkerService, - private cdr: ChangeDetectorRef, + private layerCtrlService: NehubaLayerControlService, @Optional() @Inject(CLICK_INTERCEPTOR_INJECTOR) clickInterceptor: ClickInterceptor, @Optional() @Inject(API_SERVICE_SET_VIEWER_HANDLE_TOKEN) setViewerHandle: TSetViewerHandle, - @Optional() private layerCtrlService: NehubaLayerControlService, ){ /** * This **massively** improve the performance of the viewer diff --git a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.spec.ts b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.spec.ts index 49dbb2e31..9b7a7b09d 100644 --- a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.spec.ts +++ b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.spec.ts @@ -1,22 +1,26 @@ import { Component } from "@angular/core" -import { TestBed, async, ComponentFixture, fakeAsync, tick } from "@angular/core/testing" +import { TestBed, ComponentFixture, fakeAsync, tick } from "@angular/core/testing" import { By } from "@angular/platform-browser" import { MockStore, provideMockStore } from "@ngrx/store/testing" import { NehubaViewerUnit } from "../nehubaViewer/nehubaViewer.component" import { NehubaViewerContainerDirective } from "./nehubaViewerInterface.directive" -import { Subject } from "rxjs" +import { NEVER, of, pipe, Subject } from "rxjs" import { userPreference, atlasSelection, atlasAppearance } from "src/state" +import { NehubaNavigationService } from "../navigation.service" +import { LayerCtrlEffects } from "../layerCtrl.service/layerCtrl.effects" +import { mapTo } from "rxjs/operators" describe('> nehubaViewerInterface.directive.ts', () => { + let distinctATPSpy: jasmine.Spy describe('> NehubaViewerContainerDirective', () => { - @Component({ template: '' }) class DummyCmp{} - beforeEach(async(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + distinctATPSpy = spyOn(atlasSelection.fromRootStore, 'distinctATP') + await TestBed.configureTestingModule({ imports: [ ], @@ -26,7 +30,20 @@ describe('> nehubaViewerInterface.directive.ts', () => { NehubaViewerUnit, ], providers: [ - provideMockStore({ initialState: {} }) + provideMockStore(), + { + provide: NehubaNavigationService, + useValue: { + viewerNav$: NEVER, + storeNav: null + } + }, + { + provide: LayerCtrlEffects, + useValue: { + onATPDebounceNgLayers$: of({ parcNgLayers: {} }) + } + } ] }).overrideComponent(DummyCmp, { set: { @@ -37,10 +54,22 @@ describe('> nehubaViewerInterface.directive.ts', () => { } }).compileComponents() - })) + distinctATPSpy.and.returnValue( + pipe( + mapTo({ + atlas: null, + parcellation: null, + template: null + }) + ) + ) - beforeEach(() => { const mockStore = TestBed.inject(MockStore) + // mockStore.overrideSelector(atlasSelection.selectors.selectedAtlas, null) + // mockStore.overrideSelector(atlasSelection.selectors.selectedTemplate, null) + // mockStore.overrideSelector(atlasSelection.selectors.selectedParcellation, null) + + mockStore.overrideSelector(atlasAppearance.selectors.customLayers, []) mockStore.overrideSelector(atlasAppearance.selectors.octantRemoval, true) mockStore.overrideSelector(atlasSelection.selectors.standaloneVolumes, []) mockStore.overrideSelector(atlasSelection.selectors.navigation, null) @@ -84,11 +113,17 @@ describe('> nehubaViewerInterface.directive.ts', () => { destroy: jasmine.createSpy('destroy') } - beforeEach(() => { + const gpuLimit = 5e8 + beforeEach(fakeAsync(() => { + const mockStore = TestBed.inject(MockStore) + mockStore.overrideSelector(userPreference.selectors.gpuLimit, gpuLimit) + fixture = TestBed.createComponent(DummyCmp) const directive = fixture.debugElement.query( By.directive(NehubaViewerContainerDirective) ) + + tick(300) directiveInstance = directive.injector.get(NehubaViewerContainerDirective) @@ -97,29 +132,27 @@ describe('> nehubaViewerInterface.directive.ts', () => { // casting return value to any is not perfect, but since only 2 methods and 1 property is used, it's a quick way // rather than allow component to be created elCreateComponentSpy = spyOn(directiveInstance['el'], 'createComponent').and.returnValue(spyComRef as any) - }) + })) describe('> on createNehubaInstance called', () => { - const template = {} - const lifecycle = {} - it('> method el.clear gets called before el.createComponent', () => { - directiveInstance.createNehubaInstance(template, lifecycle) + const nehubaConfig = { + dataset: { + initialNgState: { + + } + } + } + it('> method el.clear gets called before el.createComponent', async () => { + await directiveInstance.createNehubaInstance(nehubaConfig) expect(elClearSpy).toHaveBeenCalledBefore(elCreateComponentSpy) }) - it('> if viewerConfig has gpuLimit, gpuMemoryLimit will be in initialNgSTate', () => { - template['nehubaConfig'] = { - dataset: { - initialNgState: {} - } - } - directiveInstance['viewerConfig'] = { - gpuLimit: 5e8 - } - directiveInstance.createNehubaInstance(template, lifecycle) + it('> if viewerConfig has gpuLimit, gpuMemoryLimit will be in initialNgSTate', async () => { + + await directiveInstance.createNehubaInstance(nehubaConfig) expect( directiveInstance.nehubaViewerInstance?.config?.dataset?.initialNgState?.gpuMemoryLimit - ).toEqual(5e8) + ).toEqual(gpuLimit) expect( directiveInstance.nehubaViewerInstance?.config?.dataset?.initialNgState?.gpuLimit ).toBeFalsy() diff --git a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts index a43176fe1..7ccfa003c 100644 --- a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts +++ b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts @@ -205,7 +205,6 @@ export class NehubaViewerContainerDirective implements OnDestroy{ const { parcNgLayers, - tmplAuxNgLayers, } = await this.effect.onATPDebounceNgLayers$.pipe( take(1) ).toPromise() @@ -242,7 +241,7 @@ export class NehubaViewerContainerDirective implements OnDestroy{ }), this.gpuLimit$.pipe( - debounceTime(200), + debounceTime(160), ).subscribe(limit => { this.gpuLimit = limit if (this.nehubaViewerInstance && this.nehubaViewerInstance.nehubaViewer) { @@ -306,18 +305,17 @@ export class NehubaViewerContainerDirective implements OnDestroy{ } } - /** - * apply viewer config such as gpu limit - */ - - this.nehubaViewerInstance.config = nehubaConfig - if (this.gpuLimit) { const initialNgState = nehubaConfig && nehubaConfig.dataset && nehubaConfig.dataset.initialNgState // the correct key is gpuMemoryLimit initialNgState.gpuMemoryLimit = this.gpuLimit } + /** + * apply viewer config such as gpu limit + */ + + this.nehubaViewerInstance.config = nehubaConfig this.nehubaViewerSubscriptions.push( this.nehubaViewerInstance.mouseoverSegmentEmitter.pipe( diff --git a/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts b/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts index 14919d73d..ce0afa8fa 100644 --- a/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts +++ b/src/viewerModule/nehuba/statusCard/statusCard.component.spec.ts @@ -1,9 +1,9 @@ -import { async, ComponentFixture, TestBed } from "@angular/core/testing" +import { ComponentFixture, TestBed } from "@angular/core/testing" import { CommonModule } from "@angular/common" import { AngularMaterialModule } from "src/sharedModules" import { StatusCardComponent } from "./statusCard.component" import { Directive, Component } from "@angular/core" -import { Observable, of } from "rxjs" +import { of } from "rxjs" import { ShareModule } from "src/share" import { StateModule } from "src/state" import { MockStore, provideMockStore } from "@ngrx/store/testing" @@ -12,11 +12,10 @@ import { MatSlideToggle } from "@angular/material/slide-toggle" import { NoopAnimationsModule } from "@angular/platform-browser/animations" import { FormsModule, ReactiveFormsModule } from "@angular/forms" import { UtilModule } from "src/util" -import { viewerConfigSelectorUseMobileUi } from "src/services/state/viewerConfig.store.helper" -import { viewerStateNavigationStateSelector, viewerStateSelectedTemplatePureSelector } from "src/services/state/viewerState/selectors" -import * as util from '../util' +import * as configSvc from '../config.service' import {QuickTourModule} from "src/ui/quickTour/module"; -import { actions } from "src/state/atlasSelection" +import { atlasSelection } from "src/state" +import { SapiSpaceModel } from "src/atlasComponents/sapi" @Directive({ selector: '[iav-auth-auth-state]', @@ -36,8 +35,8 @@ class MockSigninModal{} describe('> statusCard.component.ts', () => { describe('> StatusCardComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ imports: [ CommonModule, AngularMaterialModule, @@ -64,12 +63,15 @@ describe('> statusCard.component.ts', () => { }) ] }).compileComponents() - })) + }) beforeEach(() => { const mockStore = TestBed.inject(MockStore) - mockStore.overrideSelector(viewerConfigSelectorUseMobileUi, false) + + mockStore.overrideSelector(atlasSelection.selectors.selectedTemplate, { + '@id': 'minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588' + } as SapiSpaceModel) }) @@ -139,24 +141,29 @@ describe('> statusCard.component.ts', () => { perspectiveOrientation: [1,0,0,0] } - const mockNavState = { - orientation: [0,0,0,1], - position: [10,20,30], - perspectiveZoom: 1e6, - zoom: 1e6, - perspectiveOrientation: [0,0,0,1] + const mockNehubaConfig = { + dataset: { + initialNgState: { + navigation: { + pose: { + orientation: [0,0,0,1], + position: [10, 20, 30] + }, + zoomFactor: 1e6 + } + } + } } - const mockTemplate = { foo:'bar', nehubaConfig: { foo2: 'bar2' } } - let getNavigationStateFromConfigSpy: jasmine.Spy = jasmine.createSpy('getNavigationStateFromConfig').and.returnValue(mockNavState) + let getNavigationStateFromConfigSpy: jasmine.Spy = jasmine.createSpy('getNavigationStateFromConfig').and.returnValue(mockNehubaConfig) beforeEach(() => { const mockStore = TestBed.inject(MockStore) - mockStore.overrideSelector(viewerStateSelectedTemplatePureSelector, mockTemplate) - mockStore.overrideSelector(viewerStateNavigationStateSelector, mockCurrNavigation) - - spyOnProperty(util, 'getNavigationStateFromConfig').and.returnValue(getNavigationStateFromConfigSpy) + mockStore.overrideSelector(atlasSelection.selectors.selectedTemplate, null) + mockStore.overrideSelector(atlasSelection.selectors.navigation, mockCurrNavigation) + spyOnProperty(configSvc, 'getNehubaConfig').and.returnValue(getNavigationStateFromConfigSpy) + fixture = TestBed.createComponent(StatusCardComponent) fixture.detectChanges() fixture.componentInstance.showFull = true @@ -180,11 +187,11 @@ describe('> statusCard.component.ts', () => { fixture.detectChanges() const overrideObj = {} - if (method === 'rotation') overrideObj['orientation'] = mockNavState['orientation'] - if (method === 'position') overrideObj['position'] = mockNavState['position'] - if (method === 'zoom') overrideObj['zoom'] = mockNavState['zoom'] + if (method === 'rotation') overrideObj['orientation'] = mockNehubaConfig.dataset.initialNgState.navigation.pose.orientation + if (method === 'position') overrideObj['position'] = mockNehubaConfig.dataset.initialNgState.navigation.pose.position + if (method === 'zoom') overrideObj['zoom'] = mockNehubaConfig.dataset.initialNgState.navigation.zoomFactor expect(idspatchSpy).toHaveBeenCalledWith( - actions.navigateTo({ + atlasSelection.actions.navigateTo({ navigation: { ...mockCurrNavigation, ...overrideObj, diff --git a/src/viewerModule/nehuba/statusCard/statusCard.component.ts b/src/viewerModule/nehuba/statusCard/statusCard.component.ts index 324978a85..9d0fa79b6 100644 --- a/src/viewerModule/nehuba/statusCard/statusCard.component.ts +++ b/src/viewerModule/nehuba/statusCard/statusCard.component.ts @@ -17,10 +17,12 @@ import { MatDialog } from "@angular/material/dialog"; import { ARIA_LABELS, QUICKTOUR_DESC } from 'common/constants' import { FormControl } from "@angular/forms"; -import { getNavigationStateFromConfig, NEHUBA_INSTANCE_INJTKN } from '../util' +import { NEHUBA_INSTANCE_INJTKN } from '../util' import { IQuickTourData } from "src/ui/quickTour/constrants"; import { actions } from "src/state/atlasSelection"; import { atlasSelection } from "src/state"; +import { SapiSpaceModel } from "src/atlasComponents/sapi"; +import { getNehubaConfig } from "../config.service"; @Component({ selector : 'iav-cmp-viewer-nehuba-status', @@ -43,7 +45,7 @@ export class StatusCardComponent implements OnInit, OnChanges{ public arialabel = ARIA_LABELS.STATUS_PANEL public showFull = false - private selectedTemplatePure: any + private selectedTemplate: SapiSpaceModel private currentNavigation: any private subscriptions: Subscription[] = [] @@ -91,7 +93,7 @@ export class StatusCardComponent implements OnInit, OnChanges{ this.subscriptions.push( this.store$.pipe( select(atlasSelection.selectors.selectedTemplate) - ).subscribe(n => this.selectedTemplatePure = n) + ).subscribe(n => this.selectedTemplate = n) ) this.subscriptions.push( @@ -177,11 +179,14 @@ export class StatusCardComponent implements OnInit, OnChanges{ * the info re: nehubaViewer can stay there, too */ public resetNavigation({rotation: rotationFlag = false, position: positionFlag = false, zoom : zoomFlag = false}: {rotation?: boolean, position?: boolean, zoom?: boolean}) { + const config = getNehubaConfig(this.selectedTemplate) const { orientation, - position, - zoom - } = getNavigationStateFromConfig(this.selectedTemplatePure.nehubaConfig) + position + } = config.dataset.initialNgState.navigation.pose + const { + zoomFactor: zoom + } = config.dataset.initialNgState.navigation this.store$.dispatch( actions.navigateTo({ @@ -191,7 +196,7 @@ export class StatusCardComponent implements OnInit, OnChanges{ ...(positionFlag ? { position: position } : {}), ...(zoomFlag ? { zoom: zoom } : {}), }, - physical: false, + physical: true, animation: true }) ) diff --git a/src/viewerModule/nehuba/util.ts b/src/viewerModule/nehuba/util.ts index ec6063f7c..739c823b4 100644 --- a/src/viewerModule/nehuba/util.ts +++ b/src/viewerModule/nehuba/util.ts @@ -163,36 +163,6 @@ export const isIdentityQuat = ori => Math.abs(ori[0]) < 1e-6 && Math.abs(ori[2]) < 1e-6 && Math.abs(ori[3] - 1) < 1e-6 -export const getNavigationStateFromConfig = nehubaConfig => { - const { - navigation = {}, - perspectiveOrientation = [0, 0, 0, 1], - perspectiveZoom = 1e7 - } = (nehubaConfig && nehubaConfig.dataset && nehubaConfig.dataset.initialNgState) || {} - - const { - zoomFactor = 3e5, - pose = {} - } = navigation || {} - - const { - voxelSize = [1e6, 1e6, 1e6], - voxelCoordinates = [0, 0, 0] - } = (pose && pose.position) || {} - - const { - orientation = [0, 0, 0, 1] - } = pose || {} - - return { - orientation, - perspectiveOrientation, - perspectiveZoom, - position: [0, 1, 2].map(idx => voxelSize[idx] * voxelCoordinates[idx]), - zoom: zoomFactor - } -} - export const calculateSliceZoomFactor = (originalZoom) => originalZoom ? 700 * originalZoom / Math.min(window.innerHeight, window.innerWidth) : 1e7 diff --git a/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts b/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts index b9c8b3737..c5042ecfc 100644 --- a/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts +++ b/src/viewerModule/nehuba/viewerCtrl/viewerCtrlCmp/viewerCtrlCmp.component.spec.ts @@ -5,7 +5,7 @@ import { MockStore, provideMockStore } from "@ngrx/store/testing" import { BehaviorSubject, of } from "rxjs" import { ComponentsModule } from "src/components" import { AngularMaterialModule } from "src/sharedModules" -import {PureContantService, UtilModule} from "src/util" +import { UtilModule } from "src/util" import { actionSetAuxMeshes, selectorAuxMeshes } from "../../store" import { NEHUBA_INSTANCE_INJTKN } from "../../util" import { ViewerCtrlCmp } from "./viewerCtrlCmp.component" @@ -65,14 +65,6 @@ describe('> viewerCtrlCmp.component.ts', () => { useFactory: () => { return new BehaviorSubject(mockNehubaViewer).asObservable() } - }, - { - provide: PureContantService, - useFactory: () => { - return { - getViewerConfig: jasmine.createSpy('getViewerConfig') - } - } } ] }).compileComponents() @@ -139,39 +131,6 @@ describe('> viewerCtrlCmp.component.ts', () => { ).toHaveBeenCalledWith(!wasChecked) }) }) - - describe('> toggle delineation', () => { - - let toggleDelination: jasmine.Spy - const toggleName = 'toggle-delineation' - beforeEach(() => { - toggleDelination = spyOn<any>(fixture.componentInstance, 'toggleParcVsbl') - }) - afterEach(() => { - toggleDelination.calls.reset() - }) - - it('> toggleslider should exist', async () => { - const slideToggle = await loader.getAllHarnesses( - MatSlideToggleHarness.with({ - name: toggleName, - }) - ) - expect(slideToggle.length).toBe(1) - }) - - it('> toggling it should result in setOctantRemoval to be called', async () => { - const slideToggle = await loader.getAllHarnesses( - MatSlideToggleHarness.with({ - name: toggleName, - }) - ) - await slideToggle[0].toggle() - expect( - toggleDelination - ).toHaveBeenCalled() - }) - }) }) describe('> UI aux meshes', () => { -- GitLab