diff --git a/client/package-lock.json b/client/package-lock.json index ed248ee..2889f76 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "@hookform/resolvers": "^2.8.1", + "@monaco-editor/react": "^4.3.1", "@svgr/webpack": "^5.5.0", "@tailwindcss/aspect-ratio": "^0.3.0", "@types/axios": "^0.14.0", @@ -17,13 +18,25 @@ "axios": "^0.23.0", "babel-core": "^6.26.3", "babel-preset-react": "^6.24.1", + "chokidar": "^3.5.2", "google-auth-library": "^7.10.1", "googleapis": "^89.0.0", + "highlight.js": "^11.3.1", + "html-react-parser": "^1.4.0", + "markdown-to-jsx": "^7.1.3", + "marked": "^3.0.8", + "monaco-editor": "^0.29.1", "mrm": "^3.0.9", + "node-watch": "^0.7.2", "nodemailer": "^6.7.0", "react": "^17.0.2", + "react-collapse-pane": "^2.0.1", "react-dom": "^17.0.2", + "react-dropzone": "^11.4.2", "react-hook-form": "^7.16.1", + "react-router": "^5.2.1", + "react-router-dom": "^5.3.0", + "react-syntax-highlighter": "^15.4.4", "typesafe-actions": "^5.1.0", "yup": "^0.32.9" }, @@ -38,8 +51,12 @@ "@testing-library/react": "^12.1.2", "@testing-library/react-hooks": "^7.0.2", "@types/jest": "^27.0.2", + "@types/marked": "^3.0.2", "@types/mock-fs": "^4.13.1", - "@types/react": "^17.0.24", + "@types/react": "^17.0.33", + "@types/react-router": "^5.1.17", + "@types/react-router-dom": "^5.3.2", + "@types/react-syntax-highlighter": "^13.5.2", "autoprefixer": "^10.3.5", "babel-jest": "^27.2.5", "css-loader": "^6.3.0", @@ -53,6 +70,7 @@ "mini-css-extract-plugin": "^2.3.0", "mock-fs": "^5.1.1", "module-alias": "^2.2.2", + "node-loader": "^2.0.0", "postcss-cli": "^8.3.1", "postcss-loader": "^6.1.1", "prettier": "2.4.1", @@ -1886,6 +1904,34 @@ "global-tunnel-ng": "^2.7.1" } }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@hookform/resolvers": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.8.1.tgz", @@ -2210,6 +2256,175 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@material-ui/core": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", + "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/styles/node_modules/csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + }, + "node_modules/@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/system/node_modules/csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + }, + "node_modules/@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.2.0.tgz", + "integrity": "sha512-cJVCG/T/KxXgzYnjKqyAgsKDbH9mGLjcXxN6AmwumBwa2rVFkwvGcUj1RJtD0ko4XqLqJxwqsN/Z/KURB5f1OQ==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.3.1.tgz", + "integrity": "sha512-f+0BK1PP/W5I50hHHmwf11+Ea92E5H1VZXs+wvKplWUWOfyMa1VVwqkJrXjRvbcqHL+XdIGYWhWNdi4McEvnZg==", + "dependencies": { + "@monaco-editor/loader": "^1.2.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -2712,6 +2927,20 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz", + "integrity": "sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ==", + "dev": true + }, "node_modules/@types/html-minifier-terser": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", @@ -2769,6 +2998,12 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==" }, + "node_modules/@types/marked": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-3.0.2.tgz", + "integrity": "sha512-mGYI9qFs+i5eYaytWKBbtEMbIkrXGKuhsDpDcj70ogKS2gk1NmgEy9Z3VEKz922Lfms6eITXXqv5idlX7C/irw==", + "dev": true + }, "node_modules/@types/mock-fs": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.1.tgz", @@ -2806,9 +3041,9 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "node_modules/@types/react": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.24.tgz", - "integrity": "sha512-eIpyco99gTH+FTI3J7Oi/OH8MZoFMJuztNRimDOJwH4iGIsKV2qkGnk4M9VzlaVWeEEWLWSQRy0FEA0Kz218cg==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.33.tgz", + "integrity": "sha512-pLWntxXpDPaU+RTAuSGWGSEL2FRTNyRQOjSWDke/rxRg14ncsZvx8AKWMWZqvc1UOaJIAoObdZhAWvRaHFi5rw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2823,6 +3058,36 @@ "@types/react": "*" } }, + "node_modules/@types/react-router": { + "version": "5.1.17", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.17.tgz", + "integrity": "sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ==", + "dev": true, + "dependencies": { + "@types/history": "*", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.2.tgz", + "integrity": "sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ==", + "dev": true, + "dependencies": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz", + "integrity": "sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-test-renderer": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", @@ -2832,6 +3097,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -2852,6 +3125,11 @@ "@types/jest": "*" } }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, "node_modules/@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -3362,6 +3640,14 @@ "node": ">= 4.5.0" } }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "engines": { + "node": ">=4" + } + }, "node_modules/autoprefixer": { "version": "10.3.5", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.5.tgz", @@ -3702,6 +3988,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, "node_modules/babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", @@ -4245,6 +4545,11 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, "node_modules/caniuse-lite": { "version": "1.0.30001260", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001260.tgz", @@ -4289,6 +4594,33 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -4496,6 +4828,14 @@ "mimic-response": "^1.0.0" } }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4641,6 +4981,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -4836,6 +5185,14 @@ "source-map-resolve": "^0.6.0" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=", + "engines": { + "node": ">=4" + } + }, "node_modules/css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -4924,6 +5281,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -4941,6 +5308,15 @@ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "node_modules/css-what": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", @@ -5244,11 +5620,19 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -5294,7 +5678,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "dev": true, "dependencies": { "domelementtype": "^2.2.0" }, @@ -5309,7 +5692,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -5889,6 +6271,18 @@ "reusify": "^1.0.4" } }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -5949,6 +6343,22 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-selector": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", + "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/file-selector/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -6005,6 +6415,14 @@ "node": ">= 6" } }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/fraction.js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", @@ -6577,6 +6995,31 @@ "node": ">=8" } }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -6591,6 +7034,40 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "node_modules/highlight.js": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.3.1.tgz", + "integrity": "sha512-PUhCRnPjLtiLHZAQ5A/Dt5F8cWZeMyj9KRsACsWT+OD6OP0x6dp5OmT5jdx0JgEyPxPZZIPQpRN2TciUT7occw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -6629,6 +7106,15 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, + "node_modules/html-dom-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.0.2.tgz", + "integrity": "sha512-Jq4oVkVSn+10ut3fyc2P/Fs1jqTo0l45cP6Q8d2ef/9jfkYwulO0QXmyLI0VUiZrXF4czpGgMEJRa52CQ6Fk8Q==", + "dependencies": { + "domhandler": "4.2.2", + "htmlparser2": "6.1.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -6700,6 +7186,20 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/html-react-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.0.tgz", + "integrity": "sha512-v8Kxy+7L90ZFSM690oJWBNRzZWZOQquYPpQt6kDQPzQyZptXgOJ69kHSi7xdqNdm1mOfsDPwF4K9Bo/dS5gRTQ==", + "dependencies": { + "domhandler": "4.2.2", + "html-dom-parser": "1.0.2", + "react-property": "2.0.0", + "style-to-js": "1.1.0" + }, + "peerDependencies": { + "react": "0.14 || 15 || 16 || 17" + } + }, "node_modules/html-tags": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", @@ -6748,7 +7248,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -6818,6 +7317,11 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6955,6 +7459,11 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -7008,6 +7517,28 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7110,6 +7641,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -7173,6 +7713,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "node_modules/is-installed-globally": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", @@ -8398,8 +8952,90 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jwa": { - "version": "2.0.0", + "node_modules/jss": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.8.2.tgz", + "integrity": "sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz", + "integrity": "sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.8.2" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz", + "integrity": "sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz", + "integrity": "sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz", + "integrity": "sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz", + "integrity": "sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz", + "integrity": "sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz", + "integrity": "sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.8.2" + } + }, + "node_modules/jwa": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", "dependencies": { @@ -9180,6 +9816,27 @@ "node": ">=0.10.0" } }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lowlight/node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, "node_modules/lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -9227,6 +9884,28 @@ "tmpl": "1.0.x" } }, + "node_modules/markdown-to-jsx": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.3.tgz", + "integrity": "sha512-jtQ6VyT7rMT5tPV0g2EJakEnXLiPksnvlYtwQsVVZ611JsWGN8bQ1tVSDX4s6JllfEH6wmsYxNjTUAMrPmNA8w==", + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -9325,6 +10004,19 @@ "node": ">=4" } }, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", @@ -9397,6 +10089,11 @@ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", "dev": true }, + "node_modules/monaco-editor": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.29.1.tgz", + "integrity": "sha512-rguaEG/zrPQSaKzQB7IfX/PpNa0qxF1FY8ZXRkN4WIl8qZdTQRSRJCtRto7IMcSgrU6H53RXI+fTcywOBC4aVw==" + }, "node_modules/mrm": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/mrm/-/mrm-3.0.9.tgz", @@ -9568,6 +10265,25 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "node_modules/node-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", + "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -9582,6 +10298,14 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" }, + "node_modules/node-watch": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz", + "integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==", + "engines": { + "node": ">=6" + } + }, "node_modules/nodemailer": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.0.tgz", @@ -9912,6 +10636,23 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-git-config": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", @@ -10028,6 +10769,19 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -10085,6 +10839,11 @@ "node": ">=8" } }, + "node_modules/popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, "node_modules/postcss": { "version": "8.3.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.8.tgz", @@ -10541,6 +11300,11 @@ "node": ">= 0.8" } }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, "node_modules/private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -10585,11 +11349,38 @@ "extend": "^3.0.0" } }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/property-expr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -10747,6 +11538,21 @@ "node": ">=0.10.0" } }, + "node_modules/react-collapse-pane": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-collapse-pane/-/react-collapse-pane-2.0.1.tgz", + "integrity": "sha512-6D95mymzY+NFKDkvjBGgsRNYbcSdLeY3Af7ll+IfIKh7dAmHyqKFh6cGj4sueVdxWoAgtbagiIeRgRcX/rYXUA==", + "dependencies": { + "@material-ui/core": "^4.11.4", + "styled-components": "^5.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16" + } + }, "node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -10760,6 +11566,22 @@ "react": "17.0.2" } }, + "node_modules/react-dropzone": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.4.2.tgz", + "integrity": "sha512-ocYzYn7Qgp0tFc1gQtUTOaHHSzVTwhWHxxY+r7cj2jJTPfMTZB5GWSJHdIVoxsl+EQENpjJ/6Zvcw0BqKZQ+Eg==", + "dependencies": { + "attr-accept": "^2.2.1", + "file-selector": "^0.2.2", + "prop-types": "^15.7.2" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 16.8" + } + }, "node_modules/react-error-boundary": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.3.tgz", @@ -10791,8 +11613,92 @@ "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, + "node_modules/react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-syntax-highlighter": { + "version": "15.4.4", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz", + "integrity": "sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.22.0", + "refractor": "^3.2.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-syntax-highlighter/node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } }, "node_modules/read-cache": { "version": "1.0.0", @@ -10891,6 +11797,20 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, + "node_modules/refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -11100,6 +12020,11 @@ "node": ">=8" } }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "node_modules/resolve.exports": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", @@ -11372,6 +12297,11 @@ "node": ">=8" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -11491,6 +12421,15 @@ "source-map": "^0.6.0" } }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/split-lines": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz", @@ -11535,6 +12474,11 @@ "node": ">=8" } }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -11672,6 +12616,70 @@ "webpack": "^5.0.0" } }, + "node_modules/style-to-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.0.tgz", + "integrity": "sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA==", + "dependencies": { + "style-to-object": "0.3.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -12126,6 +13134,16 @@ "node": ">=0.10.0" } }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -12752,6 +13770,11 @@ "builtins": "^1.0.3" } }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -14579,6 +15602,34 @@ "sumchecker": "^3.0.1" } }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "@hookform/resolvers": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.8.1.tgz", @@ -14836,6 +15887,106 @@ "chalk": "^4.0.0" } }, + "@material-ui/core": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.3.tgz", + "integrity": "sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" + } + }, + "@material-ui/styles": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.5.1", + "jss-plugin-camel-case": "^10.5.1", + "jss-plugin-default-unit": "^10.5.1", + "jss-plugin-global": "^10.5.1", + "jss-plugin-nested": "^10.5.1", + "jss-plugin-props-sort": "^10.5.1", + "jss-plugin-rule-value-function": "^10.5.1", + "jss-plugin-vendor-prefixer": "^10.5.1", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + } + } + }, + "@material-ui/system": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", + "prop-types": "^15.7.2" + }, + "dependencies": { + "csstype": { + "version": "2.6.18", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.18.tgz", + "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==" + } + } + }, + "@material-ui/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} + }, + "@material-ui/utils": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0 || ^17.0.0" + } + }, + "@monaco-editor/loader": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.2.0.tgz", + "integrity": "sha512-cJVCG/T/KxXgzYnjKqyAgsKDbH9mGLjcXxN6AmwumBwa2rVFkwvGcUj1RJtD0ko4XqLqJxwqsN/Z/KURB5f1OQ==", + "requires": { + "state-local": "^1.0.6" + } + }, + "@monaco-editor/react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.3.1.tgz", + "integrity": "sha512-f+0BK1PP/W5I50hHHmwf11+Ea92E5H1VZXs+wvKplWUWOfyMa1VVwqkJrXjRvbcqHL+XdIGYWhWNdi4McEvnZg==", + "requires": { + "@monaco-editor/loader": "^1.2.0", + "prop-types": "^15.7.2" + } + }, "@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -15183,6 +16334,20 @@ "@types/node": "*" } }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/history": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz", + "integrity": "sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ==", + "dev": true + }, "@types/html-minifier-terser": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", @@ -15240,6 +16405,12 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.175.tgz", "integrity": "sha512-XmdEOrKQ8a1Y/yxQFOMbC47G/V2VDO1GvMRnl4O75M4GW/abC5tnfzadQYkqEveqRM1dEJGFFegfPNA2vvx2iw==" }, + "@types/marked": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-3.0.2.tgz", + "integrity": "sha512-mGYI9qFs+i5eYaytWKBbtEMbIkrXGKuhsDpDcj70ogKS2gk1NmgEy9Z3VEKz922Lfms6eITXXqv5idlX7C/irw==", + "dev": true + }, "@types/mock-fs": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.1.tgz", @@ -15277,9 +16448,9 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "@types/react": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.24.tgz", - "integrity": "sha512-eIpyco99gTH+FTI3J7Oi/OH8MZoFMJuztNRimDOJwH4iGIsKV2qkGnk4M9VzlaVWeEEWLWSQRy0FEA0Kz218cg==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.33.tgz", + "integrity": "sha512-pLWntxXpDPaU+RTAuSGWGSEL2FRTNyRQOjSWDke/rxRg14ncsZvx8AKWMWZqvc1UOaJIAoObdZhAWvRaHFi5rw==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -15294,6 +16465,36 @@ "@types/react": "*" } }, + "@types/react-router": { + "version": "5.1.17", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.17.tgz", + "integrity": "sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*" + } + }, + "@types/react-router-dom": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.2.tgz", + "integrity": "sha512-ELEYRUie2czuJzaZ5+ziIp9Hhw+juEw8b7C11YNA4QdLCVbQ3qLi2l4aq8XnlqM7V31LZX8dxUuFUCrzHm6sqQ==", + "dev": true, + "requires": { + "@types/history": "*", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-syntax-highlighter": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.2.tgz", + "integrity": "sha512-sRZoKZBGKaE7CzMvTTgz+0x/aVR58ZYUTfB7HN76vC+yQnvo1FWtzNARBt0fGqcLGEVakEzMu/CtPzssmanu8Q==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-test-renderer": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz", @@ -15303,6 +16504,14 @@ "@types/react": "*" } }, + "@types/react-transition-group": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.4.tgz", + "integrity": "sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==", + "requires": { + "@types/react": "*" + } + }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -15323,6 +16532,11 @@ "@types/jest": "*" } }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, "@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -15745,6 +16959,11 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" + }, "autoprefixer": { "version": "10.3.5", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.5.tgz", @@ -16020,6 +17239,17 @@ "@babel/helper-define-polyfill-provider": "^0.2.2" } }, + "babel-plugin-styled-components": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.3.tgz", + "integrity": "sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-module-imports": "^7.15.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11" + } + }, "babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", @@ -16471,6 +17701,11 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, + "camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, "caniuse-lite": { "version": "1.0.30001260", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001260.tgz", @@ -16499,6 +17734,21 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -16663,6 +17913,11 @@ "mimic-response": "^1.0.0" } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -16782,6 +18037,11 @@ "delayed-stream": "~1.0.0" } }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -16942,6 +18202,11 @@ "source-map-resolve": "^0.6.0" } }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" + }, "css-color-names": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", @@ -17007,6 +18272,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -17021,6 +18296,15 @@ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" }, + "css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "requires": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, "css-what": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", @@ -17254,11 +18538,19 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -17291,7 +18583,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", - "dev": true, "requires": { "domelementtype": "^2.2.0" } @@ -17300,7 +18591,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -17745,6 +19035,14 @@ "reusify": "^1.0.4" } }, + "fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "requires": { + "format": "^0.2.0" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -17788,6 +19086,21 @@ "schema-utils": "^3.0.0" } }, + "file-selector": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", + "integrity": "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA==", + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -17821,6 +19134,11 @@ "mime-types": "^2.1.12" } }, + "format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=" + }, "fraction.js": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", @@ -18239,6 +19557,23 @@ "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -18250,6 +19585,39 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "highlight.js": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.3.1.tgz", + "integrity": "sha512-PUhCRnPjLtiLHZAQ5A/Dt5F8cWZeMyj9KRsACsWT+OD6OP0x6dp5OmT5jdx0JgEyPxPZZIPQpRN2TciUT7occw==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -18282,6 +19650,15 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, + "html-dom-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-1.0.2.tgz", + "integrity": "sha512-Jq4oVkVSn+10ut3fyc2P/Fs1jqTo0l45cP6Q8d2ef/9jfkYwulO0QXmyLI0VUiZrXF4czpGgMEJRa52CQ6Fk8Q==", + "requires": { + "domhandler": "4.2.2", + "htmlparser2": "6.1.0" + } + }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -18339,6 +19716,17 @@ } } }, + "html-react-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-1.4.0.tgz", + "integrity": "sha512-v8Kxy+7L90ZFSM690oJWBNRzZWZOQquYPpQt6kDQPzQyZptXgOJ69kHSi7xdqNdm1mOfsDPwF4K9Bo/dS5gRTQ==", + "requires": { + "domhandler": "4.2.2", + "html-dom-parser": "1.0.2", + "react-property": "2.0.0", + "style-to-js": "1.1.0" + } + }, "html-tags": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", @@ -18374,7 +19762,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -18419,6 +19806,11 @@ "integrity": "sha512-8yKEWNX4z2YsofXAMT7KvA1g8p+GxtB1ffV8XtpAEGuXNAbCV5wdNKH+qTpw8SM9fh4aMPDR+yQuKfgnreyZlg==", "dev": true }, + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -18517,6 +19909,11 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -18561,6 +19958,20 @@ "loose-envify": "^1.0.0" } }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -18633,6 +20044,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -18672,6 +20088,16 @@ "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + }, "is-installed-globally": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", @@ -19618,6 +21044,84 @@ "graceful-fs": "^4.1.6" } }, + "jss": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.8.2.tgz", + "integrity": "sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz", + "integrity": "sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.8.2" + } + }, + "jss-plugin-default-unit": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz", + "integrity": "sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2" + } + }, + "jss-plugin-global": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz", + "integrity": "sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2" + } + }, + "jss-plugin-nested": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz", + "integrity": "sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz", + "integrity": "sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz", + "integrity": "sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.8.2", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz", + "integrity": "sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.8.2" + } + }, "jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -20227,6 +21731,22 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "requires": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "dependencies": { + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + } + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -20265,6 +21785,17 @@ "tmpl": "1.0.x" } }, + "markdown-to-jsx": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.3.tgz", + "integrity": "sha512-jtQ6VyT7rMT5tPV0g2EJakEnXLiPksnvlYtwQsVVZ611JsWGN8bQ1tVSDX4s6JllfEH6wmsYxNjTUAMrPmNA8w==", + "requires": {} + }, + "marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==" + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -20339,6 +21870,15 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, "mini-css-extract-plugin": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", @@ -20386,6 +21926,11 @@ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", "dev": true }, + "monaco-editor": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.29.1.tgz", + "integrity": "sha512-rguaEG/zrPQSaKzQB7IfX/PpNa0qxF1FY8ZXRkN4WIl8qZdTQRSRJCtRto7IMcSgrU6H53RXI+fTcywOBC4aVw==" + }, "mrm": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/mrm/-/mrm-3.0.9.tgz", @@ -20540,6 +22085,15 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, + "node-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", + "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0" + } + }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -20551,6 +22105,11 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==" }, + "node-watch": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz", + "integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==" + }, "nodemailer": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.0.tgz", @@ -20792,6 +22351,19 @@ "callsites": "^3.0.0" } }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, "parse-git-config": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", @@ -20883,6 +22455,21 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-to-regexp": { + "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": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -20922,6 +22509,11 @@ "find-up": "^4.0.0" } }, + "popper.js": { + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" + }, "postcss": { "version": "8.3.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.8.tgz", @@ -21231,6 +22823,11 @@ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", @@ -21266,11 +22863,36 @@ "extend": "^3.0.0" } }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "property-expr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.4.tgz", "integrity": "sha512-sFPkHQjVKheDNnPvotjQmm3KD3uk1fWKUN7CrpdbwmUx3CrG3QiM8QpTSimvig5vTXmTvjz7+TDvXOI9+4rkcg==" }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -21382,6 +23004,15 @@ "object-assign": "^4.1.1" } }, + "react-collapse-pane": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/react-collapse-pane/-/react-collapse-pane-2.0.1.tgz", + "integrity": "sha512-6D95mymzY+NFKDkvjBGgsRNYbcSdLeY3Af7ll+IfIKh7dAmHyqKFh6cGj4sueVdxWoAgtbagiIeRgRcX/rYXUA==", + "requires": { + "@material-ui/core": "^4.11.4", + "styled-components": "^5.3.0" + } + }, "react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -21392,6 +23023,16 @@ "scheduler": "^0.20.2" } }, + "react-dropzone": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-11.4.2.tgz", + "integrity": "sha512-ocYzYn7Qgp0tFc1gQtUTOaHHSzVTwhWHxxY+r7cj2jJTPfMTZB5GWSJHdIVoxsl+EQENpjJ/6Zvcw0BqKZQ+Eg==", + "requires": { + "attr-accept": "^2.2.1", + "file-selector": "^0.2.2", + "prop-types": "^15.7.2" + } + }, "react-error-boundary": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.3.tgz", @@ -21410,8 +23051,80 @@ "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, + "react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-syntax-highlighter": { + "version": "15.4.4", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.4.4.tgz", + "integrity": "sha512-PsOFHNTzkb3OroXdoR897eKN5EZ6grht1iM+f1lJSq7/L0YVnkJaNVwC3wEUYPOAmeyl5xyer1DjL6MrumO6Zw==", + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.22.0", + "refractor": "^3.2.0" + }, + "dependencies": { + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" + } + } + }, + "react-transition-group": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } }, "read-cache": { "version": "1.0.0", @@ -21504,6 +23217,16 @@ } } }, + "refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -21669,6 +23392,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve.exports": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", @@ -21862,6 +23590,11 @@ "kind-of": "^6.0.2" } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -21962,6 +23695,11 @@ "source-map": "^0.6.0" } }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, "split-lines": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/split-lines/-/split-lines-2.1.0.tgz", @@ -21996,6 +23734,11 @@ } } }, + "state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -22096,6 +23839,54 @@ "dev": true, "requires": {} }, + "style-to-js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.0.tgz", + "integrity": "sha512-1OqefPDxGrlMwcbfpsTVRyzwdhr4W0uxYQzeA2F1CBc8WG04udg2+ybRnvh3XYL4TdHQrCahLtax2jc8xaE6rA==", + "requires": { + "style-to-object": "0.3.0" + } + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "styled-components": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.3.tgz", + "integrity": "sha512-++4iHwBM7ZN+x6DtPPWkCI4vdtwumQ+inA/DdAsqYd4SVgUKJie5vXyzotA00ttcFdQkCng7zc6grwlfIfw+lw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^0.8.8", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -22435,6 +24226,16 @@ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -22891,6 +24692,11 @@ "builtins": "^1.0.3" } }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/client/package.json b/client/package.json index b44c2db..e82ebee 100644 --- a/client/package.json +++ b/client/package.json @@ -24,8 +24,12 @@ "@testing-library/react": "^12.1.2", "@testing-library/react-hooks": "^7.0.2", "@types/jest": "^27.0.2", + "@types/marked": "^3.0.2", "@types/mock-fs": "^4.13.1", - "@types/react": "^17.0.24", + "@types/react": "^17.0.33", + "@types/react-router": "^5.1.17", + "@types/react-router-dom": "^5.3.2", + "@types/react-syntax-highlighter": "^13.5.2", "autoprefixer": "^10.3.5", "babel-jest": "^27.2.5", "css-loader": "^6.3.0", @@ -39,6 +43,7 @@ "mini-css-extract-plugin": "^2.3.0", "mock-fs": "^5.1.1", "module-alias": "^2.2.2", + "node-loader": "^2.0.0", "postcss-cli": "^8.3.1", "postcss-loader": "^6.1.1", "prettier": "2.4.1", @@ -54,6 +59,7 @@ }, "dependencies": { "@hookform/resolvers": "^2.8.1", + "@monaco-editor/react": "^4.3.1", "@svgr/webpack": "^5.5.0", "@tailwindcss/aspect-ratio": "^0.3.0", "@types/axios": "^0.14.0", @@ -61,13 +67,25 @@ "axios": "^0.23.0", "babel-core": "^6.26.3", "babel-preset-react": "^6.24.1", + "chokidar": "^3.5.2", "google-auth-library": "^7.10.1", "googleapis": "^89.0.0", + "highlight.js": "^11.3.1", + "html-react-parser": "^1.4.0", + "markdown-to-jsx": "^7.1.3", + "marked": "^3.0.8", + "monaco-editor": "^0.29.1", "mrm": "^3.0.9", + "node-watch": "^0.7.2", "nodemailer": "^6.7.0", "react": "^17.0.2", + "react-collapse-pane": "^2.0.1", "react-dom": "^17.0.2", + "react-dropzone": "^11.4.2", "react-hook-form": "^7.16.1", + "react-router": "^5.2.1", + "react-router-dom": "^5.3.0", + "react-syntax-highlighter": "^15.4.4", "typesafe-actions": "^5.1.0", "yup": "^0.32.9" } diff --git a/client/src/app/App.tsx b/client/src/app/App.tsx index 9c73303..a596214 100644 --- a/client/src/app/App.tsx +++ b/client/src/app/App.tsx @@ -9,20 +9,22 @@ import { SideMenu } from '@components/SideMenu'; import { getUser } from '@shared/Api/getUser'; import { useIpcListeners } from './hooks/useIpcListeners'; import { useGoogleDrive } from './hooks/useGoogleDrive'; +import { FileExplorer } from './components/FileExplorer'; +import { Placeholder } from './components/Placeholder'; +import { NotificationArea } from './components/NotificationArea'; +import { SplitPane } from 'react-collapse-pane'; export const editorReducer = (state: EditorState, action: EditorAction) => { switch (action.type) { case 'primarySelect': - return { ...state, primarySelection: action.primarySelection }; + return { ...state, primarySelection: action.primarySelection! }; case 'secondarySelect': - return { ...state, secondarySelection: action.secondarySelection }; - case 'rename': - return { ...state, isRenaming: action.isRenaming }; + return { ...state, secondarySelection: action.secondarySelection! }; } }; export function App() { - const [{ currentNote, notebook }] = useStore(); + const [{ currentFile, notebook }] = useStore(); const [, userDispatch] = useUserStore(); useIpcListeners(); @@ -32,17 +34,34 @@ export function App() { getUser().then(({ user }) => { if (user) userDispatch({ type: 'login', user }); }); - }, [currentNote, notebook]); + }, [currentFile, notebook]); return ( <> -
+
- - + + {notebook ? ( +
+ + + + +
+ ) : ( +
+ + +
+ )}
diff --git a/client/src/app/assets/icons/attachment.svg b/client/src/app/assets/icons/attachment.svg new file mode 100644 index 0000000..0a4b3ea --- /dev/null +++ b/client/src/app/assets/icons/attachment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/app/components/EditorPanel.tsx b/client/src/app/components/EditorPanel.tsx index a9976ff..e4f2911 100644 --- a/client/src/app/components/EditorPanel.tsx +++ b/client/src/app/components/EditorPanel.tsx @@ -3,7 +3,15 @@ import { useEditorPanel } from './editorPanel/useEditorPanel'; import { UIEditorPanel } from './editorPanel/UIEditorPanel'; export function EditorPanel() { - const { fileExplorerVisible } = useEditorPanel(); + const { text, setText, handlePreviewClose, livePreviewVisiable } = + useEditorPanel(); - return ; + return ( + + ); } diff --git a/client/src/app/components/editorPanel/FileExplorer.tsx b/client/src/app/components/FileExplorer.tsx similarity index 63% rename from client/src/app/components/editorPanel/FileExplorer.tsx rename to client/src/app/components/FileExplorer.tsx index 501c843..c3a0aa1 100644 --- a/client/src/app/components/editorPanel/FileExplorer.tsx +++ b/client/src/app/components/FileExplorer.tsx @@ -1,20 +1,13 @@ import React from 'react'; -import { FileSystemItem } from '@types'; import { UIFileExplorer } from './fileExplorer/UIFileExplorer'; - import { useFileExplorer } from './fileExplorer/useFileExplorer'; -interface Props { - items: FileSystemItem[]; -} - -export function FileExplorer({ items }: Props) { +export function FileExplorer() { const { + items, handleAddDirectoryClick, handleAddFileClick, - handleOuterClick, - renameText, - setRenameText + handleOuterClick } = useFileExplorer(); return ( @@ -23,8 +16,6 @@ export function FileExplorer({ items }: Props) { handleAddDirectoryClick={handleAddDirectoryClick} handleAddFileClick={handleAddFileClick} handleOuterClick={handleOuterClick} - renameText={renameText} - setRenameText={setRenameText} /> ); } diff --git a/client/src/app/components/ModalManager.tsx b/client/src/app/components/ModalManager.tsx index 537614f..a9860fd 100644 --- a/client/src/app/components/ModalManager.tsx +++ b/client/src/app/components/ModalManager.tsx @@ -1,52 +1,45 @@ import React from 'react'; +import { ipcRenderer } from 'electron'; +import { Route, useHistory } from 'react-router'; +import { CreateNotebookModal } from './CreateNotebookModal'; import { LoginModal } from './modalManager/LoginModal'; import { RegisterModal } from './modalManager/RegisterModal'; -import { CreateNotebookModal } from './CreateNotebookModal'; -import { ipcRenderer } from 'electron'; -import { useModalStore } from '../hooks'; +import { ResetPasswordModal } from './modalManager/ResetPasswordModal'; import { VerificiationModal } from './modalManager/VerificationModal'; import { TwoFactorAuthModal } from './modalManager/TwoFactorAuthModal'; import { ForgotPasswordModal } from './modalManager/ForgotPasswordModal'; -import { ResetPasswordModal } from './modalManager/ResetPasswordModal'; export function ModalManager() { - const [ - { - loginModalVisible, - registerModalVisible, - createNotebookModalVisible, - verificationModalVisible, - twoFactorAuthModalVisible, - forgotPasswordModalVisible, - resetPasswordModalVisible - }, - modalManagerDispatch - ] = useModalStore(); - + let history = useHistory(); ipcRenderer.on('createNotebook', () => { - modalManagerDispatch({ - type: 'createNotebookModal', - createNotebookModalVisible: true - }); + history.push('/notebook/create'); }); - let render: JSX.Element | null = null; - - if (loginModalVisible) { - render = ; - } else if (registerModalVisible) { - render = ; - } else if (createNotebookModalVisible) { - render = ; - } else if (verificationModalVisible) { - render = ; - } else if (twoFactorAuthModalVisible) { - render = ; - } else if (forgotPasswordModalVisible) { - render = ; - } else if (resetPasswordModalVisible) { - render = ; - } - - return render; + return ( + <> + } + exact + /> + } exact /> + } exact /> + } + exact + /> + } + exact + /> + } + exact + /> + } exact /> + + ); } diff --git a/client/src/app/components/PageManager.tsx b/client/src/app/components/PageManager.tsx index bce9656..95c774b 100644 --- a/client/src/app/components/PageManager.tsx +++ b/client/src/app/components/PageManager.tsx @@ -1,19 +1,16 @@ import React from 'react'; -import { usePageStore } from '@hooks'; import { CloudProviderPage } from './pageManager/cloudProviderPage'; import { SelectCloudProviderPage } from './pageManager/selectCloudProviderPage'; +import { Route } from 'react-router'; export function PageManager() { - const [{ cloudProviderPageVisible, selectCloudProviderPageVisible }] = - usePageStore(); - - let render: JSX.Element | null = null; - - if (cloudProviderPageVisible) { - render = ; - } else if (selectCloudProviderPageVisible) { - render = ; - } - - return render; + return ( + <> + } /> + } + /> + + ); } diff --git a/client/src/app/components/editorPanel/Placeholder.tsx b/client/src/app/components/Placeholder.tsx similarity index 100% rename from client/src/app/components/editorPanel/Placeholder.tsx rename to client/src/app/components/Placeholder.tsx diff --git a/client/src/app/components/SideMenu.tsx b/client/src/app/components/SideMenu.tsx index 1431e78..5a5c1b4 100644 --- a/client/src/app/components/SideMenu.tsx +++ b/client/src/app/components/SideMenu.tsx @@ -7,7 +7,7 @@ import { useStore } from '@hooks'; export function SideMenu() { const [{ notebook }] = useStore(); return ( -
+
{notebook && } diff --git a/client/src/app/components/createNotebookModal/useCreateNotebookModal.ts b/client/src/app/components/createNotebookModal/useCreateNotebookModal.ts index 873a365..d54e9c2 100644 --- a/client/src/app/components/createNotebookModal/useCreateNotebookModal.ts +++ b/client/src/app/components/createNotebookModal/useCreateNotebookModal.ts @@ -1,9 +1,10 @@ -import { useStore, useModalStore } from '@hooks'; +import { useStore } from '@hooks'; import { createNotebook } from '@utils'; import { useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; import fs from 'fs'; import * as yup from 'yup'; +import { useHistory } from 'react-router'; interface FormValues { name: string; @@ -22,13 +23,10 @@ const validationSchema = yup.object({ export function useCreateNotebookModal() { const [, dispatch] = useStore(); - const [, modalManagerDispatch] = useModalStore(); + let history = useHistory(); const close = () => { - modalManagerDispatch({ - type: 'createNotebookModal', - createNotebookModalVisible: false - }); + history.push('/'); }; const { @@ -67,7 +65,7 @@ export function useCreateNotebookModal() { dispatch({ type: 'openNote', - currentNote: undefined + currentFile: undefined }); dispatch({ diff --git a/client/src/app/components/editorPanel/Editor.tsx b/client/src/app/components/editorPanel/Editor.tsx index 06b1d52..8435f2d 100644 --- a/client/src/app/components/editorPanel/Editor.tsx +++ b/client/src/app/components/editorPanel/Editor.tsx @@ -2,8 +2,13 @@ import React from 'react'; import { useEditor } from './editor/useEditor'; import { UIEditor } from './editor/UIEditor'; -export function Editor() { - const { unsaved, text, handleChange } = useEditor(); +interface Props { + text: string; + setText: React.Dispatch; +} + +export function Editor({ text, setText }: Props) { + const { unsaved, handleChange } = useEditor({ text, setText }); return ( diff --git a/client/src/app/components/editorPanel/Preview.tsx b/client/src/app/components/editorPanel/Preview.tsx new file mode 100644 index 0000000..145355a --- /dev/null +++ b/client/src/app/components/editorPanel/Preview.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { UIPreview } from './preview/UIPreview'; +import { usePreview } from './preview/usePreview'; + +interface Props { + text: string; + onClose: () => void; +} + +export function Preview({ text, onClose }: Props) { + const html = usePreview(text); + + return ; +} diff --git a/client/src/app/components/editorPanel/UIEditorPanel.tsx b/client/src/app/components/editorPanel/UIEditorPanel.tsx index 78355a8..f3caba0 100644 --- a/client/src/app/components/editorPanel/UIEditorPanel.tsx +++ b/client/src/app/components/editorPanel/UIEditorPanel.tsx @@ -1,39 +1,63 @@ import React from 'react'; import { useStore } from '@hooks'; -import { getFileSystemItems } from '@utils'; -import { FileExplorer } from './FileExplorer'; import { Editor } from './Editor'; -import { Placeholder } from './Placeholder'; +import { Placeholder } from '../Placeholder'; import { NotificationArea } from '../NotificationArea'; +import { Preview } from './Preview'; +import { SplitPane } from 'react-collapse-pane'; interface Props { - fileExplorerVisible: boolean; + livePreviewVisiable: boolean; + text: string; + setText: React.Dispatch; + handlePreviewClose: () => void; } -export function UIEditorPanel({ fileExplorerVisible }: Props) { - const [{ notebook, currentNote }] = useStore(); +export function UIEditorPanel({ + text, + setText, + livePreviewVisiable, + handlePreviewClose +}: Props) { + const [{ currentFile }] = useStore(); - return notebook ? ( - <> - {fileExplorerVisible && ( - - )} -
- + return ( +
+ - {currentNote ? ( - - ) : ( - - )} -
- - ) : ( - <> -
- - -
- + {currentFile ? ( +
+ {livePreviewVisiable ? ( + + + {livePreviewVisiable ? ( + + ) : ( +
+ )} +
+ ) : ( + + )} +
+ ) : ( + + )} +
); } diff --git a/client/src/app/components/editorPanel/editor/Dropzone.tsx b/client/src/app/components/editorPanel/editor/Dropzone.tsx new file mode 100644 index 0000000..5abcb87 --- /dev/null +++ b/client/src/app/components/editorPanel/editor/Dropzone.tsx @@ -0,0 +1,38 @@ +import React, { PropsWithChildren, DragEvent, useCallback } from 'react'; +import { useDropzone, DropzoneOptions, DropEvent } from 'react-dropzone'; + +type OnDrop = DropzoneOptions['onDrop']; + +interface Props { + className?: string; + onDrop: (files: any[], cursorPosition: [number, number]) => void; +} + +export function Dropzone({ + className, + children, + onDrop: handleDrop +}: PropsWithChildren) { + const onDrop: OnDrop = useCallback((acceptedFiles, _, event: DropEvent) => { + // not type safe: need to discriminate DragEvent from DropEvent + let dragEvent = event as DragEvent; + handleDrop(acceptedFiles, [dragEvent.pageX, dragEvent.pageY]); + }, []); + + const { getRootProps, getInputProps, isDragActive } = useDropzone({ + onDrop, + noClick: true + }); + + return ( +
+ + {children} +
+ ); +} diff --git a/client/src/app/components/editorPanel/editor/UIEditor.tsx b/client/src/app/components/editorPanel/editor/UIEditor.tsx index 7f7cc83..f69fbcc 100644 --- a/client/src/app/components/editorPanel/editor/UIEditor.tsx +++ b/client/src/app/components/editorPanel/editor/UIEditor.tsx @@ -1,22 +1,121 @@ import React from 'react'; import { Breadcrumb } from './Breadcrumb'; +import MonicoEditor, { loader, OnChange, OnMount } from '@monaco-editor/react'; +import path from 'path'; +import { Dropzone } from './Dropzone'; +import { useEditorDrop } from '@hooks'; interface Props { unsaved: boolean; text: string; - handleChange: (event: React.ChangeEvent) => void; + handleChange: OnChange; +} + +function ensureFirstBackSlash(str: string) { + return str.length > 0 && str.charAt(0) !== '/' ? '/' + str : str; +} + +function uriFromPath(_path: string) { + const pathName = path.resolve(_path).replace(/\\/g, '/'); + return encodeURI('file://' + ensureFirstBackSlash(pathName)); } export function UIEditor({ unsaved, text, handleChange }: Props) { + const { drop: handleDrop, init } = useEditorDrop(); + + loader.config({ + paths: { + vs: uriFromPath( + path.join(__dirname, '../node_modules/monaco-editor/min/vs') + ) + } + }); + + const handleMount: OnMount = (event, monaco) => { + monaco.editor.defineTheme('Default', { + base: 'vs-dark', + colors: { 'editor.background': '#11182700' }, + inherit: true, + rules: [ + { + background: '#11182700', //"#111827", + token: '' + } + ] + }); + + monaco.editor.setTheme('Default'); + + init((path: string, cursorPosition: [number, number]) => { + console.log('run', path); + const target = event.getTargetAtClientPoint( + cursorPosition[0], + cursorPosition[1] + ); + + if (!target) return; + + event.setPosition(target.position!); + + const fileName = path.substring( + path.lastIndexOf('/') + 1, + path.lastIndexOf('.') + ); + + const line = event.getPosition(); + const range = new monaco.Range( + line!.lineNumber, + 1, + line!.lineNumber, + 1 + ); + + var id = { major: 1, minor: 1 }; + const textToInsert = `\n[${fileName}]{${path}}\n`; + const op = { + identifier: id, + range, + text: textToInsert, + forceMoveMarkers: true + }; + + event.executeEdits('', [op]); + }); + }; + return ( -
+
- +
+ + + +
); diff --git a/client/src/app/components/editorPanel/editor/breadcrumb/Breadcrumb.test.tsx b/client/src/app/components/editorPanel/editor/breadcrumb/Breadcrumb.test.tsx index 8fac6d5..9e915d6 100644 --- a/client/src/app/components/editorPanel/editor/breadcrumb/Breadcrumb.test.tsx +++ b/client/src/app/components/editorPanel/editor/breadcrumb/Breadcrumb.test.tsx @@ -41,7 +41,7 @@ describe.skip('Breadcrumb Logic', () => { const initialState: AppState = { notebook: '/Users/admin/Documents/notebook', - currentNote: { + currentFile: { name: 'segments.md', path: 'testing/path/segments.md' } diff --git a/client/src/app/components/editorPanel/editor/breadcrumb/useBreadcrumb.ts b/client/src/app/components/editorPanel/editor/breadcrumb/useBreadcrumb.ts index 4a32d3d..4a4e5eb 100644 --- a/client/src/app/components/editorPanel/editor/breadcrumb/useBreadcrumb.ts +++ b/client/src/app/components/editorPanel/editor/breadcrumb/useBreadcrumb.ts @@ -6,10 +6,10 @@ interface Args { } export function useBreadcrumb({ unsaved }: Args) { - const [{ notebook, currentNote }] = useStore(); + const [{ notebook, currentFile }] = useStore(); const [, editorDispatch] = useEditorStore(); - const pathSegments = useRelativePath(notebook!, currentNote!.path).split( + const pathSegments = useRelativePath(notebook!, currentFile!.path).split( /[\/\\]/ ); @@ -26,8 +26,7 @@ export function useBreadcrumb({ unsaved }: Args) { name: part, path, type: isFile(path) ? 'note' : 'directory' - }, - isRenaming: false // this is NOT supposed to be here. Delete ASAP + } }); }; }; @@ -36,7 +35,7 @@ export function useBreadcrumb({ unsaved }: Args) { let text = segment; if (index === pathSegments.length - 1) { - text = unsaved ? currentNote!.name.concat('*') : currentNote!.name; + text = unsaved ? currentFile!.name.concat('*') : currentFile!.name; } return text; diff --git a/client/src/app/components/editorPanel/editor/useEditor.ts b/client/src/app/components/editorPanel/editor/useEditor.ts index 0c35b72..dc8ede1 100644 --- a/client/src/app/components/editorPanel/editor/useEditor.ts +++ b/client/src/app/components/editorPanel/editor/useEditor.ts @@ -1,40 +1,48 @@ -import { useEffect, useState } from 'react'; +import { Dispatch, useEffect, useState } from 'react'; import { useStore } from '@hooks'; import { ipcRenderer } from 'electron'; import { saveFile } from '@utils'; +import { OnChange } from '@monaco-editor/react'; import fs from 'fs'; -export function useEditor() { - const [{ currentNote }] = useStore(); - const [text, setText] = useState(''); +interface Args { + text: string; + setText: Dispatch; +} + +export function useEditor({ text, setText }: Args) { + const [{ currentFile }] = useStore(); const [unsaved, setUnsaved] = useState(false); const [manualSave, setManualSave] = useState(false); const autoSave = true; // ADD TO SETTINGS - const handleChange = (event: React.ChangeEvent) => { - setText(event.target.value); + const handleChange: OnChange = (value, _) => { + if (!value) return; + + setText(value); if (autoSave) { - saveFile(currentNote!, event.target.value); + saveFile(currentFile!, value); } else { setUnsaved(true); } }; if (manualSave) { - saveFile(currentNote!, text); + saveFile(currentFile!, text); setUnsaved(false); setManualSave(false); } useEffect(() => { - let buffer = fs.readFileSync(currentNote!.path); + let buffer = fs.readFileSync(currentFile!.path); + console.log(currentFile); setText(buffer.toString()); ipcRenderer.on('saveNote', () => { setManualSave(true); }); - }, [currentNote]); + }, [currentFile]); return { unsaved, text, handleChange }; } diff --git a/client/src/app/components/editorPanel/fileExplorer/Directory.tsx b/client/src/app/components/editorPanel/fileExplorer/Directory.tsx deleted file mode 100644 index de7d5ac..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/Directory.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import { FileSystemItem } from '@types'; -import { UIDirectory } from './directory/UIDirectory'; -import { useDirectory } from './directory/useDirectory'; - -interface Props { - item: FileSystemItem; - depth?: number; - renameText: string; - setRenameText: React.Dispatch; -} - -export function Directory({ - item, - depth = 0, - renameText, - setRenameText -}: Props) { - const { - isOpened, - childItems, - handleClick, - handleContextMenu, - handleRenameKeyDown, - handleRenameFocus, - handleRenameChange, - handleRenameBlur - } = useDirectory({ - item, - renameText, - setRenameText - }); - - return ( - - ); -} diff --git a/client/src/app/components/editorPanel/fileExplorer/Note.tsx b/client/src/app/components/editorPanel/fileExplorer/Note.tsx deleted file mode 100644 index 0e2637f..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/Note.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import { FileSystemItem } from '@types'; -import { useNote } from './note/useNote'; -import { UINote } from './note/UINote'; - -interface Props { - item: FileSystemItem; - depth?: number; - renameText: string; - setRenameText: React.Dispatch; -} - -export function Note({ item, depth = 0, renameText, setRenameText }: Props) { - const { - handleRenameKeyDown, - handleRenameBlur, - handleClick, - handleContextMenu, - handleRenameChange, - handleRenameFocus - } = useNote({ - item, - renameText, - setRenameText - }); - - return ( - - ); -} diff --git a/client/src/app/components/editorPanel/fileExplorer/directory/UIDirectory.tsx b/client/src/app/components/editorPanel/fileExplorer/directory/UIDirectory.tsx deleted file mode 100644 index 05f2f2e..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/directory/UIDirectory.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import React from 'react'; -import { FileSystemItem } from '@types'; -import { Note } from '../Note'; -import { Directory } from '../Directory'; -import ChevronRightIcon from '@assets/icons/chevron-right.svg'; -import ChevronDownIcon from '@assets/icons/chevron-down.svg'; -import FolderIcon from '@assets/icons/folder-f.svg'; -import { useEditorStore } from '@hooks'; - -interface Props { - item: FileSystemItem; - childItems: FileSystemItem[]; - depth: number; - isOpened: boolean; - renameText: string; - setRenameText: React.Dispatch; - handleClick: () => void; - handleRenameBlur: () => void; - handleRenameChange: (event: React.ChangeEvent) => void; - handleRenameFocus: (event: React.FocusEvent) => void; - handleRenameKeyDown: (event: React.KeyboardEvent) => void; - handleContextMenu: () => void; -} - -export function UIDirectory({ - item, - childItems, - depth, - isOpened, - renameText, - setRenameText, - handleClick, - handleRenameBlur, - handleRenameChange, - handleRenameFocus, - handleRenameKeyDown, - handleContextMenu -}: Props) { - const [{ primarySelection, secondarySelection, isRenaming }] = - useEditorStore(); - - let style = ''; - - if (secondarySelection?.path === item.path) { - style = 'border-blue-500 border-opacity-70 border-2'; - } else if (primarySelection?.path === item.path) { - style = - 'bg-blue-500 border-blue-300 border bg-opacity-30 border-opacity-30'; - } else { - style = - 'hover:bg-opacity-30 hover:bg-gray-700 border border-transparent'; - } - - let displayItem = undefined; - if (isRenaming && secondarySelection?.path === item.path) { - displayItem = ( - - ); - } else { - displayItem =

{item.name}

; - } - - return ( -
-
- {isOpened ? ( - - ) : ( - - )} - - {displayItem} -
-
-
- {childItems.map((item) => { - return item.type === 'directory' ? ( - - ) : ( - - ); - })} -
-
- ); -} diff --git a/client/src/app/components/editorPanel/fileExplorer/directory/useDirectory.ts b/client/src/app/components/editorPanel/fileExplorer/directory/useDirectory.ts deleted file mode 100644 index 0403531..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/directory/useDirectory.ts +++ /dev/null @@ -1,125 +0,0 @@ -import React, { useState } from 'react'; -import { useEditorStore, useStore } from '../../../../hooks'; -import { ipcRenderer } from 'electron'; -import { FileSystemItem } from '@types'; -import { - renameExplorerItem, - getFileSystemItems -} from '../../../../../shared/utils'; - -interface Args { - item: FileSystemItem; - renameText: string; - setRenameText: React.Dispatch; -} - -export function useDirectory({ item, renameText, setRenameText }: Args) { - const [{ currentNote }, dispatch] = useStore(); - const [{ secondarySelection, isRenaming }, editorDispatch] = - useEditorStore(); - const [isOpened, setIsOpened] = useState(false); - - let childItems: FileSystemItem[] = isOpened - ? getFileSystemItems(item.path) - : []; - - const handleClick = () => { - if (secondarySelection?.path === item.path) { - return; - } else if (secondarySelection) { - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - } - - editorDispatch({ - type: 'primarySelect', - primarySelection: item, - isRenaming - }); - - setIsOpened(!isOpened); - }; - - const handleContextMenu = () => { - ipcRenderer.send('openExplorerFileContextMenu'); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: item, - isRenaming - }); - - setRenameText(item.name); - }; - - const handleRenameChange = (event: React.ChangeEvent) => { - setRenameText(event.target.value); - }; - - const handleRenameKeyDown = ( - event: React.KeyboardEvent - ) => { - if (event.key === 'Enter' || event.code === '13') { - renameExplorerItem(item.path, renameText) - .then((renamedItem) => { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - - if (item.path == currentNote?.path) { - dispatch({ - type: 'openNote', - currentNote: renamedItem - }); - } - }) - .catch((error) => { - console.log(error); - }); - } - if (event.key === 'Escape' || event.code === '27') { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - } - }; - - const handleRenameBlur = () => { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - }; - - const handleRenameFocus = (event: React.FocusEvent) => { - event.target.select(); - }; - - return { - childItems, - isOpened, - handleClick, - handleRenameBlur, - handleRenameChange, - handleRenameFocus, - handleRenameKeyDown, - handleContextMenu - }; -} diff --git a/client/src/app/components/editorPanel/fileExplorer/note/UINote.tsx b/client/src/app/components/editorPanel/fileExplorer/note/UINote.tsx deleted file mode 100644 index b1b42cc..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/note/UINote.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react'; -import { useEditorStore, useStore } from '@hooks'; -import { FileSystemItem } from '@types'; -import FileIcon from '@assets/icons/file.svg'; - -interface Props { - item: FileSystemItem; - depth: number; - renameText: string; - setRenameText: React.Dispatch; - handleRenameKeyDown: (event: React.KeyboardEvent) => void; - handleRenameBlur: () => void; - handleClick: () => void; - handleContextMenu: () => void; - handleRenameChange: (event: React.ChangeEvent) => void; - handleRenameFocus: (event: React.FocusEvent) => void; -} - -export function UINote({ - item, - renameText, - depth = 0, - handleRenameBlur, - handleClick, - handleContextMenu, - handleRenameChange, - handleRenameFocus, - handleRenameKeyDown -}: Props) { - const [{ currentNote }] = useStore(); - const [{ primarySelection, secondarySelection, isRenaming }] = - useEditorStore(); - - let style = ''; - - if (secondarySelection?.path === item.path) { - style = 'border-blue-500 border-opacity-70 border-2'; - } else if (primarySelection?.path === item.path) { - style = - 'bg-blue-500 border-blue-300 border bg-opacity-30 border-opacity-30'; - } else { - style = 'hover:bg-opacity-30 hover:bg-gray-700 border-transparent'; - } - - let displayItem = undefined; - if (isRenaming && secondarySelection?.path === item.path) { - displayItem = ( - - ); - } else { - displayItem = ( -

- {item.name} -

- ); - } - - return ( -
- - {displayItem} -
- ); -} diff --git a/client/src/app/components/editorPanel/fileExplorer/note/useNote.ts b/client/src/app/components/editorPanel/fileExplorer/note/useNote.ts deleted file mode 100644 index 6cd7063..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/note/useNote.ts +++ /dev/null @@ -1,117 +0,0 @@ -import React from 'react'; -import { useEditorStore, useStore } from '../../../../hooks'; -import { ipcRenderer } from 'electron'; -import { FileSystemItem } from '../../../../../shared/types'; -import { renameExplorerItem } from '../../../../../shared/utils'; - -interface Args { - item: FileSystemItem; - renameText: string; - setRenameText: React.Dispatch; -} - -export function useNote({ item, renameText, setRenameText }: Args) { - const [{ currentNote }, dispatch] = useStore(); - const [{ secondarySelection, isRenaming }, editorDispatch] = - useEditorStore(); - const handleClick = () => { - if (secondarySelection?.path === item.path) { - return; - } else if (secondarySelection) { - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - } - - editorDispatch({ - type: 'primarySelect', - primarySelection: item, - isRenaming - }); - - dispatch({ - type: 'openNote', - currentNote: { - name: item.name, - path: item.path - } - }); - }; - - const handleContextMenu = () => { - ipcRenderer.send('openExplorerFileContextMenu'); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: item, - isRenaming - }); - - setRenameText(item.name); - }; - - const handleRenameChange = (event: React.ChangeEvent) => { - setRenameText(event.target.value); - }; - - const handleRenameKeyDown = ( - event: React.KeyboardEvent - ) => { - if (event.key === 'Enter' || event.code === '13') { - renameExplorerItem(item.path, renameText).then((renamedItem) => { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - - if (item.path == currentNote?.path) { - dispatch({ - type: 'openNote', - currentNote: renamedItem - }); - } - }); - } - - if (event.key === 'Escape' || event.code === '27') { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - } - }; - - const handleRenameBlur = () => { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - }; - - const handleRenameFocus = (event: React.FocusEvent) => { - event.target.select(); - }; - - return { - handleClick, - handleContextMenu, - handleRenameChange, - handleRenameKeyDown, - handleRenameBlur, - handleRenameFocus - }; -} diff --git a/client/src/app/components/editorPanel/fileExplorer/useFileExplorer.ts b/client/src/app/components/editorPanel/fileExplorer/useFileExplorer.ts deleted file mode 100644 index 11b4640..0000000 --- a/client/src/app/components/editorPanel/fileExplorer/useFileExplorer.ts +++ /dev/null @@ -1,92 +0,0 @@ -import React, { useState } from 'react'; -import { useEditorStore, useStore } from '@hooks'; -import { - createFile, - getParentDirectory, - createDirectory, - renameExplorerItem -} from '@utils'; - -export function useFileExplorer() { - const [{ notebook, currentNote }, dispatch] = useStore(); - const [ - { primarySelection, secondarySelection, isRenaming }, - editorDispatch - ] = useEditorStore(); - const [renameText, setRenameText] = useState(''); - - const handleAddFileClick = () => { - const newFilePath = primarySelection - ? getParentDirectory(primarySelection.path, { onlyFiles: true }) - : notebook; - const newFile = createFile(newFilePath as string); - - dispatch({ - type: 'openNote', - currentNote: newFile - }); - }; - - const handleAddDirectoryClick = () => { - const newDirectoryPath = primarySelection - ? getParentDirectory(primarySelection.path, { onlyFiles: true }) - : notebook; - const newDirectory = createDirectory(newDirectoryPath as string); - - editorDispatch({ - type: 'primarySelect', - primarySelection: newDirectory, - isRenaming - }); - }; - - const handleOuterClick = (event: React.MouseEvent) => { - if (event.target !== event.currentTarget) return; - - editorDispatch({ - type: 'primarySelect', - primarySelection: undefined, - isRenaming - }); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - - if (isRenaming) { - renameExplorerItem(secondarySelection?.path!, renameText) - .then((renamedItem) => { - editorDispatch({ - type: 'rename', - isRenaming: false - }); - - editorDispatch({ - type: 'secondarySelect', - secondarySelection: undefined, - isRenaming - }); - - if (secondarySelection?.path == currentNote?.path) { - dispatch({ - type: 'openNote', - currentNote: renamedItem - }); - } - }) - .catch((error) => { - console.log(error); - }); - } - }; - - return { - handleAddFileClick, - handleAddDirectoryClick, - handleOuterClick, - renameText, - setRenameText - }; -} diff --git a/client/src/app/components/editorPanel/preview/UIPreview.tsx b/client/src/app/components/editorPanel/preview/UIPreview.tsx new file mode 100644 index 0000000..d71a8a7 --- /dev/null +++ b/client/src/app/components/editorPanel/preview/UIPreview.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import './theme.css'; +import CloseIcon from '@assets/icons/close.svg'; + +interface Props { + content: any; + handleClose: () => void; +} + +export function UIPreview({ content, handleClose }: Props) { + return ( +
+
+

Preview

{' '} + +
+
+ {content} +
+
+ ); +} diff --git a/client/src/app/components/editorPanel/preview/theme.css b/client/src/app/components/editorPanel/preview/theme.css new file mode 100644 index 0000000..be9a5d9 --- /dev/null +++ b/client/src/app/components/editorPanel/preview/theme.css @@ -0,0 +1,63 @@ +#wrapper h1 { + @apply text-5xl mb-2; +} + +#wrapper h2 { + @apply text-4xl; +} + +#wrapper h3 { + @apply text-3xl; +} + +#wrapper h4 { + @apply text-2xl; +} + +#wrapper h5 { + @apply text-xl; +} + +#wrapper h6 { + @apply text-lg; +} + +#wrapper ul { + @apply list-inside list-disc; +} + +#wrapper img { + @apply rounded-xl; +} + +#wrapper a:not(.attachment-link) { + @apply text-blue-500 hover:underline; +} + +#wrapper .attachment-link a { + @apply hover:no-underline text-gray-400; +} + +#wrapper > p > code { + @apply inline-block bg-gray-800 border border-gray-700 rounded-md p-0.5 m-0.5 text-sm font-mono; +} + +#wrapper ol { + @apply list-decimal list-inside; +} + +#wrapper pre { + @apply bg-gray-800 border border-gray-700 rounded-md p-0.5 m-0.5 text-sm font-mono; +} + +#wrapper pre code span.hljs-comment { + @apply text-green-600; +} + +#wrapper pre code span.hljs-keyword { + @apply text-blue-400; +} + +#wrapper pre code span.hljs-string { + @apply text-yellow-400; +} diff --git a/client/src/app/components/editorPanel/preview/usePreview.tsx b/client/src/app/components/editorPanel/preview/usePreview.tsx new file mode 100644 index 0000000..8de9f8d --- /dev/null +++ b/client/src/app/components/editorPanel/preview/usePreview.tsx @@ -0,0 +1,98 @@ +import React from 'react'; +import marked from 'marked'; +import parse from 'html-react-parser'; +import hljs from 'highlight.js'; +import { useStore } from '@hooks'; +import AttachmentIcon from '@assets/icons/attachment.svg'; +import { renderToString } from 'react-dom/server'; +import { fileExist, getFileSize } from '@utils'; +import path from 'path'; + +export function usePreview(text: string) { + const [{ notebook }] = useStore(); + + const baseUrl = notebook!; + + const attachments: any = { + name: 'attachment', + level: 'block', + start(src: string) { + return src.match(/^\[.*]\{(.*\..*)\}\s?$/)?.index || -1; + }, + tokenizer(src: string, _: any) { + // goal: /^\[.*]\((.*\..*)\)\s?$/ + const rule = /^\[(.*)]\{(.*\..*)\}\s?$/; + const match = rule.exec(src); + + if (match) { + const token = { + type: 'attachment', + raw: match[0], + text: match[1].trim(), + link: match[2].trim(), + tokens: [] + }; + + this.lexer.inline(token.text, token.tokens); + + return token; + } + + return; + }, + renderer(token: any) { + let baseUrlParent = baseUrl.substring(0, baseUrl.lastIndexOf('/')); + const fileUrl = path.join(baseUrlParent, token.link); + const fileExt = fileUrl.substring(fileUrl.lastIndexOf('.') + 1); + const found = fileExist(fileUrl); + + const render = found + ? ` + +
+ ${renderToString()} +

${ + token.text + }

+
+
+

+ ${fileExt} +

+

+ ${getFileSize(fileUrl)} KB +

+
+
+ ` + : ` +
+ ${renderToString()} +

${token.text}

+
+ `; + + return `
+ ${render} +
`; + }, + childTokens: [] + }; + + marked.use({ + extensions: [attachments] + }); + + const html = marked(text, { + highlight: (code: string) => { + return hljs.highlightAuto(code).value; // no lang selected ,throws error + }, + baseUrl + }); + + return parse(html); +} diff --git a/client/src/app/components/editorPanel/useEditorPanel.ts b/client/src/app/components/editorPanel/useEditorPanel.ts index 75b81bf..a4542f7 100644 --- a/client/src/app/components/editorPanel/useEditorPanel.ts +++ b/client/src/app/components/editorPanel/useEditorPanel.ts @@ -10,12 +10,11 @@ import { import { useEditorStore } from '@hooks'; export function useEditorPanel() { - const [{ notebook, currentNote }, dispatch] = useStore(); - const [ - { primarySelection, secondarySelection, isRenaming }, - editorDispatch - ] = useEditorStore(); - const [fileExplorerVisible, setFileExplorerVisible] = useState(true); + const [livePreviewVisiable, setLivePreviewVisiable] = useState(true); + const [{ notebook, currentFile }, dispatch] = useStore(); + const [{ primarySelection, secondarySelection }, editorDispatch] = + useEditorStore(); + const [text, setText] = useState(''); useEffect(() => { ipcRenderer.removeAllListeners('createNote'); @@ -29,52 +28,65 @@ export function useEditorPanel() { dispatch({ type: 'openNote', - currentNote: newFile + currentFile: newFile }); }); - ipcRenderer.removeAllListeners('toggleFileExplorer'); - ipcRenderer.on('toggleFileExplorer', () => { - if (!notebook) return; - - setFileExplorerVisible(!fileExplorerVisible); + ipcRenderer.removeAllListeners('toggleLivePreviewVisabilty'); + ipcRenderer.on('toggleLivePreviewVisabilty', () => { + if (!notebook) { + return; + } + setLivePreviewVisiable(!livePreviewVisiable); }); + //ipcRenderer.removeAllListeners('toggleFileExplorer'); + //ipcRenderer.on('toggleFileExplorer', () => { + //if (!notebook) return; + + //setFileExplorerVisible(!fileExplorerVisible); + //}); + /* ipcRenderer.removeAllListeners('renameExplorerItem'); ipcRenderer.on('renameExplorerItem', () => { editorDispatch({ type: 'rename', isRenaming: true }); - }); + });*/ ipcRenderer.removeAllListeners('deleteExplorerItem'); ipcRenderer.on('deleteExplorerItem', () => { deleteExplorerItem(secondarySelection?.path).then(() => { if ( - currentNote?.path === secondarySelection?.path || - !fileExist(currentNote?.path) + currentFile?.path === secondarySelection?.path || + !fileExist(currentFile?.path) ) { dispatch({ type: 'openNote', - currentNote: undefined + currentFile: undefined }); } editorDispatch({ type: 'secondarySelect', - secondarySelection: undefined, - isRenaming // find a way to not need this + secondarySelection: undefined }); }); }); - }, [notebook, primarySelection, secondarySelection, fileExplorerVisible]); + }, [notebook, primarySelection, secondarySelection, livePreviewVisiable]); + + const handlePreviewClose = () => { + setLivePreviewVisiable(false); + }; return { primarySelection, secondarySelection, - isRenaming, - fileExplorerVisible, - editorDispatch + editorDispatch, + text, + setText, + livePreviewVisiable, + handlePreviewClose }; } diff --git a/client/src/app/components/fileExplorer/Node.tsx b/client/src/app/components/fileExplorer/Node.tsx new file mode 100644 index 0000000..2985e49 --- /dev/null +++ b/client/src/app/components/fileExplorer/Node.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { UINode } from './node/UINode'; +import { useNode } from './node/useNode'; +import { FileSystemItem } from '@types'; +import DirectoryIcon from '@assets/icons/folder-f.svg'; +import NoteIcon from '@assets/icons/file.svg'; +import AttachmentIcon from '@assets/icons/attachment.svg'; + +interface Props { + item: FileSystemItem; + depth?: number; +} + +export function Node({ item, depth = 0 }: Props) { + const { + opened, + foldable, + primarySelected, + secondarySelected, + children, + handleClick, + handleContextMenu, + renaming, + setRenaming + } = useNode({ item }); + + let icon: JSX.Element; + const iconStyle = { + fill: '#9CA3AF', + className: 'self-end w-5 mr-1 align-bottom' + }; + + switch (item.type) { + case 'directory': + icon = ; + break; + case 'note': + icon = ; + break; + case 'attachment': + icon = ; + break; + } + + return ( + + ); +} diff --git a/client/src/app/components/editorPanel/fileExplorer/UIFileExplorer.tsx b/client/src/app/components/fileExplorer/UIFileExplorer.tsx similarity index 55% rename from client/src/app/components/editorPanel/fileExplorer/UIFileExplorer.tsx rename to client/src/app/components/fileExplorer/UIFileExplorer.tsx index 61b372f..bf03c7e 100644 --- a/client/src/app/components/editorPanel/fileExplorer/UIFileExplorer.tsx +++ b/client/src/app/components/fileExplorer/UIFileExplorer.tsx @@ -1,25 +1,20 @@ import React from 'react'; -import { useStore } from '../../../hooks'; +import { useStore } from '@hooks'; import { FileSystemItem } from '@types'; -import { Directory } from './Directory'; -import { Note } from './Note'; -import { getFileName } from '../../../../shared/utils'; -import PlusIcon from '../../../assets/icons/plus.svg'; -import FolderOpenIcon from '../../../assets/icons/folder-open.svg'; +import { getFileName } from '@shared/utils'; +import PlusIcon from '@assets/icons/plus.svg'; +import FolderOpenIcon from '@assets/icons/folder-open.svg'; +import { Node } from './Node'; interface Props { items: FileSystemItem[]; handleAddFileClick: () => void; handleAddDirectoryClick: () => void; handleOuterClick: (event: React.MouseEvent) => void; - renameText: string; - setRenameText: React.Dispatch; } export function UIFileExplorer({ items, - renameText, - setRenameText, handleAddFileClick, handleAddDirectoryClick, handleOuterClick @@ -27,7 +22,7 @@ export function UIFileExplorer({ const [{ notebook }] = useStore(); return ( -
+

{getFileName(notebook!)} @@ -47,23 +42,11 @@ export function UIFileExplorer({

- {items.map((item) => { - return item.type === 'directory' ? ( - - ) : ( - - ); - })} + {items.map((item) => ( + + ))}
); diff --git a/client/src/app/components/fileExplorer/node/RenameField.tsx b/client/src/app/components/fileExplorer/node/RenameField.tsx new file mode 100644 index 0000000..014d3bc --- /dev/null +++ b/client/src/app/components/fileExplorer/node/RenameField.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { UIRenameField } from './renameField/UIRenameField'; +import { useRenameField } from './renameField/useRenameField'; + +interface Props { + name: string; + path: string; + setRenaming: React.Dispatch; +} + +export function RenameField({ name, path, setRenaming }: Props) { + const { text, handleChange, handleKeyDown, handleFocus, handleBlur } = + useRenameField({ name, path, setRenaming }); + + return ( + + ); +} diff --git a/client/src/app/components/fileExplorer/node/UINode.tsx b/client/src/app/components/fileExplorer/node/UINode.tsx new file mode 100644 index 0000000..d625fa3 --- /dev/null +++ b/client/src/app/components/fileExplorer/node/UINode.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import { Node } from '../Node'; +import ChevronDownIcon from '@assets/icons/chevron-down.svg'; +import ChevronRightIcon from '@assets/icons/chevron-right.svg'; +import { FileSystemItem } from '@types'; +import { RenameField } from './RenameField'; + +interface Props { + name: string; + path: string; + depth: number; + foldable?: boolean; + opened?: boolean; + primarySelected?: boolean; + secondarySelected?: boolean; + icon: JSX.Element; + children: FileSystemItem[]; + onClick: () => void; + onContextMenu: () => void; + renaming: boolean; + setRenaming: React.Dispatch; +} + +export function UINode({ + name, + path, + depth = 0, + foldable = false, + opened = false, + primarySelected = false, + secondarySelected = false, + icon, + children, + onClick, + onContextMenu, + renaming, + setRenaming +}: Props) { + let selectionStyle = ''; + + if (secondarySelected) { + selectionStyle = 'border-blue-500 border-2 border-opacity-70'; + } else if (primarySelected) { + selectionStyle = + 'bg-blue-500 border-blue-300 border bg-opacity-30 border-opacity-30'; + } else { + selectionStyle = + 'hover:bg-opacity-30 hover:bg-gray-700 border border-transparent'; + } + + let chevronIcon: JSX.Element | null = null; + if (foldable && opened) { + chevronIcon = ; + } else if (foldable && !opened) { + chevronIcon = ; + } + + return ( +
+
+ {chevronIcon} + {icon} + {renaming ? ( + + ) : ( +

{name}

+ )} +
+
+
+ {children.map((item) => ( + + ))} +
+
+ ); +} diff --git a/client/src/app/components/fileExplorer/node/renameField/UIRenameField.tsx b/client/src/app/components/fileExplorer/node/renameField/UIRenameField.tsx new file mode 100644 index 0000000..f0a8005 --- /dev/null +++ b/client/src/app/components/fileExplorer/node/renameField/UIRenameField.tsx @@ -0,0 +1,30 @@ +import React from 'react'; + +interface Props { + text: string; + onChange: (event: React.ChangeEvent) => void; + onKeyDown: (event: React.KeyboardEvent) => void; + onFocus: (event: React.FocusEvent) => void; + onBlur: () => void; +} + +export function UIRenameField({ + text, + onChange, + onKeyDown, + onFocus, + onBlur +}: Props) { + return ( + + ); +} diff --git a/client/src/app/components/fileExplorer/node/renameField/useRenameField.ts b/client/src/app/components/fileExplorer/node/renameField/useRenameField.ts new file mode 100644 index 0000000..20f9314 --- /dev/null +++ b/client/src/app/components/fileExplorer/node/renameField/useRenameField.ts @@ -0,0 +1,47 @@ +import { useEditorStore } from '@hooks'; +import { renameExplorerItem } from '@utils'; +import React, { useState } from 'react'; + +interface Args { + path: string; + name: string; + setRenaming: React.Dispatch; +} + +export function useRenameField({ name, path, setRenaming }: Args) { + const [text, setText] = useState(name); + const [, editorDispatch] = useEditorStore(); + + const handleChange = (event: React.ChangeEvent) => { + setText(event.target.value); + }; + + const handleKeyDown = (event: React.KeyboardEvent) => { + if (event.key === 'Enter' || event.code === '13') { + renameExplorerItem(path, text).then(() => { + setRenaming(false); + editorDispatch({ + type: 'secondarySelect', + secondarySelection: undefined + }); + }); + } else if (event.key === 'Escape' || event.code === '27') { + setRenaming(false); + editorDispatch({ + type: 'secondarySelect', + secondarySelection: undefined + }); + setText(name); + } + }; + + const handleFocus = (event: React.FocusEvent) => { + event.target.select(); + }; + + const handleBlur = () => { + setRenaming(false); + }; + + return { text, handleChange, handleKeyDown, handleFocus, handleBlur }; +} diff --git a/client/src/app/components/fileExplorer/node/useNode.ts b/client/src/app/components/fileExplorer/node/useNode.ts new file mode 100644 index 0000000..29f8697 --- /dev/null +++ b/client/src/app/components/fileExplorer/node/useNode.ts @@ -0,0 +1,82 @@ +import { useState } from 'react'; +import { useEditorStore, useStore } from '@hooks'; +import { getFileSystemItems } from '@utils'; +import { FileSystemItem } from '@types'; +import { ipcRenderer } from 'electron'; + +interface Args { + item: FileSystemItem; +} + +export function useNode({ item }: Args) { + const [opened, setOpened] = useState(false); + const [renaming, setRenaming] = useState(false); + const [{}, dispatch] = useStore(); + const [{ primarySelection, secondarySelection }, editorDispatch] = + useEditorStore(); + + const foldable = item.type === 'directory'; + + let children: FileSystemItem[] = + foldable && opened ? getFileSystemItems(item.path) : []; + + const primarySelected = primarySelection?.path === item.path; + const secondarySelected = secondarySelection?.path === item.path; + + const handleClick = () => { + if (secondarySelected) return; + + if (secondarySelection) { + editorDispatch({ + type: 'secondarySelect', + secondarySelection: undefined + }); + } + + editorDispatch({ + type: 'primarySelect', + primarySelection: item + }); + + if (item.type === 'note') { + dispatch({ + type: 'openNote', + currentFile: { + name: item.name, + path: item.path + } + }); + } + + if (foldable) setOpened(!opened); + }; + + const handleContextMenu = () => { + ipcRenderer.send('openExplorerFileContextMenu'); + + editorDispatch({ + type: 'secondarySelect', + secondarySelection: item + }); + + console.log('context menu'); + + ipcRenderer.removeAllListeners('renameExplorerItem'); + ipcRenderer.on('renameExplorerItem', () => { + console.log('renaming'); + setRenaming(true); + }); + }; + + return { + children, + opened, + foldable, + primarySelected, + secondarySelected, + handleClick, + handleContextMenu, + renaming, + setRenaming + }; +} diff --git a/client/src/app/components/fileExplorer/useFileExplorer.ts b/client/src/app/components/fileExplorer/useFileExplorer.ts new file mode 100644 index 0000000..8714b3c --- /dev/null +++ b/client/src/app/components/fileExplorer/useFileExplorer.ts @@ -0,0 +1,68 @@ +import React, { useEffect } from 'react'; +import { useEditorStore, useStore, useForceUpdate } from '@hooks'; +import { + createFile, + getParentDirectory, + createDirectory, + getFileSystemItems, + watchDirectory +} from '@utils'; + +export function useFileExplorer() { + const [{ notebook }, dispatch] = useStore(); + const [{ primarySelection }, editorDispatch] = useEditorStore(); + const forceUpdate = useForceUpdate(); + + const items = notebook ? getFileSystemItems(notebook) : []; + + useEffect(() => { + if (!notebook) return; + + watchDirectory(notebook, () => forceUpdate()); + }, [notebook]); + + const handleAddFileClick = () => { + const newFilePath = primarySelection + ? getParentDirectory(primarySelection.path, { onlyFiles: true }) + : notebook; + const newFile = createFile(newFilePath as string); + + dispatch({ + type: 'openNote', + currentFile: newFile + }); + }; + + const handleAddDirectoryClick = () => { + const newDirectoryPath = primarySelection + ? getParentDirectory(primarySelection.path, { onlyFiles: true }) + : notebook; + const newDirectory = createDirectory(newDirectoryPath as string); + + editorDispatch({ + type: 'primarySelect', + primarySelection: newDirectory + }); + }; + + const handleOuterClick = (event: React.MouseEvent) => { + if (event.target !== event.currentTarget) return; + + editorDispatch({ + type: 'primarySelect', + primarySelection: undefined + }); + + editorDispatch({ + type: 'secondarySelect', + secondarySelection: undefined + }); + }; + + return { + items, + handleAddFileClick, + handleAddDirectoryClick, + handleOuterClick + }; +} diff --git a/client/src/app/components/modalManager/ForgotPasswordModal.tsx b/client/src/app/components/modalManager/ForgotPasswordModal.tsx index bceec3e..c692317 100644 --- a/client/src/app/components/modalManager/ForgotPasswordModal.tsx +++ b/client/src/app/components/modalManager/ForgotPasswordModal.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import { TextField } from '../TextField'; -import { useModalStore } from '@hooks'; import * as yup from 'yup'; import { ModalLayout } from './Modal'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -8,15 +7,16 @@ import { useForm } from 'react-hook-form'; import { FormError } from '@types'; import { FormBanner } from './FormBanner'; import { forgetPassword } from '@shared/Api/forgetPassword'; +import { useHistory } from 'react-router'; const validationSchema = yup.object({ email: yup.string().email('Invalid email').required() }); export function ForgotPasswordModal() { - const [, modalManagerDispatch] = useModalStore(); const [formError] = useState(); const [responseSuccess, setResponseSuccess] = useState(false); + let history = useHistory(); const { register, @@ -41,21 +41,11 @@ export function ForgotPasswordModal() { ); const handleCancelClick = () => { - modalManagerDispatch({ - type: 'loginModal', - loginModalVisible: true - }); + history.push('/login'); }; return ( - - modalManagerDispatch({ - type: 'forgotPasswordModal', - forgotPasswordModalVisible: false - }) - } - > + history.push('/')}> {!responseSuccess ? (
@@ -114,12 +104,7 @@ export function ForgotPasswordModal() {