├── backend ├── .gitignore ├── index.js ├── package.json └── yarn.lock └── frontend ├── README.md ├── package.json ├── public ├── global.css └── index.html ├── src ├── App.js ├── assets │ ├── arrowDown.js │ ├── arrowDown.svg │ ├── arrowUp.js │ ├── arrowUp.svg │ ├── delete.js │ ├── delete.svg │ ├── edit.js │ ├── edit.svg │ ├── money.svg │ └── send.svg ├── components │ ├── Button │ │ └── index.jsx │ ├── Container │ │ └── index.jsx │ ├── Form │ │ ├── index.jsx │ │ └── styles.js │ ├── Header │ │ ├── index.jsx │ │ └── styles.js │ ├── Item │ │ ├── index.jsx │ │ └── styles.js │ ├── Listagem │ │ ├── index.jsx │ │ └── styles.js │ └── Radio │ │ ├── index.jsx │ │ └── styles.js ├── index.js └── service │ └── api.js └── yarn.lock /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | 4 | -------------------------------------------------------------------------------- /backend/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const cors = require("cors"); 3 | const app = express(); 4 | const port = 3030; 5 | 6 | let transactions = []; 7 | 8 | app.use(cors()); 9 | app.use(express.json()); 10 | 11 | app.get("/", (req, res) => { 12 | res.send("Hello World!"); 13 | }); 14 | 15 | app.get("/transactions", (req, res) => { 16 | return res.json(transactions); 17 | }); 18 | 19 | app.post("/transactions", (req, res) => { 20 | const { description, value, isRevenue } = req.body; 21 | const id = transactions.length 22 | ? transactions[transactions.length - 1].id + 1 23 | : 1; 24 | const transaction = { id, description, value, isRevenue }; 25 | 26 | transactions.push(transaction); 27 | 28 | return res.json(transaction); 29 | }); 30 | 31 | app.put("/transactions/:id", (req, res) => { 32 | const { description, value, isRevenue } = req.body; 33 | const id = Number(req.params.id); 34 | const transaction = { id, description, value, isRevenue }; 35 | 36 | transactions = transactions.map((item) => 37 | item.id !== id ? item : transaction 38 | ); 39 | 40 | return res.json(transaction); 41 | }); 42 | 43 | app.delete("/transactions/:id", (req, res) => { 44 | const id = Number(req.params.id); 45 | 46 | transactions = transactions.filter((item) => item.id !== id); 47 | 48 | return res.sendStatus(200); 49 | }); 50 | 51 | app.listen(port, () => { 52 | console.log(`🚀 Running on port ${port}`); 53 | }); 54 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "cors": "^2.8.5", 8 | "express": "^4.17.2", 9 | "nodemon": "^2.0.15" 10 | }, 11 | "scripts": { 12 | "dev": "nodemon index.js" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /backend/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^0.14.0": 6 | version "0.14.0" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 8 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 9 | 10 | "@szmarczak/http-timer@^1.1.2": 11 | version "1.1.2" 12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 13 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 14 | dependencies: 15 | defer-to-connect "^1.0.1" 16 | 17 | abbrev@1: 18 | version "1.1.1" 19 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 20 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 21 | 22 | accepts@~1.3.7: 23 | version "1.3.7" 24 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 25 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 26 | dependencies: 27 | mime-types "~2.1.24" 28 | negotiator "0.6.2" 29 | 30 | ansi-align@^3.0.0: 31 | version "3.0.1" 32 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 33 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 34 | dependencies: 35 | string-width "^4.1.0" 36 | 37 | ansi-regex@^5.0.1: 38 | version "5.0.1" 39 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 40 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 41 | 42 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 43 | version "4.3.0" 44 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 45 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 46 | dependencies: 47 | color-convert "^2.0.1" 48 | 49 | anymatch@~3.1.2: 50 | version "3.1.2" 51 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 52 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 53 | dependencies: 54 | normalize-path "^3.0.0" 55 | picomatch "^2.0.4" 56 | 57 | array-flatten@1.1.1: 58 | version "1.1.1" 59 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 60 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 61 | 62 | balanced-match@^1.0.0: 63 | version "1.0.2" 64 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 65 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 66 | 67 | binary-extensions@^2.0.0: 68 | version "2.2.0" 69 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 70 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 71 | 72 | body-parser@1.19.1: 73 | version "1.19.1" 74 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" 75 | integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== 76 | dependencies: 77 | bytes "3.1.1" 78 | content-type "~1.0.4" 79 | debug "2.6.9" 80 | depd "~1.1.2" 81 | http-errors "1.8.1" 82 | iconv-lite "0.4.24" 83 | on-finished "~2.3.0" 84 | qs "6.9.6" 85 | raw-body "2.4.2" 86 | type-is "~1.6.18" 87 | 88 | boxen@^5.0.0: 89 | version "5.1.2" 90 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" 91 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== 92 | dependencies: 93 | ansi-align "^3.0.0" 94 | camelcase "^6.2.0" 95 | chalk "^4.1.0" 96 | cli-boxes "^2.2.1" 97 | string-width "^4.2.2" 98 | type-fest "^0.20.2" 99 | widest-line "^3.1.0" 100 | wrap-ansi "^7.0.0" 101 | 102 | brace-expansion@^1.1.7: 103 | version "1.1.11" 104 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 105 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 106 | dependencies: 107 | balanced-match "^1.0.0" 108 | concat-map "0.0.1" 109 | 110 | braces@~3.0.2: 111 | version "3.0.2" 112 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 113 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 114 | dependencies: 115 | fill-range "^7.0.1" 116 | 117 | bytes@3.1.1: 118 | version "3.1.1" 119 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" 120 | integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== 121 | 122 | cacheable-request@^6.0.0: 123 | version "6.1.0" 124 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 125 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 126 | dependencies: 127 | clone-response "^1.0.2" 128 | get-stream "^5.1.0" 129 | http-cache-semantics "^4.0.0" 130 | keyv "^3.0.0" 131 | lowercase-keys "^2.0.0" 132 | normalize-url "^4.1.0" 133 | responselike "^1.0.2" 134 | 135 | camelcase@^6.2.0: 136 | version "6.3.0" 137 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 138 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 139 | 140 | chalk@^4.1.0: 141 | version "4.1.2" 142 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 143 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 144 | dependencies: 145 | ansi-styles "^4.1.0" 146 | supports-color "^7.1.0" 147 | 148 | chokidar@^3.5.2: 149 | version "3.5.3" 150 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 151 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 152 | dependencies: 153 | anymatch "~3.1.2" 154 | braces "~3.0.2" 155 | glob-parent "~5.1.2" 156 | is-binary-path "~2.1.0" 157 | is-glob "~4.0.1" 158 | normalize-path "~3.0.0" 159 | readdirp "~3.6.0" 160 | optionalDependencies: 161 | fsevents "~2.3.2" 162 | 163 | ci-info@^2.0.0: 164 | version "2.0.0" 165 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 166 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 167 | 168 | cli-boxes@^2.2.1: 169 | version "2.2.1" 170 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 171 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 172 | 173 | clone-response@^1.0.2: 174 | version "1.0.2" 175 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 176 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 177 | dependencies: 178 | mimic-response "^1.0.0" 179 | 180 | color-convert@^2.0.1: 181 | version "2.0.1" 182 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 183 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 184 | dependencies: 185 | color-name "~1.1.4" 186 | 187 | color-name@~1.1.4: 188 | version "1.1.4" 189 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 190 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 191 | 192 | concat-map@0.0.1: 193 | version "0.0.1" 194 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 195 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 196 | 197 | configstore@^5.0.1: 198 | version "5.0.1" 199 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 200 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 201 | dependencies: 202 | dot-prop "^5.2.0" 203 | graceful-fs "^4.1.2" 204 | make-dir "^3.0.0" 205 | unique-string "^2.0.0" 206 | write-file-atomic "^3.0.0" 207 | xdg-basedir "^4.0.0" 208 | 209 | content-disposition@0.5.4: 210 | version "0.5.4" 211 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 212 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 213 | dependencies: 214 | safe-buffer "5.2.1" 215 | 216 | content-type@~1.0.4: 217 | version "1.0.4" 218 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 219 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 220 | 221 | cookie-signature@1.0.6: 222 | version "1.0.6" 223 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 224 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 225 | 226 | cookie@0.4.1: 227 | version "0.4.1" 228 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" 229 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== 230 | 231 | cors@^2.8.5: 232 | version "2.8.5" 233 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 234 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 235 | dependencies: 236 | object-assign "^4" 237 | vary "^1" 238 | 239 | crypto-random-string@^2.0.0: 240 | version "2.0.0" 241 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 242 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 243 | 244 | debug@2.6.9: 245 | version "2.6.9" 246 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 247 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 248 | dependencies: 249 | ms "2.0.0" 250 | 251 | debug@^3.2.7: 252 | version "3.2.7" 253 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 254 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 255 | dependencies: 256 | ms "^2.1.1" 257 | 258 | decompress-response@^3.3.0: 259 | version "3.3.0" 260 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 261 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 262 | dependencies: 263 | mimic-response "^1.0.0" 264 | 265 | deep-extend@^0.6.0: 266 | version "0.6.0" 267 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 268 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 269 | 270 | defer-to-connect@^1.0.1: 271 | version "1.1.3" 272 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 273 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 274 | 275 | depd@~1.1.2: 276 | version "1.1.2" 277 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 278 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 279 | 280 | destroy@~1.0.4: 281 | version "1.0.4" 282 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 283 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 284 | 285 | dot-prop@^5.2.0: 286 | version "5.3.0" 287 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 288 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 289 | dependencies: 290 | is-obj "^2.0.0" 291 | 292 | duplexer3@^0.1.4: 293 | version "0.1.4" 294 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 295 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 296 | 297 | ee-first@1.1.1: 298 | version "1.1.1" 299 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 300 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 301 | 302 | emoji-regex@^8.0.0: 303 | version "8.0.0" 304 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 305 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 306 | 307 | encodeurl@~1.0.2: 308 | version "1.0.2" 309 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 310 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 311 | 312 | end-of-stream@^1.1.0: 313 | version "1.4.4" 314 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 315 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 316 | dependencies: 317 | once "^1.4.0" 318 | 319 | escape-goat@^2.0.0: 320 | version "2.1.1" 321 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 322 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 323 | 324 | escape-html@~1.0.3: 325 | version "1.0.3" 326 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 327 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 328 | 329 | etag@~1.8.1: 330 | version "1.8.1" 331 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 332 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 333 | 334 | express@^4.17.2: 335 | version "4.17.2" 336 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" 337 | integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== 338 | dependencies: 339 | accepts "~1.3.7" 340 | array-flatten "1.1.1" 341 | body-parser "1.19.1" 342 | content-disposition "0.5.4" 343 | content-type "~1.0.4" 344 | cookie "0.4.1" 345 | cookie-signature "1.0.6" 346 | debug "2.6.9" 347 | depd "~1.1.2" 348 | encodeurl "~1.0.2" 349 | escape-html "~1.0.3" 350 | etag "~1.8.1" 351 | finalhandler "~1.1.2" 352 | fresh "0.5.2" 353 | merge-descriptors "1.0.1" 354 | methods "~1.1.2" 355 | on-finished "~2.3.0" 356 | parseurl "~1.3.3" 357 | path-to-regexp "0.1.7" 358 | proxy-addr "~2.0.7" 359 | qs "6.9.6" 360 | range-parser "~1.2.1" 361 | safe-buffer "5.2.1" 362 | send "0.17.2" 363 | serve-static "1.14.2" 364 | setprototypeof "1.2.0" 365 | statuses "~1.5.0" 366 | type-is "~1.6.18" 367 | utils-merge "1.0.1" 368 | vary "~1.1.2" 369 | 370 | fill-range@^7.0.1: 371 | version "7.0.1" 372 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 373 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 374 | dependencies: 375 | to-regex-range "^5.0.1" 376 | 377 | finalhandler@~1.1.2: 378 | version "1.1.2" 379 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 380 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 381 | dependencies: 382 | debug "2.6.9" 383 | encodeurl "~1.0.2" 384 | escape-html "~1.0.3" 385 | on-finished "~2.3.0" 386 | parseurl "~1.3.3" 387 | statuses "~1.5.0" 388 | unpipe "~1.0.0" 389 | 390 | forwarded@0.2.0: 391 | version "0.2.0" 392 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 393 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 394 | 395 | fresh@0.5.2: 396 | version "0.5.2" 397 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 398 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 399 | 400 | fsevents@~2.3.2: 401 | version "2.3.2" 402 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 403 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 404 | 405 | get-stream@^4.1.0: 406 | version "4.1.0" 407 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 408 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 409 | dependencies: 410 | pump "^3.0.0" 411 | 412 | get-stream@^5.1.0: 413 | version "5.2.0" 414 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 415 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 416 | dependencies: 417 | pump "^3.0.0" 418 | 419 | glob-parent@~5.1.2: 420 | version "5.1.2" 421 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 422 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 423 | dependencies: 424 | is-glob "^4.0.1" 425 | 426 | global-dirs@^3.0.0: 427 | version "3.0.0" 428 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" 429 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== 430 | dependencies: 431 | ini "2.0.0" 432 | 433 | got@^9.6.0: 434 | version "9.6.0" 435 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 436 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 437 | dependencies: 438 | "@sindresorhus/is" "^0.14.0" 439 | "@szmarczak/http-timer" "^1.1.2" 440 | cacheable-request "^6.0.0" 441 | decompress-response "^3.3.0" 442 | duplexer3 "^0.1.4" 443 | get-stream "^4.1.0" 444 | lowercase-keys "^1.0.1" 445 | mimic-response "^1.0.1" 446 | p-cancelable "^1.0.0" 447 | to-readable-stream "^1.0.0" 448 | url-parse-lax "^3.0.0" 449 | 450 | graceful-fs@^4.1.2: 451 | version "4.2.9" 452 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" 453 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== 454 | 455 | has-flag@^3.0.0: 456 | version "3.0.0" 457 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 458 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 459 | 460 | has-flag@^4.0.0: 461 | version "4.0.0" 462 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 463 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 464 | 465 | has-yarn@^2.1.0: 466 | version "2.1.0" 467 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 468 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 469 | 470 | http-cache-semantics@^4.0.0: 471 | version "4.1.0" 472 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 473 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 474 | 475 | http-errors@1.8.1: 476 | version "1.8.1" 477 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" 478 | integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== 479 | dependencies: 480 | depd "~1.1.2" 481 | inherits "2.0.4" 482 | setprototypeof "1.2.0" 483 | statuses ">= 1.5.0 < 2" 484 | toidentifier "1.0.1" 485 | 486 | iconv-lite@0.4.24: 487 | version "0.4.24" 488 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 489 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 490 | dependencies: 491 | safer-buffer ">= 2.1.2 < 3" 492 | 493 | ignore-by-default@^1.0.1: 494 | version "1.0.1" 495 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 496 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 497 | 498 | import-lazy@^2.1.0: 499 | version "2.1.0" 500 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 501 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 502 | 503 | imurmurhash@^0.1.4: 504 | version "0.1.4" 505 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 506 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 507 | 508 | inherits@2.0.4: 509 | version "2.0.4" 510 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 511 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 512 | 513 | ini@2.0.0: 514 | version "2.0.0" 515 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" 516 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== 517 | 518 | ini@~1.3.0: 519 | version "1.3.8" 520 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 521 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 522 | 523 | ipaddr.js@1.9.1: 524 | version "1.9.1" 525 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 526 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 527 | 528 | is-binary-path@~2.1.0: 529 | version "2.1.0" 530 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 531 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 532 | dependencies: 533 | binary-extensions "^2.0.0" 534 | 535 | is-ci@^2.0.0: 536 | version "2.0.0" 537 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 538 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 539 | dependencies: 540 | ci-info "^2.0.0" 541 | 542 | is-extglob@^2.1.1: 543 | version "2.1.1" 544 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 545 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 546 | 547 | is-fullwidth-code-point@^3.0.0: 548 | version "3.0.0" 549 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 550 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 551 | 552 | is-glob@^4.0.1, is-glob@~4.0.1: 553 | version "4.0.3" 554 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 555 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 556 | dependencies: 557 | is-extglob "^2.1.1" 558 | 559 | is-installed-globally@^0.4.0: 560 | version "0.4.0" 561 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" 562 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== 563 | dependencies: 564 | global-dirs "^3.0.0" 565 | is-path-inside "^3.0.2" 566 | 567 | is-npm@^5.0.0: 568 | version "5.0.0" 569 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 570 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 571 | 572 | is-number@^7.0.0: 573 | version "7.0.0" 574 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 575 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 576 | 577 | is-obj@^2.0.0: 578 | version "2.0.0" 579 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 580 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 581 | 582 | is-path-inside@^3.0.2: 583 | version "3.0.3" 584 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 585 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 586 | 587 | is-typedarray@^1.0.0: 588 | version "1.0.0" 589 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 590 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 591 | 592 | is-yarn-global@^0.3.0: 593 | version "0.3.0" 594 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 595 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 596 | 597 | json-buffer@3.0.0: 598 | version "3.0.0" 599 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 600 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 601 | 602 | keyv@^3.0.0: 603 | version "3.1.0" 604 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 605 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 606 | dependencies: 607 | json-buffer "3.0.0" 608 | 609 | latest-version@^5.1.0: 610 | version "5.1.0" 611 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 612 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 613 | dependencies: 614 | package-json "^6.3.0" 615 | 616 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 617 | version "1.0.1" 618 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 619 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 620 | 621 | lowercase-keys@^2.0.0: 622 | version "2.0.0" 623 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 624 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 625 | 626 | lru-cache@^6.0.0: 627 | version "6.0.0" 628 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 629 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 630 | dependencies: 631 | yallist "^4.0.0" 632 | 633 | make-dir@^3.0.0: 634 | version "3.1.0" 635 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 636 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 637 | dependencies: 638 | semver "^6.0.0" 639 | 640 | media-typer@0.3.0: 641 | version "0.3.0" 642 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 643 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 644 | 645 | merge-descriptors@1.0.1: 646 | version "1.0.1" 647 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 648 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 649 | 650 | methods@~1.1.2: 651 | version "1.1.2" 652 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 653 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 654 | 655 | mime-db@1.51.0: 656 | version "1.51.0" 657 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 658 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 659 | 660 | mime-types@~2.1.24: 661 | version "2.1.34" 662 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 663 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 664 | dependencies: 665 | mime-db "1.51.0" 666 | 667 | mime@1.6.0: 668 | version "1.6.0" 669 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 670 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 671 | 672 | mimic-response@^1.0.0, mimic-response@^1.0.1: 673 | version "1.0.1" 674 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 675 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 676 | 677 | minimatch@^3.0.4: 678 | version "3.0.4" 679 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 680 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 681 | dependencies: 682 | brace-expansion "^1.1.7" 683 | 684 | minimist@^1.2.0: 685 | version "1.2.5" 686 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 687 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 688 | 689 | ms@2.0.0: 690 | version "2.0.0" 691 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 692 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 693 | 694 | ms@2.1.3, ms@^2.1.1: 695 | version "2.1.3" 696 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 697 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 698 | 699 | negotiator@0.6.2: 700 | version "0.6.2" 701 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 702 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 703 | 704 | nodemon@^2.0.15: 705 | version "2.0.15" 706 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" 707 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== 708 | dependencies: 709 | chokidar "^3.5.2" 710 | debug "^3.2.7" 711 | ignore-by-default "^1.0.1" 712 | minimatch "^3.0.4" 713 | pstree.remy "^1.1.8" 714 | semver "^5.7.1" 715 | supports-color "^5.5.0" 716 | touch "^3.1.0" 717 | undefsafe "^2.0.5" 718 | update-notifier "^5.1.0" 719 | 720 | nopt@~1.0.10: 721 | version "1.0.10" 722 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 723 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 724 | dependencies: 725 | abbrev "1" 726 | 727 | normalize-path@^3.0.0, normalize-path@~3.0.0: 728 | version "3.0.0" 729 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 730 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 731 | 732 | normalize-url@^4.1.0: 733 | version "4.5.1" 734 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 735 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 736 | 737 | object-assign@^4: 738 | version "4.1.1" 739 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 740 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 741 | 742 | on-finished@~2.3.0: 743 | version "2.3.0" 744 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 745 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 746 | dependencies: 747 | ee-first "1.1.1" 748 | 749 | once@^1.3.1, once@^1.4.0: 750 | version "1.4.0" 751 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 752 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 753 | dependencies: 754 | wrappy "1" 755 | 756 | p-cancelable@^1.0.0: 757 | version "1.1.0" 758 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 759 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 760 | 761 | package-json@^6.3.0: 762 | version "6.5.0" 763 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 764 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 765 | dependencies: 766 | got "^9.6.0" 767 | registry-auth-token "^4.0.0" 768 | registry-url "^5.0.0" 769 | semver "^6.2.0" 770 | 771 | parseurl@~1.3.3: 772 | version "1.3.3" 773 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 774 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 775 | 776 | path-to-regexp@0.1.7: 777 | version "0.1.7" 778 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 779 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 780 | 781 | picomatch@^2.0.4, picomatch@^2.2.1: 782 | version "2.3.1" 783 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 784 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 785 | 786 | prepend-http@^2.0.0: 787 | version "2.0.0" 788 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 789 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 790 | 791 | proxy-addr@~2.0.7: 792 | version "2.0.7" 793 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 794 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 795 | dependencies: 796 | forwarded "0.2.0" 797 | ipaddr.js "1.9.1" 798 | 799 | pstree.remy@^1.1.8: 800 | version "1.1.8" 801 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 802 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 803 | 804 | pump@^3.0.0: 805 | version "3.0.0" 806 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 807 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 808 | dependencies: 809 | end-of-stream "^1.1.0" 810 | once "^1.3.1" 811 | 812 | pupa@^2.1.1: 813 | version "2.1.1" 814 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 815 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 816 | dependencies: 817 | escape-goat "^2.0.0" 818 | 819 | qs@6.9.6: 820 | version "6.9.6" 821 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" 822 | integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== 823 | 824 | range-parser@~1.2.1: 825 | version "1.2.1" 826 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 827 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 828 | 829 | raw-body@2.4.2: 830 | version "2.4.2" 831 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" 832 | integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== 833 | dependencies: 834 | bytes "3.1.1" 835 | http-errors "1.8.1" 836 | iconv-lite "0.4.24" 837 | unpipe "1.0.0" 838 | 839 | rc@^1.2.8: 840 | version "1.2.8" 841 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 842 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 843 | dependencies: 844 | deep-extend "^0.6.0" 845 | ini "~1.3.0" 846 | minimist "^1.2.0" 847 | strip-json-comments "~2.0.1" 848 | 849 | readdirp@~3.6.0: 850 | version "3.6.0" 851 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 852 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 853 | dependencies: 854 | picomatch "^2.2.1" 855 | 856 | registry-auth-token@^4.0.0: 857 | version "4.2.1" 858 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 859 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 860 | dependencies: 861 | rc "^1.2.8" 862 | 863 | registry-url@^5.0.0: 864 | version "5.1.0" 865 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 866 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 867 | dependencies: 868 | rc "^1.2.8" 869 | 870 | responselike@^1.0.2: 871 | version "1.0.2" 872 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 873 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 874 | dependencies: 875 | lowercase-keys "^1.0.0" 876 | 877 | safe-buffer@5.2.1: 878 | version "5.2.1" 879 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 880 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 881 | 882 | "safer-buffer@>= 2.1.2 < 3": 883 | version "2.1.2" 884 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 885 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 886 | 887 | semver-diff@^3.1.1: 888 | version "3.1.1" 889 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 890 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 891 | dependencies: 892 | semver "^6.3.0" 893 | 894 | semver@^5.7.1: 895 | version "5.7.1" 896 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 897 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 898 | 899 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 900 | version "6.3.0" 901 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 902 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 903 | 904 | semver@^7.3.4: 905 | version "7.3.5" 906 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 907 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 908 | dependencies: 909 | lru-cache "^6.0.0" 910 | 911 | send@0.17.2: 912 | version "0.17.2" 913 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" 914 | integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== 915 | dependencies: 916 | debug "2.6.9" 917 | depd "~1.1.2" 918 | destroy "~1.0.4" 919 | encodeurl "~1.0.2" 920 | escape-html "~1.0.3" 921 | etag "~1.8.1" 922 | fresh "0.5.2" 923 | http-errors "1.8.1" 924 | mime "1.6.0" 925 | ms "2.1.3" 926 | on-finished "~2.3.0" 927 | range-parser "~1.2.1" 928 | statuses "~1.5.0" 929 | 930 | serve-static@1.14.2: 931 | version "1.14.2" 932 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" 933 | integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== 934 | dependencies: 935 | encodeurl "~1.0.2" 936 | escape-html "~1.0.3" 937 | parseurl "~1.3.3" 938 | send "0.17.2" 939 | 940 | setprototypeof@1.2.0: 941 | version "1.2.0" 942 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 943 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 944 | 945 | signal-exit@^3.0.2: 946 | version "3.0.6" 947 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 948 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 949 | 950 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 951 | version "1.5.0" 952 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 953 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 954 | 955 | string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: 956 | version "4.2.3" 957 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 958 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 959 | dependencies: 960 | emoji-regex "^8.0.0" 961 | is-fullwidth-code-point "^3.0.0" 962 | strip-ansi "^6.0.1" 963 | 964 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 965 | version "6.0.1" 966 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 967 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 968 | dependencies: 969 | ansi-regex "^5.0.1" 970 | 971 | strip-json-comments@~2.0.1: 972 | version "2.0.1" 973 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 974 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 975 | 976 | supports-color@^5.5.0: 977 | version "5.5.0" 978 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 979 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 980 | dependencies: 981 | has-flag "^3.0.0" 982 | 983 | supports-color@^7.1.0: 984 | version "7.2.0" 985 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 986 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 987 | dependencies: 988 | has-flag "^4.0.0" 989 | 990 | to-readable-stream@^1.0.0: 991 | version "1.0.0" 992 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 993 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 994 | 995 | to-regex-range@^5.0.1: 996 | version "5.0.1" 997 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 998 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 999 | dependencies: 1000 | is-number "^7.0.0" 1001 | 1002 | toidentifier@1.0.1: 1003 | version "1.0.1" 1004 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1005 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1006 | 1007 | touch@^3.1.0: 1008 | version "3.1.0" 1009 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1010 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1011 | dependencies: 1012 | nopt "~1.0.10" 1013 | 1014 | type-fest@^0.20.2: 1015 | version "0.20.2" 1016 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1017 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1018 | 1019 | type-is@~1.6.18: 1020 | version "1.6.18" 1021 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1022 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1023 | dependencies: 1024 | media-typer "0.3.0" 1025 | mime-types "~2.1.24" 1026 | 1027 | typedarray-to-buffer@^3.1.5: 1028 | version "3.1.5" 1029 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1030 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1031 | dependencies: 1032 | is-typedarray "^1.0.0" 1033 | 1034 | undefsafe@^2.0.5: 1035 | version "2.0.5" 1036 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 1037 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 1038 | 1039 | unique-string@^2.0.0: 1040 | version "2.0.0" 1041 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1042 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1043 | dependencies: 1044 | crypto-random-string "^2.0.0" 1045 | 1046 | unpipe@1.0.0, unpipe@~1.0.0: 1047 | version "1.0.0" 1048 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1049 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1050 | 1051 | update-notifier@^5.1.0: 1052 | version "5.1.0" 1053 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" 1054 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== 1055 | dependencies: 1056 | boxen "^5.0.0" 1057 | chalk "^4.1.0" 1058 | configstore "^5.0.1" 1059 | has-yarn "^2.1.0" 1060 | import-lazy "^2.1.0" 1061 | is-ci "^2.0.0" 1062 | is-installed-globally "^0.4.0" 1063 | is-npm "^5.0.0" 1064 | is-yarn-global "^0.3.0" 1065 | latest-version "^5.1.0" 1066 | pupa "^2.1.1" 1067 | semver "^7.3.4" 1068 | semver-diff "^3.1.1" 1069 | xdg-basedir "^4.0.0" 1070 | 1071 | url-parse-lax@^3.0.0: 1072 | version "3.0.0" 1073 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1074 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1075 | dependencies: 1076 | prepend-http "^2.0.0" 1077 | 1078 | utils-merge@1.0.1: 1079 | version "1.0.1" 1080 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1081 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1082 | 1083 | vary@^1, vary@~1.1.2: 1084 | version "1.1.2" 1085 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1086 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1087 | 1088 | widest-line@^3.1.0: 1089 | version "3.1.0" 1090 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1091 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1092 | dependencies: 1093 | string-width "^4.0.0" 1094 | 1095 | wrap-ansi@^7.0.0: 1096 | version "7.0.0" 1097 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1098 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1099 | dependencies: 1100 | ansi-styles "^4.0.0" 1101 | string-width "^4.1.0" 1102 | strip-ansi "^6.0.0" 1103 | 1104 | wrappy@1: 1105 | version "1.0.2" 1106 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1107 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1108 | 1109 | write-file-atomic@^3.0.0: 1110 | version "3.0.3" 1111 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1112 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1113 | dependencies: 1114 | imurmurhash "^0.1.4" 1115 | is-typedarray "^1.0.0" 1116 | signal-exit "^3.0.2" 1117 | typedarray-to-buffer "^3.1.5" 1118 | 1119 | xdg-basedir@^4.0.0: 1120 | version "4.0.0" 1121 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1122 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1123 | 1124 | yallist@^4.0.0: 1125 | version "4.0.0" 1126 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1127 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1128 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.16.1", 7 | "@testing-library/react": "^12.1.2", 8 | "@testing-library/user-event": "^13.5.0", 9 | "axios": "^0.25.0", 10 | "react": "^17.0.2", 11 | "react-dom": "^17.0.2", 12 | "react-scripts": "5.0.0", 13 | "styled-components": "^5.3.3", 14 | "web-vitals": "^2.1.4" 15 | }, 16 | "scripts": { 17 | "start": "react-scripts start", 18 | "build": "react-scripts build", 19 | "test": "react-scripts test", 20 | "eject": "react-scripts eject" 21 | }, 22 | "eslintConfig": { 23 | "extends": [ 24 | "react-app", 25 | "react-app/jest" 26 | ] 27 | }, 28 | "browserslist": { 29 | "production": [ 30 | ">0.2%", 31 | "not dead", 32 | "not op_mini all" 33 | ], 34 | "development": [ 35 | "last 1 chrome version", 36 | "last 1 firefox version", 37 | "last 1 safari version" 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /frontend/public/global.css: -------------------------------------------------------------------------------- 1 | body { 2 | overflow: hidden; 3 | } 4 | 5 | font-family: "Roboto", Arial, sans-serif; 6 | -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | React App 14 | 15 | 16 | 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /frontend/src/App.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | import Form from "./components/Form"; 3 | import Header from "./components/Header"; 4 | import Listagem from "./components/Listagem"; 5 | import { api } from "./service/api"; 6 | 7 | function App() { 8 | const [transactions, setTransactions] = useState(undefined); 9 | 10 | useEffect(() => { 11 | const getData = async () => { 12 | const listagem = await api.get("/"); 13 | setTransactions({ total: getTotal(listagem.data), list: listagem.data }); 14 | }; 15 | getData(); 16 | }, []); 17 | 18 | const getTotal = (list) => { 19 | if (!list || list.length === 0) return 0; 20 | 21 | return list.reduce( 22 | (value, curr) => 23 | curr.isRevenue ? value + curr.value : value - curr.value, 24 | 0 25 | ); 26 | }; 27 | 28 | const handleCreate = async (data) => { 29 | const list = transactions.list; 30 | 31 | api 32 | .post("/", data) 33 | .then((response) => { 34 | list.push(response.data); 35 | setTransactions({ total: getTotal(list), list }); 36 | }) 37 | .catch((err) => { 38 | console.log("===================================="); 39 | console.log(err); 40 | console.log("===================================="); 41 | }); 42 | }; 43 | 44 | return ( 45 | <> 46 |
47 |
48 | {transactions && ( 49 | 54 | )} 55 | 56 | ); 57 | } 58 | 59 | export default App; 60 | -------------------------------------------------------------------------------- /frontend/src/assets/arrowDown.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function ArrowDown() { 4 | return ( 5 | 12 | 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/assets/arrowDown.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/arrowUp.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function ArrowUp() { 4 | return ( 5 | 12 | 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/assets/arrowUp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/delete.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Delete() { 4 | return ( 5 | 12 | 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/assets/delete.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/edit.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Edit() { 4 | return ( 5 | 12 | 13 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/assets/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/assets/send.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/components/Button/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const Button = styled.button` 4 | background: transparent; 5 | border: none; 6 | cursor: pointer; 7 | border-radius: 25%; 8 | 9 | &:hover { 10 | background: rgba(255, 255, 255, 0.5); 11 | } 12 | 13 | & + & { 14 | margin-left: 8px; 15 | } 16 | `; 17 | -------------------------------------------------------------------------------- /frontend/src/components/Container/index.jsx: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const StyledContainer = styled.div` 4 | overflow: hidden; 5 | `; 6 | -------------------------------------------------------------------------------- /frontend/src/components/Form/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | 3 | import Radio from "../Radio"; 4 | 5 | import { StyledForm, RadioDiv } from "./styles"; 6 | 7 | function Form(props) { 8 | const [description, setDescription] = useState(""); 9 | const [value, setValue] = useState(undefined); 10 | const [isRevenue, setIsRevenue] = useState(null); 11 | 12 | const onSubmit = (e) => { 13 | e.preventDefault(); 14 | 15 | if (!description || !value || isRevenue === null) { 16 | alert("Todos os campos são obrigatórios!"); 17 | return; 18 | } 19 | 20 | props.onCreate({ 21 | description, 22 | value, 23 | isRevenue, 24 | }); 25 | clearForm(); 26 | }; 27 | 28 | const clearForm = () => { 29 | setDescription(""); 30 | setValue(""); 31 | isRevenue(null); 32 | }; 33 | 34 | const onChangeRadio = (id) => { 35 | setIsRevenue(id === "entrada"); 36 | }; 37 | 38 | return ( 39 | 40 |
41 | 44 | setDescription(e.currentTarget.value)} 48 | /> 49 |
50 |
51 | 54 | 55 | R$ 56 | setValue(Number(e.currentTarget.value))} 61 | /> 62 | 63 |
64 | 65 | onChangeRadio("entrada")} 71 | /> 72 | onChangeRadio("saida")} 78 | /> 79 | 80 | 81 |
82 | ); 83 | } 84 | 85 | export default Form; 86 | -------------------------------------------------------------------------------- /frontend/src/components/Form/styles.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const StyledForm = styled.form` 4 | padding: 16px; 5 | background: #e0e0e0; 6 | margin-top: 16px; 7 | display: flex; 8 | justify-content: space-between; 9 | align-items: center; 10 | max-width: 1024px; 11 | min-width: 340px; 12 | margin: auto; 13 | 14 | @media (max-width: 1024px) { 15 | flex-direction: column; 16 | } 17 | 18 | #lblTransaction, 19 | #entrada { 20 | margin-right: 8px; 21 | } 22 | 23 | label, 24 | input, 25 | span, 26 | button { 27 | font-size: 24px; 28 | } 29 | 30 | span.textbox { 31 | display: inline-block; 32 | background-color: #fff; 33 | color: #888; 34 | line-height: 20px; 35 | height: 20px; 36 | padding: 3px; 37 | border: 1px #888 solid; 38 | height: 30px; 39 | margin-top: 16px; 40 | 41 | @media (min-width: 1024px) { 42 | margin-top: 0; 43 | } 44 | } 45 | 46 | span.textbox input { 47 | margin-left: 4px; 48 | border: 0px; 49 | background-color: #fff; 50 | outline: none; 51 | width: 260px; 52 | 53 | @media (min-width: 1024px) { 54 | width: 100px; 55 | } 56 | } 57 | 58 | button { 59 | border: none; 60 | background: aqua; 61 | padding: 16px; 62 | border-radius: 8px; 63 | cursor: pointer; 64 | 65 | &:hover { 66 | filter: brightness(0.8); 67 | } 68 | } 69 | `; 70 | 71 | export const RadioDiv = styled.div` 72 | display: flex; 73 | justify-content: space-between; 74 | margin-right: 8px; 75 | margin: 16px; 76 | width: 40%; 77 | 78 | @media (min-width: 1024px) { 79 | width: auto; 80 | height: 60px; 81 | margin-top: 0; 82 | margin-bottom: 0; 83 | flex-direction: column; 84 | } 85 | `; 86 | -------------------------------------------------------------------------------- /frontend/src/components/Header/index.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { StyledHeader } from "./styles"; 3 | 4 | export default function Header() { 5 | return Controle de gastos; 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/components/Header/styles.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const StyledHeader = styled.h1` 4 | background-color: #e0e0ff; 5 | padding: 16px; 6 | text-align: center; 7 | `; 8 | -------------------------------------------------------------------------------- /frontend/src/components/Item/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | 3 | import Delete from "../../assets/delete"; 4 | import ArrowUp from "../../assets/arrowUp"; 5 | import ArrowDown from "../../assets/arrowDown"; 6 | import Edit from "../../assets/edit"; 7 | import Radio from "../Radio"; 8 | import { Button } from "../Button"; 9 | import { StyledForms } from "./styles"; 10 | 11 | export default function Item(props) { 12 | const [editMode, setEditMode] = useState(false); 13 | const [description, setDescription] = useState(props.description); 14 | const [value, setValue] = useState(Number(props.value)); 15 | const [isRevenue, setIsRevenue] = useState(props.isRevenue); 16 | 17 | const onSubmit = (e) => { 18 | e.preventDefault(); 19 | props.onEdit({ 20 | id: props.id, 21 | description, 22 | value: Number(value), 23 | isRevenue, 24 | }); 25 | setEditMode(false); 26 | console.log("saiu"); 27 | }; 28 | 29 | const onChangeRadio = (id) => { 30 | setIsRevenue(id === "entrada"); 31 | }; 32 | 33 | const handleCancel = () => { 34 | setEditMode(false); 35 | setDescription(props.description); 36 | setValue(Number(props.value)); 37 | setIsRevenue(props.isRevenue); 38 | }; 39 | 40 | return ( 41 |
  • 42 | {editMode ? ( 43 | 44 | setDescription(e.currentTarget.value)} 47 | /> 48 | setValue(e.currentTarget.value)} 52 | /> 53 |
    54 | onChangeRadio("entrada")} 60 | /> 61 | onChangeRadio("saida")} 67 | /> 68 |
    69 |
    70 | 71 | 72 |
    73 |
    74 | ) : ( 75 | <> 76 | {description} 77 |
    78 | R$ {Number(value).toFixed(2)} 79 | {isRevenue ? : } 80 |
    81 |
    82 | 85 | 86 | 89 |
    90 | 91 | )} 92 |
  • 93 | ); 94 | } 95 | -------------------------------------------------------------------------------- /frontend/src/components/Item/styles.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const StyledForms = styled.form` 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | width: 100%; 8 | 9 | > div { 10 | display: flex; 11 | justify-content: space-between; 12 | 13 | width: 250px; 14 | } 15 | `; 16 | -------------------------------------------------------------------------------- /frontend/src/components/Listagem/index.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import { StyledList } from "./styles"; 4 | import Item from "../Item"; 5 | import { api } from "../../service/api"; 6 | 7 | function Listagem(props) { 8 | const { transactions, setTransactions, getTotal } = props; 9 | 10 | const handleEdit = async (data) => { 11 | const list = transactions.list.map((item) => 12 | item.id !== data.id ? item : data 13 | ); 14 | 15 | const response = await api.put(`/${data.id}`, data); 16 | console.log("entrou"); 17 | if (response.data) { 18 | setTransactions({ total: getTotal(list), list }); 19 | } 20 | }; 21 | 22 | const handleDelete = async (id) => { 23 | const list = transactions.list.filter((c) => c.id !== id); 24 | 25 | const response = await api.delete(`/${id}`); 26 | 27 | if (response.status === 200) { 28 | setTransactions({ total: getTotal(list), list }); 29 | } 30 | }; 31 | 32 | return ( 33 | 34 |
    35 | 36 | Saldo atual: R${" "} 37 | {Number(transactions.total).toFixed(2)} 38 | 39 |
    40 |
      41 | {transactions.list.map((item) => ( 42 | 51 | ))} 52 |
    53 |
    54 | ); 55 | } 56 | 57 | export default Listagem; 58 | -------------------------------------------------------------------------------- /frontend/src/components/Listagem/styles.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const StyledList = styled.div` 4 | background: #a0e0e0; 5 | padding: 16px; 6 | max-width: 1024px; 7 | min-width: 340px; 8 | margin: auto; 9 | 10 | span, 11 | label, 12 | button { 13 | font-size: 18px; 14 | } 15 | 16 | .saldo { 17 | display: flex; 18 | align-items: center; 19 | justify-content: center; 20 | font-size: 24px; 21 | } 22 | 23 | ul { 24 | overflow: scroll; 25 | max-height: 65vh; 26 | } 27 | 28 | li { 29 | display: flex; 30 | align-items: center; 31 | justify-content: space-between; 32 | padding: 16px; 33 | margin-top: 8px; 34 | border-radius: 8px; 35 | } 36 | 37 | li.entrada { 38 | background: lightgreen; 39 | } 40 | 41 | li.saida { 42 | background: lightcoral; 43 | } 44 | 45 | .valueDiv { 46 | display: flex; 47 | align-items: center; 48 | svg { 49 | margin-left: 8px; 50 | height: 20px; 51 | } 52 | } 53 | `; 54 | -------------------------------------------------------------------------------- /frontend/src/components/Radio/index.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import { StyledRadio } from "./styles"; 4 | 5 | function Radio(props) { 6 | return ( 7 | 8 | 19 | 20 | ); 21 | } 22 | 23 | export default Radio; 24 | -------------------------------------------------------------------------------- /frontend/src/components/Radio/styles.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | 3 | export const StyledRadio = styled.label` 4 | /* The container */ 5 | .container { 6 | display: block; 7 | position: relative; 8 | padding-left: 35px; 9 | cursor: pointer; 10 | font-size: 22px; 11 | -webkit-user-select: none; 12 | -moz-user-select: none; 13 | -ms-user-select: none; 14 | user-select: none; 15 | } 16 | 17 | /* Hide the browser's default radio button */ 18 | .container input { 19 | position: absolute; 20 | opacity: 0; 21 | cursor: pointer; 22 | } 23 | 24 | /* Create a custom radio button */ 25 | .checkmark { 26 | position: absolute; 27 | top: 0; 28 | left: 0; 29 | height: 25px; 30 | width: 25px; 31 | background-color: #eee; 32 | border-radius: 50%; 33 | } 34 | 35 | /* On mouse-over, add a grey background color */ 36 | .container:hover input ~ .checkmark { 37 | background-color: #ccc; 38 | } 39 | 40 | /* When the radio button is checked, add a blue background */ 41 | .container input:checked ~ .checkmark { 42 | background-color: #2196f3; 43 | } 44 | 45 | .container input#entrada:checked ~ .checkmark { 46 | background-color: green; 47 | } 48 | 49 | .container input#saida:checked ~ .checkmark { 50 | background-color: crimson; 51 | } 52 | 53 | /* Create the indicator (the dot/circle - hidden when not checked) */ 54 | .checkmark:after { 55 | content: ""; 56 | position: absolute; 57 | display: none; 58 | } 59 | 60 | /* Show the indicator (dot/circle) when checked */ 61 | .container input:checked ~ .checkmark:after { 62 | display: block; 63 | } 64 | 65 | /* Style the indicator (dot/circle) */ 66 | `; 67 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import App from "./App"; 4 | 5 | ReactDOM.render( 6 | 7 | 8 | , 9 | document.getElementById("root") 10 | ); 11 | -------------------------------------------------------------------------------- /frontend/src/service/api.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | export const api = axios.create({ 4 | baseURL: "http://localhost:3030/transactions", 5 | }); 6 | --------------------------------------------------------------------------------