diff --git a/.eslintrc.json b/.eslintrc.json index 8ce5835b..91bad378 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,8 @@ { "env": { "browser": true, - "es6": true + "es6": true, + "jest/globals": true }, "parser": "babel-eslint", "extends": ["airbnb"], @@ -17,8 +18,11 @@ "ecmaVersion": 2018, "sourceType": "module" }, - "plugins": ["react"], + "plugins": ["react", "jest"], "rules": { - "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }] + "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], + "no-underscore-dangle":"off", + "linebreak-style": "off", + "react/static-property-placement": "off" } } diff --git a/.gitignore b/.gitignore index e09ea8c6..a0ab4d28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules/ docs/ -build/ \ No newline at end of file +build/ +dist/ +coverage/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f8677c80 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2019] [NEOS company] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..85cc4e74 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +## About + +Application that allows you to vote on the list of questions, using the Ethereum tokens. The voting results can be shown to users, as well as transferred to the specified smart contracts to implement the decision logic. + +For more details goto [wiki](https://github.com/Neos1/zeroone/wiki) + +## Roadmap + +See this link: ... diff --git a/jsdoc.json b/jsdoc.json index 7ff496a5..06e8e911 100644 --- a/jsdoc.json +++ b/jsdoc.json @@ -8,19 +8,12 @@ ] }, "plugins": [ - "plugins/markdown", - "better-docs/component" + "plugins/markdown" ], "opts": { "encoding": "utf8", "destination": "docs/", "recurse": true, - "verbose": true, - "template": "./node_modules/better-docs" - }, - "templates": { - "better-docs": { - "name": "ZeroOne Documentation" - } + "verbose": true } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 163bf50e..5b262551 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "7zip-bin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", - "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.1.0.tgz", + "integrity": "sha512-AsnBZN3a8/JcNt+KPkGGODaA4c7l3W5+WpeKgGSbstSLxqWtTXqd1ieJGBQ8IFCtRg8DmmKUcSkIkUc0A4p3YA==", "dev": true }, "@babel/code-frame": { @@ -19,18 +19,18 @@ } }, "@babel/core": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", - "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", + "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.4", - "@babel/helpers": "^7.6.2", - "@babel/parser": "^7.6.4", - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.3", - "@babel/types": "^7.6.3", - "convert-source-map": "^1.1.0", + "@babel/generator": "^7.7.2", + "@babel/helpers": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.7.2", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", "json5": "^2.1.0", "lodash": "^4.17.13", @@ -40,156 +40,166 @@ } }, "@babel/generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz", - "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", "requires": { - "@babel/types": "^7.6.3", + "@babel/types": "^7.7.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", + "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", + "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-explode-assignable-expression": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz", + "integrity": "sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==", "requires": { - "@babel/types": "^7.3.0", + "@babel/types": "^7.7.0", "esutils": "^2.0.0" } }, "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz", + "integrity": "sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/helper-hoist-variables": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz", - "integrity": "sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", + "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", + "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" } }, "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", + "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", + "@babel/helper-function-name": "^7.7.0", + "@babel/types": "^7.7.0", "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", + "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", + "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", "dev": true, "requires": { - "@babel/types": "^7.5.5" + "@babel/types": "^7.7.0" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-module-transforms": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz", - "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", + "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.5.5", + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.7.0" } }, "@babel/helper-plugin-utils": { @@ -207,68 +217,68 @@ } }, "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", + "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-wrap-function": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", + "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", "dev": true, "requires": { - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.7.0" } }, "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", + "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "@babel/helper-function-name": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/helpers": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz", - "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", "requires": { - "@babel/template": "^7.6.0", - "@babel/traverse": "^7.6.2", - "@babel/types": "^7.6.0" + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/highlight": { @@ -282,46 +292,46 @@ } }, "@babel/parser": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz", - "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==" + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", + "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", + "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/helper-remap-async-to-generator": "^7.7.0", "@babel/plugin-syntax-async-generators": "^7.2.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", - "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.0.tgz", + "integrity": "sha512-tufDcFA1Vj+eWvwHN+jvMN6QsV5o+vUlytNKrbMiCeDL0F2j92RURzUsUMWE5EJkLyWxjdUslCsMQa9FWth16A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-create-class-features-plugin": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-decorators": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.6.0.tgz", - "integrity": "sha512-ZSyYw9trQI50sES6YxREXKu+4b7MAg6Qx2cvyDDYjP2Hpzd3FleOUwC9cqn1+za8d0A2ZU8SHujxFao956efUg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.0.tgz", + "integrity": "sha512-dMCDKmbYFQQTn1+VJjl5hbqlweuHl5oDeMU9B1Q7oAWi0mHxjQQDHdJIK6iW76NE1KJT3zA6dDU3weR1WT5D4A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.6.0", + "@babel/helper-create-class-features-plugin": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-decorators": "^7.2.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz", - "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", + "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -359,14 +369,13 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz", - "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", + "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-async-generators": { @@ -397,9 +406,9 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz", + "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -440,6 +449,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz", + "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-syntax-typescript": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", @@ -459,14 +477,14 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz", - "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", + "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-remap-async-to-generator": "^7.7.0" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -489,18 +507,18 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", + "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-define-map": "^7.7.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", "globals": "^11.1.0" } }, @@ -523,14 +541,13 @@ } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz", - "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", + "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-duplicate-keys": { @@ -572,12 +589,12 @@ } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", + "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", + "@babel/helper-function-name": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -611,45 +628,45 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz", - "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", + "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-module-transforms": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-simple-access": "^7.7.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz", - "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", + "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", + "@babel/helper-hoist-variables": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", + "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz", - "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", + "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", "dev": true, "requires": { - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0" } }, "@babel/plugin-transform-new-target": { @@ -710,11 +727,11 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz", + "integrity": "sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==", "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-builder-react-jsx": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-jsx": "^7.2.0" } @@ -738,9 +755,9 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", + "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", "dev": true, "requires": { "regenerator-transform": "^0.14.0" @@ -815,31 +832,30 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.3.tgz", - "integrity": "sha512-aiWINBrPMSC3xTXRNM/dfmyYuPNKY/aexYqBgh0HBI5Y+WO5oRAqW/oROYeYHrF4Zw12r9rK4fMk/ZlAmqx/FQ==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.2.tgz", + "integrity": "sha512-UWhDaJRqdPUtdK1s0sKYdoRuqK0NepjZto2UZltvuCgMoMZmdjhgz5hcRokie/3aYEaSz3xvusyoayVaq4PjRg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.6.0", + "@babel/helper-create-class-features-plugin": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-syntax-typescript": "^7.2.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz", - "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", + "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.6.0" + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/polyfill": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.6.0.tgz", - "integrity": "sha512-q5BZJI0n/B10VaQQvln1IlDK3BTBJFbADx7tv+oXDPIDZuTo37H5Adb9jhlXm/fEN4Y7/64qD9mnrJJG7rmaTw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.7.0.tgz", + "integrity": "sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ==", "dev": true, "requires": { "core-js": "^2.6.5", @@ -855,56 +871,57 @@ } }, "@babel/preset-env": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", - "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", + "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-module-imports": "^7.7.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.0", + "@babel/plugin-proposal-dynamic-import": "^7.7.0", "@babel/plugin-proposal-json-strings": "^7.2.0", "@babel/plugin-proposal-object-rest-spread": "^7.6.2", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.6.2", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", "@babel/plugin-syntax-async-generators": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-syntax-top-level-await": "^7.7.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-async-to-generator": "^7.7.0", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", "@babel/plugin-transform-block-scoping": "^7.6.3", - "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-classes": "^7.7.0", "@babel/plugin-transform-computed-properties": "^7.2.0", "@babel/plugin-transform-destructuring": "^7.6.0", - "@babel/plugin-transform-dotall-regex": "^7.6.2", + "@babel/plugin-transform-dotall-regex": "^7.7.0", "@babel/plugin-transform-duplicate-keys": "^7.5.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.7.0", "@babel/plugin-transform-literals": "^7.2.0", "@babel/plugin-transform-member-expression-literals": "^7.2.0", "@babel/plugin-transform-modules-amd": "^7.5.0", - "@babel/plugin-transform-modules-commonjs": "^7.6.0", - "@babel/plugin-transform-modules-systemjs": "^7.5.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3", + "@babel/plugin-transform-modules-commonjs": "^7.7.0", + "@babel/plugin-transform-modules-systemjs": "^7.7.0", + "@babel/plugin-transform-modules-umd": "^7.7.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", "@babel/plugin-transform-new-target": "^7.4.4", "@babel/plugin-transform-object-super": "^7.5.5", "@babel/plugin-transform-parameters": "^7.4.4", "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-regenerator": "^7.7.0", "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.6.2", "@babel/plugin-transform-sticky-regex": "^7.2.0", "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.6.2", - "@babel/types": "^7.6.3", + "@babel/plugin-transform-unicode-regex": "^7.7.0", + "@babel/types": "^7.7.1", "browserslist": "^4.6.0", "core-js-compat": "^3.1.1", "invariant": "^2.2.2", @@ -923,13 +940,13 @@ } }, "@babel/preset-react": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.6.3.tgz", - "integrity": "sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.0.tgz", + "integrity": "sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.7.0", "@babel/plugin-transform-react-jsx-self": "^7.0.0", "@babel/plugin-transform-react-jsx-source": "^7.0.0" } @@ -950,43 +967,43 @@ } }, "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", + "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", "requires": { "regenerator-runtime": "^0.13.2" } }, "@babel/template": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", - "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.0" + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" } }, "@babel/traverse": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz", - "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", "requires": { "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.6.3", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.6.3", - "@babel/types": "^7.6.3", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz", - "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1003,16 +1020,6 @@ "minimist": "^1.2.0" } }, - "@develar/schema-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.1.0.tgz", - "integrity": "sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, "@emotion/cache": { "version": "10.0.19", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.19.tgz", @@ -1026,28 +1033,28 @@ } }, "@emotion/core": { - "version": "10.0.21", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.21.tgz", - "integrity": "sha512-U9zbc7ovZ2ceIwbLXYZPJy6wPgnOdTNT4jENZ31ee6v2lojetV5bTbCVk6ciT8G3wQRyVaTTfUCH9WCrMzpRIw==", + "version": "10.0.22", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.22.tgz", + "integrity": "sha512-7eoP6KQVUyOjAkE6y4fdlxbZRA4ILs7dqkkm6oZUJmihtHv0UBq98VgPirq9T8F9K2gKu0J/au/TpKryKMinaA==", "dev": true, "requires": { "@babel/runtime": "^7.5.5", "@emotion/cache": "^10.0.17", - "@emotion/css": "^10.0.14", - "@emotion/serialize": "^0.11.10", + "@emotion/css": "^10.0.22", + "@emotion/serialize": "^0.11.12", "@emotion/sheet": "0.9.3", "@emotion/utils": "0.11.2" } }, "@emotion/css": { - "version": "10.0.14", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.14.tgz", - "integrity": "sha512-MozgPkBEWvorcdpqHZE5x1D/PLEHUitALQCQYt2wayf4UNhpgQs2tN0UwHYS4FMy5ROBH+0ALyCFVYJ/ywmwlg==", + "version": "10.0.22", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.22.tgz", + "integrity": "sha512-8phfa5mC/OadBTmGpMpwykIVH0gFCbUoO684LUkyixPq4F1Wwri7fK5Xlm8lURNBrd2TuvTbPUGxFsGxF9UacA==", "dev": true, "requires": { - "@emotion/serialize": "^0.11.8", + "@emotion/serialize": "^0.11.12", "@emotion/utils": "0.11.2", - "babel-plugin-emotion": "^10.0.14" + "babel-plugin-emotion": "^10.0.22" } }, "@emotion/hash": { @@ -1057,9 +1064,9 @@ "dev": true }, "@emotion/is-prop-valid": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.3.tgz", - "integrity": "sha512-We7VBiltAJ70KQA0dWkdPMXnYoizlxOXpvtjmu5/MBnExd+u0PGgV27WCYanmLAbCwAU30Le/xA0CQs/F/Otig==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.5.tgz", + "integrity": "sha512-6ZODuZSFofbxSbcxwsFz+6ioPjb0ISJRRPLZ+WIbjcU2IMU0Io+RGQjjaTgOvNQl007KICBm7zXQaYQEC1r6Bg==", "dev": true, "requires": { "@emotion/memoize": "0.7.3" @@ -1072,9 +1079,9 @@ "dev": true }, "@emotion/serialize": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.11.tgz", - "integrity": "sha512-YG8wdCqoWtuoMxhHZCTA+egL0RSGdHEc+YCsmiSBPBEDNuVeMWtjEWtGrhUterSChxzwnWBXvzSxIFQI/3sHLw==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.14.tgz", + "integrity": "sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA==", "dev": true, "requires": { "@emotion/hash": "0.7.3", @@ -1091,24 +1098,24 @@ "dev": true }, "@emotion/styled": { - "version": "10.0.17", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.17.tgz", - "integrity": "sha512-zHMgWjHDMNjD+ux64POtDnjLAObniu3znxFBLSdV/RiEhSLjHIowfvSbbd/C33/3uwtI6Uzs2KXnRZtka/PpAQ==", + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.23.tgz", + "integrity": "sha512-gNr04eqBQ2iYUx8wFLZDfm3N8/QUOODu/ReDXa693uyQGy2OqA+IhPJk+kA7id8aOfwAsMuvZ0pJImEXXKtaVQ==", "dev": true, "requires": { - "@emotion/styled-base": "^10.0.17", - "babel-plugin-emotion": "^10.0.17" + "@emotion/styled-base": "^10.0.23", + "babel-plugin-emotion": "^10.0.23" } }, "@emotion/styled-base": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.19.tgz", - "integrity": "sha512-Sz6GBHTbOZoeZQKvkE9gQPzaJ6/qtoQ/OPvyG2Z/6NILlYk60Es1cEcTgTkm26H8y7A0GSgp4UmXl+srvsnFPg==", + "version": "10.0.24", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.24.tgz", + "integrity": "sha512-AnBImerf0h4dGAJVo0p0VE8KoAns71F28ErGFK474zbNAHX6yqSWQUasb+1jvg/VPwZjCp19+tAr6oOB0pwmLQ==", "dev": true, "requires": { "@babel/runtime": "^7.5.5", - "@emotion/is-prop-valid": "0.8.3", - "@emotion/serialize": "^0.11.11", + "@emotion/is-prop-valid": "0.8.5", + "@emotion/serialize": "^0.11.14", "@emotion/utils": "0.11.2" } }, @@ -1136,6 +1143,45 @@ "integrity": "sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA==", "dev": true }, + "@hapi/address": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.2.tgz", + "integrity": "sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, "@jest/console": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", @@ -1145,14 +1191,6 @@ "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "@jest/core": { @@ -1189,29 +1227,6 @@ "rimraf": "^2.5.4", "slash": "^2.0.0", "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "@jest/environment": { @@ -1266,12 +1281,6 @@ "string-length": "^2.0.0" }, "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1291,6 +1300,12 @@ "source-map": "^0.6.0" }, "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1346,12 +1361,6 @@ "write-file-atomic": "2.4.1" }, "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1421,39 +1430,38 @@ "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@storybook/addons": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.2.4.tgz", - "integrity": "sha512-Q+bnVlBA308qnELxnh18hBDRSUgltR9KbV537285dUL/okv/NC6n51mxJwIaG+ksBW2wU+5e6tqSayaKF3uHLw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-5.2.6.tgz", + "integrity": "sha512-5MF64lsAhIEMxTbVpYROz5Wez595iwSw45yXyP8gWt12d+EmFO5tdy7cYJCxcMuVhDfaCI78tFqS9orr1atVyA==", "dev": true, "requires": { - "@storybook/api": "5.2.4", - "@storybook/channels": "5.2.4", - "@storybook/client-logger": "5.2.4", - "@storybook/core-events": "5.2.4", + "@storybook/api": "5.2.6", + "@storybook/channels": "5.2.6", + "@storybook/client-logger": "5.2.6", + "@storybook/core-events": "5.2.6", "core-js": "^3.0.1", "global": "^4.3.2", "util-deprecate": "^1.0.2" } }, "@storybook/api": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.2.4.tgz", - "integrity": "sha512-KqAB+NkHIHdwu749NDP+7i44jy1bFgpq7GTJlG+sx/XLZHQveK/8yn109g9bXHFth7SvdXI1+9GA/apzwBU/Mw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-5.2.6.tgz", + "integrity": "sha512-X/di44/SAL68mD6RHTX2qdWwhjRW6BgcfPtu0dMd38ErB3AfsfP4BITXs6kFOeSM8kWiaQoyuw0pOBzA8vlYug==", "dev": true, "requires": { - "@storybook/channels": "5.2.4", - "@storybook/client-logger": "5.2.4", - "@storybook/core-events": "5.2.4", - "@storybook/router": "5.2.4", - "@storybook/theming": "5.2.4", + "@storybook/channels": "5.2.6", + "@storybook/client-logger": "5.2.6", + "@storybook/core-events": "5.2.6", + "@storybook/router": "5.2.6", + "@storybook/theming": "5.2.6", "core-js": "^3.0.1", "fast-deep-equal": "^2.0.1", "global": "^4.3.2", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "memoizerific": "^1.11.3", "prop-types": "^15.6.2", "react": "^16.8.3", @@ -1473,50 +1481,56 @@ } }, "@storybook/channel-postmessage": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.2.4.tgz", - "integrity": "sha512-ic7/Ho8z2/aOMjoEbr5p8rijOfO3SZdJnwMvDdUxrqvYq7yACZWidPo3w2+iBwQi9HLqEsWesP1c2doJBxVGRw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-5.2.6.tgz", + "integrity": "sha512-y+63wWiEc/Q4s4MZ3KJ//5A8j5VLufxuLvPxwv9FuS4z8lmN0fqeGJn857qIlFGbZhzsQaoRdmfsCQpBBgUneg==", "dev": true, "requires": { - "@storybook/channels": "5.2.4", - "@storybook/client-logger": "5.2.4", + "@storybook/channels": "5.2.6", + "@storybook/client-logger": "5.2.6", "core-js": "^3.0.1", "global": "^4.3.2", "telejson": "^3.0.2" } }, "@storybook/channels": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.2.4.tgz", - "integrity": "sha512-/r39yEZ5QiGdiq95DhXBypdBo7urkD3Sp1WDyK48uGkZ0gdHWSPy3BBy8OJhEhfNz7nVisTiVIBr4gIrubKDjw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-5.2.6.tgz", + "integrity": "sha512-/UsktYsXuvb1efjVPCEivhh5ywRhm7hl73pQnpJLJHRqyLMM2I5nGPFELTTNuU9yWy7sP9QL5gRqBBPe1sqjZQ==", "dev": true, "requires": { "core-js": "^3.0.1" } }, "@storybook/client-api": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.2.4.tgz", - "integrity": "sha512-SOwzEFHoNapURhNqdcI7HA76o5tkWvs2+2s++i/S7xsAd3KyefIVDOdqSMlAxJkxZb8Mlrb3UNRxlrpA8SZqNA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/client-api/-/client-api-5.2.6.tgz", + "integrity": "sha512-upynf4ER2fkThNnE+mBlfRFFJxTiOh60fho1ODFcBun9BbvRD2wOHLvw7+WigIhb99HM20vk8f2dhv3I5Udzlg==", "dev": true, "requires": { - "@storybook/addons": "5.2.4", - "@storybook/channel-postmessage": "5.2.4", - "@storybook/channels": "5.2.4", - "@storybook/client-logger": "5.2.4", - "@storybook/core-events": "5.2.4", - "@storybook/router": "5.2.4", + "@storybook/addons": "5.2.6", + "@storybook/channel-postmessage": "5.2.6", + "@storybook/channels": "5.2.6", + "@storybook/client-logger": "5.2.6", + "@storybook/core-events": "5.2.6", + "@storybook/router": "5.2.6", "common-tags": "^1.8.0", "core-js": "^3.0.1", "eventemitter3": "^4.0.0", "global": "^4.3.2", "is-plain-object": "^3.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "memoizerific": "^1.11.3", "qs": "^6.6.0", "util-deprecate": "^1.0.2" }, "dependencies": { + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, "is-plain-object": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", @@ -1531,33 +1545,28 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "dev": true - }, - "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==", - "dev": true } } }, "@storybook/client-logger": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.2.4.tgz", - "integrity": "sha512-ofp6QQPQZBU+RvlAH5KpZRsfAFHecCZDnl/7YG6FwjHseJr3jHTYmBGGjJDMHFHq+Q7FGQu/yVb9lMFgoQ43QQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-5.2.6.tgz", + "integrity": "sha512-hJvPD267cCwLIRMOISjDH8h9wbwOcXIJip29UlJbU9iMtZtgE+YelmlpmZJvqcDfUiXWWrOh7tP76mj8EAfwIQ==", "dev": true, "requires": { "core-js": "^3.0.1" } }, "@storybook/components": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.2.4.tgz", - "integrity": "sha512-APhw+XGag0RTCRJ8eCWKVr8dLt9SRqnS8LtzcZJbokCYRxRTFzhmX2eVEE1v+d0gHib1/yh2COxOjMzv3m/rQA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-5.2.6.tgz", + "integrity": "sha512-C7OS90bZ1ZvxlWUZ3B2MPFFggqAtUo7X8DqqS3IwsuDUiK9dD/KS0MwPgOuFDnOTW1R5XqmQd/ylt53w3s/U5g==", "dev": true, "requires": { - "@storybook/client-logger": "5.2.4", - "@storybook/theming": "5.2.4", + "@storybook/client-logger": "5.2.6", + "@storybook/theming": "5.2.6", "@types/react-syntax-highlighter": "10.1.0", + "@types/react-textarea-autosize": "^4.3.3", "core-js": "^3.0.1", "global": "^4.3.2", "markdown-to-jsx": "^6.9.1", @@ -1576,9 +1585,9 @@ } }, "@storybook/core": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.2.4.tgz", - "integrity": "sha512-r5kDgZETNawHxpsAPw+h+pRk6l/mJhsSHeDo9/OdYtYFW7lmk2gadViXOTM+6gIWc6vQ8y750bgkahmyIIY0nQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-5.2.6.tgz", + "integrity": "sha512-q7Ful7TCm9nmjgLsJFqIwVv395NlaOXgGajyaQCQlCKB2V+jgs7GDmdCNNdWAOue4eAsFU6wQSP9lWtq0yzK4w==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.3.3", @@ -1586,15 +1595,15 @@ "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-env": "^7.4.5", - "@storybook/addons": "5.2.4", - "@storybook/channel-postmessage": "5.2.4", - "@storybook/client-api": "5.2.4", - "@storybook/client-logger": "5.2.4", - "@storybook/core-events": "5.2.4", - "@storybook/node-logger": "5.2.4", - "@storybook/router": "5.2.4", - "@storybook/theming": "5.2.4", - "@storybook/ui": "5.2.4", + "@storybook/addons": "5.2.6", + "@storybook/channel-postmessage": "5.2.6", + "@storybook/client-api": "5.2.6", + "@storybook/client-logger": "5.2.6", + "@storybook/core-events": "5.2.6", + "@storybook/node-logger": "5.2.6", + "@storybook/router": "5.2.6", + "@storybook/theming": "5.2.6", + "@storybook/ui": "5.2.6", "airbnb-js-shims": "^1 || ^2", "ansi-to-html": "^0.6.11", "autoprefixer": "^9.4.9", @@ -1651,10 +1660,16 @@ "webpack-hot-middleware": "^2.25.0" }, "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 + }, "find-cache-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", - "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.1.0.tgz", + "integrity": "sha512-zw+EFiNBNPgI2NTrKkDd1xd7q0cs6wr/iWnr/oUkI0yF9K9GqQ+riIt4aiyFaaqpaWbxPrJXHI+QvmNUQbX+0Q==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -1707,6 +1722,15 @@ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -1716,6 +1740,12 @@ "p-limit": "^2.2.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1731,12 +1761,6 @@ "find-up": "^4.0.0" } }, - "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==", - "dev": true - }, "regenerator-runtime": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", @@ -1768,18 +1792,18 @@ } }, "@storybook/core-events": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.2.4.tgz", - "integrity": "sha512-nQknCmaz2S2HW6PSGcuFzve7Y1Js2Cb268vUG0ZMNtJZwFawqYc+KSQHqmOY0pVm8dyROTcWCudPA0k+hk6N5Q==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.2.6.tgz", + "integrity": "sha512-W8kLJ7tc0aAxs11CPUxUOCReocKL4MYGyjTg8qwk0USLzPUb/FUQWmhcm2ilFz6Nz8dXLcKrXdRVYTmiMsgAeg==", "dev": true, "requires": { "core-js": "^3.0.1" } }, "@storybook/node-logger": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.2.4.tgz", - "integrity": "sha512-4OOzce02IAfrRv+Y7h3icyw6WIuDekpWF2eYjgYVVvAJYklCEwgeBTBCY0/2TJjPPTBDPUKHVP1Bdz3Vpci9pA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-5.2.6.tgz", + "integrity": "sha512-Z3mn9CUSiG7kR2OBoz4lNeoeBS094h5d9wufZSp5S+M47L6KEXmTgNcuePKj+t8Z8KT/Ph8B63bjChseKp3DNw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -1798,17 +1822,17 @@ } }, "@storybook/react": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-5.2.4.tgz", - "integrity": "sha512-AO0qwbD/2UGe5CrVizbaek+gCAPWkPVc0KUk38cT1mcuLpXwt1zZe7iHLQf2zOeBVSiBkPLOHrEtzDfnIJXKFQ==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-5.2.6.tgz", + "integrity": "sha512-yzhxxuoUx4jwn+PymU5wemzLb9ryXD9Y2Dv5kipCDkUS4cqDJwKcVO8tyhMigFUGTHREmJTmAESCKKPDR45SiQ==", "dev": true, "requires": { "@babel/plugin-transform-react-constant-elements": "^7.2.0", "@babel/preset-flow": "^7.0.0", "@babel/preset-react": "^7.0.0", - "@storybook/addons": "5.2.4", - "@storybook/core": "5.2.4", - "@storybook/node-logger": "5.2.4", + "@storybook/addons": "5.2.6", + "@storybook/core": "5.2.6", + "@storybook/node-logger": "5.2.6", "@svgr/webpack": "^4.0.3", "@types/webpack-env": "^1.13.7", "babel-plugin-add-react-displayname": "^0.0.5", @@ -1818,7 +1842,7 @@ "common-tags": "^1.8.0", "core-js": "^3.0.1", "global": "^4.3.2", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "mini-css-extract-plugin": "^0.7.0", "prop-types": "^15.7.2", "react-dev-utils": "^9.0.0", @@ -1842,37 +1866,29 @@ } }, "@storybook/router": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.2.4.tgz", - "integrity": "sha512-GL7eGdj5oYST0mE9fThJB9ye9tTTgrP+aP3okZ6MeMGtNytb7bmJRpAD2E4ouuPTQVppyHI5re8g/HUxUNOT1g==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-5.2.6.tgz", + "integrity": "sha512-/FZd3fYg5s2QzOqSIP8UMOSnCIFFIlli/jKlOxvm3WpcpxgwQOY4lfHsLO+r9ThCLs2UvVg2R/HqGrOHqDFU7A==", "dev": true, "requires": { "@reach/router": "^1.2.1", "@types/reach__router": "^1.2.3", "core-js": "^3.0.1", "global": "^4.3.2", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "memoizerific": "^1.11.3", "qs": "^6.6.0" - }, - "dependencies": { - "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==", - "dev": true - } } }, "@storybook/theming": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.2.4.tgz", - "integrity": "sha512-2ZlqBrmnm8N0352Fnu2+GB3pEsHL4Eb2eKxV0VLLgkjJuAlm7CK6+I/e4ZknQWxwYm2pQj1y6ta68A62fGBYyA==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-5.2.6.tgz", + "integrity": "sha512-Xa9R/H8DDgmvxsCHloJUJ2d9ZQl80AeqHrL+c/AKNpx05s9lV74DcinusCf0kz72YGUO/Xt1bAjuOvLnAaS8Gw==", "dev": true, "requires": { "@emotion/core": "^10.0.14", "@emotion/styled": "^10.0.14", - "@storybook/client-logger": "5.2.4", + "@storybook/client-logger": "5.2.6", "common-tags": "^1.8.0", "core-js": "^3.0.1", "deep-object-diff": "^1.1.0", @@ -1893,19 +1909,19 @@ } }, "@storybook/ui": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.2.4.tgz", - "integrity": "sha512-zsS43k1h4bWEW6oj9FNHlUL3niHoJJ8v7iqYbRtVM12rxrYhV3K8TGVG3LCuNB75i3Be0Myy+/RHA4x9kco08A==", - "dev": true, - "requires": { - "@storybook/addons": "5.2.4", - "@storybook/api": "5.2.4", - "@storybook/channels": "5.2.4", - "@storybook/client-logger": "5.2.4", - "@storybook/components": "5.2.4", - "@storybook/core-events": "5.2.4", - "@storybook/router": "5.2.4", - "@storybook/theming": "5.2.4", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-5.2.6.tgz", + "integrity": "sha512-jT3PtpEsTqnESO0U8BotC+5P971Xqy0s2leSZcgU9PNe4Eb7NaxypSULOulPgPAx1JOmMipUBdK54PP/nyudkA==", + "dev": true, + "requires": { + "@storybook/addons": "5.2.6", + "@storybook/api": "5.2.6", + "@storybook/channels": "5.2.6", + "@storybook/client-logger": "5.2.6", + "@storybook/components": "5.2.6", + "@storybook/core-events": "5.2.6", + "@storybook/router": "5.2.6", + "@storybook/theming": "5.2.6", "copy-to-clipboard": "^3.0.8", "core-js": "^3.0.1", "core-js-pure": "^3.0.1", @@ -1913,7 +1929,7 @@ "fast-deep-equal": "^2.0.1", "fuse.js": "^3.4.4", "global": "^4.3.2", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "markdown-to-jsx": "^6.9.3", "memoizerific": "^1.11.3", "polished": "^3.3.1", @@ -1933,12 +1949,6 @@ "util-deprecate": "^1.0.2" }, "dependencies": { - "qs": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz", - "integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -2088,7 +2098,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, "requires": { "defer-to-connect": "^1.0.1" } @@ -2155,6 +2164,14 @@ "@types/babel-types": "*" } }, + "@types/bn.js": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.5.tgz", + "integrity": "sha512-AEAZcIZga0JgVMHNtl1CprA/hXX7/wPt79AgR4XqaDt7jyj3QWYw6LPoOiznPtugDmlubUnAahMs2PFxGcQrng==", + "requires": { + "@types/node": "*" + } + }, "@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", @@ -2213,15 +2230,20 @@ "@types/istanbul-lib-report": "*" } }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "12.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.1.tgz", - "integrity": "sha512-TJtwsqZ39pqcljJpajeoofYRfeZ7/I/OMUQ5pR4q5wOKf2ocrUvBAZUMhWsOvKx3dVc/aaV5GluBivt0sWqA5A==" + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==" }, "@types/prop-types": { "version": "15.7.3", @@ -2246,9 +2268,9 @@ } }, "@types/react": { - "version": "16.9.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.9.tgz", - "integrity": "sha512-L+AudFJkDukk+ukInYvpoAPyJK5q1GanFOINOJnM0w6tUgITuWvJ4jyoBPFL7z4/L8hGLd+K/6xR5uUjXu0vVg==", + "version": "16.9.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.11.tgz", + "integrity": "sha512-UBT4GZ3PokTXSWmdgC/GeCGEJXE5ofWyibCcecRLUVN2ZBpXQGVgQGtG2foS7CrTKFKlQVVswLvf7Js6XA/CVQ==", "dev": true, "requires": { "@types/prop-types": "*", @@ -2264,6 +2286,15 @@ "@types/react": "*" } }, + "@types/react-textarea-autosize": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/react-textarea-autosize/-/react-textarea-autosize-4.3.5.tgz", + "integrity": "sha512-PiDL83kPMTolyZAWW3lyzO6ktooTb9tFTntVy7CA83/qFLWKLJ5bLeRboy6J6j3b1e8h2Eec6gBTEOOJRjV14A==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/source-list-map": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", @@ -2315,18 +2346,17 @@ } }, "@types/vfile-message": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-1.0.1.tgz", - "integrity": "sha512-mlGER3Aqmq7bqR1tTTIVHq8KSAFFRyGbrxuM8C/H82g6k7r2fS+IMEkIu3D7JHzG10NvPdR8DNx0jr0pwpp4dA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", "requires": { - "@types/node": "*", - "@types/unist": "*" + "vfile-message": "*" } }, "@types/webpack": { - "version": "4.39.4", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.39.4.tgz", - "integrity": "sha512-VubX3/qXtpWmHhd422GdtAHwAMLHSsgXx0dtspd2DZ7pMnCRKjduJN8Zp5Ex4e1fH4FKFBBgWTvsry0WL8wHsQ==", + "version": "4.39.8", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.39.8.tgz", + "integrity": "sha512-lkJvwNJQUPW2SbVwAZW9s9whJp02nzLf2yTNwMULa4LloED9MYS1aNnGeoBCifpAI1pEBkTpLhuyRmBnLEOZAA==", "dev": true, "requires": { "@types/anymatch": "*", @@ -2385,6 +2415,48 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "@typescript-eslint/experimental-utils": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.9.0.tgz", + "integrity": "sha512-0lOLFdpdJsCMqMSZT7l7W2ta0+GX8A3iefG3FovJjrX+QR8y6htFlFdU7aOVPL6pDvt6XcsOb8fxk5sq+girTw==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.9.0", + "eslint-scope": "^5.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.9.0.tgz", + "integrity": "sha512-v6btSPXEWCP594eZbM+JCXuFoXWXyF/z8kaSBSdCb83DF+Y7+xItW29SsKtSULgLemqJBT+LpT+0ZqdfH7QVmA==", + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash.unescape": "4.0.1", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -2575,25 +2647,23 @@ } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", - "dev": true + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "^4.0.4" }, "dependencies": { "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", "dev": true } } @@ -2616,6 +2686,11 @@ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "dev": true }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, "airbnb-js-shims": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/airbnb-js-shims/-/airbnb-js-shims-2.2.0.tgz", @@ -2715,34 +2790,6 @@ "dev": true, "requires": { "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "ansi-colors": { @@ -2762,9 +2809,9 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "ansi-styles": { "version": "3.2.1", @@ -2775,14 +2822,19 @@ } }, "ansi-to-html": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.12.tgz", - "integrity": "sha512-qBkIqLW979675mP76yB7yVkzeAWtATegdnDQ0RA3CZzknx0yUlNxMSML4xFdBfTs2GWYFQ1FELfbGbVSPzJ+LA==", + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.13.tgz", + "integrity": "sha512-Ys2/umuaTlQvP9DLkaa7UzRKF2FLrfod/hNHXS9QhXCrw7seObG6ksOGmNz3UoK+adwM8L9vQfG7mvaxfJ3Jvw==", "dev": true, "requires": { "entities": "^1.1.2" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -2803,52 +2855,43 @@ } }, "app-builder-bin": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.3.tgz", - "integrity": "sha512-qMhayIwi3juerQEVJMQ76trObEbfQT0nhUdxZz9a26/3NLT3pE6awmQ8S1cEnrGugaaM5gYqR8OElcDezfmEsg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.7.1.tgz", + "integrity": "sha512-ubIBeiL9XysjMW4HETBKxj3DC8ika6dGyC0vftPc0kZwGh1iXQ5bycsjoAqY/3t3BBEEIg0VruicvBaUl1pOSQ==", "dev": true }, "app-builder-lib": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.2.0.tgz", - "integrity": "sha512-aOX/nv77/Bti6NymJDg7p9T067xD8m1ipIEJR7B4Mm1GsJWpMm9PZdXtCRiMNRjHtQS5KIljT0g17781y6qn5A==", + "version": "20.44.4", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.44.4.tgz", + "integrity": "sha512-1K1xfrhyqDgnibwyuYMgvfwGilGLMF31YwOUJ8IXreyjRef9lUjWW+BZuBXqk4Uqd0C0EYPjhofgpuN0WoAQ+A==", "dev": true, "requires": { - "7zip-bin": "~5.0.3", - "@develar/schema-utils": "~2.1.0", + "7zip-bin": "~4.1.0", + "app-builder-bin": "2.7.1", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "21.2.0", - "builder-util-runtime": "8.3.0", + "builder-util": "10.1.2", + "builder-util-runtime": "8.2.5", "chromium-pickle-js": "^0.2.0", "debug": "^4.1.1", "ejs": "^2.6.2", - "electron-publish": "21.2.0", - "fs-extra": "^8.1.0", + "electron-osx-sign": "0.4.11", + "electron-publish": "20.44.4", + "fs-extra-p": "^8.0.2", "hosted-git-info": "^2.7.1", "is-ci": "^2.0.0", - "isbinaryfile": "^4.0.2", + "isbinaryfile": "^4.0.1", "js-yaml": "^3.13.1", "lazy-val": "^1.0.4", "minimatch": "^3.0.4", "normalize-package-data": "^2.5.0", - "read-config-file": "5.0.0", - "sanitize-filename": "^1.6.2", - "semver": "^6.3.0", - "temp-file": "^3.3.4" + "plist": "^3.0.1", + "read-config-file": "3.2.2", + "sanitize-filename": "^1.6.1", + "semver": "^6.1.1", + "temp-file": "^3.3.3" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2876,6 +2919,38 @@ "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "argparse": { @@ -2894,6 +2969,14 @@ "requires": { "ast-types-flow": "0.0.7", "commander": "^2.11.0" + }, + "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 + } } }, "arr-diff": { @@ -2929,9 +3012,9 @@ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { "version": "3.0.3", @@ -3008,7 +3091,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -3050,8 +3132,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -3108,8 +3189,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -3117,30 +3197,35 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.6.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.5.tgz", - "integrity": "sha512-rGd50YV8LgwFQ2WQp4XzOTG69u1qQsXn0amww7tjqV5jJuNazgFKYEVItEBngyyvVITKOg20zr2V+9VsrXJQ2g==", + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", "requires": { - "browserslist": "^4.7.0", - "caniuse-lite": "^1.0.30000999", + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.18", + "postcss": "^7.0.21", "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + } } }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "axobject-query": { "version": "2.0.2", @@ -3162,6 +3247,12 @@ "js-tokens": "^3.0.2" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -3187,6 +3278,15 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -3264,14 +3364,6 @@ "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "babel-loader": { @@ -3284,14 +3376,6 @@ "loader-utils": "^1.0.2", "mkdirp": "^0.5.1", "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } } }, "babel-plugin-add-react-displayname": { @@ -3310,15 +3394,15 @@ } }, "babel-plugin-emotion": { - "version": "10.0.21", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.21.tgz", - "integrity": "sha512-03o+T6sfVAJhNDcSdLapgv4IeewcFPzxlvBUVdSf7o5PI57ZSxoDvmy+ZulVWSu+rOWAWkEejNcsb29TuzJHbg==", + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.23.tgz", + "integrity": "sha512-1JiCyXU0t5S2xCbItejCduLGGcKmF3POT0Ujbexog2MI4IlRcIn/kWjkYwCUZlxpON0O5FC635yPl/3slr7cKQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@emotion/hash": "0.7.3", "@emotion/memoize": "0.7.3", - "@emotion/serialize": "^0.11.11", + "@emotion/serialize": "^0.11.14", "babel-plugin-macros": "^2.0.0", "babel-plugin-syntax-jsx": "^6.18.0", "convert-source-map": "^1.5.0", @@ -3347,6 +3431,40 @@ "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-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true } } }, @@ -3471,13 +3589,13 @@ "dev": true }, "babel-plugin-react-docgen": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-3.1.0.tgz", - "integrity": "sha512-W6xqZnZIWjZuE9IjP7XolxxgFGB5Y9GZk4cLPSWKa10MrT86q7bX4ke9jbrNhFVIRhbmzL8wE1Sn++mIWoJLbw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-3.2.0.tgz", + "integrity": "sha512-MZ3fhnJ+/tUDhWFGgWsajuLct/dD1xoprmStqrBgtt9flFLPrKIOKOfqwjXjsn6/THs5QrG5rkcDFE3TMMZDjQ==", "dev": true, "requires": { - "lodash": "^4.17.11", - "react-docgen": "^4.1.0", + "lodash": "^4.17.15", + "react-docgen": "^4.1.1", "recast": "^0.14.7" } }, @@ -3652,6 +3770,27 @@ "source-map": "^0.5.0" } }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.6.0.tgz", + "integrity": "sha512-ZSyYw9trQI50sES6YxREXKu+4b7MAg6Qx2cvyDDYjP2Hpzd3FleOUwC9cqn1+za8d0A2ZU8SHujxFao956efUg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.6.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", @@ -3876,6 +4015,14 @@ } } }, + "base-x": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz", + "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -3896,15 +4043,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "better-docs": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/better-docs/-/better-docs-1.3.3.tgz", - "integrity": "sha512-VF3P7D9S13TiXHMXVLxjdMw0OFwA7yzhJ5jTMfZSf7LoWg99NtjY6CwslricEaiDjs4pb7g9h8UDkvKXVQvGUA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/better-docs/-/better-docs-1.4.2.tgz", + "integrity": "sha512-LzSwYvC8z2jcCagjQWYbg5dKKigwhQ2FTPyDRYyxtVPKID2WDWRIV8G2nraVwIWNepSMcNorGTKvWq1II6pFyw==", "dev": true, "requires": { "brace": "^0.11.1", @@ -3926,6 +4072,71 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bip39": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.2.tgz", + "integrity": "sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==", + "requires": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -3971,11 +4182,6 @@ "type-is": "~1.6.17" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3988,11 +4194,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -4007,6 +4208,13 @@ "dns-txt": "^2.0.2", "multicast-dns": "^6.0.1", "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } } }, "boolbase": { @@ -4031,37 +4239,11 @@ "widest-line": "^2.0.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -4135,6 +4317,11 @@ } } }, + "browser-solc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-solc/-/browser-solc-1.0.0.tgz", + "integrity": "sha512-0qiaQc65DqOukrNCew7Olg3EUXWOh54h7nUBeYyebhxwl4n5fXT/D5M3AllgKJ1msVOV9L5XIp2uAZrGSRF9iw==" + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -4178,6 +4365,15 @@ "randombytes": "^2.0.1" } }, + "browserify-sha3": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/browserify-sha3/-/browserify-sha3-0.0.4.tgz", + "integrity": "sha1-CGxHuMgjFsnUcCLCYYWVRXbdjiY=", + "requires": { + "js-sha3": "^0.6.1", + "safe-buffer": "^5.1.1" + } + }, "browserify-sign": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", @@ -4201,34 +4397,75 @@ } }, "browserslist": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.1.tgz", - "integrity": "sha512-QtULFqKIAtiyNx7NhZ/p4rB8m3xDozVo/pi5VgTlADLF2tNigz/QH+v0m5qhn7XfHT7u+607NcCNOnC0HZAlMg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "requires": { - "caniuse-lite": "^1.0.30000999", - "electron-to-chromium": "^1.3.284", - "node-releases": "^1.1.36" + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", "requires": { "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -4239,52 +4476,46 @@ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" }, + "buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha1-YGSkD6dutDxyOrqe+PbhIW0QURo=" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builder-util": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.2.0.tgz", - "integrity": "sha512-Nd6CUb6YgDY8EXAXEIegx+1kzKqyFQ5ZM5BoYkeunAlwz/zDJoH1UCyULjoS5wQe5czNClFQy07zz2bzYD0Z4A==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-10.1.2.tgz", + "integrity": "sha512-LQMh36Cg0r4ZfKqNlaUclndS/IXxZ3OdCgmXvw1vdP3QwYT2NkyE7LfMikAFIHpXOs6zsVH+iW+Fe/AX1jfFag==", "dev": true, "requires": { - "7zip-bin": "~5.0.3", + "7zip-bin": "~4.1.0", "@types/debug": "^4.1.4", - "app-builder-bin": "3.4.3", + "app-builder-bin": "2.7.1", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.3.0", + "builder-util-runtime": "^8.2.5", "chalk": "^2.4.2", "debug": "^4.1.1", - "fs-extra": "^8.1.0", + "fs-extra-p": "^8.0.2", "is-ci": "^2.0.0", "js-yaml": "^3.13.1", - "source-map-support": "^0.5.13", + "source-map-support": "^0.5.12", "stat-mode": "^0.3.0", - "temp-file": "^3.3.4" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } + "temp-file": "^3.3.3" } }, "builder-util-runtime": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.3.0.tgz", - "integrity": "sha512-CSOdsYqf4RXIHh1HANPbrZHlZ9JQJXSuDDloblZPcWQVN62inyYoTQuSmY3KrgefME2Sv3Kn2MxHvbGQHRf8Iw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.2.5.tgz", + "integrity": "sha512-YILT+YUlxrE3yNB6mDC1tF+Q24mr1LSYdjP5U861jbBeDZfvy1/VPDzW3boMVrDtzYnDnvkYrzLJnoh6TXA75w==", "dev": true, "requires": { + "bluebird-lst": "^1.0.9", "debug": "^4.1.1", + "fs-extra-p": "^8.0.2", "sax": "^1.2.4" } }, @@ -4294,9 +4525,9 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cacache": { "version": "12.0.3", @@ -4318,26 +4549,6 @@ "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "yallist": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } } }, "cache-base": { @@ -4360,7 +4571,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -4375,7 +4585,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -4383,8 +4592,7 @@ "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, @@ -4399,13 +4607,6 @@ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - } } }, "caller-path": { @@ -4417,10 +4618,9 @@ } }, "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" }, "camel-case": { "version": "3.0.0", @@ -4433,19 +4633,18 @@ } }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" } }, "can-use-dom": { @@ -4455,9 +4654,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001001", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001001.tgz", - "integrity": "sha512-MsWRX5x8GsZJcvIh1zkTERAcX9cRlT+If1f4xk3B5EAJftiwjab2oBKPbned9IuBiKae5u9PMp7T2xJBDo+9Sw==" + "version": "1.0.30001008", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz", + "integrity": "sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw==" }, "capture-exit": { "version": "2.0.0", @@ -4477,8 +4676,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "catharsis": { "version": "0.8.11", @@ -4572,15 +4770,6 @@ "domelementtype": "^1.3.0", "entities": "^1.1.1" } - }, - "parse5": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", - "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", - "dev": true, - "requires": { - "@types/node": "*" - } } } }, @@ -4601,27 +4790,6 @@ "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } } }, "chownr": { @@ -4736,6 +4904,33 @@ "colors": "^1.1.2", "object-assign": "^4.1.0", "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "cli-width": { @@ -4757,47 +4952,61 @@ } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "number-is-nan": "^1.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "ansi-regex": "^3.0.0" } } } }, "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", "dev": true, "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.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" + } + } } }, "clone-regexp": { @@ -4813,7 +5022,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -4840,6 +5048,22 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "coinstring": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/coinstring/-/coinstring-2.3.0.tgz", + "integrity": "sha1-zbYzY6lhUCQEolr7gsLibV/2J6Q=", + "requires": { + "bs58": "^2.0.1", + "create-hash": "^1.1.1" + }, + "dependencies": { + "bs58": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-2.0.1.tgz", + "integrity": "sha1-VZCNWPGYKrogCPob7Y+RmYopv40=" + } + } + }, "collapse-white-space": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz", @@ -4878,7 +5102,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -4890,9 +5113,12 @@ "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": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + } }, "common-tags": { "version": "1.8.0", @@ -4905,6 +5131,12 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -4932,6 +5164,11 @@ "vary": "~1.1.2" }, "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4961,6 +5198,86 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "concurrently": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.0.tgz", + "integrity": "sha512-1yDvK8mduTIdxIxV9C60KoiOySUl/lfekpdbI+U5GXaPrgdffEavFa9QZB3vh68oWOpbCC+TuvxXV9YRPMvUrA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^2.0.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } } }, "configstore": { @@ -4975,23 +5292,6 @@ "unique-string": "^1.0.0", "write-file-atomic": "^2.0.0", "xdg-basedir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "confusing-browser-globals": { @@ -5006,12 +5306,9 @@ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, "console-control-strings": { "version": "1.1.0", @@ -5056,9 +5353,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" } @@ -5073,6 +5370,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -5101,12 +5403,12 @@ } }, "copy-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-YBuYGpSzoCHSSDGyHy6VJ7SHojKp6WHT4D7ItcQFNAYx2hrwkMe56e97xfVR0/ovDuMTrMffXUiltvQljtAGeg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.5.tgz", + "integrity": "sha512-7N68eIoQTyudAuxkfPT7HzGoQ+TsmArN/I3HFwG+lVE3FNzqvZKIiaxtYh4o3BIznioxUvx9j26+Rtsc9htQUQ==", "dev": true, "requires": { - "cacache": "^11.3.3", + "cacache": "^12.0.3", "find-cache-dir": "^2.1.0", "glob-parent": "^3.1.0", "globby": "^7.1.1", @@ -5114,34 +5416,12 @@ "loader-utils": "^1.2.3", "minimatch": "^3.0.4", "normalize-path": "^3.0.0", - "p-limit": "^2.2.0", + "p-limit": "^2.2.1", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.7.0", + "serialize-javascript": "^2.1.0", "webpack-log": "^2.0.0" }, "dependencies": { - "cacache": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", - "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", - "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", - "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" - } - }, "globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", @@ -5156,48 +5436,60 @@ "slash": "^1.0.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==", + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "yallist": "^3.0.2" + "p-try": "^2.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "serialize-javascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.0.tgz", + "integrity": "sha512-a/mxFfU00QT88umAJQsNWOnUKckhNCqOl028N48e7wFmo2/EHpTo9Wso+iJJCMrQnmFvcjto5RJdAHEvVhcyUQ==", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true } } }, "core-js": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.2.tgz", - "integrity": "sha512-S1FfZpeBchkhyoY76YAdFzKS4zz9aOK7EeFaNA2aJlyXyA+sgqz6xdxmLPGXEAf0nF44MVN1kSjrA9Kt3ATDQg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.4.0.tgz", + "integrity": "sha512-lQxb4HScV71YugF/X28LtePZj9AB7WqOpcB+YztYxusvhrgZiQXPmCYfPC5LHsw/+ScEtDbXU3xbqH3CjBRmYA==", "dev": true }, "core-js-compat": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.2.tgz", - "integrity": "sha512-gfiK4QnNXhnnHVOIZst2XHdFfdMTPxtR0EGs0TdILMlGIft+087oH6/Sw2xTTIjpWXC9vEwsJA8VG3XTGcmO5g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.0.tgz", + "integrity": "sha512-pgQUcgT2+v9/yxHgMynYjNj7nmxLRXv3UC39rjCjDwpe63ev2rioQTju1PKLYUBbPCQQvZNWvQC8tBJd65q11g==", "dev": true, "requires": { - "browserslist": "^4.7.0", + "browserslist": "^4.7.2", "semver": "^6.3.0" }, "dependencies": { @@ -5210,9 +5502,9 @@ } }, "core-js-pure": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.3.2.tgz", - "integrity": "sha512-sw695hB0UxFXrSkUthEby5tMdjOYN3hVC8IGQePF1m3JYb9e/KjT0TOFWzaSzlKwGNglKCgLYUjiJ7uZvactiw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.4.0.tgz", + "integrity": "sha512-d49s6GiW3ePYM8vCglfLLo6bueYx+Sff6MYtjohTMSB0AoxVfABXMUSmYHtKAEvW77T9JTKMyHrhE20nZ8gYDA==", "dev": true }, "core-util-is": { @@ -5238,6 +5530,15 @@ } } }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -5247,31 +5548,6 @@ "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" - }, - "dependencies": { - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } } }, "create-ecdh": { @@ -5318,11 +5594,63 @@ "gud": "^1.0.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { + "cross-env": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "path-key": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", + "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz", + "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", @@ -5380,6 +5708,12 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, "schema-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", @@ -5402,6 +5736,18 @@ "css-what": "2.1", "domutils": "1.5.1", "nth-check": "~1.0.1" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } } }, "css-select-base-adapter": { @@ -5425,13 +5771,21 @@ "integrity": "sha1-Zd/mFL1f0XW2Sgo/GTuHD8V5B3M=" }, "css-tree": { - "version": "1.0.0-alpha.33", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { "mdn-data": "2.0.4", - "source-map": "^0.5.3" + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } } }, "css-what": { @@ -5447,30 +5801,12 @@ "dev": true }, "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "dev": true, - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", - "dev": true - } + "css-tree": "1.0.0-alpha.37" } }, "cssom": { @@ -5507,6 +5843,15 @@ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "damerau-levenshtein": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", @@ -5517,7 +5862,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5534,9 +5878,9 @@ }, "dependencies": { "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -5546,10 +5890,10 @@ } } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + "date-fns": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.1.tgz", + "integrity": "sha512-C14oTzTZy8DH1Eq8N78owrCWvf3+cnJw88BTK/N3DYWVxDJuJzPaNdplzYxDYuuXXGvqBcO4Vy5SOrwAooXSWw==" }, "de-indent": { "version": "1.0.2", @@ -5577,6 +5921,13 @@ "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } } }, "decode-uri-component": { @@ -5584,15 +5935,107 @@ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, + "decompress": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", + "integrity": "sha1-eu3YVCflqS2s/lVnSnxQXpbQH50=", + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==" + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, "deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", @@ -5634,10 +6077,9 @@ } }, "defer-to-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", - "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.0.tgz", + "integrity": "sha512-WE2sZoctWm/v4smfCAdjYbrfS55JiMRdlY9ZubFhsYbteCK9+BvAx4YV7nPjYM6ZnX5BcoVKwfmyx9sIFTgQMQ==" }, "define-properties": { "version": "1.1.3", @@ -5698,18 +6140,31 @@ "rimraf": "^2.6.3" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegate": { "version": "3.2.0", @@ -5815,21 +6270,6 @@ "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "requires": { "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "discontinuous-range": { @@ -5839,40 +6279,19 @@ "dev": true }, "dmg-builder": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.2.0.tgz", - "integrity": "sha512-9cJEclnGy7EyKFCoHDYDf54pub/t92CQapyiUxU0w9Bj2vUvfoDagP1PMiX4XD5rPp96141h9A+QN0OB4VgvQg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-6.7.2.tgz", + "integrity": "sha512-xfYOwhHjOSOIqkk8A0h8zcaio/WyzrAWpMTu9hzV3Z5PI4tOG0Pq6a9Lh/mHr1r3bydif8R21qGvKU1Re9CpUg==", "dev": true, "requires": { - "app-builder-lib": "~21.2.0", + "app-builder-lib": "~20.44.4", "bluebird-lst": "^1.0.9", - "builder-util": "~21.2.0", - "fs-extra": "^8.1.0", - "iconv-lite": "^0.5.0", + "builder-util": "~10.1.2", + "fs-extra-p": "^8.0.2", + "iconv-lite": "^0.4.24", "js-yaml": "^3.13.1", - "sanitize-filename": "^1.6.2" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } + "parse-color": "^1.0.0", + "sanitize-filename": "^1.6.1" } }, "dns-equal": { @@ -5922,9 +6341,9 @@ } }, "dom-serializer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", - "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -5945,8 +6364,7 @@ "dom-walk": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" }, "domain-browser": { "version": "1.2.0", @@ -5976,9 +6394,9 @@ } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -5993,9 +6411,9 @@ } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", "dev": true }, "dotenv-defaults": { @@ -6005,14 +6423,6 @@ "dev": true, "requires": { "dotenv": "^6.2.0" - }, - "dependencies": { - "dotenv": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", - "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", - "dev": true - } } }, "dotenv-expand": { @@ -6030,6 +6440,16 @@ "dotenv-defaults": "^1.0.2" } }, + "drbg.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/drbg.js/-/drbg.js-1.0.1.tgz", + "integrity": "sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs=", + "requires": { + "browserify-aes": "^1.0.6", + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4" + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -6039,8 +6459,7 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { "version": "3.7.1", @@ -6051,13 +6470,41 @@ "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -6075,51 +6522,45 @@ "dev": true }, "electron": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/electron/-/electron-6.0.12.tgz", - "integrity": "sha512-70ODZa1RP6K0gE9IV9YLCXPSyhLjXksCuYSSPb3MljbfwfHo5uE6X0CGxzm+54YuPdE2e7EPnWZxOOsJYrS5iQ==", + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/electron/-/electron-3.1.13.tgz", + "integrity": "sha512-aRNywoUSO1Va/lpU4nz3K6GDyFqYtlOnHGLcERAAHfhB+IJrJ34cUJW4FVBpm43AwvUdAeuCkVKRLtOmrgx5CA==", "dev": true, "requires": { - "@types/node": "^10.12.18", + "@types/node": "^10.1.4", "electron-download": "^4.1.0", "extract-zip": "^1.0.3" }, "dependencies": { "@types/node": { - "version": "10.14.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.22.tgz", - "integrity": "sha512-9taxKC944BqoTVjE+UT3pQH0nHZlTvITwfsOZqyc+R3sfJuxaTtxWjfn1K2UlxyPcKHf0rnaXcVFrS9F9vf0bw==", + "version": "10.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.5.tgz", + "integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==", "dev": true } } }, "electron-builder": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.2.0.tgz", - "integrity": "sha512-x8EXrqFbAb2L3N22YlGar3dGh8vwptbB3ovo3OF6K7NTpcsmM2zEoJv7GhFyX73rNzSG2HaWpXwGAtOp2JWiEw==", + "version": "20.44.4", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.44.4.tgz", + "integrity": "sha512-H8zzP01albkKh2Ec1zc0A7RGriUkHb5M99NJskaYtgKtGATTAGH+r9OIWVk5Hk9c1dLMVudbqEeaSlygMF2asw==", "dev": true, "requires": { - "app-builder-lib": "21.2.0", + "app-builder-lib": "20.44.4", "bluebird-lst": "^1.0.9", - "builder-util": "21.2.0", - "builder-util-runtime": "8.3.0", + "builder-util": "10.1.2", + "builder-util-runtime": "8.2.5", "chalk": "^2.4.2", - "dmg-builder": "21.2.0", - "fs-extra": "^8.1.0", + "dmg-builder": "6.7.2", + "fs-extra-p": "^8.0.2", "is-ci": "^2.0.0", "lazy-val": "^1.0.4", - "read-config-file": "5.0.0", - "sanitize-filename": "^1.6.2", - "update-notifier": "^3.0.1", - "yargs": "^13.3.0" + "read-config-file": "3.2.2", + "sanitize-filename": "^1.6.1", + "update-notifier": "^3.0.0", + "yargs": "^13.2.4" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -6146,56 +6587,53 @@ "locate-path": "^3.0.0" } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "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" + } }, - "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==", + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "p-try": "^2.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": { - "ansi-regex": "^4.1.0" + "p-limit": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "wrap-ansi": { + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", @@ -6206,12 +6644,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", @@ -6267,12 +6699,6 @@ "requires": { "ms": "^2.1.1" } - }, - "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 } } }, @@ -6287,57 +6713,71 @@ "integrity": "sha512-Z1qA/1oHNowGtSBIcWk0pcLEqYT/j+13xUw/MYOrBUOL4X7VN0i0KCTf5SqyvMPmW5pSPKbo28wkxMxzZ20YnQ==" }, "electron-localshortcut": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", - "integrity": "sha512-MgL/j5jdjW7iA0R6cI7S045B0GlKXWM1FjjujVPjlrmyXRa6yH0bGSaIAfxXAF9tpJm3pLEiQzerYHkRh9JG/A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.0.tgz", + "integrity": "sha512-pm72c467BgWEFE+1Cgim2EqhoQe60UlirrobwN24TA+hd+x/2hVgZlwfqzvNEmYfuuegZlzQL8tILjomofbzdg==", "requires": { - "debug": "^2.6.8", + "debug": "^4.0.1", "electron-is-accelerator": "^0.1.0", - "keyboardevent-from-electron-accelerator": "^1.1.0", + "keyboardevent-from-electron-accelerator": "^2.0.0", "keyboardevents-areequal": "^0.2.1" + } + }, + "electron-osx-sign": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz", + "integrity": "sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "electron-publish": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.2.0.tgz", - "integrity": "sha512-mWavuoWJe87iaeKd0I24dNWIaR+0yRzshjNVqGyK019H766fsPWl3caQJnVKFaEyrZRP397v4JZVG0e7s16AxA==", + "version": "20.44.4", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.44.4.tgz", + "integrity": "sha512-50NzsKOnNqOpGJzPl04vMyitdguUvp15FWKWtu4KISsHfgdLMWGgxHGZwfMphc/vf364zXvPHsYQza3MASgaEQ==", "dev": true, "requires": { "bluebird-lst": "^1.0.9", - "builder-util": "~21.2.0", - "builder-util-runtime": "8.3.0", + "builder-util": "~10.1.2", + "builder-util-runtime": "^8.2.5", "chalk": "^2.4.2", - "fs-extra": "^8.1.0", + "fs-extra-p": "^8.0.2", "lazy-val": "^1.0.4", "mime": "^2.4.4" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", @@ -6347,9 +6787,9 @@ } }, "electron-to-chromium": { - "version": "1.3.289", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.289.tgz", - "integrity": "sha512-39GEOWgTxtMDk/WjIQLg4W/l1s4FZdiMCqUBLjd92tAXsBPDFLwuwCba5OGhuTdVYm6E128TZIqSnMpeocUlCQ==" + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==" }, "element-resize-detector": { "version": "1.1.15", @@ -6427,6 +6867,11 @@ "tapable": "^1.0.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -6435,6 +6880,28 @@ "errno": "^0.1.3", "readable-stream": "^2.0.1" } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } } } }, @@ -6539,7 +7006,6 @@ "version": "1.16.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", - "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", @@ -6554,28 +7020,56 @@ } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.52", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.52.tgz", + "integrity": "sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.2", + "next-tick": "~1.0.0" + } + }, "es5-shim": { "version": "4.5.13", "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.5.13.tgz", "integrity": "sha512-xi6hh6gsvDE0MaW4Vp1lgNEBpVcCXRWfPXj5egDvtgLz4L9MEvNwYEMdJH+JJinWkwa8c3c3o5HduV7dB/e1Hw==", "dev": true }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-shim": { "version": "0.35.5", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz", "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==", "dev": true }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6615,9 +7109,9 @@ } }, "eslint": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.5.1.tgz", - "integrity": "sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -6627,9 +7121,9 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.2", + "eslint-utils": "^1.4.3", "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.1", + "espree": "^6.1.2", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", @@ -6639,7 +7133,7 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.4.1", + "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -6659,12 +7153,58 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "dev": true, + "requires": { + "type-fest": "^0.5.2" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, "glob-parent": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", @@ -6680,19 +7220,83 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.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 }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" } }, "strip-json-comments": { @@ -6700,6 +7304,12 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "dev": true } } }, @@ -6807,61 +7417,12 @@ "ms": "2.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "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": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -6911,14 +7472,11 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "load-json-file": { "version": "2.0.0", @@ -6932,52 +7490,21 @@ "strip-bom": "^3.0.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "error-ex": "^1.2.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "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 - }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -6987,6 +7514,12 @@ "pify": "^2.0.0" } }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -7007,15 +7540,17 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, + "eslint-plugin-jest": { + "version": "23.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.1.1.tgz", + "integrity": "sha512-2oPxHKNh4j1zmJ6GaCBuGcb8FVZU7YjFUOJzGOPnl9ic7VA/MGAskArLJiRIlnFUmi1EUxY+UiATAy8dv8s5JA==", + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, "eslint-plugin-jsx-a11y": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", @@ -7068,10 +7603,9 @@ "dev": true }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -7089,8 +7623,7 @@ "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { "version": "6.1.2", @@ -7101,6 +7634,14 @@ "acorn": "^7.1.0", "acorn-jsx": "^5.1.0", "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + } } }, "esprima": { @@ -7140,22 +7681,200 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha1-IprEbsqG1S4MmR58sq74P/D2i88=", "requires": { - "original": "^1.0.0" + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + }, + "dependencies": { + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + } + } + }, + "eth-lib": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.27.tgz", + "integrity": "sha512-B8czsfkJYzn2UIEMwjc7Mbj+Cy72V+/OXH/tb44LV8jhrjizQJJ325xMOMyk3+ETa6r6oi0jsUY14+om8mQMWA==", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "keccakjs": "^0.2.1", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "ethereum-bloom-filters": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.6.tgz", + "integrity": "sha512-dE9CGNzgOOsdh7msZirvv8qjHtnHpvBlKe2647kM8v+yeF71IRso55jpojemvHV+jMjr48irPWxMRaHuOWzAFA==", + "requires": { + "js-sha3": "^0.8.0" + }, + "dependencies": { + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + } + } + }, + "ethereumjs-common": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.4.0.tgz", + "integrity": "sha512-ser2SAplX/YI5W2AnzU8wmSjKRy4KQd4uxInJ36BzjS3m18E/B9QedPUIresZN1CSEQb/RgNQ2gN7C/XbpTafA==" + }, + "ethereumjs-tx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.1.tgz", + "integrity": "sha512-QtVriNqowCFA19X9BCRPMgdVNJ0/gMBS91TQb1DfrhsbR748g4STwxZptFAwfqehMyrF8rDwB23w87PQwru0wA==", + "requires": { + "ethereumjs-common": "^1.3.1", + "ethereumjs-util": "^6.0.0" + } + }, + "ethereumjs-util": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.0.tgz", + "integrity": "sha512-vb0XN9J2QGdZGIEKG2vXM+kUdEivUfU6Wmi5y0cg+LRhDYKnXIZ/Lz7XjFbHRR9VIKq2lVGLzGBkA++y2nOdOQ==", + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "ethjs-util": "0.1.6", + "keccak": "^2.0.0", + "rlp": "^2.2.3", + "secp256k1": "^3.0.1" + } + }, + "ethereumjs-wallet": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.3.tgz", + "integrity": "sha512-qiXPiZOsStem+Dj/CQHbn5qex+FVkuPmGH7SvSnA9F3tdRDt8dLMyvIj3+U05QzVZNPYh4HXEdnzoYI4dZkr9w==", + "requires": { + "aes-js": "^3.1.1", + "bs58check": "^2.1.2", + "ethereumjs-util": "^6.0.0", + "hdkey": "^1.1.0", + "randombytes": "^2.0.6", + "safe-buffer": "^5.1.2", + "scrypt.js": "^0.3.0", + "utf8": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "ethers": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.0-beta.3.tgz", + "integrity": "sha512-YYPogooSknTwvHg3+Mv71gM/3Wcrx+ZpCzarBj3mqs9njjRkrOo2/eufzhHloOCo3JSoNI4TQJJ6yU5ABm3Uog==", + "requires": { + "@types/node": "^10.3.2", + "aes-js": "3.0.0", + "bn.js": "^4.4.0", + "elliptic": "6.3.3", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.3", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.5.tgz", + "integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==" + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0=" + }, + "elliptic": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.3.3.tgz", + "integrity": "sha1-VILZZG1UvLif19mU/J4ulWiHbj8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=" + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48=" + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=" + } + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=", + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -7168,9 +7887,9 @@ } }, "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "execa": { @@ -7306,11 +8025,6 @@ "vary": "~1.1.2" }, "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7328,11 +8042,21 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "ext": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.2.0.tgz", + "integrity": "sha512-0ccUQK/9e3NreLFg6K6np8aPyRgwycx+oFGtfx1dSp7Wj00Ozw9r05FgBRlzjf2XBM7LAzwgLyDscRrtSU91hA==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" } } }, @@ -7451,19 +8175,36 @@ "ms": "2.0.0" } }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "2.0.1", @@ -7544,10 +8285,9 @@ } }, "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "requires": { "pend": "~1.2.0" } @@ -7567,10 +8307,9 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-4.0.0.tgz", + "integrity": "sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA==", "requires": { "flat-cache": "^2.0.1" } @@ -7620,6 +8359,16 @@ } } }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "filesize": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", @@ -7684,6 +8433,17 @@ "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" + }, + "dependencies": { + "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==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + } } }, "find-root": { @@ -7693,13 +8453,11 @@ "dev": true }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^2.0.0" } }, "findup-sync": { @@ -7736,6 +8494,35 @@ "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "focus-lock": { @@ -7762,6 +8549,14 @@ } } }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -7779,8 +8574,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { "version": "1.5.0", @@ -7802,7 +8596,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -7840,19 +8633,83 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, + "fs-extra-p": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-8.1.0.tgz", + "integrity": "sha512-sCLpU5kk5CvrWZvFM9dUlqPgHrE02AEt6XYzF7kDscr5COc7DHfhNfODTXt0bkVNmt5DkvU2uJSYjorxY3bRKA==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.9", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -7862,6 +8719,35 @@ "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs.realpath": { @@ -8386,9 +9272,9 @@ "dev": true }, "functions-have-names": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.1.1.tgz", - "integrity": "sha512-U0kNHUoxwPNPWOJaMG7Z00d4a/qZVrFtzWJRaK8V9goaVOCXBSQSJpt3MYGNtkScKEBKovxLjnNdC9MlXwo5Pw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.0.tgz", + "integrity": "sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ==", "dev": true }, "fuse.js": { @@ -8465,10 +9351,9 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" }, "get-stream": { "version": "4.1.0", @@ -8487,15 +9372,14 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8530,13 +9414,12 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" }, "global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dev": true, + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "requires": { "min-document": "^2.19.0", - "process": "^0.11.10" + "process": "~0.5.1" } }, "global-dirs": { @@ -8554,31 +9437,16 @@ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } } }, "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } }, "globals": { @@ -8598,15 +9466,25 @@ } }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + } } }, "globjoin": { @@ -8654,7 +9532,6 @@ "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, "requires": { "@sindresorhus/is": "^0.14.0", "@szmarczak/http-timer": "^1.1.2", @@ -8670,9 +9547,14 @@ } }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" }, "growly": { "version": "1.3.0", @@ -8693,14 +9575,6 @@ "requires": { "duplexer": "^0.1.1", "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } } }, "handle-thing": { @@ -8709,9 +9583,9 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" }, "handlebars": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.5.tgz", - "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -8731,19 +9605,23 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8774,11 +9652,23 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } }, "has-unicode": { "version": "2.0.1", @@ -8846,23 +9736,33 @@ } }, "hast-util-parse-selector": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.2.tgz", - "integrity": "sha512-jIMtnzrLTjzqgVEQqPEmwEZV+ea4zHRFTP8Z2Utw0I5HuBOXHzUPPQWr6ouJdJqDKLbFU/OEiYwZ79LalZkmmw==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.3.tgz", + "integrity": "sha512-nxbeqjQNxsvo/uYYAw9kij6td05YVUlf1qti09rVfbWSLT5H6wo3c+USIwX6nzXWk5kFZzXnEqO82856r0aM2Q==", "dev": true }, "hastscript": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.0.tgz", - "integrity": "sha512-7mOQX5VfVs/gmrOGlN8/EDfp1GqV6P3gTNVt+KnX4gbYhpASTM8bklFdFQCbFRAadURXAmw0R1QQdBdqp7jswQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.1.tgz", + "integrity": "sha512-xHo1Hkcqd0LlWNuDL3/BxwhgAGp3d7uEvCMgCTrBY+zsOooPPH+8KAvW8PCgl+GB8H3H44nfSaF0A4BQ+4xlYg==", "dev": true, "requires": { "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.2.0", - "property-information": "^5.0.1", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, + "hdkey": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-1.1.1.tgz", + "integrity": "sha512-DvHZ5OuavsfWs5yfVJZestsnc3wzPvLWNk6c2nRUfo6X+OtxypGt20vDDf7Ba+MJzjL3KS1og2nw2eBbLCOUTA==", + "requires": { + "coinstring": "^2.0.0", + "safe-buffer": "^5.1.1", + "secp256k1": "^3.0.1" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -8929,6 +9829,35 @@ "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "html-element-map": { @@ -8967,6 +9896,22 @@ "param-case": "^2.1.1", "relateurl": "^0.2.7", "uglify-js": "^3.5.1" + }, + "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 + } + } + }, + "html-parse-stringify2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify2/-/html-parse-stringify2-2.0.1.tgz", + "integrity": "sha1-3FZwtyksoVi3vJFsmmc1rIhyg0o=", + "requires": { + "void-elements": "^2.0.1" } }, "html-tags": { @@ -8999,25 +9944,12 @@ "entities": "^1.1.1", "inherits": "^2.0.1", "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "http-cache-semantics": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==", - "dev": true + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" }, "http-deceiver": { "version": "1.2.7", @@ -9043,6 +9975,11 @@ } } }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, "http-parser-js": { "version": "0.4.10", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", @@ -9056,6 +9993,13 @@ "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + } } }, "http-proxy-middleware": { @@ -9073,7 +10017,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -9085,6 +10028,22 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "i18next": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-19.0.0.tgz", + "integrity": "sha512-xxNKNOqLdGP/M+/fzzBOhcc9hCAqv6gDhHq0xbYz/Vlz5PlMfr9P1LbBvmk7RkZjYoh/kyM1tnfSl+sJ2VaD0Q==", + "requires": { + "@babel/runtime": "^7.3.1" + } + }, + "i18next-xhr-backend": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/i18next-xhr-backend/-/i18next-xhr-backend-3.2.2.tgz", + "integrity": "sha512-OtRf2Vo3IqAxsttQbpjYnmMML12IMB5e0fc5B7qKJFLScitYaXa1OhMX0n0X/3vrfFlpHL9Ro/H+ps4Ej2j7QQ==", + "requires": { + "@babel/runtime": "^7.5.5" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9102,6 +10061,30 @@ "postcss": "^7.0.14" } }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + } + } + }, "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", @@ -9113,10 +10096,9 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" }, "immer": { "version": "1.10.0", @@ -9134,13 +10116,19 @@ } }, "import-fresh": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", - "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "import-from": { @@ -9161,10 +10149,9 @@ } }, "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==" }, "import-local": { "version": "2.0.0", @@ -9187,13 +10174,9 @@ "dev": true }, "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" }, "indexes-of": { "version": "1.0.1", @@ -9246,18 +10229,30 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "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==", + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } } } @@ -9287,10 +10282,9 @@ } }, "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" }, "ip": { "version": "1.1.5", @@ -9381,8 +10375,7 @@ "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" }, "is-ci": { "version": "2.0.0", @@ -9488,8 +10481,7 @@ "is-function": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", - "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", - "dev": true + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" }, "is-generator-fn": { "version": "2.1.0", @@ -9505,6 +10497,11 @@ "is-extglob": "^2.1.1" } }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=" + }, "is-hexadecimal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", @@ -9531,6 +10528,11 @@ } } }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, "is-npm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", @@ -9566,6 +10568,11 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -9619,6 +10626,11 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", @@ -9651,7 +10663,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, "requires": { "has-symbols": "^1.0.0" } @@ -9659,8 +10670,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -9695,9 +10705,9 @@ "dev": true }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isbinaryfile": { "version": "4.0.2", @@ -9728,8 +10738,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "2.0.5", @@ -9771,6 +10780,16 @@ "supports-color": "^6.1.0" }, "dependencies": { + "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" + } + }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -9795,6 +10814,16 @@ "source-map": "^0.6.1" }, "dependencies": { + "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" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9812,6 +10841,15 @@ "handlebars": "^4.1.2" } }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, "jest": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", @@ -9822,12 +10860,6 @@ "jest-cli": "^24.9.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -9881,36 +10913,44 @@ "yargs": "^13.3.0" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "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" + } }, - "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==", + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "p-try": "^2.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": { - "ansi-regex": "^4.1.0" + "p-limit": "^2.0.0" } }, - "which-module": { + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "wrap-ansi": { @@ -9924,12 +10964,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", @@ -9996,6 +11030,15 @@ "realpath-native": "^1.1.0" } }, + "jest-css-modules": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jest-css-modules/-/jest-css-modules-2.1.0.tgz", + "integrity": "sha512-my3Scnt6l2tOll/eGwNZeh1KLAFkNzdl4MyZRdpl46GO6/93JcKKdTjNqK6Nokg8A8rT84MFLOpY1pzqKBEqMw==", + "dev": true, + "requires": { + "identity-obj-proxy": "3.0.0" + } + }, "jest-diff": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", @@ -10143,14 +11186,6 @@ "micromatch": "^3.1.10", "slash": "^2.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "jest-mock": { @@ -10256,12 +11291,6 @@ "yargs": "^13.3.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -10294,48 +11323,44 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "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==", + "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": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "p-try": "^2.0.0" } }, - "strip-bom": { + "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "which-module": { + "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "wrap-ansi": { @@ -10349,12 +11374,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", @@ -10440,11 +11459,11 @@ "source-map": "^0.6.0" }, "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true }, "source-map": { "version": "0.6.1", @@ -10473,6 +11492,12 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true } } }, @@ -10524,6 +11549,11 @@ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, + "js-sha3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.6.1.tgz", + "integrity": "sha1-W4n3enR3Z5h39YxKB1JAk0sflcA=" + }, "js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -10556,8 +11586,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdoc": { "version": "3.6.3", @@ -10644,6 +11673,30 @@ "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + } + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", @@ -10663,8 +11716,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "json-parse-better-errors": { "version": "1.0.2", @@ -10674,8 +11726,7 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", @@ -10691,8 +11742,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.3", @@ -10711,7 +11761,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -10720,7 +11769,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -10739,19 +11787,39 @@ } }, "jsx-ast-utils": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.1.tgz", - "integrity": "sha512-v3FxCcAf20DayI+uxnCuw795+oOIkVu6EnJ1+kSzhqqTZHNkTZ7B66ZgLp4oLJ/gbA64cI0B7WRoHZMSRdyVRQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", "dev": true, "requires": { "array-includes": "^3.0.3", "object.assign": "^4.1.0" } }, + "keccak": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-2.0.0.tgz", + "integrity": "sha512-rKe/lRr0KGhjoz97cwg+oeT1Rj/Y4cjae6glArioUC8JBF9ROGZctwIaaruM7d7naovME4Q8WcQSO908A8qcyQ==", + "requires": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + } + }, + "keccakjs": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/keccakjs/-/keccakjs-0.2.3.tgz", + "integrity": "sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==", + "requires": { + "browserify-sha3": "^0.0.4", + "sha3": "^1.2.2" + } + }, "keyboardevent-from-electron-accelerator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz", - "integrity": "sha512-VDC4vKWGrR3VgIKCE4CsXnvObGgP8C2idnTKEMUkuEuvDGE1GEBX9FtNdJzrD00iQlhI3xFxRaeItsUmlERVng==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", + "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==" }, "keyboardevents-areequal": { "version": "0.2.2", @@ -10762,7 +11830,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, "requires": { "json-buffer": "3.0.0" } @@ -10823,6 +11890,14 @@ "core-js": "^3.0.4", "dotenv": "^8.0.0", "dotenv-expand": "^5.1.0" + }, + "dependencies": { + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true + } } }, "lazy-val": { @@ -10832,12 +11907,11 @@ "dev": true }, "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "^2.0.0" } }, "left-pad": { @@ -10847,10 +11921,9 @@ "dev": true }, "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { "version": "0.3.0", @@ -10872,16 +11945,21 @@ } }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "loader-fs-cache": { @@ -10905,6 +11983,25 @@ "pkg-dir": "^1.0.0" } }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, "pkg-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", @@ -10942,19 +12039,12 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } } }, "lodash": { @@ -11010,6 +12100,11 @@ "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", "dev": true }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -11019,9 +12114,9 @@ } }, "loglevel": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", - "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==" + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==" }, "longest": { "version": "1.0.1", @@ -11060,8 +12155,7 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, "lowlight": { "version": "1.9.2", @@ -11074,28 +12168,25 @@ } }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -11127,9 +12218,9 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" }, "map-or-similar": { "version": "1.5.0", @@ -11206,9 +12297,9 @@ } }, "mdast-util-compact": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.3.tgz", - "integrity": "sha512-nRiU5GpNy62rZppDKbLwhhtw5DXoFMqw9UNZFmlPsNaQCZ//WLjGKUwWMdJrUH+Se7UvtO2gXtAMe0g/N+eI5w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", + "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", "requires": { "unist-util-visit": "^1.1.0" } @@ -11238,13 +12329,6 @@ "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - } } }, "memoizerific": { @@ -11263,24 +12347,51 @@ "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", + "minimist-options": "^3.0.1", "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" } }, "merge-deep": { @@ -11294,19 +12405,6 @@ "kind-of": "^3.0.2" }, "dependencies": { - "clone-deep": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", - "dev": true, - "requires": { - "for-own": "^0.1.3", - "is-plain-object": "^2.0.1", - "kind-of": "^3.0.2", - "lazy-cache": "^1.0.3", - "shallow-clone": "^0.1.2" - } - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -11315,35 +12413,6 @@ "requires": { "is-buffer": "^1.1.5" } - }, - "shallow-clone": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", - "dev": true, - "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^2.0.1", - "lazy-cache": "^0.2.3", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "lazy-cache": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", - "dev": true - } - } } } }, @@ -11422,22 +12491,19 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, "requires": { "dom-walk": "^0.1.0" } @@ -11481,6 +12547,16 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } } } }, @@ -11516,6 +12592,23 @@ "is-plain-obj": "^1.1.0" } }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -11585,6 +12678,50 @@ } } }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "requires": { + "mkdirp": "*" + } + }, + "mobx": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-5.15.0.tgz", + "integrity": "sha512-Ax7vE32zBRgO0A3Yu12RXaFwIhBzpGQXZjRHiDvKLrqpDEijhNTSuXJ1Ci+L30BSa/Mb3by9+3nuKq15YoH5dA==" + }, + "mobx-react": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-6.1.4.tgz", + "integrity": "sha512-wzrJF1RflhyLh8ne4FJfMbG8ZgRFmZ62b4nbyhJzwQpAmrkSnSsAWG9mIff4ffV/Q7OU+uOYf7rXvSmiuUe4cw==", + "requires": { + "mobx-react-lite": "^1.4.2" + } + }, + "mobx-react-form": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/mobx-react-form/-/mobx-react-form-2.0.8.tgz", + "integrity": "sha512-Z/JsXkN7B5xjG1tolHKytJiKmtLSdqkFKMco5AVagL8cQ0yJmE+iRZ212JKGHfkEKZrRWn7EDnX2STawIQFqxg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "mobx-react-lite": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-1.5.0.tgz", + "integrity": "sha512-Ss8RLKKGn+QhKbfCHvQ4+RPEVKR8AnPW1wNyWzZAS3wYw7UP4FX6GdRn64sdOhrP646o/JtXbLuDuc4RH3Bqyg==" + }, + "mobx-utils": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/mobx-utils/-/mobx-utils-5.5.2.tgz", + "integrity": "sha512-cOlFJDWU/NHyGKvdhWqPdHmhPfeKewElAIZp5XticWIsSLGAA+4Uou3+8ookhQ/yG7qZXzvjAq90TZWXiR5+XA==" + }, + "mock-fs": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.10.3.tgz", + "integrity": "sha512-bcukePBvuA3qovmq0Qtqu9+1APCIGkFHnsozrPIVromt5XFGGgkQSfaN0H6RI8gStHkO/hRgimvS3tooNes4pQ==" + }, "moo": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", @@ -11634,6 +12771,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, + "nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -11669,6 +12811,14 @@ "railroad-diagrams": "^1.0.0", "randexp": "0.4.6", "semver": "^5.4.1" + }, + "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 + } } }, "negotiator": { @@ -11681,6 +12831,11 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -11744,6 +12899,17 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } } } }, @@ -11783,10 +12949,54 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } } } }, @@ -11810,9 +13020,9 @@ } }, "node-releases": { - "version": "1.1.36", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.36.tgz", - "integrity": "sha512-ggXhX6QGyJSjj3r+6ml2LqqC28XOWmKtpb+a15/Zpr9V3yoNazxJNlcQDS9bYaid5FReEWHEgToH1mwoUceWwg==", + "version": "1.1.39", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.39.tgz", + "integrity": "sha512-8MRC/ErwNCHOlAFycy9OPca46fQYUjbJRDcZTHVWIGXIjYLM73k70vv3WkYutVnM4cCo4hE0MqBVVZjP6vjISA==", "requires": { "semver": "^6.3.0" }, @@ -11825,9 +13035,9 @@ } }, "node-sass": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", + "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -11837,7 +13047,7 @@ "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "meow": "^3.7.0", "mkdirp": "^0.5.1", "nan": "^2.13.2", @@ -11849,12 +13059,34 @@ "true-case-path": "^1.0.2" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -11878,18 +13110,195 @@ "which": "^1.2.9" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { "abbrev": "1" @@ -11924,8 +13333,7 @@ "normalize-url": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" }, "npm-run-path": { "version": "2.0.2", @@ -11998,17 +13406,32 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=", + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha1-UzRK2xRhehP26N0s4okF0cC6MhU=" + } + } + }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -12050,10 +13473,9 @@ "dev": true }, "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "object-is": { "version": "1.0.1", @@ -12139,6 +13561,14 @@ "has": "^1.0.3" } }, + "oboe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", + "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", + "requires": { + "http-https": "^1.0.0" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -12172,6 +13602,14 @@ "dev": true, "requires": { "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } } }, "open": { @@ -12206,27 +13644,21 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true } } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "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.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "original": { @@ -12249,12 +13681,13 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "requires": { - "lcid": "^1.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "os-tmpdir": { @@ -12276,8 +13709,7 @@ "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-defer": { "version": "1.0.0", @@ -12304,19 +13736,19 @@ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -12338,10 +13770,18 @@ "retry": "^0.12.0" } }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { "version": "6.5.0", @@ -12376,6 +13816,35 @@ "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "param-case": { @@ -12394,6 +13863,14 @@ "dev": true, "requires": { "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } } }, "parse-asn1": { @@ -12409,6 +13886,23 @@ "safe-buffer": "^5.1.1" } }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, "parse-entities": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", @@ -12422,13 +13916,22 @@ "is-hexadecimal": "^1.0.0" } }, + "parse-headers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.2.tgz", + "integrity": "sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==", + "requires": { + "for-each": "^0.3.3", + "string.prototype.trim": "^1.1.2" + } + }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "parse-passwd": { @@ -12438,10 +13941,13 @@ "dev": true }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "parseurl": { "version": "1.3.3", @@ -12464,13 +13970,9 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -12493,29 +13995,26 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "requires": { "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } } }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "pbkdf2": { @@ -12533,19 +14032,17 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", @@ -12584,69 +14081,59 @@ "requires": { "locate-path": "^3.0.0" } - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, + "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==", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "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 + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" } } }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -12663,12 +14150,12 @@ } }, "polished": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-3.4.1.tgz", - "integrity": "sha512-GflTnlP5rrpDoigjczEkS6Ye7NDA4sFvAnlr5hSDrEvjiVj97Xzev3hZlLi3UB27fpxyTS9rWU64VzVLWkG+mg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/polished/-/polished-3.4.2.tgz", + "integrity": "sha512-9Rch6iMZckABr6EFCLPZsxodeBpXMo9H4fRlfR/9VjMEyy5xpo1/WgXlJGgSjPyVhEZNycbW7UmYMNyWS5MI0g==", "dev": true, "requires": { - "@babel/runtime": "^7.4.5" + "@babel/runtime": "^7.6.3" } }, "popper.js": { @@ -12703,9 +14190,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", - "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -12815,6 +14302,25 @@ "postcss": "^7.0.16", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + } } }, "postcss-modules-scope": { @@ -12825,6 +14331,19 @@ "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } } }, "postcss-modules-values": { @@ -12879,12 +14398,11 @@ } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "requires": { - "cssesc": "^3.0.0", + "dot-prop": "^4.1.1", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } @@ -12904,9 +14422,9 @@ "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==" }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, "prelude-ls": { "version": "1.1.2", @@ -12917,8 +14435,7 @@ "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "pretty-bytes": { "version": "1.0.4", @@ -12928,6 +14445,176 @@ "requires": { "get-stdin": "^4.0.1", "meow": "^3.1.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } } }, "pretty-error": { @@ -12950,14 +14637,6 @@ "ansi-regex": "^4.0.0", "ansi-styles": "^3.2.0", "react-is": "^16.8.4" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } } }, "pretty-hrtime": { @@ -12982,9 +14661,9 @@ "dev": true }, "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" }, "process-nextick-args": { "version": "2.0.1", @@ -13007,12 +14686,6 @@ "through2": "~0.2.3" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "object-keys": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", @@ -13095,9 +14768,9 @@ } }, "prompts": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", - "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -13157,8 +14830,7 @@ "psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" }, "public-encrypt": { "version": "4.0.3", @@ -13265,12 +14937,6 @@ "yargs": "~3.10.0" } }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", @@ -13389,17 +15055,16 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { + "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", "strict-uri-encode": "^1.0.0" } @@ -13486,13 +15151,6 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - } } }, "raw-loader": { @@ -13518,9 +15176,9 @@ } }, "react": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.10.2.tgz", - "integrity": "sha512-MFVIq0DpIhrHFyqLU0S3+4dIcBhhOvBE8bJ/5kHPVOVaGdo0KuiQzpcjCPsf585WvhypqtrMILyoE2th6dT+Lw==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz", + "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -13584,9 +15242,9 @@ }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "browserslist": { @@ -13653,6 +15311,12 @@ "slash": "^1.0.0" } }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, "inquirer": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", @@ -13674,34 +15338,77 @@ "through": "^2.3.6" } }, + "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" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "path-type": { + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "p-limit": "^2.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "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==", + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } } } @@ -13721,6 +15428,12 @@ "recast": "^0.17.3" }, "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 + }, "recast": { "version": "0.17.6", "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.6.tgz", @@ -13742,20 +15455,20 @@ } }, "react-dom": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.10.2.tgz", - "integrity": "sha512-kWGDcH3ItJK4+6Pl9DZB16BXYAZyrYQItU4OMy0jAkv5aNqc+mAKb4TpFtAteI6TJZu+9ZlNhaeNQSVQDHJzkw==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz", + "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.16.2" + "scheduler": "^0.17.0" } }, "react-draggable": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.0.3.tgz", - "integrity": "sha512-4vD6zms+9QGeZ2RQXzlUBw8PBYUXy+dzYX5r22idjp9YwQKIIvD/EojL0rbjS1GK4C3P0rAJnmKa8gDQYWUDyA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.1.0.tgz", + "integrity": "sha512-Or/qe70cfymshqoC8Lsp0ukTzijJObehb7Vfl7tb5JRxoV+b6PDkOGoqYaWBzZ59k9dH/bwraLGsnlW78/3vrA==", "dev": true, "requires": { "classnames": "^2.2.5", @@ -13814,10 +15527,19 @@ "prop-types": "^15.6.1" } }, + "react-i18next": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.1.0.tgz", + "integrity": "sha512-FxHNBA6ptW7cygTpbIz5GAN9lrsB89xqgwpD3AzwSB4CDQsd+9i9/Je3Hc3VF6joAb1khFmCUO3ETJFLSrmuwg==", + "requires": { + "@babel/runtime": "^7.3.1", + "html-parse-stringify2": "2.0.1" + } + }, "react-is": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", - "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", + "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -13826,9 +15548,9 @@ "dev": true }, "react-popper": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.4.tgz", - "integrity": "sha512-9AcQB29V+WrBKk6X7p0eojd1f25/oJajVdMZkywIoAV6Ag7hzE1Mhyeup2Q1QnvFRtGQFQvtqfhlEoDAPfKAVA==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-1.3.6.tgz", + "integrity": "sha512-kLTfa9z8n+0jJvRVal9+vIuirg41rObg4Bbrvv/ZfsGPQDN9reyVVSxqnHF1ZNgXgV7x11PeUfd5ItF8DZnqhg==", "dev": true, "requires": { "@babel/runtime": "^7.1.2", @@ -13861,15 +15583,23 @@ } }, "react-popper-tooltip": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-2.9.1.tgz", - "integrity": "sha512-LSbvXLEQlNKWig2GMKQW/1bBwCkWIr9cpJ+WJpSGGGhX45CthRtwyilPPLJQkc3qI6UMTAXPp0Fe/pj9E77trg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-2.10.0.tgz", + "integrity": "sha512-iMNWaY41G7kcx2/kcV+37GLe4C93yI9CPZ9DH+V9tOtJIJwEzm/w9+mlr6G1QLzxefDxjliqymMXk9X73pyuWA==", "dev": true, "requires": { "@babel/runtime": "^7.6.3", "react-popper": "^1.3.4" } }, + "react-portal": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.0.tgz", + "integrity": "sha512-Zf+vGQ/VEAb5XAy+muKEn48yhdCNYPZaB1BWg1xc8sAZWD8pXTgPtQT4ihBdmWzsfCq8p8/kqf0GWydSBqc+Eg==", + "requires": { + "prop-types": "^15.5.8" + } + }, "react-router": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", @@ -13902,9 +15632,9 @@ } }, "react-sizeme": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-2.6.9.tgz", - "integrity": "sha512-bKHpOoLWRhKgvMZmS+4NQhlQApuMwZySqweQ2vqSoqgAy+Bc0L6ApTrKU7+Wf4xJL62SmCwOSBKGBu0PthPhTA==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-2.6.10.tgz", + "integrity": "sha512-OJAPQxSqbcpbsXFD+fr5ARw4hNSAOimWcaTOLcRkIqnTp9+IFWY0w3Qdw1sMez6Ao378aimVL/sW6TTsgigdOA==", "dev": true, "requires": { "element-resize-detector": "^1.1.15", @@ -13927,21 +15657,33 @@ } }, "react-test-renderer": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.10.2.tgz", - "integrity": "sha512-k9Qzyev6cTIcIfrhgrFlYQAFxh5EEDO6ALNqYqmKsWVA7Q/rUMTay5nD3nthi6COmYsd4ghVYyi8U86aoeMqYQ==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.12.0.tgz", + "integrity": "sha512-Vj/teSqt2oayaWxkbhQ6gKis+t5JrknXfPVo+aIJ8QwYAqMPH77uptOdrlphyxl8eQI/rtkOYg86i/UWkpFu0w==", "dev": true, "requires": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", "react-is": "^16.8.6", - "scheduler": "^0.16.2" + "scheduler": "^0.18.0" + }, + "dependencies": { + "scheduler": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-textarea-autosize": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz", - "integrity": "sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz", + "integrity": "sha512-uH3ORCsCa3C6LHxExExhF4jHoXYCQwE5oECmrRsunlspaDAbS4mGKNlWZqjLfInWtFQcf0o1n1jC/NGXFdUBCg==", "dev": true, "requires": { "@babel/runtime": "^7.1.2", @@ -13949,65 +15691,78 @@ } }, "read-config-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz", - "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==", - "dev": true, - "requires": { - "dotenv": "^8.0.0", - "dotenv-expand": "^5.1.0", - "fs-extra": "^8.1.0", - "js-yaml": "^3.13.1", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.2.2.tgz", + "integrity": "sha512-PuFpMgZF01VB0ydH1dfitAxCP/fh+qnfbA9cYNIPoxPbz0SMngsrafCtaHDWfER7MwlDz4fmrNBhPkakxxFpTg==", + "dev": true, + "requires": { + "ajv": "^6.9.2", + "ajv-keywords": "^3.4.0", + "bluebird-lst": "^1.0.7", + "dotenv": "^6.2.0", + "dotenv-expand": "^4.2.0", + "fs-extra-p": "^7.0.1", + "js-yaml": "^3.12.1", "json5": "^2.1.0", "lazy-val": "^1.0.4" }, "dependencies": { + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "dev": true + }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", + "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "fs-extra-p": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz", + "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==", + "dev": true, + "requires": { + "bluebird-lst": "^1.0.7", + "fs-extra": "^7.0.1" + } } } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "path-type": "^3.0.0" } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { @@ -14018,6 +15773,35 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "realpath-native": { @@ -14074,13 +15858,12 @@ } }, "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" } }, "reflect.ownkeys": { @@ -14283,6 +16066,23 @@ "htmlparser2": "^3.3.0", "strip-ansi": "^3.0.0", "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "repeat-element": { @@ -14313,7 +16113,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -14335,24 +16134,31 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" } @@ -14430,6 +16236,19 @@ "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } } } }, @@ -14452,7 +16271,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, "requires": { "lowercase-keys": "^1.0.0" } @@ -14503,6 +16321,14 @@ "inherits": "^2.0.1" } }, + "rlp": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.4.tgz", + "integrity": "sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw==", + "requires": { + "bn.js": "^4.11.1" + } + }, "rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", @@ -14536,6 +16362,12 @@ "aproba": "^1.1.1" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, "rxjs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", @@ -14599,6 +16431,214 @@ "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } } }, "sass-loader": { @@ -14614,6 +16654,17 @@ "semver": "^6.3.0" }, "dependencies": { + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "schema-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", @@ -14629,6 +16680,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } } } }, @@ -14639,9 +16699,9 @@ "dev": true }, "scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-BqYVWqwz6s1wZMhjFvLfVR5WXP7ZY32M/wYPo04CcuPM7XZEbV2TBNW7Z0UkguPTl0dWMA59VbNXxK6q+pHItg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", + "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -14657,12 +16717,63 @@ "ajv-keywords": "^3.1.0" } }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { + "scrypt": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/scrypt/-/scrypt-6.0.3.tgz", + "integrity": "sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=", + "optional": true, + "requires": { + "nan": "^2.0.8" + } + }, + "scrypt-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.3.tgz", + "integrity": "sha1-uwBAvgMEPamgEqLOqfyfhSz8h9Q=" + }, + "scrypt-shim": { + "version": "github:web3-js/scrypt-shim#be5e616323a8b5e568788bf94d03c1b8410eac54", + "from": "github:web3-js/scrypt-shim", + "requires": { + "scryptsy": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "scryptsy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz", + "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "scrypt.js": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scrypt.js/-/scrypt.js-0.3.0.tgz", + "integrity": "sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==", + "requires": { + "scrypt": "^6.0.2", + "scryptsy": "^1.2.1" + } + }, + "scryptsy": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-1.2.1.tgz", + "integrity": "sha1-oyJfpLJST4AnAHYeKFW987LZIWM=", + "requires": { + "pbkdf2": "^3.0.3" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { "js-base64": "^2.1.8", "source-map": "^0.4.2" }, @@ -14678,6 +16789,29 @@ } } }, + "secp256k1": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", + "integrity": "sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==", + "requires": { + "bindings": "^1.5.0", + "bip66": "^1.1.5", + "bn.js": "^4.11.8", + "create-hash": "^1.2.0", + "drbg.js": "^1.0.1", + "elliptic": "^6.4.1", + "nan": "^2.14.0", + "safe-buffer": "^5.1.2" + } + }, + "seek-bzip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "requires": { + "commander": "~2.8.1" + } + }, "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -14847,6 +16981,18 @@ "send": "0.17.1" } }, + "servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "requires": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -14892,13 +17038,48 @@ "safe-buffer": "^5.0.1" } }, + "sha3": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-1.2.3.tgz", + "integrity": "sha512-sOWDZi8cDBRkLfWOw18wvJyNblXDHzwMGnRWut8zNNeIeLnmMRO17bjpLc7OzMuj1ASUgx2IyohzUCAl+Kx5vA==", + "requires": { + "nan": "2.13.2" + }, + "dependencies": { + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==" + } + } + }, "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", "dev": true, "requires": { - "kind-of": "^6.0.2" + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true + } } }, "shallow-equal": { @@ -14954,6 +17135,21 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", + "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", + "requires": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simplebar": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-4.2.3.tgz", @@ -14987,6 +17183,12 @@ "string-width": "^1.0.1" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -15006,20 +17208,28 @@ "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } } } }, "sisteransi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", - "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, "slice-ansi": { "version": "2.1.0", @@ -15213,9 +17423,9 @@ } }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15239,6 +17449,12 @@ "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==", "dev": true }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -15290,18 +17506,6 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "specificity": { @@ -15332,7 +17536,6 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -15407,6 +17610,38 @@ "dev": true, "requires": { "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stealthy-require": { @@ -15428,6 +17663,35 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-each": { @@ -15449,6 +17713,35 @@ "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-shift": { @@ -15459,8 +17752,7 @@ "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-length": { "version": "2.0.0", @@ -15472,6 +17764,12 @@ "strip-ansi": "^4.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -15484,22 +17782,13 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "strip-ansi": "^5.1.0" } }, "string.prototype.matchall": { @@ -15541,7 +17830,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.0.tgz", "integrity": "sha512-9EIjYD/WdlvLpn987+ctkLf0FfvBefOCuiEr2henD8X+7jfwPnyvTdmW8OJhj5p+M0/96mBdynLWkxUr+rHlpg==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.13.0", @@ -15552,7 +17840,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -15562,18 +17849,24 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } } }, "stringify-entities": { @@ -15588,29 +17881,24 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } + "ansi-regex": "^4.1.0" } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "requires": { - "is-utf8": "^0.2.0" + "is-natural-number": "^4.0.1" } }, "strip-eof": { @@ -15618,15 +17906,19 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha1-DF8VX+8RUTczd96du1iNoFUA428=", "requires": { - "get-stdin": "^4.0.1" + "is-hex-prefixed": "1.0.0" } }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -15712,283 +18004,6 @@ "sugarss": "^2.0.0", "svg-tags": "^1.0.0", "table": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "file-entry-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-4.0.0.tgz", - "integrity": "sha512-AVSwsnbV8vH/UVbvgEhf3saVQXORNv0ZzSkvkhQIaia5Tia+JhGTaa/ePUSVoPHQyGayQNmYfkzFi3WZV5zcpA==", - "requires": { - "flat-cache": "^2.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - } - } - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" - }, - "import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" - }, - "meow": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", - "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0", - "yargs-parser": "^10.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } } }, "stylelint-config-rational-order": { @@ -16077,17 +18092,17 @@ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=" }, "svgo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.33", - "csso": "^3.5.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", @@ -16098,25 +18113,86 @@ }, "dependencies": { "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^2.1.2", + "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + } + } + }, + "swarm-js": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.39.tgz", + "integrity": "sha512-QLMqL2rzF6n5s50BptyD6Oi0R1aWlJC5Y17SRIVXRj6OR1DRIPM7nepvrxxkjA1zNzFz6mUOMjfeqeDaWB7OOg==", + "requires": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "decompress": "^4.0.0", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^7.1.0", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request-promise": "^0.1.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" } } } @@ -16146,31 +18222,6 @@ "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } } }, "taffydb": { @@ -16185,20 +18236,66 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "telejson": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-3.0.3.tgz", - "integrity": "sha512-gUOh6wox1zJjbGMg+e26NquZcp/F18EbIaqVvjiGqikRqVB4fYEAM8Nyin8smgwX30XhaRBOg+kCj4vInmvwAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-3.1.0.tgz", + "integrity": "sha512-mhiVy+xp2atri1bzSzdy/gVGXlOhibaoZ092AUq5xhnrZGdzhF0fLaOduHJQghkro+qmjYMwhsOL9CkD2zTicg==", "dev": true, "requires": { "@types/is-function": "^1.0.0", @@ -16211,11 +18308,27 @@ "memoizerific": "^1.11.3" }, "dependencies": { + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "isobject": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true } } }, @@ -16282,19 +18395,40 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } }, "terser": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", - "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", + "integrity": "sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==", "requires": { "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==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16346,54 +18480,40 @@ "locate-path": "^3.0.0" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "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": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "p-try": "^2.0.0" } }, - "path-type": { + "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "p-limit": "^2.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, "read-pkg-up": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", @@ -16409,12 +18529,6 @@ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, @@ -16445,8 +18559,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", @@ -16455,6 +18568,35 @@ "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "thunky": { @@ -16462,6 +18604,11 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, "timers-browserify": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", @@ -16507,6 +18654,11 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -16533,8 +18685,7 @@ "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, "to-regex": { "version": "3.0.2", @@ -16577,7 +18728,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -16586,8 +18736,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, @@ -16600,16 +18749,21 @@ "punycode": "^2.1.0" } }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" }, "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" }, "trim-trailing-lines": { "version": "1.1.2", @@ -16646,9 +18800,9 @@ "dev": true }, "ts-pnp": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.4.tgz", - "integrity": "sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", + "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==", "dev": true }, "tslib": { @@ -16656,6 +18810,14 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "requires": { + "tslib": "^1.8.1" + } + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -16665,7 +18827,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -16673,8 +18834,12 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "type-check": { "version": "0.3.2", @@ -16711,10 +18876,18 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", - "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.2.tgz", + "integrity": "sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==", "dev": true }, "ua-parser-js": { @@ -16730,15 +18903,21 @@ "dev": true }, "uglify-js": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.3.tgz", - "integrity": "sha512-KfQUgOqTkLp2aZxrMbCuKCDGW9slFYu2A23A36Gs7sGzTLcRBDORdOi5E21KWHFIfkY8kzgi/Pr1cXCh0yIp5g==", + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.8.tgz", + "integrity": "sha512-XhHJ3S3ZyMwP8kY1Gkugqx3CJh2C3O0y8NPiSxtm1tyD/pktLAkFZsFGpuNfTZddKDQ/bbDBLAd2YyA1pbi8HQ==", "dev": true, "requires": { "commander": "~2.20.3", "source-map": "~0.6.1" }, "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 + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16754,11 +18933,24 @@ "dev": true, "optional": true }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unbzip2-stream": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz", + "integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", - "dev": true + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" }, "unfetch": { "version": "4.1.0", @@ -16860,9 +19052,9 @@ } }, "unist-util-find-all-after": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.4.tgz", - "integrity": "sha512-CaxvMjTd+yF93BKLJvZnEfqdM7fgEACsIpQqz8vIj9CJnUb9VpyymFS3tg6TCtgrF7vfCJBF5jbT2Ox9CBRYRQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz", + "integrity": "sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw==", "requires": { "unist-util-is": "^3.0.0" } @@ -16873,17 +19065,20 @@ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" }, "unist-util-remove-position": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz", - "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", "requires": { "unist-util-visit": "^1.1.0" } }, "unist-util-stringify-position": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", - "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.2.tgz", + "integrity": "sha512-nK5n8OGhZ7ZgUwoUbL8uiVRwAbZyzBsB/Ddrlbu6jwwubFza4oe15KlyEaLNMXQW1svOQq4xesUeqA85YrIUQA==", + "requires": { + "@types/unist": "^2.0.2" + } }, "unist-util-visit": { "version": "1.4.1", @@ -16904,8 +19099,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", @@ -16951,6 +19145,11 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, @@ -16977,6 +19176,14 @@ "latest-version": "^5.0.0", "semver-diff": "^2.0.0", "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + } } }, "upper-case": { @@ -17056,16 +19263,30 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, "requires": { "prepend-http": "^2.0.0" } }, + "url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=" + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -17133,6 +19354,14 @@ "spdx-expression-parse": "^3.0.0" } }, + "validatorjs": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/validatorjs/-/validatorjs-3.17.1.tgz", + "integrity": "sha512-i/aOdu1FPW48Y2NRt/BmHxcpoKcl7vvGtxUkPoacUVNU8jtPlb68QYcYqt7Fls9wqO5YpfLEoUHCrpk3pkIqsQ==", + "requires": { + "date-fns": "2.0.1" + } + }, "value-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", @@ -17147,7 +19376,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -17169,37 +19397,50 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==" + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "requires": { + "unist-util-stringify-position": "^1.1.1" + } } } }, "vfile-location": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz", - "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" }, "vfile-message": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", - "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.2.tgz", + "integrity": "sha512-gNV2Y2fDvDOOqq8bEe7cF3DXU6QgV4uA9zMR2P8tix11l1r7zju3zry3wZ8sx+BEfuO6WQ7z2QzfWTvqHQiwsA==", "requires": { - "unist-util-stringify-position": "^1.1.1" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" } }, "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" }, "vue-docgen-api": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-3.25.0.tgz", - "integrity": "sha512-BhY/xjc/c+x6fqHW7Xi6N0eiYheTC+JtWXq3dNMGlMWl/qdcDaWPeenwhZg7YSZvzz/rq6TqcigkKSLAuS6QgA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-3.26.0.tgz", + "integrity": "sha512-ujdg4i5ZI/wE46RZQMFzKnDGyhEuPCu+fMA86CAd9EIek/6+OqraSVBm5ZkLrbEd5f8xxdnqMU4yiSGHHeao/Q==", "dev": true, "requires": { "@babel/parser": "^7.2.3", @@ -17214,6 +19455,16 @@ "vue-template-compiler": "^2.0.0" }, "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, "recast": { "version": "0.17.6", "resolved": "https://registry.npmjs.org/recast/-/recast-0.17.6.tgz", @@ -17231,6 +19482,12 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true } } }, @@ -17262,6 +19519,27 @@ "browser-process-hrtime": "^0.1.2" } }, + "wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + } + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -17298,6 +19576,322 @@ "minimalistic-assert": "^1.0.0" } }, + "web3": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.2.2.tgz", + "integrity": "sha512-/ChbmB6qZpfGx6eNpczt5YSUBHEA5V2+iUCbn85EVb3Zv6FVxrOo5Tv7Lw0gE2tW7EEjASbCyp3mZeiZaCCngg==", + "requires": { + "@types/node": "^12.6.1", + "web3-bzz": "1.2.2", + "web3-core": "1.2.2", + "web3-eth": "1.2.2", + "web3-eth-personal": "1.2.2", + "web3-net": "1.2.2", + "web3-shh": "1.2.2", + "web3-utils": "1.2.2" + }, + "dependencies": { + "@types/node": { + "version": "12.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", + "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + } + } + }, + "web3-bzz": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.2.2.tgz", + "integrity": "sha512-b1O2ObsqUN1lJxmFSjvnEC4TsaCbmh7Owj3IAIWTKqL9qhVgx7Qsu5O9cD13pBiSPNZJ68uJPaKq380QB4NWeA==", + "requires": { + "@types/node": "^10.12.18", + "got": "9.6.0", + "swarm-js": "0.1.39", + "underscore": "1.9.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.5.tgz", + "integrity": "sha512-RElZIr/7JreF1eY6oD5RF3kpmdcreuQPjg5ri4oQ5g9sq7YWU8HkfB3eH8GwAwxf5OaCh0VPi7r4N/yoTGelrA==" + } + } + }, + "web3-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.2.2.tgz", + "integrity": "sha512-miHAX3qUgxV+KYfaOY93Hlc3kLW2j5fH8FJy6kSxAv+d4d5aH0wwrU2IIoJylQdT+FeenQ38sgsCnFu9iZ1hCQ==", + "requires": { + "@types/bn.js": "^4.11.4", + "@types/node": "^12.6.1", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-requestmanager": "1.2.2", + "web3-utils": "1.2.2" + }, + "dependencies": { + "@types/node": { + "version": "12.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", + "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + } + } + }, + "web3-core-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.2.2.tgz", + "integrity": "sha512-HJrRsIGgZa1jGUIhvGz4S5Yh6wtOIo/TMIsSLe+Xay+KVnbseJpPprDI5W3s7H2ODhMQTbogmmUFquZweW2ImQ==", + "requires": { + "underscore": "1.9.1", + "web3-eth-iban": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-core-method": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.2.2.tgz", + "integrity": "sha512-szR4fDSBxNHaF1DFqE+j6sFR/afv9Aa36OW93saHZnrh+iXSrYeUUDfugeNcRlugEKeUCkd4CZylfgbK2SKYJA==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2", + "web3-core-promievent": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-core-promievent": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.2.2.tgz", + "integrity": "sha512-tKvYeT8bkUfKABcQswK6/X79blKTKYGk949urZKcLvLDEaWrM3uuzDwdQT3BNKzQ3vIvTggFPX9BwYh0F1WwqQ==", + "requires": { + "any-promise": "1.3.0", + "eventemitter3": "3.1.2" + } + }, + "web3-core-requestmanager": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.2.2.tgz", + "integrity": "sha512-a+gSbiBRHtHvkp78U2bsntMGYGF2eCb6219aMufuZWeAZGXJ63Wc2321PCbA8hF9cQrZI4EoZ4kVLRI4OF15Hw==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2", + "web3-providers-http": "1.2.2", + "web3-providers-ipc": "1.2.2", + "web3-providers-ws": "1.2.2" + } + }, + "web3-core-subscriptions": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.2.2.tgz", + "integrity": "sha512-QbTgigNuT4eicAWWr7ahVpJyM8GbICsR1Ys9mJqzBEwpqS+RXTRVSkwZ2IsxO+iqv6liMNwGregbJLq4urMFcQ==", + "requires": { + "eventemitter3": "3.1.2", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2" + } + }, + "web3-eth": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.2.2.tgz", + "integrity": "sha512-UXpC74mBQvZzd4b+baD4Ocp7g+BlwxhBHumy9seyE/LMIcMlePXwCKzxve9yReNpjaU16Mmyya6ZYlyiKKV8UA==", + "requires": { + "underscore": "1.9.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-eth-abi": "1.2.2", + "web3-eth-accounts": "1.2.2", + "web3-eth-contract": "1.2.2", + "web3-eth-ens": "1.2.2", + "web3-eth-iban": "1.2.2", + "web3-eth-personal": "1.2.2", + "web3-net": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-eth-abi": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.2.2.tgz", + "integrity": "sha512-Yn/ZMgoOLxhTVxIYtPJ0eS6pnAnkTAaJgUJh1JhZS4ekzgswMfEYXOwpMaD5eiqPJLpuxmZFnXnBZlnQ1JMXsw==", + "requires": { + "ethers": "4.0.0-beta.3", + "underscore": "1.9.1", + "web3-utils": "1.2.2" + } + }, + "web3-eth-accounts": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.2.2.tgz", + "integrity": "sha512-KzHOEyXOEZ13ZOkWN3skZKqSo5f4Z1ogPFNn9uZbKCz+kSp+gCAEKxyfbOsB/JMAp5h7o7pb6eYsPCUBJmFFiA==", + "requires": { + "any-promise": "1.3.0", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.7", + "ethereumjs-common": "^1.3.2", + "ethereumjs-tx": "^2.1.1", + "scrypt-shim": "github:web3-js/scrypt-shim", + "underscore": "1.9.1", + "uuid": "3.3.2", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-utils": "1.2.2" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "web3-eth-contract": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.2.2.tgz", + "integrity": "sha512-EKT2yVFws3FEdotDQoNsXTYL798+ogJqR2//CaGwx3p0/RvQIgfzEwp8nbgA6dMxCsn9KOQi7OtklzpnJMkjtA==", + "requires": { + "@types/bn.js": "^4.11.4", + "underscore": "1.9.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-promievent": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-eth-abi": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-eth-ens": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.2.2.tgz", + "integrity": "sha512-CFjkr2HnuyMoMFBoNUWojyguD4Ef+NkyovcnUc/iAb9GP4LHohKrODG4pl76R5u61TkJGobC2ij6TyibtsyVYg==", + "requires": { + "eth-ens-namehash": "2.0.8", + "underscore": "1.9.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-promievent": "1.2.2", + "web3-eth-abi": "1.2.2", + "web3-eth-contract": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-eth-iban": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.2.2.tgz", + "integrity": "sha512-gxKXBoUhaTFHr0vJB/5sd4i8ejF/7gIsbM/VvemHT3tF5smnmY6hcwSMmn7sl5Gs+83XVb/BngnnGkf+I/rsrQ==", + "requires": { + "bn.js": "4.11.8", + "web3-utils": "1.2.2" + } + }, + "web3-eth-personal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.2.2.tgz", + "integrity": "sha512-4w+GLvTlFqW3+q4xDUXvCEMU7kRZ+xm/iJC8gm1Li1nXxwwFbs+Y+KBK6ZYtoN1qqAnHR+plYpIoVo27ixI5Rg==", + "requires": { + "@types/node": "^12.6.1", + "web3-core": "1.2.2", + "web3-core-helpers": "1.2.2", + "web3-core-method": "1.2.2", + "web3-net": "1.2.2", + "web3-utils": "1.2.2" + }, + "dependencies": { + "@types/node": { + "version": "12.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.7.tgz", + "integrity": "sha512-E6Zn0rffhgd130zbCbAr/JdXfXkoOUFAKNs/rF8qnafSJ8KYaA/j3oz7dcwal+lYjLA7xvdd5J4wdYpCTlP8+w==" + } + } + }, + "web3-net": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.2.2.tgz", + "integrity": "sha512-K07j2DXq0x4UOJgae65rWZKraOznhk8v5EGSTdFqASTx7vWE/m+NqBijBYGEsQY1lSMlVaAY9UEQlcXK5HzXTw==", + "requires": { + "web3-core": "1.2.2", + "web3-core-method": "1.2.2", + "web3-utils": "1.2.2" + } + }, + "web3-providers-http": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.2.2.tgz", + "integrity": "sha512-BNZ7Hguy3eBszsarH5gqr9SIZNvqk9eKwqwmGH1LQS1FL3NdoOn7tgPPdddrXec4fL94CwgNk4rCU+OjjZRNDg==", + "requires": { + "web3-core-helpers": "1.2.2", + "xhr2-cookies": "1.1.0" + } + }, + "web3-providers-ipc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.2.2.tgz", + "integrity": "sha512-t97w3zi5Kn/LEWGA6D9qxoO0LBOG+lK2FjlEdCwDQatffB/+vYrzZ/CLYVQSoyFZAlsDoBasVoYSWZK1n39aHA==", + "requires": { + "oboe": "2.1.4", + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2" + } + }, + "web3-providers-ws": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.2.2.tgz", + "integrity": "sha512-Wb1mrWTGMTXOpJkL0yGvL/WYLt8fUIXx8k/l52QB2IiKzvyd42dTWn4+j8IKXGSYYzOm7NMqv6nhA5VDk12VfA==", + "requires": { + "underscore": "1.9.1", + "web3-core-helpers": "1.2.2", + "websocket": "github:web3-js/WebSocket-Node#polyfill/globalThis" + } + }, + "web3-shh": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.2.2.tgz", + "integrity": "sha512-og258NPhlBn8yYrDWjoWBBb6zo1OlBgoWGT+LL5/LPqRbjPe09hlOYHgscAAr9zZGtohTOty7RrxYw6Z6oDWCg==", + "requires": { + "web3-core": "1.2.2", + "web3-core-method": "1.2.2", + "web3-core-subscriptions": "1.2.2", + "web3-net": "1.2.2" + } + }, + "web3-utils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.2.2.tgz", + "integrity": "sha512-joF+s3243TY5cL7Z7y4h1JsJpUCf/kmFmj+eJar7Y2yNIGVcW961VyrAms75tjUysSuHaUQ3eQXjBEUJueT52A==", + "requires": { + "bn.js": "4.11.8", + "eth-lib": "0.2.7", + "ethereum-bloom-filters": "^1.0.6", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "underscore": "1.9.1", + "utf8": "3.0.0" + }, + "dependencies": { + "eth-lib": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.7.tgz", + "integrity": "sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco=", + "requires": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + } + } + }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -17332,28 +19926,12 @@ "terser-webpack-plugin": "^1.4.1", "watchpack": "^1.6.0", "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" - }, - "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==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } } }, "webpack-cli": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.9.tgz", - "integrity": "sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", + "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", "dev": true, "requires": { "chalk": "2.4.2", @@ -17369,12 +19947,6 @@ "yargs": "13.2.4" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -17418,58 +19990,46 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "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": { - "invert-kv": "^2.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "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": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "p-limit": "^2.0.0" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -17485,12 +20045,6 @@ "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", "dev": true }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -17502,12 +20056,6 @@ "strip-ansi": "^5.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", @@ -17559,9 +20107,9 @@ } }, "webpack-dev-server": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz", - "integrity": "sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", + "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -17581,7 +20129,7 @@ "loglevel": "^1.6.4", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.24", + "portfinder": "^1.0.25", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", @@ -17603,67 +20151,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -17685,37 +20172,12 @@ "has-flag": "^3.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "async-limiter": "~1.0.0" } } } @@ -17730,6 +20192,23 @@ "html-entities": "^1.2.0", "querystring": "^0.2.0", "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } } }, "webpack-log": { @@ -17757,6 +20236,32 @@ } } }, + "websocket": { + "version": "github:web3-js/WebSocket-Node#905deb4812572b344f5801f8c9ce8bb02799d82e", + "from": "github:web3-js/WebSocket-Node#polyfill/globalThis", + "requires": { + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "nan": "^2.14.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "websocket-driver": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", @@ -17813,10 +20318,9 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { "version": "1.1.3", @@ -17825,6 +20329,33 @@ "dev": true, "requires": { "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "widest-line": { @@ -17834,6 +20365,33 @@ "dev": true, "requires": { "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "window-size": { @@ -17857,30 +20415,19 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "dev": true, - "requires": { - "acorn": "^4.0.4" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true }, "worker-farm": { @@ -17989,11 +20536,13 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, "x-is-string": { @@ -18007,107 +20556,206 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "requires": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "xhr-request-promise": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.2.tgz", + "integrity": "sha1-NDxE0e53JrhkgGloLQ+EDIO0Jh0=", + "requires": { + "xhr-request": "^1.0.1" + } + }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "requires": { + "cookiejar": "^2.1.1" + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, "xmlcreate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", "dev": true }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "number-is-nan": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } + "camelcase": "^4.1.0" } }, "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "requires": { - "fd-slicer": "~1.0.1" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } diff --git a/package.json b/package.json index 2a4ea97b..cf708e48 100644 --- a/package.json +++ b/package.json @@ -2,28 +2,50 @@ "name": "zero_one-app", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "./src/electron.js", + "author": { + "name": "", + "email": "pavkahanov@neos1.com" + }, "scripts": { - "render-test": "jest", + "test": "jest", "dev": "webpack-dev-server --hot --config webpack.dev.js", + "build": "webpack --mode=production --config webpack.dev.js && electron-builder", + "electron-dev": "concurrently \"npm run dev\" \"wait-on http://localhost:3000 && electron ./src/electron.js\"", + "electron-build": "electron-builder", "storybook": "start-storybook", "docs": "jsdoc -c ./jsdoc.json" }, - "author": "neos1.com", "license": "ISC", "dependencies": { "@babel/core": "^7.6.4", "@babel/preset-react": "^7.6.3", "@babel/preset-stage-0": "^7.0.0", "@namics/stylelint-bem": "^6.1.0", + "bip39": "^3.0.2", + "browser-solc": "^1.0.0", "electron-is-dev": "^1.1.0", "electron-localshortcut": "^3.1.0", + "eslint-plugin-jest": "^23.1.1", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^6.2.0", + "ethereumjs-wallet": "^0.6.3", + "i18next": "^19.0.0", + "i18next-xhr-backend": "^3.2.2", + "mobx": "^5.15.0", + "mobx-react": "^6.1.4", + "mobx-react-form": "^2.0.8", + "mobx-utils": "^5.5.1", "prop-types": "^15.7.2", "react": "^16.10.2", "react-dom": "^16.10.2", + "react-i18next": "^11.1.0", + "react-portal": "^4.2.0", "react-router-dom": "^5.1.2", "stylelint-config-rational-order": "^0.1.2", "stylelint-config-standard": "^19.0.0", + "validatorjs": "^3.17.1", + "web3": "^1.0.0-beta.34", "webpack": "^4.41.2", "webpack-dev-server": "^3.8.2" }, @@ -37,10 +59,12 @@ "babel-loader": "^8.0.6", "better-docs": "^1.3.3", "clean-webpack-plugin": "^3.0.0", + "concurrently": "^5.0.0", "copy-webpack-plugin": "^5.0.4", + "cross-env": "^6.0.3", "css-loader": "^3.2.0", - "electron": "^6.0.12", - "electron-builder": "^21.2.0", + "electron": "^3.0.11", + "electron-builder": "^20.38.3", "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.15.1", "eslint": "^6.5.1", @@ -51,10 +75,12 @@ "eslint-plugin-react": "^7.16.0", "eslint-plugin-react-hooks": "^1.7.0", "jest": "^24.9.0", + "jest-css-modules": "^2.1.0", "jsdoc": "^3.6.3", "node-sass": "^4.12.0", "sass-loader": "^8.0.0", "style-loader": "^1.0.0", + "wait-on": "^3.3.0", "webpack-cli": "^3.3.9", "worker-loader": "^2.0.0" }, @@ -64,7 +90,7 @@ "@babel/preset-env" ], "plugins": [ - "@babel/plugin-transform-async-to-generator", + "@babel/plugin-transform-runtime", [ "@babel/plugin-proposal-decorators", { @@ -78,5 +104,44 @@ } ] ] + }, + "build": { + "appId": "ZeroOne", + "files": [ + "build/**/*", + "src/wallets/**/*", + "src/contracts/**/*", + "src/config.json", + "src/electron.js" + ], + "win": { + "target": [ + "portable" + ] + }, + "linux": { + "target": "deb" + }, + "mac": { + "target": "dmg" + }, + "nsis": { + "warningsAsErrors": false + }, + "portable": { + "artifactName": "voter_portable--win.exe" + }, + "compression": "store", + "asar": false + }, + "jest": { + "moduleNameMapper": { + "^react-native$": "react-native-web", + "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy", + "\\.(css|less|scss|sss|styl)$": "/node_modules/jest-css-modules" + }, + "setupFilesAfterEnv": [ + "/src/setupTests.js" + ] } -} \ No newline at end of file +} diff --git a/src/App.js b/src/App.js deleted file mode 100644 index 59321fb5..00000000 --- a/src/App.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import { - Button, -} from './components/Button'; -import Input from './components/Input'; -import { - Password, -} from './components/Icons'; -import LangSwitcher from './components/LangSwitcher'; - - -const App = () => ( -
-

Прувет

- - - - - - -
-); -export default App; diff --git a/src/__mocks__/fs.js b/src/__mocks__/fs.js new file mode 100644 index 00000000..aeff89e3 --- /dev/null +++ b/src/__mocks__/fs.js @@ -0,0 +1,31 @@ +// eslint-disable-next-line no-undef +const fs = jest.genMockFromModule('fs'); + +let mockFiles = {}; + +function __setMockFiles(files) { + mockFiles = {}; + + const keys = Object.keys(files); + + keys.forEach((filePath) => { + if (!mockFiles[filePath]) { + mockFiles[filePath] = ''; + } + mockFiles[filePath] = files[filePath]; + }); +} + +function readFileSync(src) { + return mockFiles[src]; +} + +function existsSync(src) { + return !!mockFiles[src]; +} + +fs.__setMockFiles = __setMockFiles; +fs.readFileSync = readFileSync; +fs.existsSync = existsSync; + +module.exports = fs; diff --git a/src/__mocks__/react-i18next.js b/src/__mocks__/react-i18next.js new file mode 100644 index 00000000..9f8370cf --- /dev/null +++ b/src/__mocks__/react-i18next.js @@ -0,0 +1,52 @@ +const React = require('react'); +const reactI18next = require('react-i18next'); + +const hasChildren = (node) => node && (node.children || (node.props && node.props.children)); + +const getChildren = (node) => ( + node && node.children ? node.children : node.props && node.props.children +); + +const renderNodes = (reactNodes) => { + if (typeof reactNodes === 'string') { + return reactNodes; + } + + return Object.keys(reactNodes).map((key, i) => { + const child = reactNodes[key]; + const isElement = React.isValidElement(child); + + if (typeof child === 'string') { + return child; + } + if (hasChildren(child)) { + const inner = renderNodes(getChildren(child)); + return React.cloneElement(child, { ...child.props, key: i }, inner); + } + if (typeof child === 'object' && !isElement) { + return Object.keys(child).reduce((str, childKey) => `${str}${child[childKey]}`, ''); + } + + return child; + }); +}; + +const useMock = [(k) => k, {}]; +useMock.t = (k) => k; +useMock.i18n = {}; + +module.exports = { + // this mock makes sure any components using the translate HoC receive the t function as a prop + withTranslation: () => (Component) => (props) => k} {...props} />, + Trans: ({ children }) => renderNodes(children), + Translation: ({ children }) => children((k) => k, { i18n: {} }), + useTranslation: () => useMock, + + // mock if needed + I18nextProvider: reactI18next.I18nextProvider, + initReactI18next: reactI18next.initReactI18next, + setDefaults: reactI18next.setDefaults, + getDefaults: reactI18next.getDefaults, + setI18n: reactI18next.setI18n, + getI18n: reactI18next.getI18n, +}; diff --git a/src/__tests__/readFile.test.js b/src/__tests__/readFile.test.js new file mode 100644 index 00000000..3650b21d --- /dev/null +++ b/src/__tests__/readFile.test.js @@ -0,0 +1,61 @@ +import readSolFile from '../utils/fileUtils/index'; + +jest.mock('fs'); +const fs = require('fs'); + +describe('readFile', () => { + const FAIL_ON_QUESTIONS = { + '.src/contracts/Voter/Voter.sol': 'import "./VoterBase.sol";', + '.src/contracts/Voter/VoterBase.sol': 'import "../libs/QuestionGroups.sol"; import "../libs/UserGroups.sol"; import "../libs/Questions.sol"; import "../libs/Votings.sol"; import "./VoterInterface.sol"; import "../IERC20.sol";', + '.src/contracts/Voter/VoterInterface.sol': 'import "../libs/QuestionGroups.sol"; import "../libs/Questions.sol"; import "../libs/Votings.sol"; import "../libs/UserGroups.sol";', + }; + + const SUCCESSFULL = { + '.src/contracts/Voter/Voter.sol': 'import "./VoterBase.sol";', + '.src/contracts/Voter/VoterBase.sol': 'import "../libs/QuestionGroups.sol"; import "../libs/UserGroups.sol"; import "../libs/Questions.sol"; import "../libs/Votings.sol"; import "./VoterInterface.sol"; import "../IERC20.sol";', + '.src/contracts/Voter/VoterInterface.sol': 'import "../libs/QuestionGroups.sol"; import "../libs/Questions.sol"; import "../libs/Votings.sol"; import "../libs/UserGroups.sol";', + '.src/contracts/libs/Questions.sol': 'file1 contents', + '.src/contracts/libs/QuestionGroups.sol': 'file2 contents', + '.src/contracts/libs/Votings.sol': 'file3 contents', + '.src/contracts/libs/UserGroups.sol': 'file4 contents', + '.src/contracts/IERC20.sol': 'IERC20 content', + }; + + + const NESTING_LVL_3 = { + '.src/contracts/Voter/Voter.sol': 'import "./VoterBase/VoterBase.sol";', + '.src/contracts/Voter/VoterBase/VoterBase.sol': 'test123', + }; + const SELF_IMPORT = { + '.src/contracts/Voter/Voter.sol': 'import "./Voter.sol";', + }; + + it('should fail on not existing file', () => { + fs.__setMockFiles(FAIL_ON_QUESTIONS); + expect(() => readSolFile('.src/contracts/Voter/Voter.sol')).toThrow(); + }); + + it('should pass', () => { + fs.__setMockFiles(SUCCESSFULL); + const output = readSolFile('.src/contracts/Voter/Voter.sol'); + expect(output).toBe('file2 contents file4 contents file1 contents file3 contents IERC20 content'); + }); + + it('should pass with doubling files imports', () => { + fs.__setMockFiles(SUCCESSFULL); + const output = readSolFile('.src/contracts/Voter/Voter.sol'); + expect(output).toBe('file2 contents file4 contents file1 contents file3 contents IERC20 content'); + }); + + it('should pass with 3 levels of nesting', () => { + fs.__setMockFiles(NESTING_LVL_3); + const output = readSolFile('.src/contracts/Voter/Voter.sol'); + expect(output).toBe('test123'); + }); + + it('should pass with self importing', () => { + fs.__setMockFiles(SELF_IMPORT); + const output = readSolFile('.src/contracts/Voter/Voter.sol'); + expect(output).toBe(''); + }); +}); diff --git a/src/assets/images/navlink-indicator.svg b/src/assets/images/navlink-indicator.svg new file mode 100644 index 00000000..f34bbdc7 --- /dev/null +++ b/src/assets/images/navlink-indicator.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/images/scrollbarBtn.svg b/src/assets/images/scrollbarBtn.svg new file mode 100644 index 00000000..ec197b0e --- /dev/null +++ b/src/assets/images/scrollbarBtn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/scrollbarBtnDown.svg b/src/assets/images/scrollbarBtnDown.svg new file mode 100644 index 00000000..b76cd507 --- /dev/null +++ b/src/assets/images/scrollbarBtnDown.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/images/thumb.png b/src/assets/images/thumb.png new file mode 100644 index 00000000..28100311 Binary files /dev/null and b/src/assets/images/thumb.png differ diff --git a/src/assets/images/token-count.svg b/src/assets/images/token-count.svg deleted file mode 100644 index 19687bf6..00000000 --- a/src/assets/images/token-count.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/assets/images/token-name.svg b/src/assets/images/token-name.svg deleted file mode 100644 index 89cb029c..00000000 --- a/src/assets/images/token-name.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/styles/includes/_fonts.scss b/src/assets/styles/includes/_fonts.scss index bbc7f962..b4c0eb13 100644 --- a/src/assets/styles/includes/_fonts.scss +++ b/src/assets/styles/includes/_fonts.scss @@ -1,3 +1,5 @@ +@import url('https://fonts.googleapis.com/css?family=Roboto+Mono:700&display=swap'); + @font-face { font-weight: 300; font-family: "Grotesk"; diff --git a/src/assets/styles/style.scss b/src/assets/styles/style.scss index 85574100..c6318625 100644 --- a/src/assets/styles/style.scss +++ b/src/assets/styles/style.scss @@ -8,3 +8,41 @@ font-weight: 400; font-family: "Grotesk"; } + +body { + background-color: #FAFBFC; + + &::after { + position: fixed; + top: 0; + left: 0; + z-index: 16; + width: 100%; + height: 100%; + overflow: unset; + background: rgba(250, 250, 250, 0.5); + opacity: 0; + filter: blur(10px); + transition: opacity 0.4s 0.1s; + content: ''; + pointer-events: none; + } + + &.dialog-overlay { + overflow: hidden; + + &::after { + opacity: 1; + } + } +} + +a { + color: inherit; + text-decoration: none; +} + +svg { + width: 18px; + height: 18px; +} \ No newline at end of file diff --git a/src/components/AddExisitingProject/index.js b/src/components/AddExisitingProject/index.js new file mode 100644 index 00000000..baa72b36 --- /dev/null +++ b/src/components/AddExisitingProject/index.js @@ -0,0 +1,184 @@ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { NavLink } from 'react-router-dom'; +import { inject, observer } from 'mobx-react'; +import { withTranslation } from 'react-i18next'; +import Button from '../Button/Button'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import Explanation from '../Explanation'; +import ConnectProjectForm from '../../stores/FormsStore/ConnectProject'; +import Input from '../Input'; +import { + Address, TokenName, Login, BackIcon, +} from '../Icons'; +import LoadingBlock from '../LoadingBlock'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('appStore') +@observer +class AddExistingProject extends Component { + connectForm = new ConnectProjectForm({ + hooks: { + onSuccess: (form) => { + this.connectProject(form); + }, + onError: () => { + this.showError(); + }, + }, + }); + + steps = { + default: 0, + loading: 1, + success: 2, + } + + // eslint-disable-next-line react/static-property-placement + static propTypes = { + appStore: propTypes.shape({ + checkProject: propTypes.func.isRequired, + addProjectToList: propTypes.func.isRequired, + displayAlert: propTypes.func.isRequired, + }).isRequired, + t: propTypes.func.isRequired, + }; + + constructor(props) { + super(props); + this.state = { + currentStep: this.steps.default, + }; + } + + connectProject = (form) => { + const { steps } = this; + const { appStore, t } = this.props; + const { name, address } = form.values(); + this.setState({ + currentStep: steps.loading, + }); + return new Promise((resolve, reject) => { + appStore.checkProject(address) + .then(() => { + this.setState({ currentStep: steps.success }); + appStore.addProjectToList({ name, address }); + resolve(); + }) + .catch(() => { + appStore.displayAlert(t('errors:tryAgain'), 3000); + this.state = { + currentStep: steps.default, + }; + reject(); + }); + }); + } + + showError = () => { + const { appStore, t } = this.props; + appStore.displayAlert(t('errors:validationError'), 3000); + } + + renderSwitch(step) { + const { steps } = this; + const { t } = this.props; + switch (step) { + case steps.default: + return ; + case steps.loading: + return ( + + + {t('headings:projectChecking.heading')} + {t('headings:projectChecking.subheading')} + + + ); + case steps.success: + return ; + default: + return ''; + } + } + + render() { + const { currentStep } = this.state; + return ( + +
+ {this.renderSwitch(currentStep)} +
+
+ ); + } +} + +const InputBlock = withTranslation()(({ t, form }) => ( + + + {t('headings:сonnectProject.heading')} + {t('headings:сonnectProject.subheading')} + +
+ + + + +
+ +
+ +
+
+ +

+ {t('explanations:project.name')} +

+
+ +

+ {t('explanations:project.address')} +

+
+
+ + + + + +)); + +const MessageBlock = withTranslation()(({ t }) => ( + + + {t('headings:projectConnected.heading')} + {t('headings:projectConnected.subheading')} + + + + + + +)); + +InputBlock.propTypes = { + form: propTypes.shape({ + onSubmit: propTypes.func.isRequired, + $: propTypes.func.isRequired, + }).isRequired, +}; + +export default AddExistingProject; diff --git a/src/components/AddNewProject/index.js b/src/components/AddNewProject/index.js new file mode 100644 index 00000000..7d9f75b5 --- /dev/null +++ b/src/components/AddNewProject/index.js @@ -0,0 +1,46 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Button from '../Button/Button'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import { CreateToken, ChainIcon, BackIcon } from '../Icons'; + +import styles from '../Login/Login.scss'; + +const AddNewProject = withTranslation()(({ t }) => ( + +
+ + + {t('headings:addingProject.heading')} + + {t('headings:addingProject.subheading.0')} +
+ {t('headings:addingProject.subheading.1')} +
+
+
+ + + + + + +
+
+ + + +
+
+)); + +export default AddNewProject; diff --git a/src/components/Alert/Alert.scss b/src/components/Alert/Alert.scss new file mode 100644 index 00000000..cb292330 --- /dev/null +++ b/src/components/Alert/Alert.scss @@ -0,0 +1,54 @@ +@import '../../assets/styles/partials/variables'; + +.alert { + position: fixed; + top: 100%; + left: 50%; + display: flex; + flex-flow: row nowrap; + align-items: center; + justify-content: space-between; + max-width: 380px; + padding: 15px; + background-color: $white; + border: 1px solid $lightGrey; + border-radius: 2px; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.15); + transform: translateX(-50%); + transition: .3s ease-in-out; + & > svg { + flex-shrink: 0; + margin-right: 10px; + vertical-align: middle; + } + + &__text { + margin-right: 20px; + font-size: 14px; + line-height: 16px; + vertical-align: middle; + } + + &__close { + background: transparent; + border: none; + outline: none; + cursor: pointer; + svg { + rect { + transition: 0.2s; + } + } + &:hover { + svg { + rect { + fill: $primary; + } + } + } + } + + &--visible { + top: 90%; + } +} \ No newline at end of file diff --git a/src/components/Alert/Alert.stories.js b/src/components/Alert/Alert.stories.js new file mode 100644 index 00000000..f1509396 --- /dev/null +++ b/src/components/Alert/Alert.stories.js @@ -0,0 +1,10 @@ +import React from 'react'; +import Alert from '.'; + +export default ({ title: 'Alert' }); + +export const visibleAlert = () => ( + + Occaecat magna labore in excepteur eiusmod ea tempor nisi. + +); diff --git a/src/components/Alert/index.js b/src/components/Alert/index.js new file mode 100644 index 00000000..a3f190ee --- /dev/null +++ b/src/components/Alert/index.js @@ -0,0 +1,27 @@ +import React from 'react'; +import propTypes from 'prop-types'; +import { observer, inject } from 'mobx-react'; +import { IconInfo, CloseIcon } from '../Icons'; +import styles from './Alert.scss'; + +const Alert = inject('appStore')(observer(({ appStore, appStore: { alert } }) => ( +
+ + + {alert.text} + + +
+))); + +Alert.propTypes = { + alertStore: propTypes.shape({ + text: propTypes.string.isRequired, + visible: propTypes.bool.isRequired, + closeAlert: propTypes.func.isRequired, + }), +}; + +export default Alert; diff --git a/src/components/Button/Button.js b/src/components/Button/Button.js new file mode 100644 index 00000000..522fa169 --- /dev/null +++ b/src/components/Button/Button.js @@ -0,0 +1,59 @@ +import React from 'react'; +import propTypes from 'prop-types'; + +import styles from './Button.scss'; + +const Button = ({ + children, + theme, + size, + type, + disabled, + icon, + iconPosition, + onClick, +}) => ( + // eslint-disable-next-line react/button-has-type + +); + +Button.propTypes = { + children: propTypes.oneOfType([ + propTypes.string, + propTypes.shape({}), + ]).isRequired, + icon: propTypes.node, + iconPosition: propTypes.bool, + type: propTypes.string, + disabled: propTypes.bool, + onClick: propTypes.func.isRequired, + theme: propTypes.string, + size: propTypes.string, +}; + +Button.defaultProps = { + type: 'button', + theme: 'black', + size: 'default', + icon: null, + iconPosition: false, + disabled: false, +}; + +export default Button; diff --git a/src/components/Button/Button.scss b/src/components/Button/Button.scss index da411a83..bfb36fb5 100644 --- a/src/components/Button/Button.scss +++ b/src/components/Button/Button.scss @@ -1,40 +1,46 @@ @import "../../assets/styles/partials/variables"; .btn { - padding: 0; + padding: 14px 10px; + text-align: center; text-decoration: none; border: none; border-radius: 2px; outline: none; cursor: pointer; transition: 0.2s linear; + svg, + &__icon, &__text { vertical-align: middle; } + svg { - margin-right: 10px; path, circle { - transition: 0.2s; + transition: 00.2s; } } - &--big { - min-width: 140px; - padding: 30px 0; - font-weight: bold; - font-size: 14px; - } - &--default { - min-width: 232px; - padding: 18px 0; - font-size: 12px; - } - &--small { - min-width: 124px; - padding: 5px; + &__icon { + svg { + margin-right: 10px; + } + &--block { + display: block; + text-align: center; + svg { + margin: 0 auto 10px; + } + } } + + &[disabled]{ + cursor: default; + opacity: .5; + } + &--black { color: $white; background-color: $primary; @@ -43,30 +49,18 @@ color: $primary; background-color: $white; border-color: $lightGrey; - } - &:active { - border-color: $primary; - } - } - &--link { - color: $linkColor; - background-color: transparent; - border-bottom: 1px solid $linkColor; - svg { - path { - stroke: $linkColor; - } - } - &:hover { - color: $secondary; - border-color: $secondary; svg { path { - stroke: $secondary; + transition: 0.2s; + stroke: $primary; } } } + &:active { + border-color: $primary; + } } + &--white { color: $primary; background-color: $white; @@ -106,17 +100,81 @@ } } } - &--dashed { - color: $grey; - border-style: dashed; + + &--link { + padding: 0; + color: $linkColor; + background-color: transparent; + border-bottom: 1px solid $linkColor; + svg { + path { + stroke: $linkColor; + } + } &:hover { - color: $primary; + color: $secondary; + border-color: $secondary; + svg { + path { + stroke: $secondary; + } + } } - &:active { - color: $white; + } + + &--project { + @extend .btn--white; + width: 145px; + height: 85px; + padding: 10px 10px; + font-weight: 700; + font-size: 14px; + } + + &--addproject { + @extend .btn--project; + color: $border; + font-weight: 400; + border-style: dashed; + border-radius: 0; + .btn__content { + display: flex; + flex-flow: row nowrap; + align-items: center; + .btn__icon { + flex-grow:1; + } + .btn__text { + flex-grow: 1; + width: 50px; + text-align: left; + } } + &:hover { + color: $primary; + } } - &--noborder { + + &--showseed { + @extend .btn--white; + } + + &--back { + @extend .btn--link; border: none; } + + &--block { + display: block; + width: 100%; + } + + &--240 { + width: 240px; + } + + &--310 { + width: 310px; + } } + diff --git a/src/components/Button/Button.stories.js b/src/components/Button/Button.stories.js index c7d11d88..14fc0238 100644 --- a/src/components/Button/Button.stories.js +++ b/src/components/Button/Button.stories.js @@ -1,25 +1,80 @@ import React from 'react'; -import { Button, IconButton } from './index'; -import { AddIcon, BackIcon } from '../Icons'; +import Button from './Button'; +import { BackIcon, AddIcon, EyeIcon } from '../Icons'; export default { title: 'Button' }; -export const Black = () => ; -export const White = () => ; -export const Small = () => ; +export const defaultButton = () => ( + +); + +export const whiteButton = () => ( + +); + +export const iconButton = () => ( + +); + +export const iconTopButton = () => ( + +); -export const WhiteDashed = () => ( - - - Отправить - +export const linkButton = () => ( + ); -export const linkButton = () => ; -export const arrowButton = () => ( - - - Назад - -) \ No newline at end of file +export const BackButton = () => ( + +); + +export const addProjectButton = () => ( + +); + +export const projectButton = () => ( + +); + +export const showSeed = () => ( + +); diff --git a/src/components/Button/index.js b/src/components/Button/index.js deleted file mode 100644 index 451cec13..00000000 --- a/src/components/Button/index.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import propTypes from 'prop-types'; -import styles from './Button.scss'; - -export const Button = ({ children, className }) => ( - -); - -Button.propTypes = { - children: propTypes.string.isRequired, - className: propTypes.string.isRequired, -}; - -export const IconButton = ({ children, className }) => ( - -); - -IconButton.propTypes = { - children: propTypes.arrayOf(propTypes.node).isRequired, - className: propTypes.string.isRequired, -}; diff --git a/src/components/Container/Container.scss b/src/components/Container/Container.scss new file mode 100644 index 00000000..632cd7be --- /dev/null +++ b/src/components/Container/Container.scss @@ -0,0 +1,7 @@ +.container { + position: relative; + width: 100%; + max-width: 1120px; + height: 100vh; + margin: 0 auto; +} diff --git a/src/components/Container/index.js b/src/components/Container/index.js new file mode 100644 index 00000000..e1739d91 --- /dev/null +++ b/src/components/Container/index.js @@ -0,0 +1,15 @@ +import React from 'react'; +import propTypes from 'prop-types'; + +import styles from './Container.scss'; + +const Container = ({ children }) => ( +
+ {children} +
+); + +Container.propTypes = { + children: propTypes.node.isRequired, +}; +export default Container; diff --git a/src/components/CreateNewProject/index.js b/src/components/CreateNewProject/index.js new file mode 100644 index 00000000..56cd8307 --- /dev/null +++ b/src/components/CreateNewProject/index.js @@ -0,0 +1,57 @@ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { NavLink } from 'react-router-dom'; +import { observer } from 'mobx-react'; +import { withTranslation } from 'react-i18next'; +import Button from '../Button/Button'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import { Ethereum, CreateToken, BackIcon } from '../Icons'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@observer +class CreateNewProject extends Component { + render() { + const { t } = this.props; + return ( + +
+ + + {t('headings:newProject.heading')} + {t('headings:newProject.subheading')} + +
+ + {t('other:withTokens')} + + + + {t('other:withoutTokens')} + + +
+
+ + + +
+
+ ); + } +} + +CreateNewProject.propTypes = { + t: propTypes.func.isRequired, +}; + +export default CreateNewProject; diff --git a/src/components/CreateNewProjectWithTokens/index.js b/src/components/CreateNewProjectWithTokens/index.js new file mode 100644 index 00000000..1bdf36f5 --- /dev/null +++ b/src/components/CreateNewProjectWithTokens/index.js @@ -0,0 +1,286 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import propTypes from 'prop-types'; +import { NavLink, Redirect } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Button from '../Button/Button'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import LoadingBlock from '../LoadingBlock'; +import Input from '../Input'; +import StepIndicator from '../StepIndicator'; +import Explanation from '../Explanation'; +import { + BackIcon, Address, TokenName, Password, +} from '../Icons'; +import ConnectTokenForm from '../../stores/FormsStore/ConnectToken'; +import CreateProjectForm from '../../stores/FormsStore/CreateProject'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('userStore', 'appStore') +@observer +class CreateNewProjectWithTokens extends Component { + connectToken = new ConnectTokenForm({ + hooks: { + onSuccess: (form) => this.checkToken(form), + onError: () => {}, + }, + }); + + createProject = new CreateProjectForm({ + hooks: { + onSuccess: (form) => this.gotoUploading(form), + onError: () => {}, + }, + }); + + steps = { + token: 0, + check: 1, + tokenChecked: 2, + projectInfo: 3, + uploading: 4, + } + + constructor(props) { + super(props); + this.state = { + currentStep: this.steps.token, + indicatorStep: 1, + }; + } + + returnToTokenAddress=() => { + const { steps } = this; + this.setState({ + currentStep: steps.token, + indicatorStep: 1, + }); + } + + checkToken = (form) => { + const { steps } = this; + const { address } = form.values(); + const { appStore } = this.props; + this.setState({ + currentStep: steps.check, + }); + return appStore.checkErc(address).then(() => { + this.setState({ + currentStep: steps.tokenChecked, + indicatorStep: 2, + }); + appStore.setDeployArgs([address]); + }); + } + + gotoProjectInfo = () => { + const { steps } = this; + this.setState({ + currentStep: steps.projectInfo, + indicatorStep: 3, + }); + } + + gotoUploading = (form) => { + const { steps } = this; + const { appStore, userStore, t } = this.props; + const { name, password } = form.values(); + appStore.setProjectName(name); + userStore.setPassword(password); + return userStore.readWallet(password) + .then(() => { + userStore.checkBalance(userStore.address) + .then((balance) => { + if (balance > 0.05) { + this.setState({ + currentStep: steps.uploading, + }); + } else { + this.setState({ + currentStep: steps.projectInfo, + indicatorStep: 2, + }); + appStore.displayAlert(t('errors:lowBalance'), 3000); + } + }); + }) + .catch(() => { + this.setState({ + currentStep: steps.projectInfo, + indicatorStep: 2, + }); + appStore.displayAlert(t('errors:tryAgain'), 3000); + }); + } + + renderSwitch(step) { + const { t } = this.props; + const { steps } = this; + switch (step) { + case steps.token: + return ; + case steps.check: + return ( + + + {t('headings:checkingTokens.heading')} + {t('headings:checkingTokens.subheading')} + + + ); + case steps.tokenChecked: + return ; + case steps.projectInfo: + return ( + + ); + default: + return ''; + } + } + + render() { + const { steps } = this; + const { currentStep, indicatorStep } = this.state; + if (currentStep === steps.uploading) return ; + return ( + +
+ + {this.renderSwitch(currentStep)} +
+
+ ); + } +} + +const InputTokenAddress = withTranslation()(({ t, form }) => ( + + + {t('headings:existingTokens.heading')} + {t('headings:existingTokens.subheading')} + +
+ +
+ +
+ +
+ + + + + +)); + +const ContractConfirmation = inject('appStore')(observer(withTranslation()(({ t, appStore: { ERC }, onSubmit }) => ( + + + {t('headings:checkingTokensConfirm.heading')} + + {t('headings:checkingTokensConfirm.subheading.0')} +
+ {t('headings:checkingTokensConfirm.subheading.1')} +
+
+
+
+

{t('other:count')}

+

{`${ERC.totalSupply} ${ERC.symbol}`}

+
+
+ +
+
+
+)))); + +const InputProjectData = withTranslation()(({ + t, form, onClick, +}) => ( + + + {t('headings:projectCreating.heading')} + + {t('headings:projectCreating.subheading.0')} +
+ {t('headings:projectCreating.subheading.1')} +
+
+
+ + + + + + +
+ +
+
+ +

+ {t('explanations:project.name')} +

+
+
+ + +
+)); + +CreateNewProjectWithTokens.propTypes = { + appStore: propTypes.shape({ + checkErc: propTypes.func.isRequired, + deployArgs: propTypes.arrayOf(propTypes.any).isRequired, + name: propTypes.string.isRequired, + password: propTypes.string.isRequired, + displayAlert: propTypes.func.isRequired, + setDeployArgs: propTypes.func.isRequired, + setProjectName: propTypes.func.isRequired, + }).isRequired, + userStore: propTypes.shape({ + readWallet: propTypes.func.isRequired, + checkBalance: propTypes.func.isRequired, + address: propTypes.string.isRequired, + setPassword: propTypes.func.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; +InputTokenAddress.propTypes = { + form: propTypes.shape({ + $: propTypes.func.isRequired, + onSubmit: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + }).isRequired, +}; +ContractConfirmation.propTypes = { + onSubmit: propTypes.func.isRequired, +}; +InputProjectData.propTypes = { + form: propTypes.shape({ + $: propTypes.func.isRequired, + onSubmit: propTypes.func.isRequired, + }).isRequired, + onClick: propTypes.func.isRequired, +}; + +export default CreateNewProjectWithTokens; diff --git a/src/components/CreateNewProjectWithoutTokens/index.js b/src/components/CreateNewProjectWithoutTokens/index.js new file mode 100644 index 00000000..cc2286a7 --- /dev/null +++ b/src/components/CreateNewProjectWithoutTokens/index.js @@ -0,0 +1,375 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import propTypes from 'prop-types'; +import { NavLink, Redirect } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Button from '../Button/Button'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import StepIndicator from '../StepIndicator'; +import LoadingBlock from '../LoadingBlock'; +import Explanation from '../Explanation'; +import Input from '../Input'; +import { + BackIcon, Password, TokenSymbol, TokenCount, TokenName, +} from '../Icons'; +import CreateTokenForm from '../../stores/FormsStore/CreateToken'; +import CreateProjectForm from '../../stores/FormsStore/CreateProject'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('userStore', 'appStore') +@observer +class CreateNewProjectWithoutTokens extends Component { + form = new CreateTokenForm({ + hooks: { + onSuccess: (form) => this.createToken(form), + onError: () => this.showValidationError(), + }, + }); + + createProject = new CreateProjectForm({ + hooks: { + onSuccess: (form) => this.gotoUploading(form), + onError: () => this.showValidationError(), + }, + }); + + steps = { + token: 1, + creation: 2, + tokenCreated: 3, + projectInfo: 4, + } + + constructor(props) { + super(props); + this.state = { + indicatorStep: 1, + currentStep: this.steps.token, + }; + } + + returnToContractConnecting = () => { + const { steps } = this; + this.setState({ + currentStep: steps.tokenCreated, + }); + } + + createToken = (form) => { + const { steps } = this; + const { userStore, t } = this.props; + this.setState({ + currentStep: steps.creation, + }); + const { + name, symbol, count, password, + } = form.values(); + const deployArgs = [name, symbol, Number(count)]; + + return userStore.readWallet(password) + .then(() => userStore.checkBalance(userStore.address)) + .then((balance) => (this.isEnoughBalance(balance) + ? this.deployTokenContract(deployArgs, password) + : this.returnToTokenCreating(t('errors:lowBalance')))) + .catch(() => this.returnToTokenCreating(t('errors:tryAgain'))); + } + + showValidationError = () => { + const { appStore, t } = this.props; + appStore.displayAlert(t('errors:validationError'), 3000); + } + + gotoProjectInfo = () => { + const { steps } = this; + this.setState({ + currentStep: steps.projectInfo, + indicatorStep: 2, + }); + } + + gotoUploading = (form) => { + const { steps } = this; + const { userStore, appStore, t } = this.props; + const { name, password } = form.values(); + appStore.setProjectName(name); + userStore.setPassword(password); + + return userStore.readWallet(password) + .then(() => userStore.checkBalance(userStore.address)) + .then((balance) => (this.isEnoughBalance(balance) + ? this.setState({ currentStep: steps.uploading }) + : this.returnToProjectInfo(t('errors:lowBalance')))) + .catch(() => { + this.returnToProjectInfo(t('errors:tryAgain')); + }); + } + + // eslint-disable-next-line class-methods-use-this + isEnoughBalance(balance) { + return balance > 0.05; + } + + deployTokenContract(deployArgs, password) { + const { steps } = this; + const { appStore } = this.props; + appStore.deployContract('ERC20', deployArgs, password) + .then((txHash) => appStore.checkReceipt(txHash)) + .then((receipt) => { + this.setState({ + currentStep: steps.tokenCreated, + }); + appStore.setDeployArgs([receipt.contractAddress]); + }); + return Promise.resolve(); + } + + returnToTokenCreating(errorText) { + const { steps } = this; + const { appStore } = this.props; + this.setState({ + currentStep: steps.token, + indicatorStep: 1, + }); + appStore.displayAlert(errorText); + return Promise.resolve(); + } + + returnToProjectInfo(errorText) { + const { steps } = this; + const { appStore } = this.props; + + this.setState({ + currentStep: steps.projectInfo, + indicatorStep: 2, + }); + appStore.displayAlert(errorText); + return Promise.resolve(); + } + + renderSwitch(step) { + const { t } = this.props; + const { steps } = this; + switch (step) { + case steps.token: + return ; + case steps.creation: + return ( + + + {t('headings:tokensCreating.heading')} + {t('headings:tokensCreating.subheading')} + + + ); + case steps.tokenCreated: + return ; + case steps.projectInfo: + return ( + + ); + default: + return ''; + } + } + + render() { + const { currentStep, indicatorStep } = this.state; + if (currentStep === 'uploading') return ; + return ( + +
+ + {this.renderSwitch(currentStep)} +
+
+ ); + } +} + +const CreateTokenData = withTranslation()(inject('userStore', 'appStore')(observer((({ + t, userStore: { address }, appStore: { balances }, form, +}) => ( + + + {t('headings:newTokens.heading')} + {t('headings:newTokens.subheading')} + +
+
+ +

+ {t('explanations:token.left.wallet.0')} +
+ {t('explanations:token.left.wallet.1')} + {address} +

+

+ {t('explanations:token.left.balance')} + + + {Number(balances[address.replace('0x', '')]).toFixed(5)} + {' ETH'} + + +

+

+ {t('explanations:token.left.tokens.0')} +
+ {t('explanations:token.left.tokens.1')} +

+
+
+ + + +
+ + + + + + +
+ + + +
+ +
+
+ +

+ {t('explanations:token.right.symbol')} +

+
+ +

+ {t('explanations:token.right.count')} +

+
+
+ + + + +
+))))); + +const TokenCreationAlert = withTranslation()(({ onSubmit, t }) => ( + + + {t('headings:tokensCreated.heading')} + {t('headings:tokensCreated.subheading')} + +
+
+ +
+
+
+)); + +const InputProjectData = withTranslation()(({ + form, onClick, t, +}) => ( + + + {t('headings:projectCreating.heading')} + + {t('headings:projectCreating.subheading.0')} +
+ {t('headings:projectCreating.subheading.1')} +
+ +
+
+ + + + + + +
+ +
+
+ +

+ {t('explanations:project.name')} +

+
+
+ + +
+)); + +CreateNewProjectWithoutTokens.propTypes = { + appStore: propTypes.shape({ + deployContract: propTypes.func.isRequired, + checkReceipt: propTypes.func.isRequired, + deployArgs: propTypes.arrayOf(propTypes.any).isRequired, + displayAlert: propTypes.func.isRequired, + setProjectName: propTypes.func.isRequired, + password: propTypes.string.isRequired, + setDeployArgs: propTypes.func.isRequired, + }).isRequired, + userStore: propTypes.shape({ + readWallet: propTypes.func.isRequired, + checkBalance: propTypes.func.isRequired, + address: propTypes.string.isRequired, + setPassword: propTypes.func.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; +CreateTokenData.propTypes = { + form: propTypes.shape({ + onSubmit: propTypes.func.isRequired, + $: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + }).isRequired, +}; +TokenCreationAlert.propTypes = { + onSubmit: propTypes.func.isRequired, +}; +InputProjectData.propTypes = { + form: propTypes.shape({ + $: propTypes.func.isRequired, + onSubmit: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + }).isRequired, + onClick: propTypes.func.isRequired, +}; + +export default CreateNewProjectWithoutTokens; diff --git a/src/components/CreateWallet/PasswordForm.js b/src/components/CreateWallet/PasswordForm.js new file mode 100644 index 00000000..36c35e91 --- /dev/null +++ b/src/components/CreateWallet/PasswordForm.js @@ -0,0 +1,113 @@ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import { NavLink } from 'react-router-dom'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import { Password, BackIcon } from '../Icons'; +import Input from '../Input'; +import Button from '../Button/Button'; +import Explanation from '../Explanation'; +import Indicator from '../Indicator'; +import passwordValidation from '../../utils/PasswordValidation'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +class PasswordForm extends Component { + constructor(props) { + super(props); + this.state = { + validity: {}, + }; + } + + handleInput = (value) => { + const validity = passwordValidation(value); + this.setState({ validity }); + } + + render() { + const { state, form, t } = this.props; + const { validity } = this.state; + + return ( + + + {t('headings:passwordCreation.heading')} + + {t('headings:passwordCreation.subheading.0')} +
+ {t('headings:passwordCreation.subheading.1')} +
+
+
+ + + + + + +
+ +
+
+ +

+ { t('explanations:passwordCreating.0')} +
+ { t('explanations:passwordCreating.1')} +

+

+

    +
  • + + { t('explanations:passwordRules.numeric')} +
  • +
  • + + { t('explanations:passwordRules.upperCase')} +
  • +
  • + + { t('explanations:passwordRules.symbol')} +
  • +
  • + + { t('explanations:passwordRules.length')} +
  • +
+

+
+
+ + + + +
+ ); + } +} + +PasswordForm.propTypes = { + state: propTypes.bool.isRequired, + form: propTypes.shape({ + $: propTypes.func.isRequired, + onSubmit: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; +export default PasswordForm; diff --git a/src/components/CreateWallet/index.js b/src/components/CreateWallet/index.js new file mode 100644 index 00000000..38b36b31 --- /dev/null +++ b/src/components/CreateWallet/index.js @@ -0,0 +1,107 @@ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { observer, inject } from 'mobx-react'; +import { Redirect } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Container from '../Container'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Loader from '../Loader'; +import passwordValidation from '../../utils/PasswordValidation'; +import PasswordForm from './PasswordForm'; +import CreateWalletForm from '../../stores/FormsStore/CreateWalletForm'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('userStore', 'appStore') +@observer +class CreateWallet extends Component { + createForm = new CreateWalletForm({ + hooks: { + onSuccess: (form) => this.createWallet(form), + onError: () => { + }, + }, + }); + + constructor(props) { + super(props); + this.state = { + redirect: false, + }; + } + + createWallet = (form) => { + const { userStore, recover } = this.props; + const values = form.values(); + return new Promise((resolve, reject) => { + if (recover) { + userStore.recoverWallet(values.password).then(() => { + userStore.saveWalletToFile(); + resolve(); + this.setState({ redirect: true }); + }).catch(() => { + reject(); + }); + } else { + userStore.createWallet(values.password).then(() => { + resolve(); + this.setState({ redirect: true }); + }).catch(() => { + reject(); + }); + } + }); + } + + render() { + const { recover } = this.props; + const { redirect } = this.state; + const { createForm } = this; + + if (redirect) { + return recover ? : ; + } + return ( + +
+ {!createForm.loading + ? ( + + ) + : } +
+
+ ); + } +} + +const CreationLoader = withTranslation(['headings'])(({ t }) => ( + + + {t('headings:passwordCreation.heading')} + + {t('headings:passwordCreation.subheading.0')} +
+ {t('headings:passwordCreation.subheading.1')} +
+
+ +
+)); + +CreateWallet.propTypes = { + userStore: propTypes.shape({ + recoverWallet: propTypes.func.isRequired, + saveWalletToFile: propTypes.func.isRequired, + createWallet: propTypes.func.isRequired, + }).isRequired, + recover: propTypes.bool.isRequired, +}; + +export default CreateWallet; diff --git a/src/components/CreationAlert/index.js b/src/components/CreationAlert/index.js new file mode 100644 index 00000000..3484e110 --- /dev/null +++ b/src/components/CreationAlert/index.js @@ -0,0 +1,60 @@ +/* eslint-disable no-nested-ternary */ +import React from 'react'; +import propTypes from 'prop-types'; +import { NavLink } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import { inject, observer } from 'mobx-react'; +import Container from '../Container'; +import FormBlock from '../FormBlock'; +import Button from '../Button/Button'; +import Heading from '../Heading'; + +import styles from '../Login/Login.scss'; + +const WalletAddress = withTranslation()(inject('userStore')(observer(({ t, userStore }) => ( +
+

{t('other:yourWallet')}

+

{userStore.address}

+
+)))); + +WalletAddress.propTypes = { + userStore: propTypes.shape({ + address: propTypes.string.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; + +const CreationAlert = withTranslation()(({ t, success = false, recover = false }) => ( + +
+ + + {success + ? t('headings:walletCreated.heading') + : recover + ? t('headings:walletRestored.heading') + : ''} + {success + ? t('headings:walletCreated.subheading') + : recover + ? t('headings:walletRestored.subheading') + : ''} + + + + + + +
+
+)); + +CreationAlert.propTypes = { + success: propTypes.bool.isRequired, + recover: propTypes.bool.isRequired, +}; + +export default CreationAlert; diff --git a/src/components/Dialog/DefaultDialogFooter.js b/src/components/Dialog/DefaultDialogFooter.js new file mode 100644 index 00000000..5976e0ca --- /dev/null +++ b/src/components/Dialog/DefaultDialogFooter.js @@ -0,0 +1,47 @@ +import React from 'react'; +import { withTranslation } from 'react-i18next'; +import { PropTypes } from 'prop-types'; +import { inject } from 'mobx-react'; +import Button from '../Button/Button'; + +import styles from './Dialog.scss'; + +/** + * Default component for dialog footer + */ +@withTranslation('buttons') +@inject('dialogStore') +class DefaultDialogFooter extends React.Component { + static propTypes = { + t: PropTypes.func, + dialogStore: PropTypes.shape({ + hide: PropTypes.func.isRequired, + }).isRequired, + }; + + static defaultProps = { + t: (k) => (k), + }; + + render() { + const { props } = this; + const { dialogStore, t } = props; + const hide = () => dialogStore.hide(); + return ( +
+ +
+ ); + } +} + +export default DefaultDialogFooter; diff --git a/src/components/Dialog/DefaultDialogFooter.test.js b/src/components/Dialog/DefaultDialogFooter.test.js new file mode 100644 index 00000000..942a05d6 --- /dev/null +++ b/src/components/Dialog/DefaultDialogFooter.test.js @@ -0,0 +1,31 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import DefaultDialogFooter from './DefaultDialogFooter'; +import { Button } from '../Button'; + +describe('DefaultDialogFooter', () => { + let wrapper; + let mockHide; + + beforeEach(() => { + mockHide = jest.fn(); + wrapper = shallow( + ('test')} + />, + ).dive().dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); + + it('button prop onClick should call mockHide', () => { + const button = wrapper.find(Button); + button.prop('onClick')(); + expect(mockHide).toHaveBeenCalled(); + }); +}); diff --git a/src/components/Dialog/Dialog.js b/src/components/Dialog/Dialog.js new file mode 100644 index 00000000..c6fd776c --- /dev/null +++ b/src/components/Dialog/Dialog.js @@ -0,0 +1,180 @@ +import React from 'react'; +import { observer, inject } from 'mobx-react'; +import PropTypes from 'prop-types'; +import { Portal } from 'react-portal'; +import { CloseIcon } from '../Icons'; +import DefaultDialogFooter from './DefaultDialogFooter'; + +import styles from './Dialog.scss'; + +/** + * Dialog component + */ +@inject('dialogStore') +@observer +class Dialog extends React.Component { + static propTypes = { + size: PropTypes.oneOf([ + 'sm', + 'md', + 'lg', + ]), + name: PropTypes.string.isRequired, + header: PropTypes.string, + dialogStore: PropTypes.shape({ + add: PropTypes.func.isRequired, + remove: PropTypes.func.isRequired, + closing: PropTypes.bool.isRequired, + open: PropTypes.bool.isRequired, + dialog: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.bool, + ]), + hide: PropTypes.func.isRequired, + }).isRequired, + footer: PropTypes.element, + className: PropTypes.string, + history: PropTypes.bool, + onOpen: PropTypes.func, + onClose: PropTypes.func, + onCancel: PropTypes.func, + closeable: PropTypes.bool, + children: PropTypes.node, + }; + + static defaultProps = { + size: 'sm', + className: '', + header: null, + footer: (), + history: true, + onOpen: null, + onClose: null, + onCancel: null, + children: null, + closeable: true, + }; + + componentDidMount() { + const { + name, + history, + onOpen, + onClose, + dialogStore, + } = this.props; + document.addEventListener('mousedown', this.handleClickOutside); + dialogStore.add(name, { + history, + onOpen, + onClose, + }); + } + + componentWillUnmount() { + const { name, dialogStore } = this.props; + document.removeEventListener('mousedown', this.handleClickOutside); + dialogStore.remove(name); + } + + handleClickOutside = (e) => { + e.stopPropagation(); + const { props: { name, dialogStore, closeable }, cancel } = this; + if (dialogStore.closing) return; + if (closeable === false || !dialogStore.open || (dialogStore.dialog !== name)) return; + if (this.wrapperRef && !this.wrapperRef.contains(e.target)) { + dialogStore.hide(); + cancel(); + } + } + + hideDialog = (e) => { + if (e) e.preventDefault(); + const { props: { dialogStore }, cancel } = this; + dialogStore.hide(); + cancel(); + } + + cancel = () => { + const { onCancel } = this.props; + if (onCancel && typeof onCancel === 'function') onCancel(); + } + + setWrapperRef = (node) => { + if (!this.wrapperRef) this.wrapperRef = node; + } + + render() { + const { props } = this; + const { + size, + name, + header, + footer, + className, + closeable, + } = this.props; + const store = props.dialogStore; + const dialogSize = `dialog--${size}`; + return ( + +
+
+
+ { + closeable !== false + ? ( +
+
+ +
+
+ ) + : null + } + { + header + ? ( +
+
{header}
+
+ ) + : null + } + { + props.children + ? ( +
+ {props.children} +
+ ) + : null + } + {footer} +
+
+
+
+ ); + } +} + +export default Dialog; diff --git a/src/components/Dialog/Dialog.scss b/src/components/Dialog/Dialog.scss new file mode 100644 index 00000000..80c3a289 --- /dev/null +++ b/src/components/Dialog/Dialog.scss @@ -0,0 +1,189 @@ +.content { + position: relative; + z-index: 5; + display: inline-block; + min-width: 290px; + max-width: 570px; + margin: 0; + background: #fff; + border: 1px solid #E1E4E8; + opacity: 0; + pointer-events: none; + + &__inner { + position: relative; + z-index: 1; + min-height: 325px; + } +} + +.dialog { + position: fixed; + top: 0; + left: 0; + z-index: 5; + display: block; + width: 100%; + height: 100%; + overflow: none; + text-align: center; + pointer-events: none; + + &__header { + position: relative; + z-index: 4; + padding: 10px; + padding-top: 55px; + text-align: center; + } + + &__title { + margin: 0; + padding: 0; + font-weight: 700; + font-size: 24px; + font-family: "Grotesk"; + line-height: 28px; + } + + &__body { + position: relative; + z-index: 2; + padding: 10px 40px; + } + + &__footer { + position: relative; + z-index: 5; + box-sizing: border-box; + width: 100%; + padding: 25px 10px; + + &--default { + padding-top: 55px; + } + } + + &--open { + z-index: 100; + overflow: auto; + opacity: 1; + transition: opacity 0.4s; + pointer-events: auto; + + .content { + top: 50%; + animation-name: anim-open; + animation-duration: 0.7s; + animation-timing-function: cubic-bezier(0.7, 0, 0.3, 1); + animation-fill-mode: forwards; + pointer-events: auto; + } + } + + &--close { + opacity: 1; + transition: opacity 0.4s; + + .content { + animation-name: anim-close; + animation-duration: 0.4s; + animation-timing-function: cubic-bezier(0.7, 0, 0.3, 1); + animation-fill-mode: forwards; + pointer-events: auto; + } + } + + &--sm { + .content { + width: 421px; + min-width: 421px; + } + } + + &--md { + .content { + width: 495px; + min-width: 495px; + } + } + + &--lg { + .content { + width: 740px; + min-width: 740px; + } + } +} + +.close { + position: absolute; + top: -16px; + right: -16px; + z-index: 10; + width: 32px; + height: 32px; + color: #e1e4e8; + font-size: 0; + background-color: #fff; + border: 1px solid #e1e4e8; + outline: none; + transform: rotate(45deg); + cursor: pointer; + opacity: 1; + transition: all 0.5s; + + &:hover { + color: #808080; + } + + &:active { + color: #4d4d4d; + } + + svg { + transform: rotate(-45deg); + } +} + +.footer { + &__button { + min-width: 309px; + } +} + +@keyframes anim-open { + 0% { + transform: translate(0, -800px); + opacity: 0; + } + + 100% { + transform: translate(0, -50%); + opacity: 1; + } +} + +@keyframes anim-close { + 0% { + transform: translate(0, -50%); + opacity: 1; + } + + 100% { + transform: translate(0, 100px); + opacity: 0; + } +} + +@keyframes anim-elem { + 0% { + transform: translate(0, -100px); + opacity: 0; + } + + 100% { + transform: translate(0, -50%); + opacity: 1; + } +} diff --git a/src/components/Dialog/Dialog.stories.js b/src/components/Dialog/Dialog.stories.js new file mode 100644 index 00000000..5e9737e5 --- /dev/null +++ b/src/components/Dialog/Dialog.stories.js @@ -0,0 +1,143 @@ +import React from 'react'; +import { Provider } from 'mobx-react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { storiesOf } from '@storybook/react'; +import Dialog from './Dialog'; +import DefaultDialogFooter from './DefaultDialogFooter'; +import { + AgreedMessage, + RejectMessage, + TransferSuccessMessage, + TokenInProgressMessage, +} from '../Message'; + +const defaultDialogStore = { + remove: () => {}, + add: () => {}, + hide: () => {}, + closing: false, + open: true, +}; + +storiesOf('Dialog', module) + .addDecorator((story) => ( + {}, + add: () => {}, + hide: () => {}, + closing: false, + open: true, + dialog: 'dialog-stories', + }} + > + {story()} + + )) + .add('Default', () => ( + + )} + > + 0x295856bcf02b2017607e4f61cfc1573fd05d511f + + )); + +storiesOf('Dialog', module) + .addDecorator((story) => ( + + {story()} + + )) + .add('Agreed', () => ( + + {}} + /> + + )); + +storiesOf('Dialog', module) + .addDecorator((story) => ( + + {story()} + + )) + .add('Reject', () => ( + + {}} + /> + + )); + +storiesOf('Dialog', module) + .addDecorator((story) => ( + + {story()} + + )) + .add('TokenTransferSuccess', () => ( + + {}} + value="0.134234 TKN" + /> + + )); + +storiesOf('Dialog', module) + .addDecorator((story) => ( + + {story()} + + )) + .add('TokenInProgress', () => ( + + {}} + /> + + )); diff --git a/src/components/Dialog/Dialog.test.js b/src/components/Dialog/Dialog.test.js new file mode 100644 index 00000000..d1772409 --- /dev/null +++ b/src/components/Dialog/Dialog.test.js @@ -0,0 +1,214 @@ +import React from 'react'; +import { Provider } from 'mobx-react'; +import { shallow, mount } from 'enzyme'; +import Dialog from './Dialog'; + +describe('Dialog', () => { + describe('with default props', () => { + let element; + let elementInstance; + let wrapper; + let mockDialogAdd; + let mockDialogRemove; + let mockOnCancel; + let mockDialogHide; + + beforeEach(() => { + mockDialogAdd = jest.fn(); + mockDialogRemove = jest.fn(); + mockOnCancel = jest.fn(); + mockDialogHide = jest.fn(); + element = shallow( + footer test content} + />, + ); + wrapper = element.dive().dive(); + elementInstance = element.dive().instance(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.find('.dialog').hasClass('dialog--sm')).toEqual(true); + expect(wrapper.find('.close__container').length).toEqual(1); + expect(wrapper.find('.dialog__title').text()).toEqual('TEST'); + expect(wrapper.find('.dialog__header-icon').length).toEqual(0); + expect(wrapper.find('.footer--test').length).toEqual(1); + expect(wrapper.find('.footer--test').text()).toEqual('footer test content'); + }); + + it('hideDialog should call mockDialogHide & mockOnCancel', () => { + const closeButton = wrapper.find('.close'); + closeButton.prop('onClick')({ preventDefault: () => {} }); + expect(mockDialogHide).toHaveBeenCalled(); + expect(mockOnCancel).toHaveBeenCalled(); + }); + + it('cancel should call mockOnCancel', () => { + elementInstance.cancel(); + expect(mockOnCancel).toHaveBeenCalled(); + }); + + it('Dialog unmount should call mockDialogRemove', () => { + elementInstance.componentWillUnmount(); + expect(mockDialogRemove).toHaveBeenCalled(); + }); + }); + + describe('mount component with mockDialogHide', () => { + let wrapper; + let outerNode; + let mockDialogHide; + + beforeEach(() => { + outerNode = document.createElement('div'); + mockDialogHide = jest.fn(); + wrapper = mount( + {}, + remove: () => {}, + dialog: 'test', + open: true, + hide: mockDialogHide, + closing: false, + }} + appStore={{}} + > + + , + { attachTo: outerNode }, + ); + }); + + it('click outside component should call mockDialogHide', () => { + document.body.appendChild(outerNode); + outerNode.dispatchEvent(new Event('mousedown', { + bubbles: true, + stopPropagation: () => {}, + })); + expect(mockDialogHide).toHaveBeenCalled(); + }); + + it('wrapperRef should be truthy', () => { + const dialog = wrapper.find(Dialog.wrappedComponent); + expect(dialog.instance().wrapperRef).toBeTruthy(); + }); + }); + + describe('closeable=false', () => { + let wrapper; + let outerNode; + let mockDialogHide; + + beforeEach(() => { + outerNode = document.createElement('div'); + document.body.appendChild(outerNode); + mockDialogHide = jest.fn(); + wrapper = mount( + {}, + remove: () => {}, + dialog: 'test', + open: true, + closing: false, + hide: mockDialogHide, + }} + appStore={{}} + > + + , + { attachTo: outerNode }, + ); + }); + + it('should render correct with needed class', () => { + expect(wrapper.find('.close__container').length).toEqual(0); + }); + + it('should not call mockDialogHide on outside click', () => { + outerNode.dispatchEvent(new Event('mousedown', { + bubbles: true, + stopPropagation: () => {}, + })); + expect(mockDialogHide).not.toHaveBeenCalled(); + }); + }); + + describe('footer=null', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow( + {}, + remove: () => {}, + hide: () => {}, + open: false, + closing: false, + dialog: 'test', + }} + name="test" + header="Test title" + footer={null} + />, + ).dive().dive(); + }); + + it('should render without footer', () => { + expect(wrapper.find('.footer').length).toEqual(0); + }); + }); + + describe('open & closing', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow( + {}, + remove: () => {}, + hide: () => {}, + open: true, + closing: true, + dialog: 'test', + }} + name="test" + header="Test title" + size={null} + />, + ).dive().dive(); + }); + + it('should has dialog--close class', () => { + expect(wrapper.find('.dialog').hasClass('dialog--close')).toEqual(true); + }); + + it('should has dialog--open class', () => { + expect(wrapper.find('.dialog').hasClass('dialog--open')).toEqual(true); + }); + }); +}); diff --git a/src/components/Dialog/index.js b/src/components/Dialog/index.js new file mode 100644 index 00000000..16772f4f --- /dev/null +++ b/src/components/Dialog/index.js @@ -0,0 +1,3 @@ +import Dialog from './Dialog'; + +export default { Dialog }; diff --git a/src/components/DisplayUserInfo/index.js b/src/components/DisplayUserInfo/index.js new file mode 100644 index 00000000..28b43c53 --- /dev/null +++ b/src/components/DisplayUserInfo/index.js @@ -0,0 +1,49 @@ +import React from 'react'; +import { inject, observer } from 'mobx-react'; +import { NavLink } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Container from '../Container'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Button from '../Button/Button'; + +import styles from '../Login/Login.scss'; + +const DisplayUserInfo = withTranslation()(inject('userStore')(observer(({ t, userStore: { balance, address } }) => ( + +
+ + + {t('headings:walletRestoring.heading')} + + {t('headings:walletRestoring.subheading.0')} +
+ {t('headings:walletRestoring.subheading.1')} +
+
+
+
+
+

{t('other:walletAddress')}

+

{`${address.substr(0, 8)}...${address.substr(35, 41)}`}

+
+
+
+

{t('other:balance')}

+

{balance}

+
+
+
+ + + +
+
+ +
+ +)))); + +export default DisplayUserInfo; diff --git a/src/components/Dropdown/Dropdown.scss b/src/components/Dropdown/Dropdown.scss index e69de29b..90dba5cc 100644 --- a/src/components/Dropdown/Dropdown.scss +++ b/src/components/Dropdown/Dropdown.scss @@ -0,0 +1,177 @@ +@import '../../assets/styles/partials/variables'; +.dropdown { + position: relative; + display: inline-block; + + button { + background: transparent; + outline: none; + } + + &__head { + position: relative; + width: 100%; + padding: 8px 15px 8px 5px; + text-align: left; + border: unset; + border-bottom: 1px solid $lightGrey; + cursor: pointer; + transition: 0.2s linear; + &-line { + position: absolute; + top: 100%; + left: 0; + width: 0; + height: 1px; + background-color: $primary; + transition: 0.2s ease-in; + } + &:hover { + border-color: $border; + .dropdown__arrow { + svg { + path { + opacity: 1; + stroke: $border; + } + } + } + } + } + + &__arrow { + position: absolute; + top: 50%; + right: 0; + font-size: 0; + transform: translateY(-50%) rotate(0deg); + transition: 0.2s; + svg { + path { + opacity: 1; + transition: 0.2s; + stroke: $lightGrey; + } + } + } + + &__icon { + position: relative; + display: inline-block; + margin-right: 20px; + svg { + vertical-align: middle; + } + &:after { + position: absolute; + top: 50%; + right: -10px; + width: 1px; + height: 13px; + background-color: $lightGrey; + transform: translate(-50%, -50%); + content: ""; + } + } + + &__selected { + display: inline-block; + max-width: 80%; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: middle; + } + + &__options { + position: absolute; + top: 100%; + z-index: 1; + width: 155%; + height: 0; + max-height: 150px; + padding: 5px 10px; + overflow-x: hidden; + overflow-y: auto; + background-color: $white; + border: 1px solid #E1E4E8; + opacity: 0; + transition: .3s ease-in-out; + &::-webkit-scrollbar { + width: 20px; + } + /* Track */ + &::-webkit-scrollbar-track { + background: #fff; + border: 2px solid #f1f1f1; + } + /* Handle */ + &::-webkit-scrollbar-thumb { + background-image: url(../../assets/images/thumb.png); + background-repeat: no-repeat; + background-position: center; + border: 1px solid $border; + } + &::-webkit-scrollbar-button:vertical:decrement{ + width: 20px; + height: 20px; + background-image: url(../../assets/images/scrollbarBtn.svg); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + } + &::-webkit-scrollbar-button:vertical:increment{ + position: relative; + width: 20px; + height: 20px; + background-image: url(../../assets/images/scrollbarBtnDown.svg); + background-repeat: no-repeat; + background-position: center; + background-size: cover; + } + } + + &__option { + display: block; + padding: 10px 0; + border: none; + cursor: pointer; + } + + &__suboption { + margin-left: 30px; + color: $linkColor; + font-weight: 700; + } + + &--opened { + .dropdown__head { + &-line { + width: 100%; + } + &:hover { + .dropdown__arrow { + transform: translateY(-50%)rotate(180deg); + svg { + path { + opacity: 1; + stroke: $primary; + } + } + } + } + } + .dropdown__arrow { + transform: translateY(-50%)rotate(180deg); + svg { + path { + opacity: 1; + stroke: $primary; + } + } + } + .dropdown__options { + height: 150px; + opacity: 1; + } + } +} \ No newline at end of file diff --git a/src/components/Dropdown/Dropdown.stories.js b/src/components/Dropdown/Dropdown.stories.js index e69de29b..e7b91604 100644 --- a/src/components/Dropdown/Dropdown.stories.js +++ b/src/components/Dropdown/Dropdown.stories.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { CreditCardIcon } from '../Icons'; +import Dropdown from '.'; + +export default ({ title: 'Dropdown' }); + +let opened = true; + +const toggle = () => { + opened = !opened; +}; + +const options = [ + { label: '0x295856bcf02b2017607e4f61cfc1573fd05d511f', value: '1' }, + { label: '0xfffffffffffffffffffffffffffffff', value: '2' }, + { label: '0x00000000000000000000000000', value: '3' }, +]; + +export const WalletDropdown = () => ( + + + +); diff --git a/src/components/Dropdown/index.js b/src/components/Dropdown/index.js index 9b58bcd1..2e346f3d 100644 --- a/src/components/Dropdown/index.js +++ b/src/components/Dropdown/index.js @@ -1,26 +1,87 @@ import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import DropdownOption from '../DropdownOption'; +import { DropdownArrowIcon } from '../Icons'; import styles from './Dropdown.scss'; class Dropdown extends Component { - constructor() { - super(); + constructor(props) { + super(props); this.state = { - options: [], + selectedValue: '', }; + + this.setWrapperRef = this.setWrapperRef.bind(this); + this.handleClickOutside = this.handleClickOutside.bind(this); + } + + componentDidMount() { + document.addEventListener('mousedown', this.handleClickOutside); + } + + componentWillUnmount() { + document.addEventListener('mousedown', this.handleClickOutside); + } + + setWrapperRef(node) { + this.wrapperRef = node; + } + + toggleOptions = () => { + const { opened } = this.state; + this.setState({ opened: !opened }); + } + + closeOptions = () => { + this.setState({ opened: false }); + } + + handleSelect = (selected) => { + const { onSelect, field } = this.props; + this.setState({ + selectedValue: selected, + }); + field.set(selected); + onSelect(selected); + this.toggleOptions(); + } + + handleClickOutside(event) { + if (this.wrapperRef && !this.wrapperRef.contains(event.target)) { + this.closeOptions(); + } } render() { - const { options } = this.state; + const { + children, options, field, subOptions, + } = this.props; + const { opened, selectedValue } = this.state; + const getOptions = options.map((option) => ( -

{option.label}

+ )); return ( -
-

- Выберите кошелек -

-
+
+ + +
{getOptions}
@@ -28,4 +89,22 @@ class Dropdown extends Component { } } +Dropdown.propTypes = { + children: propTypes.element, + options: propTypes.arrayOf(propTypes.object).isRequired, + subOptions: propTypes.shape({}), + onSelect: propTypes.func.isRequired, + field: propTypes.shape({ + set: propTypes.func.isRequired, + value: propTypes.string.isRequired, + placeholder: propTypes.string.isRequired, + }).isRequired, +}; + +Dropdown.defaultProps = { + children: '', + subOptions: {}, +}; + + export default Dropdown; diff --git a/src/components/DropdownOption/index.js b/src/components/DropdownOption/index.js new file mode 100644 index 00000000..69a6cf81 --- /dev/null +++ b/src/components/DropdownOption/index.js @@ -0,0 +1,36 @@ +import React from 'react'; +import propTypes from 'prop-types'; + +import styles from '../Dropdown/Dropdown.scss'; + +const DropdownOption = ({ + value, label, select, subOption, +}) => ( + +); + +DropdownOption.propTypes = { + value: propTypes.string.isRequired, + label: propTypes.string.isRequired, + select: propTypes.func.isRequired, + subOption: propTypes.string.isRequired, +}; + +DropdownOption.defaultProps = { +}; + +export default DropdownOption; diff --git a/src/components/Explanation/Explanation.scss b/src/components/Explanation/Explanation.scss new file mode 100644 index 00000000..1d03db9b --- /dev/null +++ b/src/components/Explanation/Explanation.scss @@ -0,0 +1,20 @@ +@import '../../assets/styles/partials/variables'; +.explanation { + display: inline-block; + margin-bottom: 10px; + padding: 5px; + color: $border; + font-size: 12px; + + &__string { + padding-left: 10px; + border-left: 1px solid $border; + p { + margin-bottom: 15px; + line-height: 17px; + &>span{ + display: block; + } + } + } +} \ No newline at end of file diff --git a/src/components/Explanation/Explanation.stories.js b/src/components/Explanation/Explanation.stories.js new file mode 100644 index 00000000..e440376b --- /dev/null +++ b/src/components/Explanation/Explanation.stories.js @@ -0,0 +1,10 @@ +import React from 'react'; +import Explanation from '.'; + +export default ({ title: 'Explanation' }); + +export const defaultExp = () => ( + + 0x295856bcf02b2017607e4f61cfc1573fd05d511f + +); diff --git a/src/components/Explanation/Explanation.test.js b/src/components/Explanation/Explanation.test.js new file mode 100644 index 00000000..e69de29b diff --git a/src/components/Explanation/index.js b/src/components/Explanation/index.js new file mode 100644 index 00000000..61f3208b --- /dev/null +++ b/src/components/Explanation/index.js @@ -0,0 +1,18 @@ +import React from 'react'; +import propTypes from 'prop-types'; +import styles from './Explanation.scss'; + +const Explanation = ({ children }) => ( +

+

{children}

+

+); + +Explanation.defaultProps = { + children: '', +}; + +Explanation.propTypes = { + children: propTypes.node, +}; +export default Explanation; diff --git a/src/components/FormBlock/index.js b/src/components/FormBlock/index.js new file mode 100644 index 00000000..f5577416 --- /dev/null +++ b/src/components/FormBlock/index.js @@ -0,0 +1,21 @@ +import React from 'react'; +import propTypes from 'prop-types'; + +import styles from '../Login/Login.scss'; + +const FormBlock = ({ children, className }) => ( +
+ {children} +
+); + +FormBlock.propTypes = { + children: propTypes.node.isRequired, + className: propTypes.string, +}; + +FormBlock.defaultProps = { + className: '', +}; + +export default FormBlock; diff --git a/src/components/Header/Header.scss b/src/components/Header/Header.scss new file mode 100644 index 00000000..392cf70d --- /dev/null +++ b/src/components/Header/Header.scss @@ -0,0 +1,64 @@ +@import '../../assets/styles/partials/variables'; + +.header { + position: absolute; + top: 30px; + left: 50%; + z-index: 2; + display: flex; + flex-flow: row nowrap; + align-items:center; + justify-content: space-between; + width: 100%; + max-width: 1120px; + transform: translateX(-50%); + &__nav { + color: $primary; + background-color: #FAFBFC; + } + + &__line { + position: absolute; + top: 50%; + left: 54%; + z-index: -1; + width: 80%; + height: 1px; + background-color: $lightGrey; + border: none; + transform: translate(-50%, -50%); + } + + &__link { + position: relative; + margin: 0 30px; + transition: .2s linear; + &.active{ + font-weight: bold; + &:before, &:after { + position: absolute; + left: 50%; + transform: translateX(-50%); + content: url('../../assets/images/navlink-indicator.svg'); + } + &:before { + bottom: 100%; + } + &:after { + top: 100%; + transform: translateX(-50%) rotate(180deg); + } + } + } + + .lang { + padding: 10px; + background-color: #fafbfc; + } + + .user { + margin-left: 10px; + vertical-align: middle; + background-color: #FAFBFC; + } +} \ No newline at end of file diff --git a/src/components/Header/Header.stories.js b/src/components/Header/Header.stories.js new file mode 100644 index 00000000..e69de29b diff --git a/src/components/Header/HeaderNav/index.js b/src/components/Header/HeaderNav/index.js new file mode 100644 index 00000000..169a1b5c --- /dev/null +++ b/src/components/Header/HeaderNav/index.js @@ -0,0 +1,16 @@ +import React from 'react'; +import { NavLink } from 'react-router-dom'; + +import styles from '../Header.scss'; + +const HeaderNav = () => ( + +); + +export default HeaderNav; diff --git a/src/components/Header/index.js b/src/components/Header/index.js new file mode 100644 index 00000000..4cb974f4 --- /dev/null +++ b/src/components/Header/index.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { inject, observer } from 'mobx-react'; +import Logo from '../Logo'; +import HeaderNav from './HeaderNav'; +import LangSwitcher from '../LangSwitcher'; +import User from '../User'; + +import styles from './Header.scss'; + +const Header = inject('userStore', 'appStore')(observer(({ appStore: { inProject }, userStore: { authorized, address } }) => ( +
+ + {inProject ? : ''} +
+
+ + {authorized ? {address} : ''} +
+
+))); + +export default Header; diff --git a/src/components/Heading/Heading.scss b/src/components/Heading/Heading.scss new file mode 100644 index 00000000..8645cf64 --- /dev/null +++ b/src/components/Heading/Heading.scss @@ -0,0 +1,19 @@ +@import '../../assets/styles/partials/variables'; + +.heading { + text-align: center; + + &--main { + margin-bottom: 5px; + color: $primary; + font-weight: bold; + font-size: 24px; + } + + &--sub { + width: 70%; + margin: 0 auto; + color: $secondary; + font-size: 14px; + } +} \ No newline at end of file diff --git a/src/components/Heading/Heading.stories.js b/src/components/Heading/Heading.stories.js new file mode 100644 index 00000000..ec43fb8c --- /dev/null +++ b/src/components/Heading/Heading.stories.js @@ -0,0 +1,11 @@ +import React from 'react'; +import Heading from '.'; + +export default ({ title: 'Heading' }); + +export const simpleHeading = () => ( + + {'Заголовок'} + {'Nulla sit minim laboris excepteur.'} + +); diff --git a/src/components/Heading/index.js b/src/components/Heading/index.js new file mode 100644 index 00000000..fca314fa --- /dev/null +++ b/src/components/Heading/index.js @@ -0,0 +1,16 @@ +import React from 'react'; +import propTypes from 'prop-types'; +import styles from './Heading.scss'; + +const Heading = ({ children }) => ( +
+

{children[0]}

+ {children[1] ?

{children[1]}

: ''} +
+); + +Heading.propTypes = { + children: propTypes.arrayOf(propTypes.string).isRequired, +}; + +export default Heading; diff --git a/src/components/Hint/Hint.scss b/src/components/Hint/Hint.scss index 2461a3c4..e1c23c5c 100644 --- a/src/components/Hint/Hint.scss +++ b/src/components/Hint/Hint.scss @@ -6,6 +6,7 @@ width: 16px; height: 16px; cursor: default; + &__icon { position: relative; display: inline-block; @@ -15,7 +16,7 @@ font-size: 11px; line-height: 15px; text-align: center; - transition: .2s; + transition: 0.2s; &::before { position: absolute; top: 50%; @@ -26,7 +27,7 @@ background-color: $white; border: 1px solid $border; transform: translate(-50%, -50%) rotate(-45deg); - transition: .2s; + transition: 0.2s; content: ''; } &:hover { @@ -41,6 +42,7 @@ } } } + &__text { position: absolute; top:50%; @@ -53,6 +55,6 @@ transform: translate(-1px, 2px); visibility: hidden; opacity: 0; - transition: .2s; + transition: 0.2s; } } \ No newline at end of file diff --git a/src/components/Hint/Hint.stories.js b/src/components/Hint/Hint.stories.js index 043e7cb0..eab72a0a 100644 --- a/src/components/Hint/Hint.stories.js +++ b/src/components/Hint/Hint.stories.js @@ -5,8 +5,8 @@ export default ({ title: 'Hint' }); export const simpleHint = () => ( - Aliquip nostrud elit nostrud incididunt. - Do labore pariatur mollit magna irure eu. - Minim labore exercitation veniam do fugiat non irure consequat ullamco dolore pariatur id. + {'Aliquip nostrud elit nostrud incididunt.'} + {'Do labore pariatur mollit magna irure eu.'} + {'Minim labore exercitation veniam do fugiat non irure consequat ullamco dolore pariatur id.'} ); diff --git a/src/components/Hint/index.js b/src/components/Hint/index.js index 0f347bd5..e55184fa 100644 --- a/src/components/Hint/index.js +++ b/src/components/Hint/index.js @@ -1,12 +1,12 @@ import React from 'react'; import propTypes from 'prop-types'; -import styles from './Hint.scss'; +import styles from './Hint.scss'; const Hint = ({ children }) => (
- ? - + ? + {children}
diff --git a/src/components/Icons/entities/AddIcon.js b/src/components/Icons/entities/AddIcon.js new file mode 100644 index 00000000..8fa487dd --- /dev/null +++ b/src/components/Icons/entities/AddIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const AddIcon = () => ( + + + + +); + +export default AddIcon; diff --git a/src/components/Icons/entities/AddressIcon.js b/src/components/Icons/entities/AddressIcon.js new file mode 100644 index 00000000..a785e489 --- /dev/null +++ b/src/components/Icons/entities/AddressIcon.js @@ -0,0 +1,13 @@ +import React from 'react'; + +const Address = () => ( + + + + + + + +); + +export default Address; diff --git a/src/components/Icons/entities/BackIcon.js b/src/components/Icons/entities/BackIcon.js new file mode 100644 index 00000000..1e888898 --- /dev/null +++ b/src/components/Icons/entities/BackIcon.js @@ -0,0 +1,8 @@ +import React from 'react'; + +const BackIcon = () => ( + + + +); +export default BackIcon; diff --git a/src/components/Icons/entities/ChainIcon.js b/src/components/Icons/entities/ChainIcon.js new file mode 100644 index 00000000..1fd2590b --- /dev/null +++ b/src/components/Icons/entities/ChainIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const ChainIcon = () => ( + + + + +); + +export default ChainIcon; diff --git a/src/components/Icons/entities/CloseIcon.js b/src/components/Icons/entities/CloseIcon.js new file mode 100644 index 00000000..5883683a --- /dev/null +++ b/src/components/Icons/entities/CloseIcon.js @@ -0,0 +1,33 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const CloseIcon = ({ + width, + height, + fill, +}) => ( + + + + +); + +CloseIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + fill: PropTypes.string, +}; + +CloseIcon.defaultProps = { + width: 11, + height: 11, + fill: '#E1E4E8', +}; + +export default CloseIcon; diff --git a/src/components/Icons/entities/CompilingIcon.js b/src/components/Icons/entities/CompilingIcon.js new file mode 100644 index 00000000..5180e098 --- /dev/null +++ b/src/components/Icons/entities/CompilingIcon.js @@ -0,0 +1,33 @@ +import React from 'react'; + +const CompilingIcon = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default CompilingIcon; diff --git a/src/components/Icons/entities/CreateTokenIcon.js b/src/components/Icons/entities/CreateTokenIcon.js new file mode 100644 index 00000000..9c391c55 --- /dev/null +++ b/src/components/Icons/entities/CreateTokenIcon.js @@ -0,0 +1,17 @@ +import React from 'react'; + +const CreateToken = () => ( + + + + + + + + + + + +); + +export default CreateToken; diff --git a/src/components/Icons/entities/CreditCardIcon.js b/src/components/Icons/entities/CreditCardIcon.js new file mode 100644 index 00000000..07fbadda --- /dev/null +++ b/src/components/Icons/entities/CreditCardIcon.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const CreditCard = () => ( + + + + +); +export default CreditCard; diff --git a/src/components/Icons/entities/CrossedEyeIcon.js b/src/components/Icons/entities/CrossedEyeIcon.js new file mode 100644 index 00000000..96dc22df --- /dev/null +++ b/src/components/Icons/entities/CrossedEyeIcon.js @@ -0,0 +1,17 @@ +import React from 'react'; + +const CrossedEyeIcon = () => ( + + + + + + + + + + + +); + +export default CrossedEyeIcon; diff --git a/src/components/Icons/entities/DropdownArrowIcon.js b/src/components/Icons/entities/DropdownArrowIcon.js new file mode 100644 index 00000000..ce04565a --- /dev/null +++ b/src/components/Icons/entities/DropdownArrowIcon.js @@ -0,0 +1,8 @@ +import React from 'react'; + +const DropdownArrow = () => ( + + + +); +export default DropdownArrow; diff --git a/src/components/Icons/entities/EthereumIcon.js b/src/components/Icons/entities/EthereumIcon.js new file mode 100644 index 00000000..33ccf53c --- /dev/null +++ b/src/components/Icons/entities/EthereumIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const Ethereum = () => ( + + + + +); + +export default Ethereum; diff --git a/src/components/Icons/entities/EyeIcon.js b/src/components/Icons/entities/EyeIcon.js new file mode 100644 index 00000000..5b8e1c4b --- /dev/null +++ b/src/components/Icons/entities/EyeIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const EyeIcon = () => ( + + + + +); + +export default EyeIcon; diff --git a/src/components/Icons/entities/InfoIcon.js b/src/components/Icons/entities/InfoIcon.js new file mode 100644 index 00000000..918e136c --- /dev/null +++ b/src/components/Icons/entities/InfoIcon.js @@ -0,0 +1,11 @@ +import React from 'react'; + +const IconInfo = () => ( + + + + + +); + +export default IconInfo; diff --git a/src/components/Icons/entities/LoginIcon.js b/src/components/Icons/entities/LoginIcon.js new file mode 100644 index 00000000..c3421fb7 --- /dev/null +++ b/src/components/Icons/entities/LoginIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const Login = () => ( + + + + + +); +export default Login; diff --git a/src/components/Icons/entities/PasswordIcon.js b/src/components/Icons/entities/PasswordIcon.js new file mode 100644 index 00000000..975f4599 --- /dev/null +++ b/src/components/Icons/entities/PasswordIcon.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const Password = () => ( + + + +); + +export default Password; diff --git a/src/components/Icons/entities/QuestionUploadingIcon.js b/src/components/Icons/entities/QuestionUploadingIcon.js new file mode 100644 index 00000000..fd187537 --- /dev/null +++ b/src/components/Icons/entities/QuestionUploadingIcon.js @@ -0,0 +1,24 @@ +import React from 'react'; + +const QuestionUploadingIcon = () => ( + + + + + + + + + + + + + + + + + + +); + +export default QuestionUploadingIcon; diff --git a/src/components/Icons/entities/RejectIcon.js b/src/components/Icons/entities/RejectIcon.js new file mode 100644 index 00000000..130241a1 --- /dev/null +++ b/src/components/Icons/entities/RejectIcon.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const RejectIcon = ({ + width, + height, + color, + strokeWidth, +}) => ( + + + + + +); + +RejectIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + strokeWidth: PropTypes.number, + color: PropTypes.string, +}; + +RejectIcon.defaultProps = { + width: 32, + height: 32, + strokeWidth: 2, + color: '#000', +}; + +export default RejectIcon; diff --git a/src/components/Icons/entities/SendingIcon.js b/src/components/Icons/entities/SendingIcon.js new file mode 100644 index 00000000..c6ab16a2 --- /dev/null +++ b/src/components/Icons/entities/SendingIcon.js @@ -0,0 +1,37 @@ +import React from 'react'; + +const SendingIcon = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default SendingIcon; diff --git a/src/components/Icons/entities/StatsIcon.js b/src/components/Icons/entities/StatsIcon.js new file mode 100644 index 00000000..22cbe455 --- /dev/null +++ b/src/components/Icons/entities/StatsIcon.js @@ -0,0 +1,17 @@ +import React from 'react'; + +const Stats = () => ( + + + + + + + + + + + +); + +export default Stats; diff --git a/src/components/Icons/entities/TokenCountIcon.js b/src/components/Icons/entities/TokenCountIcon.js new file mode 100644 index 00000000..41dbe791 --- /dev/null +++ b/src/components/Icons/entities/TokenCountIcon.js @@ -0,0 +1,11 @@ +import React from 'react'; + +const TokenCount = () => ( + + + + + +); + +export default TokenCount; diff --git a/src/components/Icons/entities/TokenNameIcon.js b/src/components/Icons/entities/TokenNameIcon.js new file mode 100644 index 00000000..c2369cc9 --- /dev/null +++ b/src/components/Icons/entities/TokenNameIcon.js @@ -0,0 +1,10 @@ +import React from 'react'; + +const TokenName = () => ( + + + + +); + +export default TokenName; diff --git a/src/components/Icons/entities/TokenSymbolIcon.js b/src/components/Icons/entities/TokenSymbolIcon.js new file mode 100644 index 00000000..ff71fbeb --- /dev/null +++ b/src/components/Icons/entities/TokenSymbolIcon.js @@ -0,0 +1,9 @@ +import React from 'react'; + +const TokenSymbol = () => ( + + + +); + +export default TokenSymbol; diff --git a/src/components/Icons/entities/TxHashIcon.js b/src/components/Icons/entities/TxHashIcon.js new file mode 100644 index 00000000..51cc1b11 --- /dev/null +++ b/src/components/Icons/entities/TxHashIcon.js @@ -0,0 +1,39 @@ +import React from 'react'; + +const TxHashIcon = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default TxHashIcon; diff --git a/src/components/Icons/entities/TxRecieptIcon.js b/src/components/Icons/entities/TxRecieptIcon.js new file mode 100644 index 00000000..e1e0c352 --- /dev/null +++ b/src/components/Icons/entities/TxRecieptIcon.js @@ -0,0 +1,59 @@ +import React from 'react'; + +const TxRecieptIcon = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default TxRecieptIcon; diff --git a/src/components/Icons/entities/VerifyIcon.js b/src/components/Icons/entities/VerifyIcon.js new file mode 100644 index 00000000..9d56f4ab --- /dev/null +++ b/src/components/Icons/entities/VerifyIcon.js @@ -0,0 +1,47 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const VerifyIcon = ({ + width, + height, + color, + strokeWidth, +}) => ( + + + + +); + +VerifyIcon.propTypes = { + width: PropTypes.number, + height: PropTypes.number, + strokeWidth: PropTypes.number, + color: PropTypes.string, +}; + +VerifyIcon.defaultProps = { + width: 32, + height: 32, + strokeWidth: 2, + color: '#000', +}; +export default VerifyIcon; diff --git a/src/components/Icons/index.js b/src/components/Icons/index.js index a91563bb..fa86a243 100644 --- a/src/components/Icons/index.js +++ b/src/components/Icons/index.js @@ -1,95 +1,53 @@ -import React from 'react'; - - -export const AddIcon = () => ( - - - - -); - -export const BackIcon = () => ( - - - -); - -export const Address = () => ( - - - - - - - -); - -export const CreateToken = () => ( - - - - - - - - - - - -); - -export const Ethereum = () => ( - - - - -); - -export const Login = () => ( - - - - - -); - -export const Password = () => ( - - - -); - -export const Stats = () => ( - - - - - - - - - - - -); - -export const TokenSymbol = () => ( - - - -); - -export const TokenCount = () => ( - - - - - -); - -export const TokenName = () => ( - - - - -); +import AddIcon from './entities/AddIcon'; +import Address from './entities/AddressIcon'; +import BackIcon from './entities/BackIcon'; +import ChainIcon from './entities/ChainIcon'; +import CloseIcon from './entities/CloseIcon'; +import CompilingIcon from './entities/CompilingIcon'; +import CreateToken from './entities/CreateTokenIcon'; +import CreditCard from './entities/CreditCardIcon'; +import CrossedEyeIcon from './entities/CrossedEyeIcon'; +import DropdownArrowIcon from './entities/DropdownArrowIcon'; +import Ethereum from './entities/EthereumIcon'; +import EyeIcon from './entities/EyeIcon'; +import IconInfo from './entities/InfoIcon'; +import Login from './entities/LoginIcon'; +import Password from './entities/PasswordIcon'; +import QuestionUploadingIcon from './entities/QuestionUploadingIcon'; +import SendingIcon from './entities/SendingIcon'; +import Stats from './entities/StatsIcon'; +import TokenCount from './entities/TokenCountIcon'; +import TokenSymbol from './entities/TokenSymbolIcon'; +import TokenName from './entities/TokenNameIcon'; +import TxHashIcon from './entities/TxHashIcon'; +import TxRecieptIcon from './entities/TxRecieptIcon'; +import VerifyIcon from './entities/VerifyIcon'; +import RejectIcon from './entities/RejectIcon'; + +export { + AddIcon, + Address, + BackIcon, + ChainIcon, + CloseIcon, + CompilingIcon, + CreateToken, + CreditCard, + CrossedEyeIcon, + DropdownArrowIcon, + Ethereum, + EyeIcon, + IconInfo, + Login, + Password, + QuestionUploadingIcon, + SendingIcon, + Stats, + TokenCount, + TokenName, + TokenSymbol, + TxHashIcon, + TxRecieptIcon, + VerifyIcon, + RejectIcon, +}; diff --git a/src/components/Indicator/Indicator.scss b/src/components/Indicator/Indicator.scss new file mode 100644 index 00000000..233e23f1 --- /dev/null +++ b/src/components/Indicator/Indicator.scss @@ -0,0 +1,16 @@ +@import '../../assets/styles/partials/variables'; + +.indicator { + display: inline-block; + width: 8px; + height: 8px; + margin: 10px 5px; + background-color: $white; + border: 1px solid $primary; + transform: rotate(45deg); + transition: .3s linear; + + &--checked { + background-color: $primary; + } +} \ No newline at end of file diff --git a/src/components/Indicator/Indicator.stories.js b/src/components/Indicator/Indicator.stories.js new file mode 100644 index 00000000..7ee355a7 --- /dev/null +++ b/src/components/Indicator/Indicator.stories.js @@ -0,0 +1,11 @@ +import React from 'react'; +import Indicator from '.'; + +export default ({ title: 'Indicator' }); + +export const uncheckedIndicator = () => ( + +); +export const checkedIndicator = () => ( + +); diff --git a/src/components/Indicator/index.js b/src/components/Indicator/index.js new file mode 100644 index 00000000..06cdf763 --- /dev/null +++ b/src/components/Indicator/index.js @@ -0,0 +1,14 @@ +import React from 'react'; +import propTypes from 'prop-types'; + +import styles from './Indicator.scss'; + +const Indicator = ({ checked }) => ( + +); + +Indicator.propTypes = { + checked: propTypes.bool.isRequired, +}; + +export default Indicator; diff --git a/src/components/Input/Input.scss b/src/components/Input/Input.scss index 0c0d7629..f07437e7 100644 --- a/src/components/Input/Input.scss +++ b/src/components/Input/Input.scss @@ -2,14 +2,18 @@ .field { position: relative; display: inline-block; - padding: 8px 5px; + padding: 0 5px; + text-align: left; border-bottom: 1px solid $lightGrey; svg { position: relative; vertical-align: middle; } + &__input { + width: 85%; margin-left: 20px; + padding: 8px 0; vertical-align: middle; background: transparent; border: none; @@ -29,6 +33,7 @@ } } } + &__label { position: absolute; top: 50%; @@ -39,19 +44,23 @@ transform: translateY(-50%); transition: 0.2s; } + &__error-text { position: absolute; + top: 35px; width: 100%; font-size: 11px; text-align: center; visibility: hidden; opacity: 0; } + &__line { position: absolute; - bottom: 0; - height: 1px; + bottom: -1px; + left: 0; width: 0; + height: 1px; background-color: $primary; transition: 0.3s ease-in; } @@ -78,6 +87,17 @@ opacity: 1; } .field__input { + &:focus, + &:not(:placeholder-shown) { + & ~ .field__line { + width: 0%; + } + & + .field__label { + top: 0; + color: $primary; + font-size: 9px; + } + } &:focus { & ~ .field__line { width: 0; diff --git a/src/components/Input/Input.stories.js b/src/components/Input/Input.stories.js index b85187f4..acbc0793 100644 --- a/src/components/Input/Input.stories.js +++ b/src/components/Input/Input.stories.js @@ -1,16 +1,16 @@ import React from 'react'; import Input from './index'; -import { Password } from '../Icons'; +import { PasswordIcon } from '../Icons'; export default ({ title: 'Input' }); export const simpleInput = () => ( - + ); export const inputError = () => ( - + ); diff --git a/src/components/Input/index.js b/src/components/Input/index.js index d46dd44b..d073daff 100644 --- a/src/components/Input/index.js +++ b/src/components/Input/index.js @@ -1,27 +1,57 @@ -import React from 'react'; +/* eslint-disable react/jsx-props-no-spreading */ +import React, { Component } from 'react'; import propTypes from 'prop-types'; +import { observer } from 'mobx-react'; + import styles from './Input.scss'; -const Input = ({ - children, type, required = false, placeholder, className = '', errorText, -}) => ( -
- {children} - - {placeholder} -

- {errorText} -

-
-
-); +@observer +class Input extends Component { + handleOnChange = (e) => { + const { field, onInput } = this.props; + field.onChange(e); + onInput(field.value); + } + + render() { + const { + children, field, className, + } = this.props; + return ( +
+ {children} + + {field.placeholder} +

+ {field.error} +

+
+
+ ); + } +} + Input.propTypes = { children: propTypes.element.isRequired, - type: propTypes.string.isRequired, - placeholder: propTypes.string.isRequired, - className: propTypes.string.isRequired, - errorText: propTypes.string.isRequired, - required: propTypes.bool.isRequired, + className: propTypes.string, + field: propTypes.shape({ + error: propTypes.string.isRequired, + value: propTypes.string.isRequired, + placeholder: propTypes.string.isRequired, + bind: propTypes.func.isRequired, + onChange: propTypes.func.isRequired, + }).isRequired, + onInput: propTypes.func, +}; + +Input.defaultProps = { + className: '', + onInput: () => null, }; export default Input; diff --git a/src/components/InputSeed/SeedForm.js b/src/components/InputSeed/SeedForm.js new file mode 100644 index 00000000..f390f8c2 --- /dev/null +++ b/src/components/InputSeed/SeedForm.js @@ -0,0 +1,49 @@ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { withTranslation } from 'react-i18next'; +import Input from '../Input'; +import Button from '../Button/Button'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +class SeedInput extends Component { + render() { + const { + seed, form, t, + } = this.props; + + return ( +
+
+ {seed.map((word, index) => ( + + {index + 1} + + ))} +
+
+ +
+
+ ); + } +} + +SeedInput.propTypes = { + form: propTypes.shape({ + onSubmit: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + $: propTypes.func.isRequired, + }).isRequired, + seed: propTypes.arrayOf(propTypes.string).isRequired, + t: propTypes.func.isRequired, +}; + +export default SeedInput; diff --git a/src/components/InputSeed/index.js b/src/components/InputSeed/index.js new file mode 100644 index 00000000..2b1b3690 --- /dev/null +++ b/src/components/InputSeed/index.js @@ -0,0 +1,128 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import propTypes from 'prop-types'; +import { NavLink, Redirect } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Container from '../Container'; +import Heading from '../Heading'; +import FormBlock from '../FormBlock'; +import Button from '../Button/Button'; +import { BackIcon } from '../Icons'; +import Loader from '../Loader'; +import SeedForm from '../../stores/FormsStore/SeedForm'; +import SeedInput from './SeedForm'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('appStore', 'userStore') +@observer +class InputSeed extends Component { + seedForm = new SeedForm({ + hooks: { + onSuccess: (form) => this.submitForm(form), + onError: () => { + this.showError(); + }, + }, + }); + + constructor(props) { + super(props); + this.state = { + redirect: false, + }; + } + + setRedirect = () => { + this.setState({ redirect: true }); + } + + submitForm = (form) => { + const { + userStore, appStore, recover, t, + } = this.props; + const values = Object.values(form.values()); + userStore.setMnemonicRepeat(values); + const mnemonic = values.join(' '); + return new Promise((resolve, reject) => { + if (userStore.isSeedValid(mnemonic)) { + if (recover) { + userStore.recoverWallet() + .then((data) => { + userStore.setEncryptedWallet(data.v3wallet); + userStore.getEthBalance(); + this.setRedirect(); + resolve(); + }); + } else if (!recover) { + if (userStore.isSeedValid(mnemonic)) { + userStore.saveWalletToFile(); + this.setRedirect(); + resolve(); + } + } + } else { + appStore.displayAlert(t('errors:validationError'), 2000); + reject(); + } + }); + } + + showError = () => { + const { appStore, t } = this.props; + appStore.displayAlert(t('errors:emptyFields'), 2000); + } + + render() { + const { userStore, recover, t } = this.props; + const { redirect } = this.state; + const { seedForm } = this; + if (redirect) return recover ? : ; + return ( + +
+ + + {t('headings:seedCheck.heading')} + {seedForm.loading ? t('headings:seedCheck.subheading.0') : t('headings:seedCheck.subheading.1')} + + {seedForm.loading + ? + : ( + + )} + + + + +
+
+ ); + } +} + +InputSeed.propTypes = { + userStore: propTypes.shape({ + setMnemonicRepeat: propTypes.func.isRequired, + isSeedValid: propTypes.func.isRequired, + recoverWallet: propTypes.func.isRequired, + setEncryptedWallet: propTypes.func.isRequired, + getEthBalance: propTypes.func.isRequired, + saveWalletToFile: propTypes.func.isRequired, + mnemonic: propTypes.arrayOf(propTypes.string).isRequired, + }).isRequired, + appStore: propTypes.shape({ + displayAlert: propTypes.func.isRequired, + }).isRequired, + recover: propTypes.bool.isRequired, + t: propTypes.func.isRequired, +}; + +export default InputSeed; diff --git a/src/components/LangSwitcher/LangSwitcher.scss b/src/components/LangSwitcher/LangSwitcher.scss index befc8036..046b9ecf 100644 --- a/src/components/LangSwitcher/LangSwitcher.scss +++ b/src/components/LangSwitcher/LangSwitcher.scss @@ -2,46 +2,59 @@ .lang { display: inline-block; - &--selected { - position: relative; - display: block; - padding: 5px 0; - font-weight: bold; - &:hover { - & + .lang__options { - visibility: visible; - opacity: 1; - } + + &--opened { + .lang__options { + visibility: visible; + opacity: 1; + } + .lang--selected{ &:after { border-color: transparent transparent $primary transparent; border-width: 0px 3px 6px 3px; } } + } + + &--selected { + position: relative; + display: block; + padding: 5px 0; + font-weight: bold; + cursor: pointer; &:after { top: 50%; right: 0; display: inline-block; width: 0; height: 0; + margin-left: 5px; border-color: $primary transparent transparent transparent; border-style: solid; border-width: 6px 3px 0 3px; transform: translateY(-50%); - transition: .2s; + transition: 0.2s; content: ''; } } + &__options { + position: absolute; display: inline-block; + width: max-content; padding: 5px 10px; border: 1px solid $border; visibility: hidden; opacity: 0; - transition: .2s linear; + transition: 0.2s linear; } &__option { display: block; padding: 5px 0; + font-size: 16px; + background-color: $white; + border: none; + outline: none; cursor: pointer; } } \ No newline at end of file diff --git a/src/components/LangSwitcher/index.js b/src/components/LangSwitcher/index.js index 5de19923..5dc1669f 100644 --- a/src/components/LangSwitcher/index.js +++ b/src/components/LangSwitcher/index.js @@ -1,16 +1,90 @@ -import React from 'react'; +/* eslint-disable jsx-a11y/no-static-element-interactions */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +import React, { Component } from 'react'; +import { withTranslation } from 'react-i18next'; +import propTypes from 'prop-types'; +import i18n from '../../i18n'; import styles from './LangSwitcher.scss'; +@withTranslation() +class LangSwitcher extends Component { + constructor(props) { + super(props); + this.state = { + opened: false, + }; -const LangSwitcher = () => ( -
- RUS -
- Русский (RUS) - Русский (ENG) - Русский (ESP) -
-
-); + this.setWrapperRef = this.setWrapperRef.bind(this); + this.handleClickOutside = this.handleClickOutside.bind(this); + } + + componentDidMount() { + document.addEventListener('mousedown', this.handleClickOutside); + } + + componentWillUnmount() { + document.addEventListener('mousedown', this.handleClickOutside); + } + + setWrapperRef(node) { + this.wrapperRef = node; + } + + toggleOptions = () => { + const { opened } = this.state; + this.setState({ + opened: !opened, + }); + } + + selectOption = (e) => { + const value = e.target.getAttribute('data-value'); + this.toggleOptions(); + i18n.changeLanguage(value); + } + + closeOptions = () => { + this.setState({ + opened: false, + }); + } + + handleClickOutside(event) { + if (this.wrapperRef && !this.wrapperRef.contains(event.target)) { + this.closeOptions(); + } + } + + render() { + const { opened } = this.state; + const { t } = this.props; + const { language } = i18n; + return ( +
+ + {language} + +
+ { + i18n.languages.map((item) => ( + + )) + } +
+
+ ); + } +} + +LangSwitcher.propTypes = { + t: propTypes.func.isRequired, +}; export default LangSwitcher; diff --git a/src/components/Loader/Loader.scss b/src/components/Loader/Loader.scss new file mode 100644 index 00000000..1ad9986d --- /dev/null +++ b/src/components/Loader/Loader.scss @@ -0,0 +1,51 @@ +@import '../../assets/styles/partials/variables'; + +.loader { + position: relative; + display: inline-block; + width: 14px; + height: 14px; + margin: 20px; + background-color: $primary; + + &:before { + position: absolute; + top: 50%; + left: 50%; + z-index: -1; + width: 26px; + height: 26px; + border: 1px solid $primary; + transform: translate(-50%, -50%) ; + animation: loaderSpin 2s ease-in infinite; + content: ''; + } + &:after { + position: absolute; + top: 50%; + left: 50%; + z-index: -1; + color: $white; + font-weight: bolder; + font-size: 102px; + line-height: 26px; + transform: translate(-50%, -50%); + animation: loaderSpin 2s ease-in infinite; + content: "+"; + } +} + +@keyframes loaderSpin { + 0% { + transform: scale(1) translate(-50%, -50%) rotate(0deg) ; + } + 10%, 20% { + transform: scale(1.4) translate(-35%, -35%) rotate(0deg) ; + } + 30%, 45% { + transform: scale(1.4) translate(-35%, -35%) rotate(-90deg) ; + } + 55%, 100% { + transform: scale(1) translate(-50%, -50%) rotate(-90deg) ; + } +} \ No newline at end of file diff --git a/src/components/Loader/Loader.stories.js b/src/components/Loader/Loader.stories.js new file mode 100644 index 00000000..e55589fd --- /dev/null +++ b/src/components/Loader/Loader.stories.js @@ -0,0 +1,8 @@ +import React from 'react'; +import Loader from '.'; + +export default ({ title: 'Loader' }); + +export const simpleLoader = () => ( + +); diff --git a/src/components/Loader/Loader.test.js b/src/components/Loader/Loader.test.js new file mode 100644 index 00000000..e69de29b diff --git a/src/components/Loader/index.js b/src/components/Loader/index.js new file mode 100644 index 00000000..70ceea1e --- /dev/null +++ b/src/components/Loader/index.js @@ -0,0 +1,9 @@ +import React from 'react'; + +import styles from './Loader.scss'; + +const Loader = () => ( +
+); + +export default Loader; diff --git a/src/components/LoadingBlock/index.js b/src/components/LoadingBlock/index.js new file mode 100644 index 00000000..3d5dc5cc --- /dev/null +++ b/src/components/LoadingBlock/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import propTypes from 'prop-types'; +import FormBlock from '../FormBlock'; +import Loader from '../Loader'; + +const LoadingBlock = ({ children }) => ( + + {children} + + +); + +LoadingBlock.propTypes = { + children: propTypes.node.isRequired, +}; + +export default LoadingBlock; diff --git a/src/components/Login/Login.scss b/src/components/Login/Login.scss new file mode 100644 index 00000000..bd4d362a --- /dev/null +++ b/src/components/Login/Login.scss @@ -0,0 +1,452 @@ +@import '../../assets/styles/partials/variables'; +.form { + position: absolute; + top: 50%; + left: 50%; + width: 500px; + background-color: $white; + border: 1px solid $lightGrey; + transform: translate(-50%, -50%); + &--wide { + width: 550px; + .form__block { + padding: 60px 50px; + } + } + + &--ultrawide { + width: 1062px; + .form__block { + padding: 70px 90px 110px; + } + } + + &__block { + padding: 60px 44px; + text-align: center; + .heading { + margin-bottom: 60px; + } + .dropdown { + width: 100%; + margin: 10px 0; + } + .field { + width: 100%; + margin: 10px 0; + } + .btn { + display: block; + margin: 10px auto; + &--default { + width: 100%; + margin: 42px auto 20px; + } + } + form, .add-project { + padding: 0 50px; + } + } + + &__submit { + text-align: center; + } + + .btn--back { + position: absolute; + bottom: -62px; + left: 50%; + transform: translateX(-50%); + svg{ + width: 14px; + height: 12px; + margin-right: 3px; + } + } + + &__explanation { + position: absolute; + top: 50%; + width: 60%; + text-align: left; + transform: translateY(-50%); + &--left { + right: 103.5%; + } + &--right { + left: 102%; + } + ul { + list-style: none; + .indicator { + margin: 7px 5px; + vertical-align: middle; + } + } + strong{ + font-weight: 700; + } + } + + &__group { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + .field { + width: 45%; + &__input { + width: 70%; + } + } + } + + &__token { + display: flex; + &-half { + display: inline-block; + width: calc(50% - 1px); + } + &-label { + margin-bottom: 10px; + font-weight: bold; + font-size: 14px; + } + &-divider { + display: inline-block; + width: 1px; + background-color: $primary; + opacity: .1; + } + &-value { + color: $secondary; + font-size: 14px; + } + } + + &__wallet { + font-size: 12px; + &-label{ + margin-bottom: 15px; + font-weight: 700; + font-size: 14px; + } + &-text { + color: $border + } + } +} +.seed { + display: flex; + flex-flow: row wrap; + justify-content: space-between; + + &__word { + display: inline-block; + width: 33%; + margin-bottom: 30px; + text-align: left; + &-id { + display: inline-block; + margin-right: 10px; + color: #181818; + opacity: .5; + + } + &-text { + font-weight: bold; + } + } + + .field { + position: relative; + width: 30%; + padding: 8px 5px; + &:before { + left: 30px; + } + &__input { + position: absolute; + top: 50%; + right: 0; + width: 65%; + margin-left: 0; + transform: translateY(-50%); + &:not(:placeholder-shown) { + & ~ .field__line { + width: 0%; + } + } + &:focus { + & ~ .field__line { + width: 100%; + } + } + } + &__line { + width: 0; + } + } +} + +.projects { + display: grid; + grid-row-gap: 10px; + grid-template-columns: repeat(3, 1fr); + justify-items: center; + + .btn { + display: flex; + flex-flow: row nowrap; + align-items: center; + justify-content: center; + margin: 0; + } +} + +.create, .add-project { + display: flex; + flex-flow: row wrap; + justify-content: space-between; + + &>a { + display: inline-block; + width: calc(50% - 5px); + .btn--white { + display: inline-block; + width: 100%; + svg { + path { + fill: $white + } + } + &:active { + svg { + path { + fill: $primary; + stroke: $white; + } + } + } + &>.btn__content{ + display: inline-block; + &>*{ + display: unset; + } + } + } + } +} +.create { + + .btn--white { + padding: 15px; + svg { + height: 25px; + margin: 0 0 10px; + path { + fill: $white; + } + } + .btn__content{ + .btn__text { + display: block; + width: 80%; + margin: 5px auto 0; + } + } + + } + + &__label { + display: inline-block; + margin-bottom: 0px; + font-weight: 700; + font-size: 14px; + } +} + +.progress { + display: flex; + flex-flow: row nowrap; + justify-content: space-around; + + &-block { + position: relative; + display: inline-block; + width: 80px; + height: 80px; + transition: .3s linear; + &__icon { + position: absolute; + top: 50%; + left: 50%; + display: inline-block; + transform: translate(-50%, -50%); + & > svg { + width: 42px; + height: 42px; + path { + transition: .2s; + fill: rgba($color: $primary, $alpha: .5); + } + } + } + &>svg { + position: absolute; + top: 0%; + left: 50%; + width: 80px; + height: 80px; + transform: translate(-50%, 0%) scale(1); + } + & > img { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + opacity: .5; + } + &>p{ + width: 100%; + margin: 90px 0 0; + color: #37474F; + font-size: 12px; + opacity: .5; + span { + display: block; + margin-bottom: 10px; + } + &+strong { + display: inline-block; + width: 165%; + margin: 5px 0 0 -35%; + } + } + .stroke-animation { + opacity: 0; + } + + &.success{ + .progress-block__icon { + &>svg { + path { + fill: rgba($color: $primary, $alpha: 1); + } + } + } + .stroke-still { + stroke-dasharray: 0; + stroke: rgba($color: $primary, $alpha: 1); + } + & > img { + opacity: 1; + } + .progress-line{ + width: 96px; + border: 1px solid rgba($color: $primary, $alpha: 1); + opacity: 1; + } + &>p { + color: $primary; + opacity: 1; + } + } + + &.active{ + & > img { + opacity: 1; + } + .stroke-animation { + opacity: 1; + } + .progress-block__icon { + svg { + path { + fill: $primary + } + } + } + .progress-line { + opacity: 1; + } + .stroke-still { + stroke: transparent; + } + &>p{ + color: $primary; + opacity: 1; + } + } + } + + &-line { + position: absolute; + top: 50%; + left: 100%; + width: 96px; + border: 1px dashed rgba($color: $primary, $alpha: .5); + transform: translateY(-50%); + opacity: 0; + transition: .3s ease-in; + } +} + +.stroke { + + &-still { + stroke-dasharray: 2; + stroke-width: 4; + transition: .2s; + stroke: rgba($color: $primary, $alpha: .5); + } + + &-animation { + stroke-width: 4; + transform-origin: center center; + animation: stroke-spacing 4s ease-in, stroke-color 5.2s linear; + animation-play-state: running; + animation-delay: 0; + animation-iteration-count: infinite; + animation-direction: normal; + animation-fill-mode: forwards; + } +} + +.step-indicator { + position: absolute; + bottom: 100%; + left: 50%; + color: #808080; + font-size: 12px; + text-align: center; + transform: translate(-50%, 30%); +} + +@keyframes stroke-spacing { + 0% { + stroke-dasharray: 0 200; + } + 45% { + stroke-dashoffset: 0; + stroke-dasharray: 200 200; + } + 90% { + stroke-dashoffset: -200; + stroke-dasharray: 200 200; + } + 100% { + stroke-dashoffset: -200; + stroke-dasharray: 200 200; + } +} + +@keyframes stroke-color { + 0% { stroke: $primary; } + 24% { stroke: $primary; } + 25% { stroke: $primary; } + 49% { stroke: $primary; } + 50% { stroke: $primary; } + 74% { stroke: $primary; } + 75% { stroke: $primary; } + 99% { stroke: $primary; } +} diff --git a/src/components/Login/index.js b/src/components/Login/index.js new file mode 100644 index 00000000..52095573 --- /dev/null +++ b/src/components/Login/index.js @@ -0,0 +1,136 @@ +import React, { Component } from 'react'; +import { observer, inject } from 'mobx-react'; +import propTypes from 'prop-types'; +import { NavLink, Redirect } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Container from '../Container'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Dropdown from '../Dropdown'; +import { CreditCard, Password } from '../Icons'; +import Input from '../Input'; +import Button from '../Button/Button'; +import LoadingBlock from '../LoadingBlock'; +import LoginForm from '../../stores/FormsStore/LoginForm'; + +import styles from './Login.scss'; + +@withTranslation() +@inject('userStore', 'appStore') +@observer +class Login extends Component { + loginForm = new LoginForm({ + hooks: { + onSuccess: (form) => this.login(form), + onError: () => { + this.showError(); + }, + }, + }); + + componentDidMount() { + const { appStore } = this.props; + appStore.readWalletList(); + } + + login(form) { + const { userStore } = this.props; + return userStore.login(form.values().password); + } + + showError() { + const { appStore, t } = this.props; + appStore.displayAlert(t('errors:emptyFields'), 3000); + } + + render() { + const { appStore, userStore, t } = this.props; + const { loginForm } = this; + if (userStore.authorized) return ; + return ( + +
+ { + !loginForm.loading + ? ( + + ) + : ( + + + {t('headings:logging.heading')} + {t('headings:logging.subheading')} + + + ) + } +
+
+ ); + } +} + +const InputForm = withTranslation()(({ + appStore, form, t, +}) => ( + + + {t('headings:login.heading')} + {t('headings:login.subheading')} + +
+ + + + + + +
+ + + + + + + +
+ +
+)); + +Login.propTypes = { + appStore: propTypes.shape({ + displayAlert: propTypes.func.isRequired, + readWalletList: propTypes.func.isRequired, + }).isRequired, + userStore: propTypes.shape({ + logging: propTypes.bool.isRequired, + login: propTypes.func.isRequired, + authorized: propTypes.bool.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; + +InputForm.propTypes = { + appStore: propTypes.shape({ + wallets: propTypes.arrayOf(propTypes.object).isRequired, + }).isRequired, + form: propTypes.shape({ + $: propTypes.func.isRequired, + onSubmit: propTypes.func.isRequired, + loading: propTypes.bool.isRequired, + }).isRequired, +}; + +export default Login; diff --git a/src/components/Logo/Logo.scss b/src/components/Logo/Logo.scss new file mode 100644 index 00000000..8ed4a7ce --- /dev/null +++ b/src/components/Logo/Logo.scss @@ -0,0 +1,48 @@ +@import '../../assets/styles/partials/variables'; + +.logo{ + display: table; + height: 53px; + color: $primary; + text-decoration: none; + border: 3px solid $primary; + + &__dark { + display: table-cell; + min-width: 49px; + padding: 0 5px; + font-size: 0; + text-align: center; + background: $primary; + transition: 0.3s; + span { + color: $white; + font-weight: bold; + font-size: 32px; + font-family: "Roboto Mono"; + } + } + + &__light { + display: table-cell; + min-width: 79px; + padding: 0 10px 0 10px; + font-size: 0; + text-align: center; + vertical-align: middle; + background: $white; + transition: 0.3s; + span { + font-weight: 700; + font-size: 14px; + font-family: "Grotesk"; + } + } + + &:hover { + .logo__dark, + .logo__light { + filter: invert(100%); + } + } +} diff --git a/src/components/Logo/Logo.stories.js b/src/components/Logo/Logo.stories.js new file mode 100644 index 00000000..280172f2 --- /dev/null +++ b/src/components/Logo/Logo.stories.js @@ -0,0 +1,8 @@ +import React from 'react'; +import Logo from '.'; + +export default ({ title: 'Logo' }); + +export const simpleLogo = () => ( + +); diff --git a/src/components/Logo/index.js b/src/components/Logo/index.js new file mode 100644 index 00000000..ac442623 --- /dev/null +++ b/src/components/Logo/index.js @@ -0,0 +1,16 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import styles from './Logo.scss'; + +const Logo = () => ( + + + 01 + + + ZeroOne + + +); + +export default Logo; diff --git a/src/components/Message/AgreedMessage.js b/src/components/Message/AgreedMessage.js new file mode 100644 index 00000000..8c1e5c64 --- /dev/null +++ b/src/components/Message/AgreedMessage.js @@ -0,0 +1,61 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation, Trans } from 'react-i18next'; +import { VerifyIcon } from '../Icons'; +import DefaultMessage from './DefaultMessage'; +import Button from '../Button/Button'; + +import styles from './Message.scss'; + +/** + * Message about agreed decision + */ +@withTranslation(['dialogs']) +class AgreedMessage extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + onButtonClick: PropTypes.func, + buttonText: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.shape({}), + ]), + }; + + static defaultProps = { + onButtonClick: null, + buttonText: , + } + + render() { + const { + props: { + onButtonClick, + t, + buttonText, + }, + } = this; + return ( +
+ + + { + onButtonClick + ? ( +
+ +
+ ) + : null + } +
+ ); + } +} + +export default AgreedMessage; diff --git a/src/components/Message/AgreedMessage.test.js b/src/components/Message/AgreedMessage.test.js new file mode 100644 index 00000000..979c452c --- /dev/null +++ b/src/components/Message/AgreedMessage.test.js @@ -0,0 +1,37 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import AgreedMessage from './AgreedMessage'; +import Button from '../Button/Button'; + +describe('AgreedMessage', () => { + let wrapper; + let mockOnClick; + + beforeEach(() => { + mockOnClick = jest.fn(); + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); + + it('should call mockOnClick on button onClick', () => { + const button = wrapper.find(Button); + expect(button.length).toEqual(1); + button.prop('onClick')(); + expect(mockOnClick).toHaveBeenCalled(); + }); + + it('should render correct without onButtonClick', async () => { + const wrapperCustom = shallow( + , + ).dive(); + expect(wrapper.length).toEqual(1); + expect(wrapperCustom.find(Button).length).toEqual(0); + }); +}); diff --git a/src/components/Message/DefaultMessage.js b/src/components/Message/DefaultMessage.js new file mode 100644 index 00000000..3ae721b3 --- /dev/null +++ b/src/components/Message/DefaultMessage.js @@ -0,0 +1,39 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import styles from './Message.scss'; + +class DefaultMessage extends React.PureComponent { + static propTypes = { + title: PropTypes.string.isRequired, + children: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.node, + ]), + }; + + static defaultProps = { + children: null, + }; + + render() { + const { props } = this; + const { title, children } = props; + return ( +
+ { + title + ? ( +

{title}

+ ) + : null + } + {children} +
+ ); + } +} + +export default DefaultMessage; diff --git a/src/components/Message/DefaultMessage.test.js b/src/components/Message/DefaultMessage.test.js new file mode 100644 index 00000000..b57049c1 --- /dev/null +++ b/src/components/Message/DefaultMessage.test.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import DefaultMessage from './DefaultMessage'; + +describe('DefaultMessage', () => { + it('should render without error with required props', () => { + const wrapper = shallow( + , + ); + expect(wrapper.length).toEqual(1); + expect(wrapper.find('.message__title').text()).toEqual('message title'); + }); + + it('should render without error with optional props', () => { + const wrapper = shallow( + +
content
+
, + ); + expect(wrapper.find('.message__title').text()).toEqual('message title'); + expect(wrapper.find('.content').text()).toEqual('content'); + expect(wrapper.length).toEqual(1); + }); +}); diff --git a/src/components/Message/Message.scss b/src/components/Message/Message.scss new file mode 100644 index 00000000..e74b429a --- /dev/null +++ b/src/components/Message/Message.scss @@ -0,0 +1,81 @@ +.message { + &__container { + width: 100%; + } + + &__title { + margin-top: 18px; + margin-bottom: 8px; + color: #000; + font-weight: 700; + font-size: 24px; + font-family: "Grotesk"; + line-height: 28px; + text-align: center; + } + + &--agreed, + &--reject { + text-align: center; + + .footer { + padding-top: 53px; + padding-bottom: 48px; + } + + svg { + width: auto; + height: auto; + padding-top: 82px; + } + } + + &--transfer-success { + text-align: center; + + .subtext { + color: rgba(0, 0, 0, 0.7); + font-size: 14px; + line-height: 16px; + } + + .value { + margin-top: 8px; + font-weight: 700; + font-size: 14px; + line-height: 16px; + } + + .message { + &__title { + margin-top: 57px; + } + } + + .footer { + padding-top: 48px; + padding-bottom: 51px; + } + } + + &--progress { + .message { + &__title { + margin-top: 57px; + } + } + + .subtext { + color: rgba(0, 0, 0, 0.7); + font-size: 14px; + line-height: 16px; + } + + .loader__container { + width: 100%; + padding-top: 92px; + padding-bottom: 110px; + text-align: center; + } + } +} diff --git a/src/components/Message/Messages.stories.js b/src/components/Message/Messages.stories.js new file mode 100644 index 00000000..1b79e57c --- /dev/null +++ b/src/components/Message/Messages.stories.js @@ -0,0 +1,27 @@ +import React from 'react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { storiesOf } from '@storybook/react'; +import { DefaultMessage, AgreedMessage, RejectMessage, TransferSuccessMessage } from '.'; + +storiesOf('Messages', module) + .add('With children & title', () => ( + +
content Messages
+
+ )) + .add('With title', () => ( + + )) + .add('Agreed', () => ( + {}} /> + )) + .add('Reject', () => ( + {}} /> + )) + .add('TransferSuccessMessage', () => ( + {}} /> + )); diff --git a/src/components/Message/RejectMessage.js b/src/components/Message/RejectMessage.js new file mode 100644 index 00000000..6b46df4c --- /dev/null +++ b/src/components/Message/RejectMessage.js @@ -0,0 +1,61 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation, Trans } from 'react-i18next'; +import { RejectIcon } from '../Icons'; +import Button from '../Button/Button'; +import DefaultMessage from './DefaultMessage'; + +import styles from './Message.scss'; + +/** + * Message about reject decision + */ +@withTranslation(['dialogs', 'buttons']) +class RejectMessage extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + onButtonClick: PropTypes.func, + buttonText: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.shape({}), + ]), + }; + + static defaultProps = { + onButtonClick: null, + buttonText: , + } + + render() { + const { + props: { + onButtonClick, + t, + buttonText, + }, + } = this; + return ( +
+ + + { + onButtonClick + ? ( +
+ +
+ ) + : null + } +
+ ); + } +} + +export default RejectMessage; diff --git a/src/components/Message/RejectMessage.test.js b/src/components/Message/RejectMessage.test.js new file mode 100644 index 00000000..be2e4226 --- /dev/null +++ b/src/components/Message/RejectMessage.test.js @@ -0,0 +1,37 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import RejectMessage from './RejectMessage'; +import Button from '../Button/Button'; + +describe('RejectMessage', () => { + let wrapper; + let mockOnClick; + + beforeEach(() => { + mockOnClick = jest.fn(); + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); + + it('should call mockOnClick on button onClick', () => { + const button = wrapper.find(Button); + expect(button.length).toEqual(1); + button.prop('onClick')(); + expect(mockOnClick).toHaveBeenCalled(); + }); + + it('should render correct without onButtonClick', async () => { + const wrapperCustom = shallow( + , + ).dive(); + expect(wrapper.length).toEqual(1); + expect(wrapperCustom.find(Button).length).toEqual(0); + }); +}); diff --git a/src/components/Message/TokenInProgressMessage.js b/src/components/Message/TokenInProgressMessage.js new file mode 100644 index 00000000..ee5a02f4 --- /dev/null +++ b/src/components/Message/TokenInProgressMessage.js @@ -0,0 +1,38 @@ +import React from 'react'; +import { withTranslation } from 'react-i18next'; +import PropTypes from 'prop-types'; +import Loader from '../Loader'; +import DefaultMessage from './DefaultMessage'; + +import styles from './Message.scss'; + +/** + * Dialog with token transfer in progress + */ +@withTranslation('dialogs') +class TokenInProgressMessage extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + } + + render() { + const { props } = this; + const { t } = props; + return ( +
+ +

+ {t('dialogs:someTimeText')} +

+
+ +
+
+
+ ); + } +} + +export default TokenInProgressMessage; diff --git a/src/components/Message/TokenInProgressMessage.test.js b/src/components/Message/TokenInProgressMessage.test.js new file mode 100644 index 00000000..43f85d6c --- /dev/null +++ b/src/components/Message/TokenInProgressMessage.test.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import TokenInProgressMessage from './TokenInProgressMessage'; + +describe('TokenInProgressMessage', () => { + let wrapper; + + beforeEach(() => { + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + }); +}); diff --git a/src/components/Message/TransferSuccessMessage.js b/src/components/Message/TransferSuccessMessage.js new file mode 100644 index 00000000..936a2b1f --- /dev/null +++ b/src/components/Message/TransferSuccessMessage.js @@ -0,0 +1,68 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withTranslation, Trans } from 'react-i18next'; +import { EMPTY_DATA_STRING } from '../../constants'; +import DefaultMessage from './DefaultMessage'; +import Button from '../Button/Button'; + +import styles from './Message.scss'; +/** + * Dialog with message about success token transfer + */ +@withTranslation(['dialogs', 'other']) +class TransferSuccessMessage extends React.Component { + static propTypes = { + t: PropTypes.func.isRequired, + onButtonClick: PropTypes.func, + value: PropTypes.string, + buttonText: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.shape({}), + ]), + } + + static defaultProps = { + onButtonClick: null, + } + + static defaultProps = { + value: EMPTY_DATA_STRING, + buttonText: , + } + + render() { + const { + props: { + onButtonClick, + t, + value, + buttonText, + }, + } = this; + return ( +
+ +

{t('other:yourBalance')}

+
{value}
+
+ { + onButtonClick + ? ( +
+ +
+ ) + : null + } +
+ ); + } +} + +export default TransferSuccessMessage; diff --git a/src/components/Message/TransferSuccessMessage.test.js b/src/components/Message/TransferSuccessMessage.test.js new file mode 100644 index 00000000..1c87d1fb --- /dev/null +++ b/src/components/Message/TransferSuccessMessage.test.js @@ -0,0 +1,51 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import Button from '../Button/Button'; +import TransferSuccessMessage from './TransferSuccessMessage'; +import { EMPTY_DATA_STRING } from '../../constants'; + +describe('TransferSuccessMessage', () => { + let wrapper; + let mockOnClick; + + beforeEach(() => { + mockOnClick = jest.fn(); + wrapper = shallow( + , + ).dive(); + }); + + it('should render without error', () => { + expect(wrapper.length).toEqual(1); + expect(wrapper.find('.value').text()).toEqual(EMPTY_DATA_STRING); + }); + + it('should call mockOnClick on button onClick', () => { + const button = wrapper.find(Button); + expect(button.length).toEqual(1); + button.prop('onClick')(); + expect(mockOnClick).toHaveBeenCalled(); + }); + + it('should render without error & with correct data', () => { + const wrapperCustom = shallow( + , + ).dive(); + expect(wrapperCustom.find('.value').text()).toEqual('0.1234 TKN'); + }); + + it('should render correct without onButtonClick', async () => { + const wrapperCustom = shallow( + , + ).dive(); + expect(wrapper.length).toEqual(1); + expect(wrapperCustom.find(Button).length).toEqual(0); + }); +}); diff --git a/src/components/Message/index.js b/src/components/Message/index.js new file mode 100644 index 00000000..4e724aae --- /dev/null +++ b/src/components/Message/index.js @@ -0,0 +1,14 @@ +import DefaultMessage from './DefaultMessage'; +import AgreedMessage from './AgreedMessage'; +import RejectMessage from './RejectMessage'; +import TransferSuccessMessage from './TransferSuccessMessage'; +import TokenInProgressMessage from './TokenInProgressMessage'; + +export default DefaultMessage; + +export { + AgreedMessage, + RejectMessage, + TransferSuccessMessage, + TokenInProgressMessage, +}; diff --git a/src/components/ProjectList/index.js b/src/components/ProjectList/index.js new file mode 100644 index 00000000..08f606f2 --- /dev/null +++ b/src/components/ProjectList/index.js @@ -0,0 +1,69 @@ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { NavLink } from 'react-router-dom'; +import { inject, observer } from 'mobx-react'; +import { withTranslation } from 'react-i18next'; +import Button from '../Button/Button'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import { AddIcon } from '../Icons'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('appStore') +@observer +class ProjectList extends Component { + constructor(props) { + super(props); + this.state = {}; + } + + componentDidMount() { + const { appStore } = this.props; + appStore.readProjectList(); + } + + render() { + const { appStore: { projectList }, t } = this.props; + const projects = projectList.map((project, index) => ( + + )); + return ( + +
+ + + {t('headings:projects.heading')} + {t('headings:projects.subheading')} + +
+ {projects} + + + +
+
+
+
+ ); + } +} + +ProjectList.propTypes = { + appStore: propTypes.shape({ + readProjectList: propTypes.func.isRequired, + projectList: propTypes.arrayOf(propTypes.object).isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; + +export default ProjectList; diff --git a/src/components/ProjectUploading/ProgressBlock/index.js b/src/components/ProjectUploading/ProgressBlock/index.js new file mode 100644 index 00000000..e1426c9b --- /dev/null +++ b/src/components/ProjectUploading/ProgressBlock/index.js @@ -0,0 +1,42 @@ +import React from 'react'; +import propTypes from 'prop-types'; + +import styles from '../../Login/Login.scss'; + +const ProgressBlock = ({ + children, text, index, state, noline, +}) => ( +
index ? 'success' : ''}`} + > + + + + + + +
+ {children[0] ? children[0] : children} +
+

+ {text} + {children[1] ? children[1] : ''} +

+ {!noline ?
: ''} +
+); + +ProgressBlock.propTypes = { + children: propTypes.arrayOf(propTypes.node).isRequired, + text: propTypes.string.isRequired, + index: propTypes.number.isRequired, + state: propTypes.number.isRequired, + noline: propTypes.bool, +}; + +ProgressBlock.defaultProps = { + noline: false, +}; + +export default ProgressBlock; diff --git a/src/components/ProjectUploading/index.js b/src/components/ProjectUploading/index.js new file mode 100644 index 00000000..c323c6e6 --- /dev/null +++ b/src/components/ProjectUploading/index.js @@ -0,0 +1,166 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import propTypes from 'prop-types'; +import { NavLink } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Container from '../Container'; +import ProgressBlock from './ProgressBlock'; +import { + CompilingIcon, SendingIcon, TxHashIcon, TxRecieptIcon, QuestionUploadingIcon, Login, +} from '../Icons'; +import Button from '../Button/Button'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('userStore', 'appStore') +@observer +class ProjectUploading extends Component { + steps = { + compiling: 0, + sending: 1, + hash: 2, + receipt: 3, + questions: 4, + } + + constructor(props) { + super(props); + this.state = { + step: this.steps.compiling, + uploading: true, + }; + } + + componentDidMount() { + const { steps } = this; + const { + appStore, appStore: { deployArgs, name }, userStore: { password }, t, + } = this.props; + this.setState({ + step: steps.sending, + }); + + appStore.deployContract('project', deployArgs, password) + .then((txHash) => { + this.setState({ + step: steps.receipt, + }); + return appStore.checkReceipt(txHash); + }) + .then((receipt) => { + if (receipt) { + this.setState({ + step: steps.questions, + }); + appStore.addProjectToList({ name, address: receipt.contractAddress }); + appStore.deployQuestions(receipt.contractAddress).then(() => { + this.setState({ + uploading: false, + }); + }); + } + }).catch(() => { appStore.displayAlert(t('errors:hostUnreachable'), 3000); }); + } + + render() { + const { step, uploading } = this.state; + return ( + +
+ { + uploading ? : + } +
+
+ ); + } +} + +const Progress = withTranslation()(inject('appStore')(observer(({ t, appStore, step }) => { + const steps = [ + [t('other:compiling'), ], + [t('other:sending'), ], + [t('other:txHash'), ], + [t('other:txReceipt'), ], + [t('other:questionsUploading'), [ + , + + {appStore.uploadedQuestion} + {'/'} + {appStore.countOfQuestions} + ], + ]]; + + return ( + + + {t('headings:uploadingProject.heading')} + {t('headings:uploadingProject.subheading')} + +
+ {steps.map((item, index) => ( + + {item[1]} + + ))} +
+
+ ); +}))); + +const AlertBlock = withTranslation()(({ t }) => ( + + + {t('headings:projectCreated.heading')} + + {t('headings:projectCreated.subheading.0')} +
+ {t('headings:projectCreated.subheading.1')} +
+
+ + + + +
+)); + +ProjectUploading.propTypes = { + appStore: propTypes.shape({ + deployContract: propTypes.func.isRequired, + checkReceipt: propTypes.func.isRequired, + deployArgs: propTypes.array.isRequired, + name: propTypes.string.isRequired, + password: propTypes.string.isRequired, + addProjectToList: propTypes.func.isRequired, + deployQuestions: propTypes.func.isRequired, + displayAlert: propTypes.func.isRequired, + }).isRequired, + userStore: propTypes.shape({ + password: propTypes.string.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; + +Progress.propTypes = { + step: propTypes.number.isRequired, + appStore: propTypes.shape({ + uploadedQuestion: propTypes.number.isRequired, + countOfQuestions: propTypes.number.isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; + +export default ProjectUploading; diff --git a/src/components/RequiredAuthorization/index.js b/src/components/RequiredAuthorization/index.js new file mode 100644 index 00000000..33080620 --- /dev/null +++ b/src/components/RequiredAuthorization/index.js @@ -0,0 +1,24 @@ +import React from 'react'; +import propTypes from 'prop-types'; +import { observer, inject } from 'mobx-react'; +import { Redirect } from 'react-router-dom'; + +@inject('userStore') +@observer +class RequiredAuthorization extends React.Component { + render() { + const { props } = this; + const { userStore, children } = props; + if (!userStore.authorized) return ; + return children; + } +} + +RequiredAuthorization.propTypes = { + children: propTypes.node.isRequired, + userStore: propTypes.shape({ + authorized: propTypes.bool.isRequired, + }).isRequired, +}; + +export default RequiredAuthorization; diff --git a/src/components/Router/SimpleRouter.js b/src/components/Router/SimpleRouter.js new file mode 100644 index 00000000..92eea738 --- /dev/null +++ b/src/components/Router/SimpleRouter.js @@ -0,0 +1,45 @@ +import React from 'react'; +import { + MemoryRouter, Route, Switch, +} from 'react-router-dom'; +import Login from '../Login'; +import CreateWallet from '../CreateWallet'; +import InputSeed from '../InputSeed'; +import ShowSeed from '../ShowSeed'; +import ProjectList from '../ProjectList'; +import CreateNewProject from '../CreateNewProject'; +import CreateNewProjectWithTokens from '../CreateNewProjectWithTokens'; +import CreateNewProjectWithoutTokens from '../CreateNewProjectWithoutTokens'; +import AddExistingProject from '../AddExisitingProject'; +import AddNewProject from '../AddNewProject'; +import ProjectUploading from '../ProjectUploading'; +import CreationAlert from '../CreationAlert'; +import DisplayUserInfo from '../DisplayUserInfo'; +import Header from '../Header'; + +const SimpleRouter = () => ( + +
+ + + + + ()} /> + ()} /> + ()} /> + ()} /> + ()} /> + ()} /> + + + + + + + ()} /> + ()} /> + + +); + +export default SimpleRouter; diff --git a/src/components/ShowSeed/index.js b/src/components/ShowSeed/index.js new file mode 100644 index 00000000..2462075e --- /dev/null +++ b/src/components/ShowSeed/index.js @@ -0,0 +1,108 @@ +/* eslint-disable react/jsx-props-no-spreading */ +import React, { Component } from 'react'; +import propTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { NavLink, Redirect } from 'react-router-dom'; +import { withTranslation } from 'react-i18next'; +import Container from '../Container'; +import FormBlock from '../FormBlock'; +import Heading from '../Heading'; +import Explanation from '../Explanation'; +import Button from '../Button/Button'; +import { BackIcon, EyeIcon, CrossedEyeIcon } from '../Icons'; + +import styles from '../Login/Login.scss'; + +@withTranslation() +@inject('userStore', 'appStore') +@observer +class ShowSeed extends Component { + constructor(props) { + super(props); + this.state = { + visible: false, + }; + } + + toggleWords = () => { + const { visible } = this.state; + this.setState({ + visible: !visible, + }); + } + + // eslint-disable-next-line class-methods-use-this + redirectToInput() { + return ; + } + + render() { + const { userStore, t } = this.props; + const { visible } = this.state; + return ( + +
+ + + {t('headings:showSeed.heading')} + {t('headings:showSeed.subheading')} + +
+ {userStore.mnemonic.map((word, id) => ( + + ))} +
+
+ + + +
+
+ + + +
+ +

{t('explanations:seed.0')}

+

{t('explanations:seed.1')}

+
+ +
+
+
+ ); + } +} + +const SeedWord = ({ word, id, visible }) => ( +

+ {id + 1} + {visible ? word : ('*').repeat(word.length)} +

+); + +ShowSeed.propTypes = { + userStore: propTypes.shape({ + mnemonic: propTypes.arrayOf(propTypes.string).isRequired, + }).isRequired, + t: propTypes.func.isRequired, +}; + +SeedWord.propTypes = { + id: propTypes.number.isRequired, + word: propTypes.string.isRequired, + visible: propTypes.bool.isRequired, +}; + +export default ShowSeed; diff --git a/src/components/StepIndicator/index.js b/src/components/StepIndicator/index.js new file mode 100644 index 00000000..b518eae3 --- /dev/null +++ b/src/components/StepIndicator/index.js @@ -0,0 +1,28 @@ +import React from 'react'; +import { withTranslation } from 'react-i18next'; +import Indicator from '../Indicator'; + +import styles from '../Login/Login.scss'; + +const StepIndicator = withTranslation()(({ t, currentStep, stepCount }) => { + const arr = new Array(stepCount).fill(''); + return ( +
+

+ {t('other:step')} + + {` ${currentStep} `} + + {t('other:from')} + + {` ${stepCount} `} + +

+

+ {arr.map((item, index) => = index + 1} />)} +

+
+ ); +}); + +export default StepIndicator; diff --git a/src/components/User/User.scss b/src/components/User/User.scss index 739dc70e..28733112 100644 --- a/src/components/User/User.scss +++ b/src/components/User/User.scss @@ -1,16 +1,20 @@ @import '../../assets/styles/partials/variables'; + .user { display: inline-block; font-size: 0; border: 1px solid $primary; cursor: pointer; + &__image { vertical-align: middle; } + &__wallet { margin: 0 10px; font-size: 12px; vertical-align: middle; + background-color: $white; &--full { display: none; } diff --git a/src/components/User/User.stories.js b/src/components/User/User.stories.js index e4d4ed95..342d9744 100644 --- a/src/components/User/User.stories.js +++ b/src/components/User/User.stories.js @@ -3,4 +3,4 @@ import User from '.'; export default ({ title: 'Header (User)' }); -export const SimpleUser = () => ; +export const SimpleUser = () => 0x295856bcf02b2017607e4f61cfc1573fd05d511f; diff --git a/src/components/User/index.js b/src/components/User/index.js index 7e1f47f9..93457481 100644 --- a/src/components/User/index.js +++ b/src/components/User/index.js @@ -1,11 +1,17 @@ import React from 'react'; +import propTypes from 'prop-types'; import styles from './User.scss'; -const User = () => ( +const User = ({ children }) => (
- avatar - 0x295856bcf02b2017607e4f61cfc1573fd05d511f - 0x295856...5d511f + avatar + {children} + {`${children.substr(0, 8)}...${children.substr(35, 41)}`}
); + +User.propTypes = { + children: propTypes.string.isRequired, +}; + export default User; diff --git a/src/config.json b/src/config.json new file mode 100644 index 00000000..c19978c1 --- /dev/null +++ b/src/config.json @@ -0,0 +1,17 @@ +{ + "host": "https://ropsten.infura.io/v3/14b2319f08e24f3aadfe1aa933301b38", + "projects": [ + { + "name": "tetete", + "address": "0x1Df6AdA9f170D0FdFb075140333A44c0C651f4AC" + }, + { + "name": "test", + "address": "0x1Cd9D97EC3f3283cD564bB82f7d0Ee2737D6F352" + }, + { + "name": "T3st", + "address": "0xACA55c33D67d549CacA4f700D0319B865D8E0FC5" + } + ] +} \ No newline at end of file diff --git a/src/constants/index.js b/src/constants/index.js new file mode 100644 index 00000000..0da98827 --- /dev/null +++ b/src/constants/index.js @@ -0,0 +1,13 @@ +/* eslint-disable no-useless-escape */ +export const votingStates = { + default: 0, + prepared: 1, + active: 2, +}; + +export const SOL_PATH_REGEXP = new RegExp(/(\"|\')((\.{1,2}\/){1,})(\w+\/){0,}?(\w+\.(?:sol))(\"|\')/g); +export const SOL_IMPORT_REGEXP = new RegExp(/(import)*.(\"|\')((\.{1,2}\/){1,})(\w+\/){0,}?(\w+\.(?:sol))(\"|\')(;)/g); +export const SOL_VERSION_REGEXP = new RegExp(/(pragma).(solidity).((\^)?)([0-9](.)?){1,}/g); + +export const EMPTY_DATA_STRING = '-/-'; +export const walletHdPath = "m/44'/60'/0'/0/0"; diff --git a/src/constants/windowModules.js b/src/constants/windowModules.js new file mode 100644 index 00000000..e588d5e0 --- /dev/null +++ b/src/constants/windowModules.js @@ -0,0 +1,20 @@ +export const fs = window.require('fs'); +export const path = window.require('path'); + +const ENV = process.env.NODE_ENV || 'development'; +window.__ENV = ENV; + +const devPath = window.process.env.INIT_CWD; +const prodPath = window.process.env.PORTABLE_EXECUTABLE_DIR || path.join(window.__dirname, '../src'); + +export const ROOT_DIR = window.__ENV === 'production' + ? prodPath + : path.join(devPath, './src/'); + +export const PATH_TO_WALLETS = window.__ENV === 'production' + ? path.join(prodPath, './wallets/') + : path.join(devPath, './src/wallets/'); + +export const PATH_TO_CONTRACTS = window.__ENV === 'production' + ? path.join(prodPath, './contracts/') + : path.join(devPath, './src/contracts/'); diff --git a/src/contracts/ERC20.abi b/src/contracts/ERC20.abi new file mode 100644 index 00000000..6e054f53 --- /dev/null +++ b/src/contracts/ERC20.abi @@ -0,0 +1 @@ +[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"totalSupply","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}] \ No newline at end of file diff --git a/src/contracts/ERC20.sol b/src/contracts/ERC20.sol new file mode 100644 index 00000000..c7dd2d5b --- /dev/null +++ b/src/contracts/ERC20.sol @@ -0,0 +1,252 @@ +pragma solidity 0.5; + +import "./IERC20.sol"; +import "./SafeMath.sol"; + +/** + * @dev Implementation of the `IERC20` interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using `_mint`. + * For a generic mechanism see `ERC20Mintable`. + * + * *For a detailed writeup see our guide [How to implement supply + * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* + * + * We have followed general OpenZeppelin guidelines: functions revert instead + * of returning `false` on failure. This behavior is nonetheless conventional + * and does not conflict with the expectations of ERC20 applications. + * + * Additionally, an `Approval` event is emitted on calls to `transferFrom`. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + * + * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` + * functions have been added to mitigate the well-known issues around setting + * allowances. See `IERC20.approve`. + */ +contract ERC20 is IERC20 { + using SafeMath for uint256; + + mapping (address => uint256) private _balances; + + mapping (address => mapping (address => uint256)) private _allowances; + + uint256 private _totalSupply; + + string private _name; + + string private _symbol; + + constructor (string name, string symbol, uint256 totalSupply) public { + _name = name; + _symbol = symbol; + _totalSupply = totalSupply; + _balances[msg.sender] = totalSupply; + } + + /** + * @dev See `IERC20.totalSupply`. + */ + function totalSupply() public view returns (uint256) { + return _totalSupply; + } + + /** + * @dev See `IERC20.balanceOf`. + */ + function balanceOf(address account) public view returns (uint256) { + return _balances[account]; + } + + /** + * @dev Get the symbol of token. + */ + function symbol() public view returns (string) { + return _symbol; + } + /** + * @dev Get the name of token. + */ + function name() public view returns (string) { + return _name; + } + + /** + * @dev See `IERC20.transfer`. + * + * Requirements: + * + * - `recipient` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer(address recipient, uint256 amount) public returns (bool) { + _transfer(msg.sender, recipient, amount); + return true; + } + + /** + * @dev See `IERC20.allowance`. + */ + function allowance(address owner, address spender) public view returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See `IERC20.approve`. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 value) public returns (bool) { + _approve(msg.sender, spender, value); + return true; + } + + /** + * @dev See `IERC20.transferFrom`. + * + * Emits an `Approval` event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of `ERC20`; + * + * Requirements: + * - `sender` and `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `value`. + * - the caller must have allowance for `sender`'s tokens of at least + * `amount`. + */ + function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { + _transfer(sender, recipient, amount); + _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); + return true; + } + + /** + * @dev Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to `approve` that can be used as a mitigation for + * problems described in `IERC20.approve`. + * + * Emits an `Approval` event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { + _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); + return true; + } + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to `approve` that can be used as a mitigation for + * problems described in `IERC20.approve`. + * + * Emits an `Approval` event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { + _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); + return true; + } + + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to `transfer`, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a `Transfer` event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer(address sender, address recipient, uint256 amount) internal { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _balances[sender] = _balances[sender].sub(amount); + _balances[recipient] = _balances[recipient].add(amount); + emit Transfer(sender, recipient, amount); + } + + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a `Transfer` event with `from` set to the zero address. + * + * Requirements + * + * - `to` cannot be the zero address. + */ + function _mint(address account, uint256 amount) internal { + require(account != address(0), "ERC20: mint to the zero address"); + + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } + + /** + * @dev Destoys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a `Transfer` event with `to` set to the zero address. + * + * Requirements + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + function _burn(address account, uint256 value) internal { + require(account != address(0), "ERC20: burn from the zero address"); + + _totalSupply = _totalSupply.sub(value); + _balances[account] = _balances[account].sub(value); + emit Transfer(account, address(0), value); + } + + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. + * + * This is internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an `Approval` event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + function _approve(address owner, address spender, uint256 value) internal { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = value; + emit Approval(owner, spender, value); + } + + /** + * @dev Destoys `amount` tokens from `account`.`amount` is then deducted + * from the caller's allowance. + * + * See `_burn` and `_approve`. + */ + function _burnFrom(address account, uint256 amount) internal { + _burn(account, amount); + _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); + } +} \ No newline at end of file diff --git a/src/contracts/IERC20.sol b/src/contracts/IERC20.sol new file mode 100644 index 00000000..0501a2f9 --- /dev/null +++ b/src/contracts/IERC20.sol @@ -0,0 +1,84 @@ +pragma solidity 0.5; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. Does not include + * the optional functions; to access them see `ERC20Detailed`. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + /** + * @dev Returns the amount of tokens in existence. + */ + function name() external view returns (string); + /** + * @dev Returns the amount of tokens in existence. + */ + function symbol() external view returns (string); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a `Transfer` event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through `transferFrom`. This is + * zero by default. + * + * This value changes when `approve` or `transferFrom` are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * > Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an `Approval` event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a `Transfer` event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to `approve`. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} \ No newline at end of file diff --git a/src/contracts/MERC20.abi b/src/contracts/MERC20.abi new file mode 100644 index 00000000..8f465543 --- /dev/null +++ b/src/contracts/MERC20.abi @@ -0,0 +1,235 @@ +[ + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "who", + "type": "address" + } + ], + "name": "balanceOfERC", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "admin", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "name", + "type": "string" + }, + { + "name": "symbol", + "type": "string" + }, + { + "name": "decimals", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getUsers", + "outputs": [ + { + "name": "userList", + "type": "address[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "who", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "user", + "type": "address" + } + ], + "name": "findUser", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "findEmptyUser", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "user", + "type": "address" + }, + { + "name": "balance", + "type": "uint256" + } + ], + "name": "_addUser", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_who", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/src/contracts/MERC20.sol b/src/contracts/MERC20.sol new file mode 100644 index 00000000..70cc00be --- /dev/null +++ b/src/contracts/MERC20.sol @@ -0,0 +1,103 @@ +pragma solidity 0.5; + +contract MERC20 { + string private _name; + string private _symbol; + uint256 private _decimals; + address public admin; + address public owner; + + mapping (address => uint256) balances; + mapping (uint => mapping (address => uint256)) userBalances; + address[] users; + + constructor (string name, string symbol, uint256 decimals ) public { + _name = name; + _symbol = symbol; + _decimals = decimals; + admin = msg.sender; + owner = msg.sender; + balances[msg.sender] = _decimals; + + userBalances[0][msg.sender] = decimals; + users.push(msg.sender); + } + + function symbol() external returns(string) { + return _symbol; + } + function name() external returns(string) { + return _name; + } + function totalSupply() external returns(uint256) { + return _decimals; + } + + function getUsers() external returns (address[]) { + return users; + } + + function balanceOf(address who) external returns (uint256) { + return balances[who]; + } + + function findUser(address user) external returns (uint) { + uint usersLength = users.length; + uint matched = 0; + for (uint i = 0; i < usersLength; i++) { + if (users[i] == user) { + matched = i; + } + } + return matched; + } + + function findEmptyUser() external returns (uint) { + uint usersLength = users.length; + uint matched = 0; + for (uint i = 0; i < usersLength; i++) { + if (users[i] == 0) { + matched = i; + } + } + return matched; + } + + function _addUser(address user, uint256 balance) external returns(uint256) { + uint isUser = this.findUser(user); + uint emptyIndex = this.findEmptyUser(); + if (isUser == 0) { + balances[user] = balance; + userBalances[emptyIndex][user] = balance; + users[emptyIndex] = user; + } + return balances[user]; + } + + + function transferFrom(address _who, address _to, uint256 value) external { + require(msg.sender == admin); + require(_who != address(0), "MERC20: transfer from the zero address"); + require(_to != address(0), "MERC20: transfer to the zero address"); + require(balances[_who] >= value, "MERC20: Token value must be lower or equal"); + + uint index = this.findUser(_to); + if (index == 0 ) { + index = users.length; + users.push(_to); + userBalances[index][_to] = value; + balances[_who] = balances[_who] - value; + balances[_to] = balances[_to] + value; + } else { + userBalances[index][_to] += value; + balances[_who] = balances[_who] - value; + balances[_to] = balances[_to] + value; + } + + } + + function setAdmin(address _newAdmin) external { + admin = _newAdmin; + } + +} \ No newline at end of file diff --git a/src/contracts/MERCInterface.sol b/src/contracts/MERCInterface.sol new file mode 100644 index 00000000..b9f4a773 --- /dev/null +++ b/src/contracts/MERCInterface.sol @@ -0,0 +1,21 @@ +pragma solidity 0.5; + +interface MERCInterface { + + + function symbol() external returns (string); + + function name() external returns (string); + + function totalSupply() external returns (uint256); + + function setAdmin(address who) external ; + + function balanceOfERC(address who) external returns (uint256); + + function balanceOf() external returns (uint256) ; + + function _addUser(address who, uint256 balance) external returns (uint256); + + function transferFrom(address who, address to, uint256 value) external; +} \ No newline at end of file diff --git a/src/contracts/Project/Project.sol b/src/contracts/Project/Project.sol new file mode 100644 index 00000000..b27720b0 --- /dev/null +++ b/src/contracts/Project/Project.sol @@ -0,0 +1,14 @@ +pragma solidity 0.5; + +contract Project { + + uint public test; + + constructor() public { + test = 1; + } + + function updateTest(uint _test) public pure returns (uint result) { + return _test; + } +} diff --git a/src/contracts/SafeMath.sol b/src/contracts/SafeMath.sol new file mode 100644 index 00000000..62cf6358 --- /dev/null +++ b/src/contracts/SafeMath.sol @@ -0,0 +1,65 @@ +pragma solidity 0.5; + +/** + * @title SafeMath + * @dev Unsigned math operations with safety checks that revert on error + */ +library SafeMath { + /** + * @dev Multiplies two unsigned integers, reverts on overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b); + + return c; + } + + /** + * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + require(b <= a); + uint256 c = a - b; + + return c; + } + + /** + * @dev Adds two unsigned integers, reverts on overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a); + + return c; + } + + /** + * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), + * reverts when dividing by zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + require(b != 0); + return a % b; + } +} \ No newline at end of file diff --git a/src/contracts/Voter.abi b/src/contracts/Voter.abi new file mode 100644 index 00000000..0efeb78e --- /dev/null +++ b/src/contracts/Voter.abi @@ -0,0 +1,839 @@ +[ + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "getVotingDescision", + "outputs": [ + { + "name": "result", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x0d24ef38" + }, + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "question", + "outputs": [ + { + "name": "groupId", + "type": "uint256" + }, + { + "name": "status", + "type": "uint8" + }, + { + "name": "caption", + "type": "string" + }, + { + "name": "text", + "type": "string" + }, + { + "name": "time", + "type": "uint256" + }, + { + "name": "target", + "type": "address" + }, + { + "name": "methodSelector", + "type": "bytes4" + }, + { + "name": "_formula", + "type": "uint256[]" + }, + { + "name": "_parameters", + "type": "bytes32[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x1e16f68b" + }, + { + "constant": true, + "inputs": [], + "name": "votings", + "outputs": [ + { + "name": "votingIdIndex", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x352485b7" + }, + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "getUserGroup", + "outputs": [ + { + "name": "name", + "type": "string" + }, + { + "name": "groupType", + "type": "string" + }, + { + "name": "status", + "type": "uint8" + }, + { + "name": "groupAddress", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x352704b7" + }, + { + "constant": true, + "inputs": [], + "name": "getQuestionGroupsLength", + "outputs": [ + { + "name": "length", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x392e1c84" + }, + { + "constant": false, + "inputs": [ + { + "name": "votingId", + "type": "uint256" + } + ], + "name": "returnTokens", + "outputs": [ + { + "name": "status", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0x3ae1786f" + }, + { + "constant": false, + "inputs": [ + { + "name": "group", + "type": "address" + }, + { + "name": "admin", + "type": "address" + } + ], + "name": "setCustomGroupAdmin", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0x3cc0a953" + }, + { + "constant": true, + "inputs": [], + "name": "getUserWeight", + "outputs": [ + { + "name": "weight", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x42429139" + }, + { + "constant": false, + "inputs": [ + { + "name": "votingId", + "type": "uint256" + }, + { + "name": "user", + "type": "address" + } + ], + "name": "isUserReturnTokens", + "outputs": [ + { + "name": "result", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0x4a1e82a0" + }, + { + "constant": true, + "inputs": [], + "name": "getERCTotal", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x5b1bb4a2" + }, + { + "constant": true, + "inputs": [], + "name": "groups", + "outputs": [ + { + "name": "groupIdIndex", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x5bf89d9e" + }, + { + "constant": false, + "inputs": [ + { + "name": "_idsAndTime", + "type": "uint256[]" + }, + { + "name": "_status", + "type": "uint8" + }, + { + "name": "_caption", + "type": "string" + }, + { + "name": "_text", + "type": "string" + }, + { + "name": "_target", + "type": "address" + }, + { + "name": "_methodSelector", + "type": "bytes4" + }, + { + "name": "_formula", + "type": "uint256[]" + }, + { + "name": "_parameters", + "type": "bytes32[]" + } + ], + "name": "saveNewQuestion", + "outputs": [ + { + "name": "_saved", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0x686c52c4" + }, + { + "constant": true, + "inputs": [], + "name": "getERCSymbol", + "outputs": [ + { + "name": "symbol", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x7264420a" + }, + { + "constant": true, + "inputs": [], + "name": "questions", + "outputs": [ + { + "name": "questionIdIndex", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x77a49821" + }, + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "getQuestionGroup", + "outputs": [ + { + "name": "name", + "type": "string" + }, + { + "name": "groupType", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x7fd60dfd" + }, + { + "constant": true, + "inputs": [ + { + "name": "_voteId", + "type": "uint256" + } + ], + "name": "getUserVote", + "outputs": [ + { + "name": "vote", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0x86194c19" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "_address", + "type": "address" + }, + { + "name": "_type", + "type": "string" + } + ], + "name": "saveNewUserGroup", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0x952b627c" + }, + { + "constant": false, + "inputs": [], + "name": "getCount", + "outputs": [ + { + "name": "length", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xa87d942c" + }, + { + "constant": true, + "inputs": [], + "name": "getUserBalance", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xb7013dc1" + }, + { + "constant": false, + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "name": "setERC20", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xc29a6fda" + }, + { + "constant": true, + "inputs": [], + "name": "isActiveVoting", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xc39c89df" + }, + { + "constant": false, + "inputs": [], + "name": "closeVoting", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xc631b292" + }, + { + "constant": false, + "inputs": [ + { + "name": "_questionId", + "type": "uint256" + }, + { + "name": "_status", + "type": "uint8" + }, + { + "name": "_starterGroup", + "type": "uint256" + }, + { + "name": "_data", + "type": "bytes" + } + ], + "name": "startNewVoting", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xc7ce7f10" + }, + { + "constant": false, + "inputs": [ + { + "name": "_choice", + "type": "uint256" + } + ], + "name": "sendVote", + "outputs": [ + { + "name": "result", + "type": "uint256" + }, + { + "name": "votePos", + "type": "uint256" + }, + { + "name": "voteNeg", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xc8f5714e" + }, + { + "constant": true, + "inputs": [], + "name": "ERC20", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xcc4aa204" + }, + { + "constant": true, + "inputs": [], + "name": "getERCAddress", + "outputs": [ + { + "name": "_address", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xd094b706" + }, + { + "constant": true, + "inputs": [], + "name": "userGroups", + "outputs": [ + { + "name": "groupIdIndex", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xd7843f54" + }, + { + "constant": true, + "inputs": [], + "name": "addresses", + "outputs": [ + { + "name": "user", + "type": "address" + }, + { + "name": "instance", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xda0321cd" + }, + { + "constant": true, + "inputs": [], + "name": "getVotingsCount", + "outputs": [ + { + "name": "count", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xdae7c92c" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + } + ], + "name": "saveNewGroup", + "outputs": [ + { + "name": "id", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xdf831328" + }, + { + "constant": true, + "inputs": [], + "name": "getUserGroupsLength", + "outputs": [ + { + "name": "length", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xec4d819c" + }, + { + "constant": false, + "inputs": [ + { + "name": "user", + "type": "address" + } + ], + "name": "findUserGroup", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xf0c4c3e6" + }, + { + "constant": false, + "inputs": [ + { + "name": "_who", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferERC20", + "outputs": [ + { + "name": "newBalance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function", + "signature": "0xf7448a31" + }, + { + "constant": true, + "inputs": [ + { + "name": "_id", + "type": "uint256" + } + ], + "name": "voting", + "outputs": [ + { + "name": "id", + "type": "uint256" + }, + { + "name": "status", + "type": "uint8" + }, + { + "name": "caption", + "type": "string" + }, + { + "name": "text", + "type": "string" + }, + { + "name": "startTime", + "type": "uint256" + }, + { + "name": "endTime", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xfd4a77f1" + }, + { + "constant": true, + "inputs": [ + { + "name": "_votingId", + "type": "uint256" + } + ], + "name": "getVotes", + "outputs": [ + { + "name": "_votes", + "type": "uint256[3]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function", + "signature": "0xff981099" + }, + { + "inputs": [ + { + "name": "_address", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor", + "signature": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "groupId", + "type": "uint256" + }, + { + "indexed": false, + "name": "status", + "type": "uint8" + }, + { + "indexed": false, + "name": "caption", + "type": "string" + }, + { + "indexed": false, + "name": "text", + "type": "string" + }, + { + "indexed": false, + "name": "time", + "type": "uint256" + }, + { + "indexed": false, + "name": "target", + "type": "address" + }, + { + "indexed": false, + "name": "methodSelector", + "type": "bytes4" + } + ], + "name": "NewQuestion", + "type": "event", + "signature": "0xf74c837bcb7177c5fc07298a351f91ebaf73da24a2665c4dd592976c4e1780c9" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "name": "questionId", + "type": "uint256" + }, + { + "indexed": false, + "name": "status", + "type": "uint8" + }, + { + "indexed": false, + "name": "starterGroup", + "type": "uint256" + }, + { + "indexed": false, + "name": "starterAddress", + "type": "address" + }, + { + "indexed": false, + "name": "startblock", + "type": "uint256" + } + ], + "name": "NewVoting", + "type": "event", + "signature": "0x20cd0a5d2be6a115945cf28e1511206f69d34a385fb4b9c8ee18f39fa52471c7" + } +] \ No newline at end of file diff --git a/src/contracts/Voter/Voter.sol b/src/contracts/Voter/Voter.sol new file mode 100644 index 00000000..eefe9132 --- /dev/null +++ b/src/contracts/Voter/Voter.sol @@ -0,0 +1,17 @@ +pragma solidity 0.5; + +import "./VoterBase.sol"; + + +contract Voter is VoterBase { + + IERC20 public ERC20; + + constructor(address _address) public { + // implement contract deploy + // set erc20 token here + setERC20(_address); + } + + +} diff --git a/src/contracts/Voter/VoterBase.sol b/src/contracts/Voter/VoterBase.sol new file mode 100644 index 00000000..8297ee95 --- /dev/null +++ b/src/contracts/Voter/VoterBase.sol @@ -0,0 +1,487 @@ +pragma solidity 0.5; + +import "../libs/QuestionGroups.sol"; +import "../libs/UserGroups.sol"; +import "../libs/Questions.sol"; +import "../libs/Votings.sol"; +import "./VoterInterface.sol"; +import "../IERC20.sol"; + + + +/** + * @title VoterBase + * @dev an base difinitions for voter + */ +contract VoterBase is VoterInterface { + + Questions.List public questions; + QuestionGroups.List public groups; + Votings.List public votings; + UserGroups.List public userGroups; + + IERC20 public ERC20; + + constructor() public { + questions.init(); + groups.init(); + votings.init(); + } + + // METHODS + function setERC20(address _address) public { + ERC20 = IERC20(_address); + userGroups.init(_address); + } + + /* + * @notice creates new question to saveNewQuestion function + * @param _groupId question group id + * @param _status question status + * @param _caption question name + * @param _text question description + * @param _time question length + * @param _target target address to call + * @param _methodSelector method to call + * @param _formula voting formula + * @param _parameters parameters of inputs + * @return new question id + */ + function createNewQuestion( + uint[] memory _idsAndTime, + Questions.Status _status, + string memory _caption, + string memory _text, + address _target, + bytes4 _methodSelector, + uint[] memory _formula, + bytes32[] memory _parameters + ) private returns (Questions.Question memory _question) { + Questions.Question memory question = Questions.Question({ + groupId: _idsAndTime[1], + status: _status, + caption: _caption, + text: _text, + time: _idsAndTime[2], + target: _target, + methodSelector: _methodSelector, + formula: _formula, + parameters: _parameters + }); + questions.save(question, _idsAndTime[0]); + + emit NewQuestion( _idsAndTime[1], _status, _caption, _text, _idsAndTime[0], _target, _methodSelector ); + return question; + } + + /* + * @notice adds new question to question library + * @param _groupId question group id + * @param _status question status + * @param _caption question name + * @param _text question description + * @param _time question length + * @param _target target address to call + * @param _methodSelector method to call + * @param _formula voting formula + * @param _parameters parameters of inputs + * @return new question id + */ + function saveNewQuestion( + uint[] _idsAndTime, + Questions.Status _status, + string _caption, + string _text, + address _target, + bytes4 _methodSelector, + uint[] _formula, + bytes32[] _parameters + + ) external returns (bool _saved){ + Questions.Question memory question = createNewQuestion( + _idsAndTime, + _status, + _caption, + _text, + _target, + _methodSelector, + _formula, + _parameters + ); + return true; + } + + + /** + * @notice adds new question to question library + * @param _name question group name + * @return new question id + */ + function saveNewGroup( + string _name + ) external returns (uint id) { + QuestionGroups.Group memory group = QuestionGroups.Group({ + name: _name, + groupType: QuestionGroups.GroupType.CUSTOM + }); + id = groups.save(group); + return id; + } + + function getCount() external returns (uint length) { + uint count = questions.questionIdIndex; + return count; + } + + /** + * @notice gets question data + * @param _id question id + * @return question data + */ + function question(uint _id) public view returns ( + uint groupId, + Questions.Status status, + string memory caption, + string memory text, + uint time, + address target, + bytes4 methodSelector, + uint[] memory _formula, + bytes32[] memory _parameters + ) { + uint id = _id; + return ( + questions.question[id].groupId, + questions.question[id].status, + questions.question[id].caption, + questions.question[id].text, + questions.question[id].time, + questions.question[id].target, + questions.question[id].methodSelector, + questions.question[id].formula, + questions.question[id].parameters + ); + } + + function getQuestionGroup(uint _id) public view returns ( + string name, + QuestionGroups.GroupType groupType + ) { + return ( + groups.group[_id].name, + groups.group[_id].groupType + ); + } + + function getQuestionGroupsLength() public view returns (uint length) { + return groups.groupIdIndex ; + } + function getUserGroup(uint _id) public view returns ( + string name, + string groupType, + UserGroups.GroupStatus status, + address groupAddress + ) { + return ( + userGroups.group[_id].name, + userGroups.group[_id].groupType, + userGroups.group[_id].status, + userGroups.group[_id].groupAddr + ); + } + + function getUserGroupsLength() public view returns (uint length) { + return userGroups.groupIdIndex ; + } + + function isActiveVoting() public view returns (bool) { + + } + + /** + * @notice adds new voting to voting library + * @param _questionId question id + * @param _status voting status + * @param _starterGroup group which started voting + * @return new voting id + */ + + function startNewVoting( + uint _questionId, + Votings.Status _status, + uint _starterGroup, + bytes _data + ) external returns (bool) { + bool canStart; + uint votingId = votings.votingIdIndex - 1; + if ( + ((votings.votingIdIndex == 1) && (votings.voting[votingId].status == Votings.Status.ACTIVE)) + || (!(votings.votingIdIndex == 1) && !(votings.voting[votingId].status == Votings.Status.ACTIVE))) { + canStart = true; + uint start = block.timestamp; + uint _endTime = start + (questions.question[_questionId].time * 60); + Votings.Voting memory voting = Votings.Voting({ + questionId: _questionId, + status: _status, + starterGroup: _starterGroup, + starterAddress: msg.sender, + startTime: block.timestamp, + endTime: _endTime, + data: _data + }); + + uint id = votings.save(voting); + + emit NewVoting ( + id, + _questionId, + _status, + _starterGroup, + msg.sender, + block.number + ); + } else { + canStart = false; + } + return canStart; + } + + function voting(uint _id) external view returns ( + uint id, + Votings.Status status, + string memory caption, + string memory text, + uint startTime, + uint endTime, + bytes data + ){ + uint votingId = _id; + uint questionId = votings.voting[_id].questionId; + return ( + votings.voting[votingId].questionId, + votings.voting[votingId].status, + questions.question[questionId].caption, + questions.question[questionId].text, + votings.voting[votingId].startTime, + votings.voting[votingId].endTime, + votings.voting[votingId].data + ); + } + + function getVotingsCount() external view returns (uint count) { + return votings.votingIdIndex; + } + + function getVotingDescision(uint _id) external view returns (uint result) { + return votings.descision[_id]; + } + + function closeVoting() external { + uint votingId = votings.votingIdIndex - 1; + uint questionId = votings.voting[votingId].questionId; + uint[] storage formula = questions.question[questionId].formula; + + uint votingCondition = formula[2]; // 1 - positive, 0 - quorum + uint sign = formula[3]; // 1 - >=, 2 - <= + uint percent = formula[4]; + uint quorumPercent; + uint modificator; // modificator of votingCondition: 1 - of all, 0 - of quorum + + string memory groupName = userGroups.names[formula[1]]; + IERC20 group = IERC20(userGroups.group[formula[1]].groupAddr); + uint256 positiveVotes = votings.voting[votingId].descisionWeights[1][groupName]; + uint256 negativeVotes = votings.voting[votingId].descisionWeights[2][groupName]; + uint256 totalSupply = group.totalSupply(); + + if (formula[5] != 0) { // if modificator exists in question + modificator = formula[5]; + } else { + modificator = 0; + } + + + if (votingCondition == 0) { + // if condition == quorum + quorumPercent = (positiveVotes + negativeVotes) * 100 / totalSupply; + } else if (votingCondition == 1) { + // else if condition == positive + if (modificator == 0) { + // of quorum + quorumPercent = (positiveVotes * 100 / (positiveVotes + negativeVotes) ); + } else if (modificator == 1) { + // of all + quorumPercent = ( positiveVotes * 100 / totalSupply ); + } + } + + if (sign == 1) { + // if >= + if (quorumPercent >= percent) { + if (positiveVotes > negativeVotes) { + votings.descision[votingId] = 1; + address(this).call(votings.voting[votingId].data); + } else if (positiveVotes < negativeVotes) { + votings.descision[votingId] = 2; + } else if (positiveVotes == negativeVotes) { + votings.descision[votingId] = 0; + } + } + } else if (sign == 0) { + //if <= + if (quorumPercent <= percent) { + if (positiveVotes > negativeVotes) { + votings.descision[votingId] = 1; + address(this).call(votings.voting[votingId].data); + } else if (positiveVotes < negativeVotes) { + votings.descision[votingId] = 2; + } else if (positiveVotes == negativeVotes) { + votings.descision[votingId] = 0; + } + } + } + + + votings.voting[votingId].status = Votings.Status.ENDED; + } + + + function getVotes(uint _votingId) external view returns (uint256[3] memory _votes) { + uint questionId = votings.voting[_votingId].questionId; + uint groupId = questions.question[questionId].groupId; + string memory groupName = userGroups.names[groupId]; + IERC20 group = IERC20(userGroups.group[groupId].groupAddr); + uint256[3] memory votes; + votes[0] = votings.voting[_votingId].descisionWeights[1][groupName]; + votes[1] = votings.voting[_votingId].descisionWeights[2][groupName]; + votes[2] = group.totalSupply(); + return votes; + } + + function returnTokens(uint votingId) public returns (bool status){ + uint questionId = votings.voting[votingId].questionId; + uint groupId = questions.question[questionId].groupId; + string memory groupType = userGroups.group[groupId].groupType; + IERC20 group = IERC20(userGroups.group[groupId].groupAddr); + uint256 weight = votings.voting[votingId].voteWeigths[address(group)][msg.sender]; + bool isReturned = this.isUserReturnTokens(votingId, msg.sender); + + if (!isReturned) { + if( bytes4(keccak256(groupType)) == bytes4(keccak256("ERC20"))) { + group.transfer(msg.sender, weight); + } else { + group.transferFrom(address(this), msg.sender, weight); + } + votings.voting[votingId].tokenReturns[address(group)][msg.sender] = weight; + } + return true; + } + + function isUserReturnTokens(uint votingId, address user) returns (bool result) { + uint questionId = votings.voting[votingId].questionId; + uint groupId = questions.question[questionId].groupId; + string memory groupType = userGroups.group[groupId].groupType; + IERC20 group = IERC20(userGroups.group[groupId].groupAddr); + uint256 returnedTokens = votings.voting[votingId].tokenReturns[address(group)][user]; + return returnedTokens > 0; + } + + + function findUserGroup(address user) external returns (uint) { + uint votingIndex = votings.votingIdIndex - 1; + uint questionId = votings.voting[votingIndex].questionId; + uint groupId = questions.question[questionId].groupId; + IERC20 group = IERC20(userGroups.group[groupId].groupAddr); + uint256 balance = group.balanceOf(user); + uint index = 0; + if (balance != 0 ) { + index = groupId; + } + return index; + } + + + function sendVote(uint _choice) external returns (uint result, uint256 votePos, uint256 voteNeg) { + uint _voteId = votings.votingIdIndex - 1; + uint timestamp = votings.voting[_voteId].endTime; + uint questionId = votings.voting[_voteId].questionId; + uint groupId = questions.question[questionId].groupId; + string memory groupName = userGroups.names[groupId]; + uint index = this.findUserGroup(msg.sender); + IERC20 group = IERC20(userGroups.group[index].groupAddr); + uint256 balance = group.balanceOf(msg.sender); + + if (block.timestamp < timestamp ) { + if ( balance != 0) { + if (votings.voting[_voteId].votes[address(group)][msg.sender] == 0) { + group.transferFrom(msg.sender, address(this), balance); + votings.voting[_voteId].votes[address(group)][msg.sender] = _choice; + votings.voting[_voteId].voteWeigths[address(group)][msg.sender] = balance; + votings.voting[_voteId].descisionWeights[_choice][groupName] += balance; + } + } + } else { + this.closeVoting(); + } + return ( + votings.voting[_voteId].votes[address(group)][msg.sender] = _choice, + votings.voting[_voteId].descisionWeights[1][groupName], + votings.voting[_voteId].descisionWeights[2][groupName] + ); + } + + function getERCAddress() external view returns (address _address) { + return address(ERC20); + } + + function getUserBalance() external view returns (uint256 balance) { + uint256 _balance = ERC20.balanceOf(msg.sender); + return _balance; + } + + function getERCTotal() external view returns (uint256 balance) { + return ERC20.totalSupply(); + } + + function getERCSymbol() external view returns (string symbol) { + return ERC20.symbol(); + } + + function getUserVote(uint _voteId) external view returns (uint vote) { + uint questionId = votings.voting[_voteId].questionId; + uint groupId = questions.question[questionId].groupId; + IERC20 group = IERC20(userGroups.group[groupId].groupAddr); + return votings.voting[_voteId].votes[address(group)][msg.sender]; + } + + function getUserWeight() external view returns (uint256 weight) { + uint _voteId = votings.votingIdIndex - 1; + return votings.voting[_voteId].voteWeigths[address(ERC20)][msg.sender]; + } + + function transferERC20(address _who, uint256 _value) external returns (uint256 newBalance) { + ERC20.transferFrom(msg.sender, _who, _value); + return ERC20.balanceOf(msg.sender); + } + + function addresses() external view returns (address user, address instance) { + return ( + msg.sender, + address(this) + ); + } + + function saveNewUserGroup (string _name, address _address, string _type) external { + UserGroups.UserGroup memory userGroup = UserGroups.UserGroup({ + name: _name, + groupType: _type, + status: UserGroups.GroupStatus.ACTIVE, + groupAddr: _address + }); + userGroups.save(userGroup); + } + + function setCustomGroupAdmin(address group, address admin) external returns (bool) { + require(group.call( bytes4( keccak256("setAdmin(address)")), admin)); + return true; + } +} diff --git a/src/contracts/Voter/VoterInterface.sol b/src/contracts/Voter/VoterInterface.sol new file mode 100644 index 00000000..51a10280 --- /dev/null +++ b/src/contracts/Voter/VoterInterface.sol @@ -0,0 +1,113 @@ +pragma solidity 0.5; + +import "../libs/QuestionGroups.sol"; +import "../libs/Questions.sol"; +import "../libs/Votings.sol"; +import "../libs/UserGroups.sol"; + +/** + * @title VoterInterface + * @dev an interface for voter + */ +interface VoterInterface { + // LIBRARIES + using QuestionGroups for QuestionGroups.List; + using Questions for Questions.List; + using Votings for Votings.List; + using UserGroups for UserGroups.List; + + + // DIFINTIONS + // new question added event + event NewQuestion( + uint groupId, + Questions.Status status, + string caption, + string text, + uint time, + address target, + bytes4 methodSelector + ); + // new Votings added event + event NewVoting( + uint id, + uint questionId, + Votings.Status status, + uint starterGroup, + address starterAddress, + uint startblock + ); + + // METHODS + /* + * @notice adds new question to question library + * @param _ids question group id + * @param _status question status + * @param _caption question name + * @param _text question description + * @param _time question length + * @param _target target address to call + * @param _methodSelector method to call + * @param _formula voting formula + * @param _parameters parameters of inputs + * return new question id + */ + function saveNewQuestion( + uint[] _idsAndTime, + Questions.Status _status, + string _caption, + string _text, + address _target, + bytes4 _methodSelector, + uint[] _formula, + bytes32[] _parameters + ) external returns (bool _saved); + + /** + * @notice adds new question to question library + * @param _name question group name + * @return new question id + */ + function saveNewGroup( + string _name + ) external returns (uint id); + + /** + * @notice gets question data + * @param _id question id + * @return question data + */ + function question( + uint _id + ) external view returns ( + uint groupId, + Questions.Status status, + string memory caption, + string memory text, + uint time, + address target, + bytes4 methodSelector, + uint[] memory _formula, + bytes32[] memory _parameters + ); + + function getCount() external returns (uint length); + + function startNewVoting( + uint questionId, + Votings.Status status, + uint starterGroup, + bytes data + ) external returns (bool); + + function voting(uint id) external view returns ( + uint questionId, + Votings.Status status, + string memory caption, + string memory text, + uint startTime, + uint endTime, + bytes data + ); + function getVotingsCount() external view returns (uint length); +} diff --git a/src/contracts/libs/QuestionGroups.sol b/src/contracts/libs/QuestionGroups.sol new file mode 100644 index 00000000..06012284 --- /dev/null +++ b/src/contracts/libs/QuestionGroups.sol @@ -0,0 +1,54 @@ +pragma solidity 0.5; + + +library QuestionGroups { + + enum GroupType { + // system group + SYSTEM, + // user group + CUSTOM + } + + struct Group { + // group type + GroupType groupType; + // group name + string name; + } + + struct List { + uint groupIdIndex; + mapping (bytes32 => uint) uniqNames; + mapping (uint => Group) group; + } + + function init(List storage _self) internal { + _self.groupIdIndex = 1; + Group memory systemGroup = Group({ + name: 'Системные', + groupType: GroupType.SYSTEM + }); + save(_self, systemGroup); + Group memory otherGroup = Group({ + name: "Другие", + groupType: GroupType.CUSTOM + }); + save(_self, otherGroup); + } + + function save(List storage _self, Group memory _group) internal returns (uint id) { + bytes32 name = keccak256(abi.encodePacked(_group.name)); + uint groupId = _self.groupIdIndex; + require(!exists(_self, name), "provided group already exists"); + _self.group[groupId] = _group; + _self.uniqNames[name] = groupId; + _self.groupIdIndex++; + return groupId; + } + + function exists(List storage _self, bytes32 _name) internal view returns (bool) { + return _self.uniqNames[_name] != 0; + } + +} diff --git a/src/contracts/libs/Questions.sol b/src/contracts/libs/Questions.sol new file mode 100644 index 00000000..6d66d600 --- /dev/null +++ b/src/contracts/libs/Questions.sol @@ -0,0 +1,56 @@ +pragma solidity 0.5; + + +library Questions { + + enum Status { + // deleted or inactive question + INACTIVE, + // active question + ACTIVE + } + + struct Question { + // question group id + uint groupId; + // question status + Status status; + // question name + string caption; + // question description + string text; + // question length in minutes + uint time; + // target address + address target; + // method to be called + bytes4 methodSelector; + uint[] formula; + bytes32[] parameters; + } + + struct List { + uint questionIdIndex; + mapping (bytes32 => uint) uniqNames; + mapping (uint => Question) question; + } + + function init(List storage _self) internal { + _self.questionIdIndex = 1; + } + + function save(List storage _self, Question memory _question, uint _id) internal returns (uint id) { + bytes32 name = keccak256(abi.encodePacked(_question.caption)); + uint questionId = _self.questionIdIndex; + require(!exists(_self, name), "provided group already exists"); + _self.question[_id] = _question; + _self.uniqNames[name] = questionId; + _self.questionIdIndex++; + return questionId; + } + + function exists(List storage _self, bytes32 _name) internal view returns (bool) { + return _self.uniqNames[_name] != 0; + } + +} diff --git a/src/contracts/libs/UserGroups.sol b/src/contracts/libs/UserGroups.sol new file mode 100644 index 00000000..d283237e --- /dev/null +++ b/src/contracts/libs/UserGroups.sol @@ -0,0 +1,54 @@ +pragma solidity 0.5; + + +library UserGroups { + + enum GroupStatus { + // deleted or inactive question + INACTIVE, + // active question + ACTIVE + } + + struct UserGroup { + string name; + string groupType; + GroupStatus status; + address groupAddr; + } + + struct List { + uint groupIdIndex; + mapping (bytes32 => uint) uniqNames; + mapping (uint => string) names; + mapping (uint => UserGroup) group; + } + + function init(List storage _self, address _ERC20) internal { + _self.groupIdIndex = 1; + UserGroup memory group = UserGroup({ + name: "Owner", + groupType: "ERC20", + status: GroupStatus.ACTIVE, + groupAddr: _ERC20 + }); + save(_self, group); + } + + function save(List storage _self, UserGroup memory _group) internal returns (uint id) { + bytes32 key = keccak256(abi.encodePacked(_group.name)); + string memory name = _group.name; + uint groupId = _self.groupIdIndex; + require(!exists(_self, key), "provided group already exists"); + _self.names[groupId] = name; + _self.group[groupId] = _group; + _self.uniqNames[key] = groupId; + _self.groupIdIndex++; + return groupId; + } + + function exists(List storage _self, bytes32 _name) internal view returns (bool) { + return _self.uniqNames[_name] != 0; + } + +} diff --git a/src/contracts/libs/Votings.sol b/src/contracts/libs/Votings.sol new file mode 100644 index 00000000..cba423c8 --- /dev/null +++ b/src/contracts/libs/Votings.sol @@ -0,0 +1,53 @@ +pragma solidity 0.5; + +library Votings { + + enum Status {ACTIVE, ENDED} + + struct Voting { + // ? question id used for vote + uint questionId; + // ? vote status + Status status; + // ? group of users, who started vote + uint starterGroup; + // ? user, who started the voting + address starterAddress; + // ? block when voting was started + uint startTime; + uint endTime; + // ? contains pairs of (address => vote) for every user + mapping (address=> mapping(address => uint)) votes; + + // contains total weights for voting variants + mapping (address=> mapping(address => uint256)) voteWeigths; + mapping (uint=> mapping(string => uint256)) descisionWeights; + mapping (address=> mapping (address=>uint256)) tokenReturns; + + bytes data; + } + + struct List { + uint votingIdIndex; + mapping (uint => Voting) voting; + mapping (uint => uint) descision; + } + + function init(List storage _self) internal { + _self.votingIdIndex = 1; + } + + + function save(List storage _self, Voting memory _voting) internal returns (uint id) { + uint votingId = _self.votingIdIndex; + _self.voting[votingId] = _voting; + _self.votingIdIndex++; + return votingId; + } + + function close(List storage _self) internal { + uint votingId = _self.votingIdIndex - 1; + _self.voting[votingId].status = Status.ENDED; + } + +} \ No newline at end of file diff --git a/src/contracts/project.sol b/src/contracts/project.sol new file mode 100644 index 00000000..85f98ad3 --- /dev/null +++ b/src/contracts/project.sol @@ -0,0 +1,50 @@ +pragma solidity ^0.5; + + +contract UsingERC20 { + IERC20 public associatedToken; + + // Constructor. Pass it the token you want this contract to work with + constructor(IERC20 _token) public { + associatedToken = _token; + } + + function doSomethingThatRequiresERC20tokens() public { + // The key here is to use ERC20's transferFrom method. + // For this to work, the given address has to have enough balance, + // and it has to allow this contract to transfer tokens from their account. + // This can be done using ERC20's approve method/ + + // If transferFrom fails, the transaction reverts. So if the transaction + // does not revert, we know that the transer succeeded. + + // Using msg.sender here, the caller of this function. + // Could be any address you like, though. + // This transfers 100 tokens from msg.sender to this contract. + associatedToken.transfer(msg.sender, address(this), 100); + + // Ok, now the tokens are transferred successfully, let's do some cool stuff! + emit YayIReceivedTokens(100, msg.sender, associatedToken.balanceOf(address(this))); + } + + event YayIReceivedTokens(uint256 amount, address fromAccount, uint256 totalBalance); +} + + +interface IERC20 { + function transfer(address who, address to, uint256 value) external returns (bool); + + function approve(address spender, uint256 value) external returns (bool); + + function transferFrom(address from, address to, uint256 value) external returns (bool); + + function totalSupply() external view returns (uint256); + + function balanceOf(address who) external view returns (uint256); + + function allowance(address owner, address spender) external view returns (uint256); + + event Transfer(address indexed from, address indexed to, uint256 value); + + event Approval(address indexed owner, address indexed spender, uint256 value); +} \ No newline at end of file diff --git a/src/contracts/sysQuestions.json b/src/contracts/sysQuestions.json new file mode 100644 index 00000000..67343d14 --- /dev/null +++ b/src/contracts/sysQuestions.json @@ -0,0 +1,128 @@ +{ + "1": { + "id": 1, + "group": 1, + "name": "Добавить Вопрос", + "caption": "Добавление нового вопроса", + "time": 5, + "method": "0x686c52c4", + "formula": "(group (Owners) => condition (positive >= 20% of all))", + "parameters": [ + "GroupId", + "uint", + "Name", + "string", + "Caption", + "string", + "Time", + "uint", + "MethodSelector", + "bytes4", + "Formula", + "string", + "parameters", + "bytes32[]" + ], + "hints": { + "0": { + "desc": "Id группы вопросов, к которому он будет принадлежать", + "example": "1 - системные вопросы, 2 - вопросы для группы владельцев кастомных токенов" + }, + "1": { + "desc": "Название вопроса", + "example": "Уничтожить проект" + }, + "2": { + "desc": "Описание вопроса", + "example": "Уничтожение всего проекта, так как дальнейшее существование потеряло смысл" + }, + "3": { + "desc": "Время, в течении которого можно будет проголосовать после того, как будет начато голосование по данному вопросу (в минутах)", + "example": "10" + }, + "4": { + "desc": "Селектор метода в контракте, который будет вызываться в случае положительного исхода голосования", + "example": "0xcaF1deb4" + }, + "5": { + "desc": "Формула, по которой будут подсчитываться результаты голосования", + "example": "(group (Owners) => condition (positive >= 20% of all)) \r\n (group (Designers) => condition (quorum >= 20%))" + } + } + }, + "2": { + "id": 2, + "group": 1, + "name": "Подключить группу пользователей", + "caption": "Подключить новую группу пользователей для участия в голосованиях", + "time": 5, + "method": "0x952b627c", + "formula": "(group (Owners) => condition (positive >= 20% of all))", + "parameters": [ + "Name", + "string", + "Address", + "address", + "Type", + "string" + ], + "hints": { + "0": { + "desc": "Название группы пользователей", + "example": "Дизайнеры" + }, + "1": { + "desc": "Адрес контракта, в котором находятся токены, распределенные среди участников группы", + "example": "0х0000000000000000000000000000000000000000" + }, + "2": { + "desc": "Тип контракта данной группы (ERC20 для контракта токенов ERC20, Custom для контракта токенов, созданного в этом приложении)", + "example": "ERC20, Custom" + } + } + }, + "3": { + "id": 3, + "group": 1, + "name": "Добавить группу вопросов", + "caption": "Добавить новую группу вопросов", + "time": 5, + "method": "0xdf831328", + "formula": "(group (Owners) => condition (positive >= 20% of all))", + "parameters": [ + "Name", + "string" + ], + "hints": { + "0": { + "desc": "Имя для группы вопросов", + "example": "Административные" + } + } + }, + "4": { + "id": 4, + "group": 1, + "name": "Установить администратора группы", + "caption": "Установка администратора в группе кастомных токенов", + "time": 5, + "method": "0x3cc0a953", + "formula": "(group (Owners) => condition (positive >= 20% of all))", + "parameters": [ + "Group", + "address", + "Admin address", + "address" + ], + "hints": { + "0": { + "desc": "Aдрес группы, в которой произойдет установка администратора", + "example": "0х0000000000000000000000000000000000000000" + }, + "1": { + "desc": "Адрес пользователя, который получит администраторские привелегии", + "example": "0х0000000000000000000000000000000000000000" + } + } + } +} \ No newline at end of file diff --git a/src/electron.js b/src/electron.js new file mode 100644 index 00000000..59301c66 --- /dev/null +++ b/src/electron.js @@ -0,0 +1,42 @@ +const { app, BrowserWindow } = require('electron'); +const electronLocalshortcut = require('electron-localshortcut'); +const isDev = require('electron-is-dev'); +const path = require('path'); + +let mainWindow; + +function createWindow() { + mainWindow = new BrowserWindow({ + useContentSize: true, + minWidth: 1280, + minHeight: 720, + width: 1280, + height: 720, + webPreferences: { + nodeIntegration: true, + }, + }); + mainWindow.loadURL(isDev ? 'http://localhost:3000' : `file://${path.join(__dirname, '../build/index.html')}`); + // eslint-disable-next-line no-unused-expressions + isDev + ? process.env.NODE_ENV = 'production' + : process.env.NODE_ENV = 'development'; + mainWindow.on('closed', () => mainWindow = null); + electronLocalshortcut.register(mainWindow, 'F12', () => { + mainWindow.webContents.toggleDevTools(); + }); +} + +app.on('ready', createWindow); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + if (mainWindow === null) { + createWindow(); + } +}); diff --git a/src/i18n.js b/src/i18n.js new file mode 100644 index 00000000..e6c87b28 --- /dev/null +++ b/src/i18n.js @@ -0,0 +1,54 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import headingsEn from './locales/ENG/headings'; +import headingsRu from './locales/RUS/headings'; +import explanationsEn from './locales/ENG/explanations'; +import explanationsRu from './locales/RUS/explanations'; +import buttonsEn from './locales/ENG/buttons'; +import buttonsRu from './locales/RUS/buttons'; +import fieldsEn from './locales/ENG/fields'; +import fieldsRu from './locales/RUS/fields'; +import otherEn from './locales/ENG/other'; +import otherRu from './locales/RUS/other'; +import errorsEn from './locales/ENG/errors'; +import errorsRu from './locales/RUS/errors'; +import dialogsEn from './locales/ENG/dialogs'; +import dialogsRu from './locales/RUS/dialogs'; + +const resources = { + ENG: { + headings: headingsEn, + explanations: explanationsEn, + buttons: buttonsEn, + fields: fieldsEn, + other: otherEn, + errors: errorsEn, + dialogs: dialogsEn, + }, + RUS: { + headings: headingsRu, + explanations: explanationsRu, + buttons: buttonsRu, + fields: fieldsRu, + other: otherRu, + errors: errorsRu, + dialogs: dialogsRu, + }, +}; + +i18n + .use(initReactI18next) // passes i18n down to react-i18next + .init({ + resources, + fallbackLng: ['RUS', 'ENG'], + lng: 'RUS', + react: { + wait: false, + bindI18n: 'languageChanged loaded', + bindStore: 'added removed', + nsMode: 'default', + useSuspense: false, + }, + }); +window.i18n = i18n; +export default i18n; diff --git a/src/index.js b/src/index.js index eb80d7e5..1bb212a8 100644 --- a/src/index.js +++ b/src/index.js @@ -1,15 +1,23 @@ import React from 'react'; import { render } from 'react-dom'; -import App from './App'; +import { Provider } from 'mobx-react'; +import SimpleRouter from './components/Router/SimpleRouter'; +import rootStore from './stores/RootStore'; +import Alert from './components/Alert'; +import './i18n'; + import './assets/styles/style.scss'; -/** - * Represents a book. - * @param {string} title - The title of the book. - * @param {string} author - The author of the book. - */ +const { userStore, appStore, dialogStore } = rootStore; render( - , + + + + , document.getElementById('root'), ); diff --git a/src/index.test.js b/src/index.test.js index 3a2dfce3..355a0231 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -2,7 +2,6 @@ import React from 'react'; import ReactDOM from 'react-dom'; - it('renders without crashing', () => { -}); \ No newline at end of file +}); diff --git a/src/locales/ENG/buttons.js b/src/locales/ENG/buttons.js new file mode 100644 index 00000000..7303b775 --- /dev/null +++ b/src/locales/ENG/buttons.js @@ -0,0 +1,21 @@ +const buttons = { + login: 'Sign in', + newWallet: 'Create a new key', + forgotPassword: 'Forgot a password?', + showSeed: 'Show phrase', + hideSeed: 'Hide phrase', + seedWroted: 'I wrote down', + addProject: 'Add project', + create: 'Create', + connect: 'Connect', + continue: 'Continue', + finish: 'Complete', + back: 'Back', + otherProject: 'Choose another project', + toConnectedProject: 'To connected project', + toCreatedProject: 'To created project', + withTokens: 'Connect contract and create project', + withoutTokens: 'Create new contract and project', + toWallets: 'To wallets', +}; +export default buttons; diff --git a/src/locales/ENG/dialogs.js b/src/locales/ENG/dialogs.js new file mode 100644 index 00000000..bd2146a9 --- /dev/null +++ b/src/locales/ENG/dialogs.js @@ -0,0 +1,10 @@ +const dialog = { + definetelyAgree: 'Do you definitely agree?', + agreedMessage: 'You agreed', + rejectMessage: 'You voted against', + transferInProgress: 'Token transfer in progress', + someTimeText: 'It will take some time', + tokenTransferSuccess: 'Tokens successfully transferred!', +}; + +export default dialog; diff --git a/src/locales/ENG/errors.js b/src/locales/ENG/errors.js new file mode 100644 index 00000000..73888097 --- /dev/null +++ b/src/locales/ENG/errors.js @@ -0,0 +1,11 @@ +const errors = { + wrongAddress: 'Enter valid address', + wrongPassword: 'Wrong password, please try again', + tryAgain: 'Something goes wrong, please try again', + validationError: 'Please check field filled accurate', + emptyFields: 'Form have empty fields', + lowBalance: 'Your balance is to low for this', + hostUnreachable: 'Host is unreachable, please check your internet connection and try again', +}; + +export default errors; diff --git a/src/locales/ENG/explanations.js b/src/locales/ENG/explanations.js new file mode 100644 index 00000000..6dc9bd22 --- /dev/null +++ b/src/locales/ENG/explanations.js @@ -0,0 +1,25 @@ +const explanations = { + passwordCreating: ['Password must be set in', ' English layout and contain:'], + passwordRules: { + numeric: 'a numeral', + upperCase: 'a capital letter', + symbol: 'a special character', + length: 'minimum 6 char length', + }, + seed: ['The phrase gives you complete control over your account', 'Be sure to write down and do’t tell it to anyone'], + project: { name: 'The project title is set by you and appears in the project selection page', address: 'The address is provided by the creator of the project' }, + token: { + left: + { + wallet: ['The contract will be uploaded to the network', ' by a wallet:'], + balance: 'Balance: ', + tokens: ['Tokens will be credited to this wallet', ' Тhey can be distributed later'], + }, + right: { + symbol: 'A token symbol is its abbreviated name. For example: ETH, BTC, etc.', + count: 'The total number of tokens is set by you. They can be distributed among the project participants later.', + }, + }, +}; + +export default explanations; diff --git a/src/locales/ENG/fields.js b/src/locales/ENG/fields.js new file mode 100644 index 00000000..80666846 --- /dev/null +++ b/src/locales/ENG/fields.js @@ -0,0 +1,13 @@ +const placeholders = { + wallet: 'Choose wallet', + password: 'Password', + enterPassword: 'Enter a password', + repeatPassword: 'Repeat password', + tokenTitle: 'Token title', + symbol: 'Token symbol', + quantity: 'Quantity', + projectTitle: 'Project title', + contractAddress: 'Enter contract address', +}; + +export default placeholders; diff --git a/src/locales/ENG/headings.js b/src/locales/ENG/headings.js new file mode 100644 index 00000000..9df808df --- /dev/null +++ b/src/locales/ENG/headings.js @@ -0,0 +1,26 @@ +const headings = { + login: { heading: 'Sign In', subheading: 'Get ready for a new era of voting' }, + logging: { heading: 'Sighning in', subheading: 'It does not take much time' }, + projects: { heading: 'Project selection', subheading: 'Chose a project or create a new one' }, + addingProject: { heading: 'Adding a project', subheading: 'Create a new one or connect already existing' }, + passwordCreation: { heading: 'Password creation', subheading: 'Will be used to enter the wallet and transactions confirmation' }, + showSeed: { heading: 'Reserve phrase', subheading: 'Will be used for password recovery' }, + seedCheck: { heading: 'Reserve phrase check', subheading: ['Checking the seed', 'Enter the phrase u wrote down'] }, + сonnectProject: { heading: 'Project connecting', subheading: 'Create a new one or connect already existing' }, + projectChecking: { heading: 'Checking the project address', subheading: 'It does not take much time' }, + projectConnected: { heading: 'Project is connected!', subheading: 'Now you can start working with it or choose another project' }, + newProject: { heading: 'Creating a new project', subheading: 'Choose the suitable option ' }, + existingTokens: { heading: 'Connecting contarct of tokens', subheading: 'The owner of this contract will be considered the owner of the created project' }, + checkingTokens: { heading: 'Checking the project address', subheading: 'It does not take much time' }, + checkingTokensConfirm: { heading: 'The contract is checked', subheading: 'Verify the data before proceeding' }, + newTokens: { heading: 'Token creating', subheading: '' }, + tokensCreating: { heading: 'Creating ERC20 tokens', subheading: 'It will take some time' }, + tokensCreated: { heading: 'Tokens are created!', subheading: 'Now you need to create a project' }, + projectCreating: { heading: 'Creating a project', subheading: 'The project contract will be uploaded to the network by a wallet' }, + uploadingProject: { heading: 'Uploading a contract', subheading: 'It can take up to 5 minutes' }, + projectCreated: { heading: 'Contract is created!', subheading: 'Now you can start working with it or choose another project' }, + walletRestored: { heading: 'Wallet restoring', subheading: 'Wallet is succesfully restored' }, + walletCreated: { heading: 'Wallet creating', subheading: 'Wallet is succesfully created' }, + walletRestoring: { heading: 'Wallet restoring', subheading: 'Check the data accuracy before continuing' }, +}; +export default headings; diff --git a/src/locales/ENG/other.js b/src/locales/ENG/other.js new file mode 100644 index 00000000..8395020a --- /dev/null +++ b/src/locales/ENG/other.js @@ -0,0 +1,20 @@ +const other = { + step: 'Step', + from: 'from', + yourWallet: 'Your wallet', + compiling: 'Compiling', + sending: 'Sendind', + txHash: 'Awaiting hash', + txReceipt: 'Awaiting receipt', + questionsUploading: 'Uploading questions', + walletAddress: 'Wallet', + balance: 'Balance', + tokenSymbol: 'Token symbol', + count: 'Quantity', + withTokens: 'If you have ERC20 tokens', + withoutTokens: "If you don't have ERC20 tokens", + yourBalance: 'Your balance', + RUS: 'Русский', + ENG: 'English', +}; +export default other; diff --git a/src/locales/RUS/buttons.js b/src/locales/RUS/buttons.js new file mode 100644 index 00000000..0dba007a --- /dev/null +++ b/src/locales/RUS/buttons.js @@ -0,0 +1,21 @@ +const buttons = { + login: 'Войти', + newWallet: 'Создать новый ключ', + forgotPassword: 'Забыли пароль?', + showSeed: 'Показать фразу', + hideSeed: 'Скрыть фразу', + seedWroted: 'Я записал', + addProject: 'Добавить проект', + create: 'Создать', + connect: 'Подключить', + continue: 'Продолжить', + finish: 'Завершить', + back: 'Назад', + otherProject: 'Выбрать другой проект', + toConnectedProject: 'К подлюченному проекту', + toCreatedProject: 'К созданному проекту', + withTokens: 'Подключить контракт и создать проект', + withoutTokens: 'Создать новые токены и проект', + toWallets: 'К выбору кошелька', +}; +export default buttons; diff --git a/src/locales/RUS/dialogs.js b/src/locales/RUS/dialogs.js new file mode 100644 index 00000000..4a7ff65b --- /dev/null +++ b/src/locales/RUS/dialogs.js @@ -0,0 +1,10 @@ +const dialog = { + definetelyAgree: 'Вы точно согласны?', + agreedMessage: 'Вы выразили согласие', + rejectMessage: 'Вы проголосовали против', + transferInProgress: 'Переводим токены', + someTimeText: 'Это займет некоторое время', + tokenTransferSuccess: 'Токены успешно переведены!', +}; + +export default dialog; diff --git a/src/locales/RUS/errors.js b/src/locales/RUS/errors.js new file mode 100644 index 00000000..6c54fb3d --- /dev/null +++ b/src/locales/RUS/errors.js @@ -0,0 +1,10 @@ +const errors = { + wrongAddress: 'Проверьте правильность введенного адреса', + wrongPassword: 'Неверный пароль, попробуйте еще раз', + tryAgain: 'Произошла ошибка, попробуйте еще раз', + validationError: 'Проверьте правильность заполнения данных', + emptyFields: 'Вы ввели не все данные, пожалуйста, введите все данные', + lowBalance: 'Ваш баланс слишком мал для этого действия', + hostUnreachable: 'Соединение с хостом потеряно, проверьте доступ к интернету и повторите еще раз', +}; +export default errors; diff --git a/src/locales/RUS/explanations.js b/src/locales/RUS/explanations.js new file mode 100644 index 00000000..bb55eede --- /dev/null +++ b/src/locales/RUS/explanations.js @@ -0,0 +1,28 @@ +const explanations = { + passwordCreating: ['Пароль задается на английской раскладке', 'И должен содержать:'], + passwordRules: { + numeric: 'цифру', + upperCase: 'заглавную букву', + symbol: 'спецсимол', + length: 'не менее 6 символов', + }, + seed: ['Фраза дает полный контроль над вашей учетной записью.', 'Обязательно запишите и не сообщайте ее никому'], + project: { + name: 'Название задается вами и отображается в списке проектов', + address: 'Адрес сообщает создатель проекта', + }, + token: { + left: + { + wallet: ['Контракт будет загружен в сеть', ' при помощи кошелька:'], + balance: 'Баланс: ', + tokens: ['Токены зачислятся на этот кошелек ', 'После их можно будет распределить'], + }, + right: { + symbol: 'Символом токена называется его сокращенно название. Например: ETH, BTC и т.п.', + count: 'Общее число токенов задаете вы. В дальнейшем их можно будет распределить между участниками проекта', + }, + }, +}; + +export default explanations; diff --git a/src/locales/RUS/fields.js b/src/locales/RUS/fields.js new file mode 100644 index 00000000..81c14fb6 --- /dev/null +++ b/src/locales/RUS/fields.js @@ -0,0 +1,13 @@ +const placeholders = { + wallet: 'Выберите кошелек', + password: 'Пароль', + enterPassword: 'Введите пароль', + repeatPassword: 'Повторите пароль', + tokenTitle: 'Название токена', + symbol: 'Символ', + quantity: 'Количество', + projectTitle: 'Придумайте название проекта', + contractAddress: 'Введите адрес контракта', +}; + +export default placeholders; diff --git a/src/locales/RUS/headings.js b/src/locales/RUS/headings.js new file mode 100644 index 00000000..c8abc999 --- /dev/null +++ b/src/locales/RUS/headings.js @@ -0,0 +1,26 @@ +const headings = { + login: { heading: 'Вход в систему', subheading: 'Приготовьтесь к новой эре в сфере голосования' }, + logging: { heading: 'Выполняется вход', subheading: 'Это не займет много времени' }, + passwordCreation: { heading: 'Создание пароля', subheading: ['Будет использоваться для входа в', 'кошелек и подтверждения транзакций'] }, + showSeed: { heading: 'Резервная фраза', subheading: 'Нужна для восстановления пароля' }, + seedCheck: { heading: 'Проверка резервной фразы', subheading: ['Проверяется фраза', 'Введите фразу, которую вы записали'] }, + projects: { heading: 'Выбор проекта', subheading: 'Выберите проект или создайте новый' }, + addingProject: { heading: 'Добавление проекта', subheading: ['Cоздайте новый или подключите', 'уже существующий'] }, + сonnectProject: { heading: 'Подключить проект', subheading: 'Подключите уже существующий проект' }, + projectChecking: { heading: 'Проверяем адрес проекта', subheading: 'Это не займет много времени' }, + projectConnected: { heading: 'Проект успешно подключен!', subheading: 'Теперь можно начать работу с ним или выбрать другой проект' }, + newProject: { heading: 'Создание нового проекта', subheading: 'Выберите подходящий вам вариант' }, + existingTokens: { heading: 'Подключение контракта токенов', subheading: 'Владелец этого контракта будет считаться и владельцем создаваемого проекта' }, + checkingTokens: { heading: 'Проверяем адрес контракта', subheading: 'Это не займет много времени' }, + checkingTokensConfirm: { heading: 'Контракт успешно проверен', subheading: ['Проверьте правильность данных', ' перед тем, как продолжить'] }, + newTokens: { heading: 'Создание токенов', subheading: '' }, + tokensCreating: { heading: 'Создаем токены ERC20', subheading: 'Это займет некоторе время' }, + tokensCreated: { heading: 'Токены успешно созданы!', subheading: 'Теперь нужно создать проект' }, + projectCreating: { heading: 'Создание проекта', subheading: ['Контракт проекта будет загружен в сеть', 'при помощи кошелька'] }, + uploadingProject: { heading: 'Загружаем контракт', subheading: 'Это может занять до 5 минут' }, + projectCreated: { heading: 'Проект успешно создан!', subheading: ['Теперь можно начать работу с', 'ним или выбрать другой проект'] }, + walletRestored: { heading: 'Восстановление кошелька', subheading: 'Кошелек успешно восстанолен' }, + walletCreated: { heading: 'Создание кошелька', subheading: 'Кошелек успешно создан' }, + walletRestoring: { heading: 'Процесс восстановления кошелька', subheading: ['Проверьте правильность данных', ' перед тем, как продолжить'] }, +}; +export default headings; diff --git a/src/locales/RUS/other.js b/src/locales/RUS/other.js new file mode 100644 index 00000000..6234e3ae --- /dev/null +++ b/src/locales/RUS/other.js @@ -0,0 +1,20 @@ +const other = { + step: 'Шаг', + from: 'из', + yourWallet: 'Ваш кошелек', + compiling: 'Компиляция', + sending: 'Отправка', + txHash: 'Получение хэша', + txReceipt: 'Получение чека', + questionsUploading: 'Загрузка вопросов', + walletAddress: 'Кошелек', + balance: 'Баланс', + tokenSymbol: 'Символ токена', + count: 'Количество', + withTokens: 'Если есть токены ERC20', + withoutTokens: 'Если токенов ERC20 нет', + yourBalance: 'Ваш баланс', + RUS: 'Русский', + ENG: 'English', +}; +export default other; diff --git a/src/models/FormModel/index.js b/src/models/FormModel/index.js new file mode 100644 index 00000000..f1e4bd9a --- /dev/null +++ b/src/models/FormModel/index.js @@ -0,0 +1,61 @@ +import { extendObservable, action } from 'mobx'; +import { Form } from 'mobx-react-form'; +import dvr from 'mobx-react-form/lib/validators/DVR'; +import plugins from '../../utils/Validator'; + +class ExtendedForm extends Form { + constructor(data) { + const { hooks } = data || {}; + super(); + extendObservable(this, { loading: false }); + Object.keys(hooks).forEach((hook) => { + this.addHook(hook, hooks[hook]); + }); + } + + // eslint-disable-next-line class-methods-use-this + plugins() { + return { dvr: dvr(plugins.dvr) }; + } + + hooks() { + const $this = this; + return { + onSubmit: (form) => { + $this.setLoading(true); + $this.fireHook('onSubmitHook', form); + // Trigger hide mobile keyboard + document.activeElement.blur(); + }, + onSuccess: (form) => { + const promise = $this.fireHook('onSuccessHook', form); + promise + .finally(() => { + $this.setLoading(false); + }); + }, + onError: (form) => { + $this.setLoading(false); + $this.fireHook('onErrorHook', form); + }, + }; + } + + @action addHook(hook, fn) { + this[`${hook}Hook`] = fn; + } + + @action setLoading(status) { + this.loading = status; + } + + fireHook(hook, form) { + const fire = this[hook]; + if (fire && typeof fire === 'function') { + return fire(form); + } + return null; + } +} + +export default ExtendedForm; diff --git a/src/services/ContractService/ContractService.js b/src/services/ContractService/ContractService.js new file mode 100644 index 00000000..dd2a68e0 --- /dev/null +++ b/src/services/ContractService/ContractService.js @@ -0,0 +1,251 @@ +/* eslint-disable no-unused-vars */ +import browserSolc from 'browser-solc'; +import { BN } from 'ethereumjs-util'; +import { SOL_IMPORT_REGEXP, SOL_PATH_REGEXP, SOL_VERSION_REGEXP } from '../../constants'; +import { + fs, PATH_TO_CONTRACTS, path, +} from '../../constants/windowModules'; +import Question from './entities/Question'; +import readSolFile from '../../utils/fileUtils/index'; + +/** + * Class for work with contracts + */ +class ContractService { + constructor(rootStore) { + this._contract = {}; + this.rootStore = rootStore; + this.sysQuestions = JSON.parse(fs.readFileSync(path.join(PATH_TO_CONTRACTS, './sysQuestions.json'), 'utf8')); + this.ercAbi = JSON.parse(fs.readFileSync(path.join(PATH_TO_CONTRACTS, './ERC20.abi'))); + } + + /** + * sets instance of contract to this._contract + * @param {object} instance instance of contract created by Web3Service + */ + // eslint-disable-next-line consistent-return + setContract(instance) { + const { Web3Service: { web3 } } = this.rootStore; + if (!(instance instanceof web3.eth.Contract)) return new Error('this is not contract'); + this._contract = instance; + } + + /** + * compiles contracts and returning type of compiled contract, bytecode & abi + * @param {string} type - ERC20 - if compiling ERC20 token contract, project - if project contract + * @returns {object} contains type of compiled contract, his bytecode and abi for deploying + */ + compileContract(type) { + return new Promise((resolve, reject) => { + window.BrowserSolc.getVersions((sources, releases) => { + const version = releases['0.4.24']; + const contract = this.combineContract(type); + const contractName = type === 'ERC20' + ? ':ERC20' + : ':Voter'; + window.BrowserSolc.loadVersion(version, (compiler) => { + const compiledContract = compiler.compile(contract); + const contractData = compiledContract.contracts[contractName]; + if (contractData.interface !== '') { + const { bytecode, metadata } = contractData; + const { output: { abi } } = JSON.parse(metadata); + resolve({ type, bytecode, abi }); + } else reject(new Error('Something went wrong on contract compiling')); + }); + }); + }); + } + + /** + * reading all imports in main contract file and importing all files in one output file + * @param {string} type type of project - ERC20 for ERC-20 tokens, Project for project contract + * @returns {string} combined contracts + */ + // eslint-disable-next-line class-methods-use-this + combineContract(type) { + const dir = type === 'ERC20' ? './' : './Voter/'; + const compiler = 'pragma solidity ^0.4.24;'; + const pathToMainFile = type === 'ERC20' + ? path.join(PATH_TO_CONTRACTS, `${dir}ERC20.sol`) + : path.join(PATH_TO_CONTRACTS, `${dir}Voter.sol`); + + const importedFiles = {}; + + let output = readSolFile(pathToMainFile, importedFiles); + output = output.replace(SOL_VERSION_REGEXP, compiler); + output = output.replace(/(calldata)/g, ''); + + return output; + } + + /** + * Sendind transaction with contract to blockchain + * @param {object} params parameters for deploying + * @param {array} params.deployArgs ERC20 - [Name, Symbol, Count], Project - [tokenAddress] + * @param {string} params.bytecode bytecode of contract + * @param {JSON} params.abi JSON interface of contract + * @param {string} params.password password of user wallet + * @returns {Promise} Promise of web3.sendSignedTransaction which resolves on txHash + */ + deployContract({ + deployArgs, bytecode, abi, password, + }) { + const { rootStore: { Web3Service, userStore } } = this; + const { address } = userStore; + const maxGasPrice = 30000000000; + const contract = Web3Service.createContractInstance(abi); + const txData = contract.deploy({ + data: `0x${bytecode}`, + arguments: deployArgs, + }).encodeABI(); + + const tx = { + data: txData, + gasLimit: 8000000, + gasPrice: maxGasPrice, + }; + + return new Promise((resolve) => { + Web3Service.createTxData(address, tx, maxGasPrice) + .then((formedTx) => userStore.singTransaction(formedTx, password)) + .then((signedTx) => Web3Service.sendSignedTransaction(`0x${signedTx}`)) + .then((txHash) => resolve(txHash)); + }); + } + + /** + * checks erc20 tokens contract on totalSupply and symbol + * @param {string} address address of erc20 contract + * @return {object} {totalSypply, symbol} + */ + async checkTokens(address) { + const { rootStore: { Web3Service }, ercAbi } = this; + const contract = Web3Service.createContractInstance(ercAbi); + contract.options.address = address; + const totalSupply = await contract.methods.totalSupply().call(); + const symbol = await contract.methods.symbol().call(); + return { totalSupply, symbol }; + } + + /** + * checks is the address of contract + * @param {string} address address of contract + * @return {Promise} Promise with function which resolves, if address is contract + */ + // eslint-disable-next-line class-methods-use-this + checkProject(address) { + const { rootStore: { Web3Service } } = this; + return new Promise((resolve, reject) => { + Web3Service.web3.eth.getCode(address).then((bytecode) => { + if (bytecode === '0x') reject(); + resolve(bytecode); + }); + }); + } + + /** + * calling contract method + * @param {string} method method, which will be called + * @param {string} from address of caller + * @param params parameters for method + */ + async callMethod(method, ...params) { + const data = await this._contract.methods[method](...params).call(); + return data; + } + + /** + * checks count of uploaded to contract questions and total count of system questions + * @function + * @returns {object} {countOfUploaded, totalCount} + */ + async checkQuestions() { + const countOfUploaded = await this._contract.methods.getCount().call(); + const totalCount = Object.keys(this.sysQuestions).length; + return ({ countOfUploaded, totalCount }); + } + + /** + * send question to created contract + * @param {number} idx id of question; + * @return {Promise} Promise, which resolves on transaction hash + */ + async sendQuestion(idx) { + const { + Web3Service, userStore, + } = this.rootStore; + const sysQuestion = this.sysQuestions[idx]; + await this.fetchQuestion(idx).then((result) => { + if (result.caption === '') { + const { address, password } = userStore; + const question = new Question(sysQuestion); + const contractAddr = this._contract.options.address; + const params = question.getUploadingParams(contractAddr); + + const dataTx = this._contract.methods.saveNewQuestion(...params).encodeABI(); + + const maxGasPrice = 30000000000; + const rawTx = { + to: contractAddr, + data: dataTx, + gasLimit: 8000000, + value: '0x0', + }; + + return new Promise((resolve) => { + Web3Service.createTxData(address, rawTx, maxGasPrice) + .then((formedTx) => userStore.singTransaction(formedTx, password)) + .then((signedTx) => Web3Service.sendSignedTransaction(`0x${signedTx}`)) + .then((txHash) => resolve(txHash)); + }); + } + return Promise.reject(); + }); + } + + /** + * Fetching one question from contract + * @param {number} id id of question + * @returns {Object} Question data from contract + */ + fetchQuestion(id) { + return this.callMethod('question', [id]); + } + + /** + * getting one voting + * @param {number} id id of voting + * @param {string} from address who calls method + */ + async fetchVoting(id) { + return this.callMethod('getVoting', [id]); + } + + /** + * getting votes weights for voting + * @param {number} id id of voting + * @param {string} from address, who calls + */ + async fetchVotingStats(id) { + return this.callMethod('getVotingStats', [id]); + } + + /** + * Starting the voting + * @param {id} id id of question + * @param {string} from address, who starts + * @param params parameters of voting + */ + async sendVotingStart(id, from, params) { + return (this, id, from, params); + } + + /** + * Finishes the voting + */ + async sendVotingFinish() { + return this; + } +} + +export default ContractService; diff --git a/src/services/ContractService/entities/Question.js b/src/services/ContractService/entities/Question.js new file mode 100644 index 00000000..a8a792c6 --- /dev/null +++ b/src/services/ContractService/entities/Question.js @@ -0,0 +1,51 @@ +import web3 from 'web3'; + +class Question { + constructor({ + id, group, name, caption, time, method, formula, parameters, + }) { + this.id = id; + this.group = group; + this.name = name; + this.caption = caption; + this.time = time; + this.method = method; + this.formula = formula; + this.parameters = parameters; + } + + /** + * convert simple formula of system question for contract + * @param {string} formula text implimentation of formula + * @returns {array} numeric implimentation of formula for smart contract + */ + getFormulaForContract() { + const FORMULA_REGEXP = new RegExp(/(group)|((?:[a-zA-Z0-9]{1,}))|((quorum|positive))|(>=|<=)|([0-9%]{1,})|(quorum|all)/g); + const matched = this.formula.match(FORMULA_REGEXP); + const convertedFormula = []; + convertedFormula.push(matched[0] === 'group' ? 0 : 1); + convertedFormula.push(matched[1] === 'Owners' ? 1 : 2); + convertedFormula.push(matched[3] === 'quorum' ? 0 : 1); + convertedFormula.push(matched[4] === '<=' ? 0 : 1); + convertedFormula.push(Number(matched[5])); + if (matched.length === 9) { + convertedFormula.push(matched[8] === 'quorum' ? 0 : 1); + } + return convertedFormula; + } + + /** + * getting formed parameters for contract + * @param {string} contractAddr address of target contract + * @returns {array} formed data for encoding transaction + */ + getUploadingParams(contractAddr) { + const { + id, group, name, caption, time, method, parameters, + } = this; + const convertedFormula = this.getFormulaForContract(); + const params = parameters.map((param) => web3.utils.utf8ToHex(param)); + return [[id, group, time], 0, name, caption, contractAddr, method, convertedFormula, params]; + } +} +export default Question; diff --git a/src/services/ContractService/index.js b/src/services/ContractService/index.js new file mode 100644 index 00000000..0837ff42 --- /dev/null +++ b/src/services/ContractService/index.js @@ -0,0 +1,3 @@ +import ContractService from './ContractService'; + +export default ContractService; diff --git a/src/services/EventEmitterService/index.js b/src/services/EventEmitterService/index.js new file mode 100644 index 00000000..e60b8ee7 --- /dev/null +++ b/src/services/EventEmitterService/index.js @@ -0,0 +1,17 @@ +class EventEmitterService { + constructor() { + this.events = {}; + } + + emit(event, data) { + if (!this.events[event]) return; + this.events[event].forEach((callback) => callback(data)); + } + + subscribe(event, callback) { + if (!this.events[event]) this.events[event] = []; + this.events[event].push(callback); + } +} + +export default EventEmitterService; diff --git a/src/services/WalletService/WalletService.js b/src/services/WalletService/WalletService.js new file mode 100644 index 00000000..acaaa6a6 --- /dev/null +++ b/src/services/WalletService/WalletService.js @@ -0,0 +1,76 @@ +/* eslint-disable class-methods-use-this */ +import WorkerWrapper from './entities/WorkerWrapper'; +import WalletWorker from '../../workers/wallet.worker'; +import { fs, path, PATH_TO_WALLETS } from '../../constants/windowModules'; + +const bip39 = require('bip39'); + +const worker = new WorkerWrapper(new WalletWorker()); + +/** Service for working with wallets */ +class WalletService { + /** + * Decrypts wallet + * @param {string} url path to wallet + * @param {string} password password for decrypting + * @returns {Promise} + */ + readWallet(input, password) { + const data = { + action: 'read', + input, + password, + }; + return worker.send(data); + } + + /** + * Write encrypted wallet to file + * @param {string} encryptedWallet + * @param {string} name name of the wallet, generated by ethereumjs-wallet + */ + writeWalletToFile(encryptedWallet, name) { + fs.writeFileSync(path.join(PATH_TO_WALLETS, `${name}.json`), JSON.stringify(encryptedWallet, null, '\t'), 'utf8'); + } + + /** + * Creates new wallet + * @param {string} password - combination of symbols which will be allow decode wallet + * @returns {Promise} + */ + createWallet(password, seed = '') { + const mnemonic = seed === '' ? bip39.generateMnemonic() : seed; + const data = { + action: 'create', + password, + mnemonic, + }; + return worker.send(data); + } + + /** + * Recover wallet from 12-word recover phrase + * @param {string} mnemonic - 12 word recover phrase + * @returns {Promise} + */ + recoverWallet(mnemonic) { + if (this.validateMnemonic(mnemonic)) { + const data = { + action: 'recover', + mnemonic, + }; + return Promise.resolve(worker.send(data)); + } return Promise.reject(); + } + + /** + * validates mnemonic + * @param {string} mnemonic mnemonic + * @returns {boolean} is mnemonic valid + */ + validateMnemonic(mnemonic) { + return bip39.validateMnemonic(mnemonic); + } +} + +export default WalletService; diff --git a/src/services/WalletService/entities/WorkerWrapper.js b/src/services/WalletService/entities/WorkerWrapper.js new file mode 100644 index 00000000..fd072e55 --- /dev/null +++ b/src/services/WalletService/entities/WorkerWrapper.js @@ -0,0 +1,57 @@ +let requestId = 0; + +/** Wrapper class for Workers */ +class WorkerWrapper { + worker; + + stack = {}; + + /** + * @constructor + * @param {function} worker instance of worker, which will be used + */ + constructor(worker) { + this.worker = worker; + this._listen(); + } + + /** + * sends Data in worker + * @function + * @param {object} data data for worker + * @return {Promise} promise, which resolves with worker message + */ + send(data) { + const { worker, stack } = this; + requestId += 1; + const id = requestId; + const request = { + id, + payload: data, + }; + worker.postMessage(request); + return new Promise((resolve) => { + stack[id] = (response) => { + stack[id] = undefined; + return resolve(response); + }; + }); + } + + _listen() { + const { worker } = this; + worker.addEventListener('message', this._handleMessage.bind(this)); + } + + _handleMessage(event) { + const { stack } = this; + const { id, payload, error } = event.data; + if (!stack[id] || !(typeof stack[id] === 'function')) return; + if (error) { + throw new Error(error); + } + stack[id](payload); + } +} + +export default WorkerWrapper; diff --git a/src/services/WalletService/index.js b/src/services/WalletService/index.js new file mode 100644 index 00000000..6657332d --- /dev/null +++ b/src/services/WalletService/index.js @@ -0,0 +1,3 @@ +import WalletService from './WalletService'; + +export default WalletService; diff --git a/src/services/Web3Service/Web3Service.js b/src/services/Web3Service/Web3Service.js new file mode 100644 index 00000000..634a11bc --- /dev/null +++ b/src/services/Web3Service/Web3Service.js @@ -0,0 +1,97 @@ +import Web3 from 'web3'; +import { BN } from 'ethereumjs-util'; + +/** + * Service for working with web3 (sending signed transactions, creating transactions) + */ +class Web3Service { + /** + * @constructor + * @param {string} provider - provider for this.web3 + */ + constructor(url, rootStore) { + this.web3 = new Web3(new Web3.providers.HttpProvider(url)); + this.rootStore = rootStore; + } + + createContractInstance(abi) { + const { web3: { eth: { Contract } } } = this; + return new Contract(abi); + } + + createTxData(address, tx, maxGasPrice) { + const { web3: { eth } } = this; + let transaction = { ...tx }; + return eth.getTransactionCount(address, 'pending') + .then((nonce) => { + transaction = { ...tx, nonce }; + return eth.estimateGas(tx); + }) + .then((gas) => { + if (!maxGasPrice) return (Promise.resolve(gas)); + return this.getGasPrice() + .then((gasPrice) => { + const minGasPrice = 10000000000; + const gp = new BN(gasPrice); + const minGp = new BN(minGasPrice); + const maxGp = new BN(maxGasPrice); + transaction.gasPrice = (gp.gte(minGp) && gp.lte(maxGp)) + ? gasPrice + : minGasPrice; + return Promise.resolve(transaction.gasPrice); + }) + .catch(Promise.reject); + }) + // eslint-disable-next-line no-unused-vars + .then((gasPrice) => (transaction)) + .catch((err) => Promise.reject(err)); + } + + /** + * getting gas price + * @returns {number} gasPrice from network + */ + getGasPrice() { + const { web3: { eth: { getGasPrice } } } = this; + return getGasPrice(); + } + + /** + * Sending transaction to contract + * @param {string} txData Raw transaction (without 0x) + * @return {Promise} promise with web3 transaction PromiEvent + */ + sendSignedTransaction(rawTx) { + const { web3: { eth: { sendSignedTransaction } } } = this; + return new Promise((resolve, reject) => { + sendSignedTransaction(rawTx) + .on('transactionHash', (txHash) => { + resolve(txHash); + }) + .on('error', (error) => { + reject(error); + }); + }); + } + + /** + * checking transaction receipt by hash every 5 seconds + * @param {string} txHash hash of transaction + * @return {Promise} Promise which resolves on successful receipt fetching + */ + subscribeTxReceipt(txHash) { + const { web3 } = this; + return new Promise((resolve) => { + const interval = setInterval(() => { + web3.eth.getTransactionReceipt(txHash).then((receipt) => { + if (receipt) { + clearInterval(interval); + resolve(receipt); + } + }); + }, 5000); + }); + } +} + +export default Web3Service; diff --git a/src/services/Web3Service/index.js b/src/services/Web3Service/index.js new file mode 100644 index 00000000..0cc7897f --- /dev/null +++ b/src/services/Web3Service/index.js @@ -0,0 +1,3 @@ +import Web3Service from './Web3Service'; + +export default Web3Service; diff --git a/src/services/models/FormModel/index.js b/src/services/models/FormModel/index.js new file mode 100644 index 00000000..f1e4bd9a --- /dev/null +++ b/src/services/models/FormModel/index.js @@ -0,0 +1,61 @@ +import { extendObservable, action } from 'mobx'; +import { Form } from 'mobx-react-form'; +import dvr from 'mobx-react-form/lib/validators/DVR'; +import plugins from '../../utils/Validator'; + +class ExtendedForm extends Form { + constructor(data) { + const { hooks } = data || {}; + super(); + extendObservable(this, { loading: false }); + Object.keys(hooks).forEach((hook) => { + this.addHook(hook, hooks[hook]); + }); + } + + // eslint-disable-next-line class-methods-use-this + plugins() { + return { dvr: dvr(plugins.dvr) }; + } + + hooks() { + const $this = this; + return { + onSubmit: (form) => { + $this.setLoading(true); + $this.fireHook('onSubmitHook', form); + // Trigger hide mobile keyboard + document.activeElement.blur(); + }, + onSuccess: (form) => { + const promise = $this.fireHook('onSuccessHook', form); + promise + .finally(() => { + $this.setLoading(false); + }); + }, + onError: (form) => { + $this.setLoading(false); + $this.fireHook('onErrorHook', form); + }, + }; + } + + @action addHook(hook, fn) { + this[`${hook}Hook`] = fn; + } + + @action setLoading(status) { + this.loading = status; + } + + fireHook(hook, form) { + const fire = this[hook]; + if (fire && typeof fire === 'function') { + return fire(form); + } + return null; + } +} + +export default ExtendedForm; diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 00000000..9714a977 --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,16 @@ +// setup file +import { configure } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +global.require = (param) => { + switch (param) { + case 'path': + return { + join: jest.fn(), + }; + default: + return jest.fn(); + } +}; + +configure({ adapter: new Adapter() }); diff --git a/src/stores/AppStore/AppStore.js b/src/stores/AppStore/AppStore.js new file mode 100644 index 00000000..27400adc --- /dev/null +++ b/src/stores/AppStore/AppStore.js @@ -0,0 +1,198 @@ +import { observable, action, computed } from 'mobx'; +import { + fs, path, PATH_TO_WALLETS, ROOT_DIR, PATH_TO_CONTRACTS, +} from '../../constants/windowModules'; +import Alert from './entities/Alert'; + +class AppStore { + @observable walletList = {}; + + @observable balances = {}; + + @observable projectList = []; + + @observable ERC = { + + }; + + @observable deployArgs = []; + + @observable name = ''; + + @observable alert = new Alert() + + @observable uploadedQuestion = 0; + + @observable countOfQuestions = 0; + + @observable userInProject = false; + + constructor(rootStore) { + this.rootStore = rootStore; + this.readWalletList(); + } + + /** + * Getting list of url's for sending this to wallet service + * @function + */ + @action readWalletList() { + const { Web3Service: { web3: { eth, utils } } } = this.rootStore; + this.walletList = {}; + + const files = fs.readdirSync(PATH_TO_WALLETS); + files.forEach((file) => { + const wallet = JSON.parse(fs.readFileSync(path.join(PATH_TO_WALLETS, file), 'utf8')); + const walletObject = {}; + eth.getBalance(wallet.address) + .then((balance) => { this.balances[wallet.address] = utils.fromWei(balance); }); + walletObject[wallet.address] = wallet; + this.walletList = Object.assign(this.walletList, walletObject); + }); + } + + /** + * selecting encrypted wallet and pushing this to userStore + * @param {string} address address of wallet + */ + selectWallet = (address) => { + const { userStore } = this.rootStore; + const key = address.replace('0x', ''); + userStore.setEncryptedWallet(this.walletList[key]); + } + + /** + * Reading list of projects for displaing them in project list + * @function + */ + @action readProjectList() { + const config = JSON.parse(fs.readFileSync(path.join(ROOT_DIR, './config.json'))); + this.projectList = config.projects; + } + + /** + * compile contract by given type and arguments + * @param {string} type type of contract - ERC20 for erc tokens, project - for project contract + * @returns {Promise} Function which compiles contract and deploy contract to network on success + */ + @action deployContract(type, deployArgs, password) { + const { contractService } = this.rootStore; + return new Promise((resolve) => { + contractService.compileContract(type) + .then(({ bytecode, abi }) => contractService.deployContract({ + type, deployArgs, bytecode, abi, password, + })) + .then((txhash) => resolve(txhash)); + }); + } + + /** + * checks given address on ERC20 tokens + * @param {string} address address of ERC20 contract + * @returns {Promise} resolves on success checking and set information about ERC token + */ + @action checkErc(address) { + const { contractService } = this.rootStore; + return new Promise((resolve, reject) => { + contractService.checkTokens(address).then((data) => { + if (data.totalSupply) { + this.ERC = { ...data }; + resolve(data); + } else { + reject(); + } + }); + }); + } + + /** + * checks if given address is contract in network + * @param {string} address address, which will be ckecked on contract instance + */ + @action checkProject(address) { + const { contractService } = this.rootStore; + return contractService.checkProject(address) + .then((data) => { + Promise.resolve(data); + }) + .catch(() => { Promise.reject(); }); + } + + /** + * Upload questions to created project + * @param {string} address address of smart contract, where will be uploaded questions + * @return Promise.resolve() + */ + @action async deployQuestions(address) { + const { Web3Service, contractService } = this.rootStore; + const abi = JSON.parse(fs.readFileSync(path.join(PATH_TO_CONTRACTS, './Voter.abi'), 'utf8')); + const contract = Web3Service.createContractInstance(abi); + contract.options.address = address; + contractService.setContract(contract); + const { countOfUploaded, totalCount } = await contractService.checkQuestions(); + this.countOfQuestions = Number(totalCount); + this.uploadedQuestion = Number(countOfUploaded); + let idx = Number(countOfUploaded) === 0 ? 1 : Number(countOfUploaded); + for (idx; idx <= totalCount; idx += 1) { + // eslint-disable-next-line no-await-in-loop + await contractService.sendQuestion(idx); + this.uploadedQuestion += 1; + } + return Promise.resolve(); + } + + /** + * add project to config and update config saved in file + * @param {object} data data about project {name, address} + */ + // eslint-disable-next-line class-methods-use-this + @action addProjectToList(data) { + const config = JSON.parse(fs.readFileSync(path.join(ROOT_DIR, './config.json'), 'utf8')); + config.projects.push(data); + fs.writeFileSync(path.join(ROOT_DIR, './config.json'), JSON.stringify(config, null, '\t')); + } + + /** + * Check transaction receipt + * @param {string} hash Transaction hash + * @return {Promise} Promise with interval, which resolves on succesfull receipt recieving + */ + @action checkReceipt(hash) { + const { Web3Service } = this.rootStore; + return Web3Service.subscribeTxReceipt(hash); + } + + /** + * + * @param {string} text error text + * @param {number} [timeOut=3000] timeout when alert disappear + */ + @action displayAlert(text, timeOut) { + const { alert } = this; + alert.showAlert(text, timeOut); + } + + @action closeAlert() { + const { alert } = this; + alert.closeAlert(); + } + + @computed get wallets() { + const wallets = Object.keys(this.walletList); + return wallets.map((wallet) => ({ label: `0x${wallet}`, value: `0x${wallet}` })); + } + + @computed get inProject() { + return this.userInProject; + } + + @action setProjectName(value) { + this.name = value; + } + + @action setDeployArgs(value) { + this.deployArgs = value; + } +} + +export default AppStore; diff --git a/src/stores/AppStore/entities/Alert.js b/src/stores/AppStore/entities/Alert.js new file mode 100644 index 00000000..98595898 --- /dev/null +++ b/src/stores/AppStore/entities/Alert.js @@ -0,0 +1,21 @@ +import { observable, action } from 'mobx'; + +class Alert { + @observable text = ''; + + @observable visible = false; + + @action showAlert = (text, interval = 3000) => { + this.text = text; + this.visible = true; + setTimeout(() => { + this.visible = false; + }, interval); + } + + @action closeAlert = () => { + this.visible = false; + } +} + +export default Alert; diff --git a/src/stores/AppStore/index.js b/src/stores/AppStore/index.js new file mode 100644 index 00000000..00850ceb --- /dev/null +++ b/src/stores/AppStore/index.js @@ -0,0 +1,3 @@ +import AppStore from './AppStore'; + +export default AppStore; diff --git a/src/stores/DialogStore/DialogItemModel.js b/src/stores/DialogStore/DialogItemModel.js new file mode 100644 index 00000000..ed9fb852 --- /dev/null +++ b/src/stores/DialogStore/DialogItemModel.js @@ -0,0 +1,86 @@ +const defaults = { + onOpen: null, + onClose: null, + history: true, +}; + +/** + * Single modal dialog model + */ +class DialogItem { + /** + * @param {string} name name dialog + * @param {object} options options for dialog + * @param {boolean} options.history add to history or not + * @param {Function} options.onOpen method that is called + * on open dialog + * @param {Function} options.onClose method that is called + * on close dialog + */ + constructor(name, options) { + this._name = name; + this.options = { ...defaults, ...options }; + } + + /** + * Method for getting name dialog + * + * @returns {string} name + */ + get name() { + return this._name; + } + + /** + * Method for getting id dialog + * + * @returns {string} id + */ + get id() { + return `dialog-${this.name}`; + } + + /** + * Method for getting history dialogs + * + * @returns {Array} history + */ + get history() { + return this.options.history; + } + + /** + * Method for call onOpen method with + * all necessary actions + */ + open() { + const { options: { onOpen } } = this; + const input = document.querySelector(`#${this.id} [open-focus]`); + if (input) { + const inputEvent = new Event('input', { bubbles: true }); + if (!input.value) { + input.focus(); + input.dispatchEvent(inputEvent); + } + } else { + const button = document.querySelector(`#${this.id} button`); + if (button) button.focus(); + } + if (onOpen && typeof onOpen === 'function') { + onOpen(); + } + } + + /** + * Method for call onClose method with + * all necessary actions + */ + close() { + const { options: { onClose } } = this; + if (onClose && typeof onClose === 'function') { + onClose(); + } + } +} + +export default DialogItem; diff --git a/src/stores/DialogStore/DialogStore.js b/src/stores/DialogStore/DialogStore.js new file mode 100644 index 00000000..73bf9304 --- /dev/null +++ b/src/stores/DialogStore/DialogStore.js @@ -0,0 +1,168 @@ +import { + observable, + computed, + action, +} from 'mobx'; +import DialogItem from './DialogItemModel'; + +/** + * Class for manage all dialogs in app + */ +class DialogStore { + /** actual open state */ + @observable open = false; + + /** closing in progress state */ + @observable closing = false; + + /** current active name dialog */ + @observable dialog = null; + + /** history dialogs */ + history = []; + + /** list of all dialogs */ + list = {}; + + @computed + /** + * Actual open state + * + * @returns {string, boolean} name dialog or boolean state + */ + get isOpen() { + if (this.open && this.dialog) return this.dialog; + return false; + } + + /** + * Method for getting dialog by name in list + * + * @param {string} dialogName name dialog + * @return {object} dialog item model + */ + getDialog(dialogName) { + const { list } = this; + return list[dialogName]; + } + + /** + * Method for checking the existence of a dialog + * + * @param {string} dialog dialog name + * @returns {boolean} dialog exists or does not exist + */ + doesExist(dialog) { + return this.getDialog(dialog) !== undefined; + } + + /** + * Method for adding new dialog in list + * + * @param {string} name name new dialog + * @param {object} options options for new dialog + * @param {boolean} options.history add to history or not + * @param {Function} options.onOpen method that is called + * on open dialog + * @param {Function} options.onClose method that is called + * on close dialog + */ + add(name, options) { + this.list[name] = new DialogItem(name, options); + } + + /** + * Method for removing dialog from list dialogs + * + * @param {string} name name dialog + */ + remove(name) { + delete this.list[name]; + } + + @action + /** + * Method for showing dialog by name + * + * @param {string} dialogName dialog name + */ + show(dialogName) { + const { open, dialog: currentDialogName } = this; + const dialog = this.getDialog(dialogName); + // not found + if (!dialog) return this.hide(); + // this dialog is opened next already + if (dialog.name === currentDialogName) return Promise.resolve(); + // save provided dialog as next to open + if (open) { + this.next = dialogName; + return this.hide(true); + } + document.body.classList.add('dialog-overlay'); + this.open = true; + this.dialog = dialog.name; + dialog.open(); + this.addToHistory(dialog); + // this.emit(`${dialog.name}:open`); + return Promise.resolve(); + } + + @action + /** + * Method for hiding dialog + */ + hide() { + const { dialog: dialogName } = this; + const dialog = this.getDialog(dialogName); + // closing right now + if (this.closing || !dialog) { + return Promise.resolve(); + } + return new Promise((resolve) => { + this.closing = true; + setTimeout(() => { + const { next } = this; + this.open = false; + this.closing = false; + this.dialog = false; + if (dialog) dialog.close(); + if (!next || typeof next !== 'boolean') { + document.body.classList.remove('dialog-overlay'); + } + if (next) { + this.next = false; + this.show(next) + .then(resolve); + } + // this.emit(`${dialog.name}:hidden`); + return resolve(); + }, 400); + }); + } + + /** + * Method for adding dialog in history dialogs + * + * @param {object} dialog dialog item model + */ + addToHistory(dialog) { + if (dialog.history === false) return false; + return this.history.push(dialog.name); + } + + /** + * Method for toggle dialogs + * + * @param {string} dialogName dialog name for opening + */ + toggle(dialogName) { + const { open } = this; + if (!open || this.dialog !== dialogName) { + this.hide().then(() => { this.show(dialogName); }); + } else { + this.hide(); + } + } +} + +export default DialogStore; diff --git a/src/stores/DialogStore/index.js b/src/stores/DialogStore/index.js new file mode 100644 index 00000000..ffd7d4d1 --- /dev/null +++ b/src/stores/DialogStore/index.js @@ -0,0 +1,3 @@ +import DialogStore from './DialogStore'; + +export default DialogStore; diff --git a/src/stores/FormsStore/ConnectProject.js b/src/stores/FormsStore/ConnectProject.js new file mode 100644 index 00000000..1fa25943 --- /dev/null +++ b/src/stores/FormsStore/ConnectProject.js @@ -0,0 +1,25 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class ConnectProjectForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'name', + type: 'text', + label: 'Project Name', + placeholder: i18n.t('fields:projectTitle'), + rules: 'required|string|between:3,20', + }, { + name: 'address', + type: 'text', + label: 'Token Address', + placeholder: i18n.t('fields:contractAddress'), + rules: 'required|string|address', + }], + }; + } +} + +export default ConnectProjectForm; diff --git a/src/stores/FormsStore/ConnectToken.js b/src/stores/FormsStore/ConnectToken.js new file mode 100644 index 00000000..3c247bb2 --- /dev/null +++ b/src/stores/FormsStore/ConnectToken.js @@ -0,0 +1,19 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class ConnectTokenForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'address', + type: 'text', + label: 'Token Address', + placeholder: i18n.t('fields:contractAddress'), + rules: 'required|string|address', + }], + }; + } +} + +export default ConnectTokenForm; diff --git a/src/stores/FormsStore/CreateProject.js b/src/stores/FormsStore/CreateProject.js new file mode 100644 index 00000000..a35ed028 --- /dev/null +++ b/src/stores/FormsStore/CreateProject.js @@ -0,0 +1,25 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class СreateProjectForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'name', + type: 'text', + label: 'Project name', + placeholder: i18n.t('fields:projectTitle'), + rules: 'required|string|between:3,20', + }, { + name: 'password', + type: 'password', + label: 'Password', + placeholder: i18n.t('fields:enterPassword'), + rules: 'required|password', + }], + }; + } +} + +export default СreateProjectForm; diff --git a/src/stores/FormsStore/CreateToken.js b/src/stores/FormsStore/CreateToken.js new file mode 100644 index 00000000..6efd78d4 --- /dev/null +++ b/src/stores/FormsStore/CreateToken.js @@ -0,0 +1,37 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class CreateTokenForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'name', + type: 'text', + label: 'Имя', + placeholder: i18n.t('fields:tokenTitle'), + rules: 'required|string', + }, { + name: 'symbol', + type: 'text', + label: 'Символ Токена', + placeholder: i18n.t('fields:symbol'), + rules: 'required|string|between:3,5', + }, { + name: 'count', + type: 'text', + label: 'Количество токенов', + placeholder: i18n.t('fields:quantity'), + rules: 'required|numeric|min:1|max:2147483647 ', + }, { + name: 'password', + type: 'password', + label: 'Password', + placeholder: i18n.t('fields:enterPassword'), + rules: 'required|password', + }], + }; + } +} + +export default CreateTokenForm; diff --git a/src/stores/FormsStore/CreateWalletForm.js b/src/stores/FormsStore/CreateWalletForm.js new file mode 100644 index 00000000..e01a1760 --- /dev/null +++ b/src/stores/FormsStore/CreateWalletForm.js @@ -0,0 +1,25 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class CreateWalletForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'password', + type: 'password', + label: 'Password', + placeholder: i18n.t('fields:enterPassword'), + rules: 'required|password', + }, { + name: 'passwordConfirm', + type: 'password', + label: 'Password Confirmation', + placeholder: i18n.t('fields:repeatPassword'), + rules: 'required|same:password', + }], + }; + } +} + +export default CreateWalletForm; diff --git a/src/stores/FormsStore/FinPassForm.js b/src/stores/FormsStore/FinPassForm.js new file mode 100644 index 00000000..ec5ff96a --- /dev/null +++ b/src/stores/FormsStore/FinPassForm.js @@ -0,0 +1,19 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class FinPassForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'password', + type: 'password', + label: 'Password', + placeholder: i18n.t('fields:enterPassword'), + rules: 'required|password', + }], + }; + } +} + +export default FinPassForm; diff --git a/src/stores/FormsStore/LoginForm.js b/src/stores/FormsStore/LoginForm.js new file mode 100644 index 00000000..d96e27fa --- /dev/null +++ b/src/stores/FormsStore/LoginForm.js @@ -0,0 +1,26 @@ +/* eslint-disable class-methods-use-this */ +import i18n from 'i18next'; +import ExtendedForm from '../../models/FormModel'; + +class LoginForm extends ExtendedForm { + setup() { + return { + fields: [{ + name: 'wallet', + type: 'text', + label: 'Wallet', + placeholder: i18n.t('fields:wallet'), + rules: 'required|string', + }, { + name: 'password', + type: 'password', + label: 'Password', + placeholder: i18n.t('fields:enterPassword'), + rules: 'required|password', + + }], + }; + } +} + +export default LoginForm; diff --git a/src/stores/FormsStore/SeedForm.js b/src/stores/FormsStore/SeedForm.js new file mode 100644 index 00000000..2f5624c1 --- /dev/null +++ b/src/stores/FormsStore/SeedForm.js @@ -0,0 +1,18 @@ +/* eslint-disable class-methods-use-this */ +import ExtendedForm from '../../models/FormModel'; + +class SeedForm extends ExtendedForm { + setup() { + const fields = []; + for (let i = 1; i < 13; i += 1) { + fields.push({ + name: `word_${i}`, + rules: 'required|string', + value: '', + }); + } + return { fields }; + } +} + +export default SeedForm; diff --git a/src/stores/HistoryStore/HistoryStore.js b/src/stores/HistoryStore/HistoryStore.js new file mode 100644 index 00000000..e96b6627 --- /dev/null +++ b/src/stores/HistoryStore/HistoryStore.js @@ -0,0 +1,73 @@ +import { observable, action, computed } from 'mobx'; +import Voting from './entities/Voting'; + +class HistoryStore { + @observable votings = []; + + constructor(projectAddress) { + this.fetchVotings(projectAddress); + } + + /** + * recieving voting length for fetching them from contract + * @function + * @param {string} address user address + * @returns {number} count of votings + */ + @action fetchVotingsCount = (address) => address + + /** + * recieving voting for local using + * @function + * @param {string} address user address + */ + @action fetchVotings = (address) => { + this.fetchVotingsCount(address); + this.votings.push(new Voting()); + } + + /** + * Getting full info about one voting, selected by id + * @function + * @param {number} id id of voting + * @return {object} selected voting + */ + @action getVotingsById = (id) => this.votings.filter((voting) => voting.id === id) + + /** + * Getting stats about votes in voting, selected by id + * @function + * @param {number} id id of voting + * @return {array} stats + */ + @action getVotingStats = (id) => id + + /** + * filtering voting by given parameters + * @function + * @param {object} params parameters for filtering + * @param {number} params.questionId filter votings by questionId + * @param {number} params.descision filter voting by descision + * @param {string} params.dateFrom filter voting by startTime + * @param {string} params.dateTo filter voting by endTime + * @return {array} Filtered question + */ + @action filterVotings = (params) => params + + /** + * @function + * @return {bool} True if project have not ended voting + */ + @computed get isVotingActive() { + return this.votings; + } + + /** + * @function + * @return {array} list of votings + */ + @computed get votingsList() { + return this.votings; + } +} +export default HistoryStore; diff --git a/src/stores/HistoryStore/entities/Voting.js b/src/stores/HistoryStore/entities/Voting.js new file mode 100644 index 00000000..d2bff068 --- /dev/null +++ b/src/stores/HistoryStore/entities/Voting.js @@ -0,0 +1,18 @@ +class Voting { + /** + * @constructor + * @param {Object} data object contains info adout voting + * @param {Number} data.votingId id of voting + * @param {Number} data.questionId id of question which selected for voting + * @param {Array} data.params parameters of voting + */ + constructor({ + votingId, questionId, params, + }) { + this.id = votingId; + this.questionId = questionId; + this.params = params; + } +} + +export default Voting; diff --git a/src/stores/HistoryStore/index.js b/src/stores/HistoryStore/index.js new file mode 100644 index 00000000..7ebd5c19 --- /dev/null +++ b/src/stores/HistoryStore/index.js @@ -0,0 +1,3 @@ +import HistoryStore from './HistoryStore'; + +export default HistoryStore; diff --git a/src/stores/ProjectStore/ProjectStore.js b/src/stores/ProjectStore/ProjectStore.js new file mode 100644 index 00000000..063499fc --- /dev/null +++ b/src/stores/ProjectStore/ProjectStore.js @@ -0,0 +1,71 @@ +import { observable, action } from 'mobx'; +import UsergroupStore from '../UsergroupStore'; +import QuestionStore from '../QuestionStore'; +import HistoryStore from '../HistoryStore'; +import { votingStates } from '../../constants'; + +/** + * Class implements whole project + */ +class ProjectStore { + @observable projectAddress = '' + + @observable prepared = 0; + + @observable userGrops = []; + + @observable questionStore; + + @observable historyStore; + + constructor(projectAddress) { + this.projectAddress = projectAddress; + this.questionStore = new QuestionStore(projectAddress); + this.historyStore = new HistoryStore(projectAddress); + this.userGrops = this.fetchUserGroups(projectAddress); + } + + /** + * Starting of voting + */ + @action startVoting() { + this.prepared = votingStates.active; + } + + /** + * Preparing app for start voting + * @param {number} questionId + * @param {array} parameters + */ + @action prepareVoting(questionId, parameters) { + /** + * Bunch of code + */ + this.prepared = votingStates.prepared; + return (questionId, parameters); + } + + /** + * getting usergroups lentgh from contract + */ + @action fetchUserGroupsLength = () => { + /** + * get usergroups length, then + * for 1 to length + * this.fetchUserGroups(id) + */ + } + + /** + * getting usergroups from contract + * @param {number} projectAddress address of project + * @return {array} list of usergroups + */ + @action fetchUserGroups = (projectAddress) => { + this.fetchUserGroupsLength(projectAddress); + const data = {}; + this.userGrops.push(new UsergroupStore(data)); + } +} + +export default ProjectStore; diff --git a/src/stores/ProjectStore/index.js b/src/stores/ProjectStore/index.js new file mode 100644 index 00000000..0c137861 --- /dev/null +++ b/src/stores/ProjectStore/index.js @@ -0,0 +1,3 @@ +import ProjectStore from './ProjectStore'; + +export default ProjectStore; diff --git a/src/stores/QuestionStore/QuestionStore.js b/src/stores/QuestionStore/QuestionStore.js new file mode 100644 index 00000000..aea16405 --- /dev/null +++ b/src/stores/QuestionStore/QuestionStore.js @@ -0,0 +1,63 @@ +import { observable, action, computed } from 'mobx'; +import Question from './entities/Question'; + +/** + * Contains methods for working + */ +class QuestionStore { + @observable _questions; + + constructor(projectAddress) { + this._questions = []; + this.fetchQuestionsCount(projectAddress); + } + + /** + * Recieving questions count for fetching them from contract + * @function + * @param {string} address user address + * @returns {number} count of questions + */ + @action fetchQuestionsCount = (address) => address + + /** + * Recieving question from contract + * @function + * @param {string} address user address + */ + @action fetchQuestions = (address) => { + this.fetchQuestionsCount(address); + /** + * gets the question + */ + this.addQuestion(); + } + + /** + * Adding question to the list + * @function + * @param {object} question Question which will be added + */ + @action addQuestion = (question) => { + this._questions.push(new Question(question)); + } + + /** + * Getting question by given id + * @function + * @param {number} id id of question + * @returns {object} question matched by id + */ + @action getQuestionById = (id) => this._questions.filter((question) => question.id === id) + + /** + * Getting list of questions for displaying + * @function + * @returns {Array} list of all questions + */ + @computed get questions() { + return this._questions; + } +} + +export default QuestionStore; diff --git a/src/stores/QuestionStore/entities/Question.js b/src/stores/QuestionStore/entities/Question.js new file mode 100644 index 00000000..e5bbe555 --- /dev/null +++ b/src/stores/QuestionStore/entities/Question.js @@ -0,0 +1,22 @@ +class Question { + /** + * @constructor + * @param {object} data data about question + * @param {number} data.id question id + * @param {number} data.groupId id of group, which can start voting for this question + * @param {string} data.caption question caption + * @param {string} data.text description of the question + * @param {Array} data.params parameters which will be used after voting + */ + constructor({ + id, groupId, caption, text, params, + }) { + this.id = id; + this.caption = caption; + this.groupId = groupId; + this.text = text; + this.params = params; + } +} + +export default Question; diff --git a/src/stores/QuestionStore/index.js b/src/stores/QuestionStore/index.js new file mode 100644 index 00000000..14f2df06 --- /dev/null +++ b/src/stores/QuestionStore/index.js @@ -0,0 +1,3 @@ +import QuestionStore from './QuestionStore'; + +export default QuestionStore; diff --git a/src/stores/RootStore/RootStore.js b/src/stores/RootStore/RootStore.js new file mode 100644 index 00000000..b564760c --- /dev/null +++ b/src/stores/RootStore/RootStore.js @@ -0,0 +1,54 @@ +import { action } from 'mobx'; +import AppStore from '../AppStore'; +import UserStore from '../UserStore'; +import ProjectStore from '../ProjectStore'; +import DialogStore from '../DialogStore'; +import Web3Service from '../../services/Web3Service'; +import WalletService from '../../services/WalletService'; +import ContractService from '../../services/ContractService'; +import EventEmitterService from '../../services/EventEmitterService'; +import { fs, path, ROOT_DIR } from '../../constants/windowModules'; + +class RootStore { + // stores + projectStore; + + appStore; + + userStore; + + dialogStore; + + // services + walletService; + + contractService; + + Web3Service; + + eventEmitterService; + + constructor() { + const configRaw = fs.readFileSync(path.join(ROOT_DIR, './config.json'), 'utf8'); + const config = JSON.parse(configRaw); + this.Web3Service = new Web3Service(config.host, this); + this.appStore = new AppStore(this); + this.userStore = new UserStore(this); + this.walletService = new WalletService(); + this.eventEmitterService = new EventEmitterService(); + this.contractService = new ContractService(this); + this.dialogStore = new DialogStore(); + } + + /** + * initiating project + * @param {string} address adress of project + */ + @action initProject(address) { + this.projectStore = new ProjectStore(address); + } +} + +// eslint-disable-next-line no-multi-assign +const rootStore = window.rootStore = new RootStore(); +export default rootStore; diff --git a/src/stores/RootStore/index.js b/src/stores/RootStore/index.js new file mode 100644 index 00000000..4e9b742a --- /dev/null +++ b/src/stores/RootStore/index.js @@ -0,0 +1,3 @@ +import rootStore from './RootStore'; + +export default rootStore; diff --git a/src/stores/UserStore/UserStore.js b/src/stores/UserStore/UserStore.js new file mode 100644 index 00000000..2c8c684c --- /dev/null +++ b/src/stores/UserStore/UserStore.js @@ -0,0 +1,232 @@ +import { observable, action, computed } from 'mobx'; +import { Transaction as Tx } from 'ethereumjs-tx'; +import i18n from 'i18next'; +/** + * Describes store with user data + */ +class UserStore { + @observable authorized = false; + + @observable redirectToProjects = false; + + @observable encryptedWallet = ''; + + @observable walletName = ''; + + @observable privateKey = ''; + + @observable _mnemonic = Array(12); + + @observable _mnemonicRepeat = Array(12); + + @observable balance = 0; + + @observable password = ''; + + constructor(rootStore) { + this.rootStore = rootStore; + } + + /** + * saves password to store for decoding wallet and transaction signing + *@param {string} value password from form + */ + @action setPassword(value) { + this.password = value; + } + + /** + * saves v3 keystore and wallet address to store + * @param {object} wallet JSON Keystore V3 + */ + @action setEncryptedWallet(wallet) { + this.encryptedWallet = wallet; + } + + /** + * checking Ethereum balance for given address + * @param {string} address wallet adddress + * @returns {Promise} resolves with balance rounded to 5 decimal places + */ + @action checkBalance(address) { + const { Web3Service: { web3 } } = this.rootStore; + return new Promise((resolve, reject) => { + web3.eth.getBalance(address).then((balance) => { + resolve(Number(web3.utils.fromWei(balance)).toFixed(5)); + }).catch(() => { reject(); }); + }); + } + + /** + * create wallet by given password + * @param {string} password password which will be used for wallet decrypting + * @return {Promise} resolves on success with {v3wallet, mnemonic, privateKey, walletName} + */ + @action createWallet(password) { + return new Promise((resolve, reject) => { + this.rootStore.walletService.createWallet(password).then((data) => { + if (data.v3wallet) { + const { + v3wallet, mnemonic, privateKey, walletName, + } = data; + this.setEncryptedWallet(v3wallet); + this.setWalletName(walletName); + this.setMnemonic(mnemonic); + this.privateKey = privateKey; + resolve(true); + } else { + reject(new Error('Error on creating wallet')); + } + }); + }); + } + + /** + * recovering wallet by mnemonic + * @param {string} password + * @returns {Promise} resolves with {v3wallet, privateKey} + */ + @action recoverWallet() { + const seed = this._mnemonicRepeat.join(' '); + return new Promise((resolve, reject) => { + this.rootStore.walletService.createWallet(undefined, seed).then((data) => { + if (data.v3wallet) { + const { + v3wallet, mnemonic, privateKey, walletName, + } = data; + this.setEncryptedWallet(v3wallet); + this.setWalletName(walletName); + this.setMnemonic(mnemonic); + this.privateKey = privateKey; + resolve(data); + } else { + reject(new Error('Error on creating wallet')); + } + }); + }); + } + + /** + * method for authorize wallet for working with projects + * @param {string} password password for wallet + * @returns {Promise} resolve on success authorization + */ + @action login(password) { + const { appStore } = this.rootStore; + return this.readWallet(password) + .then((data) => { + this.privateKey = data.privateKey; + this.setEncryptedWallet(JSON.parse(data.wallet)); + this.authorized = true; + Promise.resolve(); + }).catch(() => { + appStore.displayAlert(i18n.t('errors:wrongPassword'), 3000); + Promise.reject(); + }); + } + + /** + * read wallet for any operations with it + * @param {string} password password for wallet + * @returns {Promise} resolves with object {v3wallet, privateKey} + */ + + @action readWallet(password) { + const wallet = JSON.stringify(this.encryptedWallet); + return new Promise((resolve, reject) => { + this.rootStore.walletService.readWallet(wallet, password).then((data) => { + if (data.privateKey !== null) { + resolve(data); + } else { + reject(); + } + }).catch(() => { + reject(); + }); + }); + } + + /** + * saves wallet to file by generated name + */ + @action saveWalletToFile() { + const { walletService, appStore } = this.rootStore; + walletService.writeWalletToFile(this.encryptedWallet, this.walletName); + appStore.readWalletList(); + } + + /** + * checks is seed valid with walletService + * @param {string} mnemonic mnemonic + * @returns {bool} is valid + */ + @action isSeedValid(mnemonic) { + const { walletService } = this.rootStore; + return walletService.validateMnemonic(mnemonic); + } + + /** + * Signing transactions with private key + * @function + * @param {string} data rawTx + * @param {string} password password which was used to encode Keystore V3 + * @return Signed TX data + */ + @action singTransaction(data, password) { + return new Promise((resolve) => { + // eslint-disable-next-line consistent-return + this.readWallet(password).then((info) => { + if (info instanceof Error) return false; + const privateKey = Buffer.from( + info.privateKey, + 'hex', + ); + const tx = new Tx(data, { chain: 'ropsten' }); + tx.sign(privateKey); + const serialized = tx.serialize().toString('hex'); + resolve(serialized); + }); + }); + } + + /** + * Sending transaction from user + * @function + * @param {string} txData Raw transaction + */ + @action sendTransaction(txData) { + return (this.balance, txData); + } + + /** + * Getting user Ethereum balance + * @return {number} balance in ETH + */ + @action async getEthBalance() { + const { Web3Service: { web3 } } = this.rootStore; + this.balance = await web3.eth.getBalance(this.address); + } + + @action setMnemonic(value) { + this._mnemonic = value.split(' '); + } + + @action setMnemonicRepeat(value) { + this._mnemonicRepeat = value; + } + + @action setWalletName(name) { + this.walletName = name; + } + + @computed get address() { + const { encryptedWallet } = this; + return `0x${encryptedWallet.address}`; + } + + @computed get mnemonic() { + return this._mnemonic; + } +} + +export default UserStore; diff --git a/src/stores/UserStore/index.js b/src/stores/UserStore/index.js new file mode 100644 index 00000000..2d7459c2 --- /dev/null +++ b/src/stores/UserStore/index.js @@ -0,0 +1,3 @@ +import UserStore from './UserStore'; + +export default UserStore; diff --git a/src/stores/UsergroupStore/UsergroupStore.js b/src/stores/UsergroupStore/UsergroupStore.js new file mode 100644 index 00000000..0040f26e --- /dev/null +++ b/src/stores/UsergroupStore/UsergroupStore.js @@ -0,0 +1,82 @@ +import { observable, action } from 'mobx'; +/** + * class for working with userGroup + */ +class UsergroupStore { + @observable id = ''; + + @observable alias = ''; + + @observable description = ''; + + @observable address = ''; + + @observable totalSupply = 0; + + @observable tokenSymbol = ''; + + @observable tokenType = ''; + + @observable usersList = []; + + /** + * @constructor + * @param {object} groupInfo Contains info about group + * @param {string} groupInfo.id id of usergroup + * @param {string} groupInfo.alias Name of the group in contract + * @param {string} groupInfo.description Description about userGroup + * @param {string} groupInfo.address Address of smart-contract + * @param {number} groupInfo.totalSupply Total token balance of smart-contract + * @param {string} groupInfo.tokenSymbol Short token symbol + * @param {Array} groupInfo.usersList List of users + */ + constructor({ + id, alias, description, address, totalSupply, tokenSymbol, tokenType, usersList, + }) { + this.id = id; + this.alias = alias; + this.description = description; + this.address = address; + this.totalSupply = totalSupply; + this.tokenSymbol = tokenSymbol; + this.tokenType = tokenType; + this.usersList = usersList; + } + + /** + * Getting user token balance from contract + * @function + * @param {string} address Address of user + */ + @action getUserBalance = async (address) => { + /* web3.eth.getBalance(address).call({from:'userAddress'}) + .then((balance) => { + this.addUser(address, balance); + }) */ + this.address = address; + return (this.address, address); + } + + /** + * Adding user with his balance into array + * @function + * @param {string} address Address of user wallet + * @param {number} tokenBalance user token balance in this usergroup + */ + @action addUser = (address, tokenBalance) => { + const { groupInfo } = this; + groupInfo.usersList.push({ address, tokenBalance }); + } + + /** + * Transfering tokens between users + * @param {string} from address, who will send tokens + * @param {address} to address, who will recieve tokens + * @param {number} count number of tokens + */ + @action transferTokens(from, to, count) { + return (this.tokenType, from, to, count); + } +} + +export default UsergroupStore; diff --git a/src/stores/UsergroupStore/index.js b/src/stores/UsergroupStore/index.js new file mode 100644 index 00000000..ff9e845b --- /dev/null +++ b/src/stores/UsergroupStore/index.js @@ -0,0 +1,3 @@ +import UsergroupStore from './UsergroupStore'; + +export default UsergroupStore; diff --git a/src/utils/PasswordValidation/PasswordValidation.test.js b/src/utils/PasswordValidation/PasswordValidation.test.js new file mode 100644 index 00000000..6327679d --- /dev/null +++ b/src/utils/PasswordValidation/PasswordValidation.test.js @@ -0,0 +1,93 @@ +/* eslint-disable no-undef */ +import passwordValidation from './index'; + +describe('test for password validation', () => { + test('password T3sting!', () => { + const validity = passwordValidation('T3sting!'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password 123!@#qweQWE', () => { + const validity = passwordValidation('123!@#qweQWE'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password T3st!ng', () => { + const validity = passwordValidation('T3st!ng'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password t3sT!ng!', () => { + const validity = passwordValidation('t3sT!ng!'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password T#st1ng', () => { + const validity = passwordValidation('T#st1ng'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(false); + expect(validity.Length).toBe(true); + }); + test('password !@#qwe123QWE', () => { + const validity = passwordValidation('!@#qwe123QWE'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password qwe123QWE', () => { + const validity = passwordValidation('qwe123QWE'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(false); + expect(validity.Length).toBe(true); + }); + test('password QWE123QWE', () => { + const validity = passwordValidation('QWE123QWE'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(false); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(false); + expect(validity.Length).toBe(true); + }); + test('password testtin!', () => { + const validity = passwordValidation('testtin!'); + expect(validity.High).toBe(false); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(false); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password !qwe1!2', () => { + const validity = passwordValidation('!qwe1!2'); + expect(validity.High).toBe(false); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(true); + }); + test('password !@Qq2', () => { + const validity = passwordValidation('!@Qq2'); + expect(validity.High).toBe(true); + expect(validity.Low).toBe(true); + expect(validity.Num).toBe(true); + expect(validity.Char).toBe(true); + expect(validity.Length).toBe(false); + }); +}); diff --git a/src/utils/PasswordValidation/index.js b/src/utils/PasswordValidation/index.js new file mode 100644 index 00000000..f2e2af90 --- /dev/null +++ b/src/utils/PasswordValidation/index.js @@ -0,0 +1,19 @@ +const passwordValidation = (value) => { + const regexHigh = new RegExp(/^(?=[^A-Z]*[A-Z]).{1,}$/g); + const regexLow = new RegExp(/^(?=[^a-z]*[a-z]).{1,}$/g); + const regexNum = new RegExp(/^(?=[^0-9]*[0-9]).{1,}$/g); + const regexChar = new RegExp(/^(?=.*[!&$%&? "]).{1,}$/g); + const regexLength = new RegExp(/^.{6,}$/g); + + const values = { + High: regexHigh.test(value), + Low: regexLow.test(value), + Num: regexNum.test(value), + Char: regexChar.test(value), + Length: regexLength.test(value), + }; + + return values; +}; + +export default passwordValidation; diff --git a/src/utils/Validator/index.js b/src/utils/Validator/index.js new file mode 100644 index 00000000..cf5d328e --- /dev/null +++ b/src/utils/Validator/index.js @@ -0,0 +1,54 @@ +import validatorjs from 'validatorjs'; +import i18n from 'i18next'; + +validatorjs.prototype.setAttributeNames = function setAttributeNames(attributes) { + if (!attributes) return; + const modified = { ...attributes }; + const keys = Object.keys(modified); + for (let i = 0; i < keys.length; i += 1) { + const attribute = keys[i]; + modified[attribute] = modified[attribute].toLowerCase(); + } + this.messages._setAttributeNames(modified); +}; + +const rules = { + password: { + function: (value) => value.match(/(?=.*[!@#$%^&*()_\-+=~])+(?=[a-z]*[A-Z]*[0-9]).{6,}/g), + }, + address: { + function: (value) => value.match(/(0x)+([0-9 a-f A-F]){40}/g), + }, +}; + +const plugins = { + dvr: { + package: validatorjs, + extend: ({ validator }) => { + const { language } = i18n; + const languages = { + RUS: 'ru', + ENG: 'en', + }; + Object.keys(rules).forEach( + (key) => validator.register(key, rules[key].function, rules[key].message), + ); + validator.useLang(languages[language]); + validator.setMessages('en', { + required: 'The field is required.', + same: 'Fields must be same', + password: 'Field value not valid', + address: 'Enter valid address', + }); + validator.setMessages('ru', { + required: 'Обязательное поле', + same: 'Поля должны содержать одинаковые значения', + password: 'Пароль не соответствует требованиям', + address: 'Введите валидный адрес', + }); + validator.stopOnError(true); + }, + }, +}; + +export default plugins; diff --git a/src/utils/fileUtils/get-sol-imports.js b/src/utils/fileUtils/get-sol-imports.js new file mode 100644 index 00000000..04adb9da --- /dev/null +++ b/src/utils/fileUtils/get-sol-imports.js @@ -0,0 +1,7 @@ +import { SOL_PATH_REGEXP } from '../../constants'; + +const getImports = (file) => { + const files = file.match(SOL_PATH_REGEXP); + return files ? files.map((singleFile) => singleFile.replace(new RegExp(/('|")/g), '')) : []; +}; +export default getImports; diff --git a/src/utils/fileUtils/index.js b/src/utils/fileUtils/index.js new file mode 100644 index 00000000..c336eb01 --- /dev/null +++ b/src/utils/fileUtils/index.js @@ -0,0 +1,27 @@ +import { SOL_IMPORT_REGEXP, SOL_VERSION_REGEXP } from '../../constants'; +import getImports from './get-sol-imports'; +import { fs, path } from '../../constants/windowModules'; + +const readSolFile = (src, importedFiles) => { + let mainImport; + if (!fs.existsSync(src)) throw new Error(`${src} - file not exist`); + mainImport = fs.readFileSync(src, 'utf8'); + const importList = getImports(mainImport); + const currentFolder = src.replace(/(((\.\/|\.\.\/)).{1,})*([a-zA-z0-9])*(\.sol)/g, ''); + importList.forEach((file) => { + const pathToFile = path.join(currentFolder, file); + if (!importedFiles[pathToFile] && (pathToFile !== src)) { + const includedFile = (readSolFile(pathToFile, importedFiles)).replace(SOL_VERSION_REGEXP, ''); + if (mainImport.match(SOL_IMPORT_REGEXP)) { + mainImport = mainImport.replace(mainImport.match(SOL_IMPORT_REGEXP)[0], includedFile); + } + // eslint-disable-next-line no-param-reassign + importedFiles[pathToFile] = true; + } else { + mainImport = mainImport.replace(mainImport.match(SOL_IMPORT_REGEXP)[0], ''); + } + }); + return mainImport; +}; + +export default readSolFile; diff --git a/src/wallets/UTC--2019-1-1T6-5-3.742000000Z--68c0c7f9534e7b5fde6a4ca6b00b4ed5b958242a.json b/src/wallets/UTC--2019-1-1T6-5-3.742000000Z--68c0c7f9534e7b5fde6a4ca6b00b4ed5b958242a.json new file mode 100644 index 00000000..96580a4f --- /dev/null +++ b/src/wallets/UTC--2019-1-1T6-5-3.742000000Z--68c0c7f9534e7b5fde6a4ca6b00b4ed5b958242a.json @@ -0,0 +1,21 @@ +{ + "version": 3, + "id": "64e03561-1a74-474b-8bfd-9206eae53988", + "address": "68c0c7f9534e7b5fde6a4ca6b00b4ed5b958242a", + "crypto": { + "ciphertext": "f6bd467b54b27b0e5729c32ababd3d763a7b38e78f1056d030b46c6154ce415b", + "cipherparams": { + "iv": "3b940ff76645df9cd3934996d0fca5a7" + }, + "cipher": "aes-128-ctr", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "salt": "5ec5a11747e931e50fe2be4682c18225c18d794fab9253da6a4245c3b012d5e4", + "n": 262144, + "r": 8, + "p": 1 + }, + "mac": "beb40dd71f9c1b5cdff29f19b7d7bde1c93235b7a1201649a068d7ff0301f6d9" + } +} \ No newline at end of file diff --git a/src/wallets/UTC--2019-11-29T07-19-05.154Z--7f51b0660a89f459a46313f391b4521963a8e5b7.json b/src/wallets/UTC--2019-11-29T07-19-05.154Z--7f51b0660a89f459a46313f391b4521963a8e5b7.json new file mode 100644 index 00000000..08f07869 --- /dev/null +++ b/src/wallets/UTC--2019-11-29T07-19-05.154Z--7f51b0660a89f459a46313f391b4521963a8e5b7.json @@ -0,0 +1,21 @@ +{ + "version": 3, + "id": "fc76e19f-f0cd-443a-a275-869053e418c7", + "address": "7f51b0660a89f459a46313f391b4521963a8e5b7", + "crypto": { + "ciphertext": "56953182a01baba41d0b8c5bde3ea1056696ff8b748944a5738519aabfc1184b", + "cipherparams": { + "iv": "2536ee3ec7985c1b708f1b97c5fdb1af" + }, + "cipher": "aes-128-ctr", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "salt": "258cd6b009cd9cf397b18040f4871ddeead4cf3c6c781ccfafec83b8ff3c5229", + "n": 262144, + "r": 8, + "p": 1 + }, + "mac": "9908077786372dcb21cffe114b92b942a2568e92c6c6b184d8eb1f7512414a86" + } +} \ No newline at end of file diff --git a/src/wallets/UTC--2019-14-4T2-19-16.914000000Z--f6676e5138576e61b058b36fb3d2de089edc39b9.json b/src/wallets/UTC--2019-14-4T2-19-16.914000000Z--f6676e5138576e61b058b36fb3d2de089edc39b9.json new file mode 100644 index 00000000..bc543d96 --- /dev/null +++ b/src/wallets/UTC--2019-14-4T2-19-16.914000000Z--f6676e5138576e61b058b36fb3d2de089edc39b9.json @@ -0,0 +1,21 @@ +{ + "version": 3, + "id": "ef8113ac-160d-4504-ad90-a2357d017a2b", + "address": "f6676e5138576e61b058b36fb3d2de089edc39b9", + "crypto": { + "ciphertext": "05d6c307d57c210dd68bf85232d754127bf55420bd35f9d08454a20e08bcd759", + "cipherparams": { + "iv": "8de293d09e53249324e414c5ba3e38a7" + }, + "cipher": "aes-128-ctr", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "salt": "ae15fb2ae0160cbaec8af14d832877955537720805385ffacc15fccea34b913c", + "n": 262144, + "r": 8, + "p": 1 + }, + "mac": "f07befdb5f801d71ff5d79874e1fae3b6937cfc47855a3c45a9d1ed428c1ed1c" + } +} \ No newline at end of file diff --git a/src/wallets/UTC--2019-7-2T4-27-20.179000000Z--298e231fcf67b4aa9f41f902a5c5e05983e1d5f8.json b/src/wallets/UTC--2019-7-2T4-27-20.179000000Z--298e231fcf67b4aa9f41f902a5c5e05983e1d5f8.json new file mode 100644 index 00000000..58e8ece9 --- /dev/null +++ b/src/wallets/UTC--2019-7-2T4-27-20.179000000Z--298e231fcf67b4aa9f41f902a5c5e05983e1d5f8.json @@ -0,0 +1 @@ +{"version":3,"id":"aed48d31-3fca-416c-b447-4caa56e96bd6","address":"298e231fcf67b4aa9f41f902a5c5e05983e1d5f8","crypto":{"ciphertext":"50afcb1841086a14b91d67a3a9716299a22e71d656e8df63f2f656051426cae3","cipherparams":{"iv":"add6992cb6ec386cd91f329ce7575401"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"3559497243cf424c4cdcf9800add95e5a99a58377b2d02f86bc83671a46f4798","n":262144,"r":8,"p":1},"mac":"f3af3424826a6ea75f549c5261a719e28c5bb8895e3f779c2fae8f34369afb2d"}} \ No newline at end of file diff --git a/src/workers/wallet.worker.js b/src/workers/wallet.worker.js new file mode 100644 index 00000000..48cd767b --- /dev/null +++ b/src/workers/wallet.worker.js @@ -0,0 +1,71 @@ +import { walletHdPath } from '../constants'; + +const ejsWallet = require('ethereumjs-wallet'); +const hdKey = require('ethereumjs-wallet/hdkey'); +const bip39 = require('bip39'); + +const createWallet = ({ id, payload: { mnemonic, password = '', action } }) => { + try { + const wallet = hdKey.fromMasterSeed(bip39.mnemonicToSeedSync(mnemonic)) + .derivePath(walletHdPath) + .deriveChild(0) + .getWallet(); + + const privateKey = wallet.getPrivateKeyString(); + const v3wallet = wallet.toV3(password); + const walletName = wallet.getV3Filename(new Date()); + + const payload = { + action, + privateKey, + wallet, + v3wallet, + mnemonic, + walletName, + }; + return { id, payload }; + } catch (e) { + return { id, payload: { privateKey: null } }; + } +}; + +const readWallet = ({ id, payload: { input, password } }) => { + try { + const wallet = ejsWallet.fromV3(input, password); + const data = { + privateKey: wallet.getPrivateKey(), + wallet: input, + }; + return { id, payload: data }; + } catch (e) { + const data = { + privateKey: null, + error: 'Wrong passphrase', + }; + return { id, payload: data }; + } +}; + +onmessage = (e) => { + const { payload } = e.data; + const { action } = payload; + let response; + + switch (action) { + case 'create': + response = createWallet(e.data); + break; + case 'read': + response = readWallet(e.data); + break; + case 'recover': + response = createWallet(e.data); + break; + default: + response = null; + break; + } + + // eslint-disable-next-line no-restricted-globals + self.postMessage(response); +}; diff --git a/webpack.dev.js b/webpack.dev.js index 5f5e64ee..616ae052 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -33,7 +33,7 @@ module.exports = { rules: [ { test: /\.jsx?$/, - exclude: [/node_modules/], + exclude: [/node_modules/, /\.worker\.js$/], use: [{ loader: 'babel-loader', }, { @@ -101,4 +101,4 @@ module.exports = { }], }], }, -}; \ No newline at end of file +};