├── .gitignore ├── README.md ├── netflix-api ├── controllers │ └── UserController.js ├── models │ └── UserModel.js ├── package.json ├── routes │ └── UserRoutes.js ├── server.js └── yarn.lock └── netflix-ui ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── src ├── App.js ├── assets │ ├── card.jpg │ ├── home.jpg │ ├── homeTitle.webp │ ├── login.jpg │ ├── logo-logomark.png │ └── logo.png ├── components │ ├── BackgroundImage.jsx │ ├── Card.jsx │ ├── CardSlider.jsx │ ├── Header.jsx │ ├── Navbar.jsx │ ├── NotAvailable.jsx │ ├── SelectGenre.jsx │ └── Slider.jsx ├── index.css ├── index.js ├── pages │ ├── Login.jsx │ ├── Movies.jsx │ ├── Netflix.jsx │ ├── Player.jsx │ ├── Signup.jsx │ ├── TVShows.jsx │ └── UserListedMovies.jsx ├── store │ └── index.js └── utils │ ├── constants.js │ └── firebase-config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | ./netflix-ui/node_modules/ 5 | ./netflix-api/node_modules/ 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Netflix Clone built using React, Redux Toolkit, Firebase, Styled Components, Axios, Node.js, Express and MongoDB. 2 | 3 | ## Steps to Start the App 4 | 5 | + Install React Dependencies 6 | + Instal Node Dependencies 7 | + Start Node App 8 | + Start React App 9 | 10 | 11 | ## Watch it on [Youtube](https://www.youtube.com/watch?v=HgaJW2I4Mbk) 12 | 13 | -------------------------------------------------------------------------------- /netflix-api/controllers/UserController.js: -------------------------------------------------------------------------------- 1 | const User = require("../models/UserModel"); 2 | 3 | module.exports.getLikedMovies = async (req, res) => { 4 | try { 5 | const { email } = req.params; 6 | const user = await await User.findOne({ email }); 7 | if (user) { 8 | return res.json({ msg: "success", movies: user.likedMovies }); 9 | } else return res.json({ msg: "User with given email not found." }); 10 | } catch (error) { 11 | return res.json({ msg: "Error fetching movies." }); 12 | } 13 | }; 14 | 15 | module.exports.addToLikedMovies = async (req, res) => { 16 | try { 17 | const { email, data } = req.body; 18 | const user = await await User.findOne({ email }); 19 | if (user) { 20 | const { likedMovies } = user; 21 | const movieAlreadyLiked = likedMovies.find(({ id }) => id === data.id); 22 | if (!movieAlreadyLiked) { 23 | await User.findByIdAndUpdate( 24 | user._id, 25 | { 26 | likedMovies: [...user.likedMovies, data], 27 | }, 28 | { new: true } 29 | ); 30 | } else return res.json({ msg: "Movie already added to the liked list." }); 31 | } else await User.create({ email, likedMovies: [data] }); 32 | return res.json({ msg: "Movie successfully added to liked list." }); 33 | } catch (error) { 34 | return res.json({ msg: "Error adding movie to the liked list" }); 35 | } 36 | }; 37 | 38 | module.exports.removeFromLikedMovies = async (req, res) => { 39 | try { 40 | const { email, movieId } = req.body; 41 | const user = await User.findOne({ email }); 42 | if (user) { 43 | const movies = user.likedMovies; 44 | const movieIndex = movies.findIndex(({ id }) => id === movieId); 45 | if (!movieIndex) { 46 | res.status(400).send({ msg: "Movie not found." }); 47 | } 48 | movies.splice(movieIndex, 1); 49 | await User.findByIdAndUpdate( 50 | user._id, 51 | { 52 | likedMovies: movies, 53 | }, 54 | { new: true } 55 | ); 56 | return res.json({ msg: "Movie successfully removed.", movies }); 57 | } else return res.json({ msg: "User with given email not found." }); 58 | } catch (error) { 59 | return res.json({ msg: "Error removing movie to the liked list" }); 60 | } 61 | }; 62 | -------------------------------------------------------------------------------- /netflix-api/models/UserModel.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const userSchema = new mongoose.Schema({ 4 | email: { 5 | type: String, 6 | required: true, 7 | unique: true, 8 | max: 50, 9 | }, 10 | likedMovies: Array, 11 | }); 12 | 13 | module.exports = mongoose.model("users", userSchema); 14 | -------------------------------------------------------------------------------- /netflix-api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "netflix-api", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "nodemon server.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "cors": "^2.8.5", 15 | "express": "^4.18.1", 16 | "mongoose": "^6.3.6", 17 | "nodemon": "^2.0.16" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /netflix-api/routes/UserRoutes.js: -------------------------------------------------------------------------------- 1 | const { 2 | addToLikedMovies, 3 | getLikedMovies, 4 | removeFromLikedMovies, 5 | } = require("../controllers/UserController"); 6 | 7 | const router = require("express").Router(); 8 | 9 | router.get("/liked/:email", getLikedMovies); 10 | router.post("/add", addToLikedMovies); 11 | router.put("/remove", removeFromLikedMovies); 12 | 13 | module.exports = router; 14 | -------------------------------------------------------------------------------- /netflix-api/server.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const cors = require("cors"); 3 | const userRoutes = require("./routes/UserRoutes"); 4 | const mongoose = require("mongoose"); 5 | 6 | const app = express(); 7 | 8 | app.use(cors()); 9 | app.use(express.json()); 10 | 11 | mongoose 12 | .connect("mongodb://localhost:27017/netflix", { 13 | useNewUrlParser: true, 14 | useUnifiedTopology: true, 15 | }) 16 | .then(() => { 17 | console.log("DB Connetion Successfull"); 18 | }) 19 | .catch((err) => { 20 | console.log(err.message); 21 | }); 22 | 23 | app.use("/api/user", userRoutes); 24 | 25 | app.listen(5000, () => { 26 | console.log("server started on port 5000"); 27 | }); 28 | -------------------------------------------------------------------------------- /netflix-api/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 | "@types/node@*": 18 | version "17.0.41" 19 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.41.tgz#1607b2fd3da014ae5d4d1b31bc792a39348dfb9b" 20 | integrity sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw== 21 | 22 | "@types/webidl-conversions@*": 23 | version "6.1.1" 24 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e" 25 | integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q== 26 | 27 | "@types/whatwg-url@^8.2.1": 28 | version "8.2.1" 29 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.1.tgz#f1aac222dab7c59e011663a0cb0a3117b2ef05d4" 30 | integrity sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ== 31 | dependencies: 32 | "@types/node" "*" 33 | "@types/webidl-conversions" "*" 34 | 35 | abbrev@1: 36 | version "1.1.1" 37 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 38 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 39 | 40 | accepts@~1.3.8: 41 | version "1.3.8" 42 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 43 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 44 | dependencies: 45 | mime-types "~2.1.34" 46 | negotiator "0.6.3" 47 | 48 | ansi-align@^3.0.0: 49 | version "3.0.1" 50 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 51 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 52 | dependencies: 53 | string-width "^4.1.0" 54 | 55 | ansi-regex@^5.0.1: 56 | version "5.0.1" 57 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 58 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 59 | 60 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 61 | version "4.3.0" 62 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 63 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 64 | dependencies: 65 | color-convert "^2.0.1" 66 | 67 | anymatch@~3.1.2: 68 | version "3.1.2" 69 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 70 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 71 | dependencies: 72 | normalize-path "^3.0.0" 73 | picomatch "^2.0.4" 74 | 75 | array-flatten@1.1.1: 76 | version "1.1.1" 77 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 78 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 79 | 80 | balanced-match@^1.0.0: 81 | version "1.0.2" 82 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 83 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 84 | 85 | base64-js@^1.3.1: 86 | version "1.5.1" 87 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 88 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 89 | 90 | binary-extensions@^2.0.0: 91 | version "2.2.0" 92 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 93 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 94 | 95 | body-parser@1.20.0: 96 | version "1.20.0" 97 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" 98 | integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== 99 | dependencies: 100 | bytes "3.1.2" 101 | content-type "~1.0.4" 102 | debug "2.6.9" 103 | depd "2.0.0" 104 | destroy "1.2.0" 105 | http-errors "2.0.0" 106 | iconv-lite "0.4.24" 107 | on-finished "2.4.1" 108 | qs "6.10.3" 109 | raw-body "2.5.1" 110 | type-is "~1.6.18" 111 | unpipe "1.0.0" 112 | 113 | boxen@^5.0.0: 114 | version "5.1.2" 115 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" 116 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== 117 | dependencies: 118 | ansi-align "^3.0.0" 119 | camelcase "^6.2.0" 120 | chalk "^4.1.0" 121 | cli-boxes "^2.2.1" 122 | string-width "^4.2.2" 123 | type-fest "^0.20.2" 124 | widest-line "^3.1.0" 125 | wrap-ansi "^7.0.0" 126 | 127 | brace-expansion@^1.1.7: 128 | version "1.1.11" 129 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 130 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 131 | dependencies: 132 | balanced-match "^1.0.0" 133 | concat-map "0.0.1" 134 | 135 | braces@~3.0.2: 136 | version "3.0.2" 137 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 138 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 139 | dependencies: 140 | fill-range "^7.0.1" 141 | 142 | bson@^4.6.2: 143 | version "4.6.4" 144 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.4.tgz#e66d4a334f1ab230dfcfb9ec4ea9091476dd372e" 145 | integrity sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ== 146 | dependencies: 147 | buffer "^5.6.0" 148 | 149 | buffer@^5.6.0: 150 | version "5.7.1" 151 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 152 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 153 | dependencies: 154 | base64-js "^1.3.1" 155 | ieee754 "^1.1.13" 156 | 157 | bytes@3.1.2: 158 | version "3.1.2" 159 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 160 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 161 | 162 | cacheable-request@^6.0.0: 163 | version "6.1.0" 164 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 165 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 166 | dependencies: 167 | clone-response "^1.0.2" 168 | get-stream "^5.1.0" 169 | http-cache-semantics "^4.0.0" 170 | keyv "^3.0.0" 171 | lowercase-keys "^2.0.0" 172 | normalize-url "^4.1.0" 173 | responselike "^1.0.2" 174 | 175 | call-bind@^1.0.0: 176 | version "1.0.2" 177 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 178 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 179 | dependencies: 180 | function-bind "^1.1.1" 181 | get-intrinsic "^1.0.2" 182 | 183 | camelcase@^6.2.0: 184 | version "6.3.0" 185 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 186 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 187 | 188 | chalk@^4.1.0: 189 | version "4.1.2" 190 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 191 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 192 | dependencies: 193 | ansi-styles "^4.1.0" 194 | supports-color "^7.1.0" 195 | 196 | chokidar@^3.5.2: 197 | version "3.5.3" 198 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 199 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 200 | dependencies: 201 | anymatch "~3.1.2" 202 | braces "~3.0.2" 203 | glob-parent "~5.1.2" 204 | is-binary-path "~2.1.0" 205 | is-glob "~4.0.1" 206 | normalize-path "~3.0.0" 207 | readdirp "~3.6.0" 208 | optionalDependencies: 209 | fsevents "~2.3.2" 210 | 211 | ci-info@^2.0.0: 212 | version "2.0.0" 213 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 214 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 215 | 216 | cli-boxes@^2.2.1: 217 | version "2.2.1" 218 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 219 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 220 | 221 | clone-response@^1.0.2: 222 | version "1.0.2" 223 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 224 | integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== 225 | dependencies: 226 | mimic-response "^1.0.0" 227 | 228 | color-convert@^2.0.1: 229 | version "2.0.1" 230 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 231 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 232 | dependencies: 233 | color-name "~1.1.4" 234 | 235 | color-name@~1.1.4: 236 | version "1.1.4" 237 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 238 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 239 | 240 | concat-map@0.0.1: 241 | version "0.0.1" 242 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 243 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 244 | 245 | configstore@^5.0.1: 246 | version "5.0.1" 247 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 248 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 249 | dependencies: 250 | dot-prop "^5.2.0" 251 | graceful-fs "^4.1.2" 252 | make-dir "^3.0.0" 253 | unique-string "^2.0.0" 254 | write-file-atomic "^3.0.0" 255 | xdg-basedir "^4.0.0" 256 | 257 | content-disposition@0.5.4: 258 | version "0.5.4" 259 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 260 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 261 | dependencies: 262 | safe-buffer "5.2.1" 263 | 264 | content-type@~1.0.4: 265 | version "1.0.4" 266 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 267 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 268 | 269 | cookie-signature@1.0.6: 270 | version "1.0.6" 271 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 272 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 273 | 274 | cookie@0.5.0: 275 | version "0.5.0" 276 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 277 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 278 | 279 | cors@^2.8.5: 280 | version "2.8.5" 281 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 282 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 283 | dependencies: 284 | object-assign "^4" 285 | vary "^1" 286 | 287 | crypto-random-string@^2.0.0: 288 | version "2.0.0" 289 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 290 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 291 | 292 | debug@2.6.9: 293 | version "2.6.9" 294 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 295 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 296 | dependencies: 297 | ms "2.0.0" 298 | 299 | debug@4.x: 300 | version "4.3.4" 301 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 302 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 303 | dependencies: 304 | ms "2.1.2" 305 | 306 | debug@^3.2.7: 307 | version "3.2.7" 308 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 309 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 310 | dependencies: 311 | ms "^2.1.1" 312 | 313 | decompress-response@^3.3.0: 314 | version "3.3.0" 315 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 316 | integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== 317 | dependencies: 318 | mimic-response "^1.0.0" 319 | 320 | deep-extend@^0.6.0: 321 | version "0.6.0" 322 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 323 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 324 | 325 | defer-to-connect@^1.0.1: 326 | version "1.1.3" 327 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 328 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 329 | 330 | denque@^2.0.1: 331 | version "2.0.1" 332 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a" 333 | integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ== 334 | 335 | depd@2.0.0: 336 | version "2.0.0" 337 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 338 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 339 | 340 | destroy@1.2.0: 341 | version "1.2.0" 342 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 343 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 344 | 345 | dot-prop@^5.2.0: 346 | version "5.3.0" 347 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 348 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 349 | dependencies: 350 | is-obj "^2.0.0" 351 | 352 | duplexer3@^0.1.4: 353 | version "0.1.4" 354 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 355 | integrity sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA== 356 | 357 | ee-first@1.1.1: 358 | version "1.1.1" 359 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 360 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 361 | 362 | emoji-regex@^8.0.0: 363 | version "8.0.0" 364 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 365 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 366 | 367 | encodeurl@~1.0.2: 368 | version "1.0.2" 369 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 370 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 371 | 372 | end-of-stream@^1.1.0: 373 | version "1.4.4" 374 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 375 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 376 | dependencies: 377 | once "^1.4.0" 378 | 379 | escape-goat@^2.0.0: 380 | version "2.1.1" 381 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 382 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 383 | 384 | escape-html@~1.0.3: 385 | version "1.0.3" 386 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 387 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 388 | 389 | etag@~1.8.1: 390 | version "1.8.1" 391 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 392 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 393 | 394 | express@^4.18.1: 395 | version "4.18.1" 396 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" 397 | integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== 398 | dependencies: 399 | accepts "~1.3.8" 400 | array-flatten "1.1.1" 401 | body-parser "1.20.0" 402 | content-disposition "0.5.4" 403 | content-type "~1.0.4" 404 | cookie "0.5.0" 405 | cookie-signature "1.0.6" 406 | debug "2.6.9" 407 | depd "2.0.0" 408 | encodeurl "~1.0.2" 409 | escape-html "~1.0.3" 410 | etag "~1.8.1" 411 | finalhandler "1.2.0" 412 | fresh "0.5.2" 413 | http-errors "2.0.0" 414 | merge-descriptors "1.0.1" 415 | methods "~1.1.2" 416 | on-finished "2.4.1" 417 | parseurl "~1.3.3" 418 | path-to-regexp "0.1.7" 419 | proxy-addr "~2.0.7" 420 | qs "6.10.3" 421 | range-parser "~1.2.1" 422 | safe-buffer "5.2.1" 423 | send "0.18.0" 424 | serve-static "1.15.0" 425 | setprototypeof "1.2.0" 426 | statuses "2.0.1" 427 | type-is "~1.6.18" 428 | utils-merge "1.0.1" 429 | vary "~1.1.2" 430 | 431 | fill-range@^7.0.1: 432 | version "7.0.1" 433 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 434 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 435 | dependencies: 436 | to-regex-range "^5.0.1" 437 | 438 | finalhandler@1.2.0: 439 | version "1.2.0" 440 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 441 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 442 | dependencies: 443 | debug "2.6.9" 444 | encodeurl "~1.0.2" 445 | escape-html "~1.0.3" 446 | on-finished "2.4.1" 447 | parseurl "~1.3.3" 448 | statuses "2.0.1" 449 | unpipe "~1.0.0" 450 | 451 | forwarded@0.2.0: 452 | version "0.2.0" 453 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 454 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 455 | 456 | fresh@0.5.2: 457 | version "0.5.2" 458 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 459 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 460 | 461 | fsevents@~2.3.2: 462 | version "2.3.2" 463 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 464 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 465 | 466 | function-bind@^1.1.1: 467 | version "1.1.1" 468 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 469 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 470 | 471 | get-intrinsic@^1.0.2: 472 | version "1.1.2" 473 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" 474 | integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== 475 | dependencies: 476 | function-bind "^1.1.1" 477 | has "^1.0.3" 478 | has-symbols "^1.0.3" 479 | 480 | get-stream@^4.1.0: 481 | version "4.1.0" 482 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 483 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 484 | dependencies: 485 | pump "^3.0.0" 486 | 487 | get-stream@^5.1.0: 488 | version "5.2.0" 489 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 490 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 491 | dependencies: 492 | pump "^3.0.0" 493 | 494 | glob-parent@~5.1.2: 495 | version "5.1.2" 496 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 497 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 498 | dependencies: 499 | is-glob "^4.0.1" 500 | 501 | global-dirs@^3.0.0: 502 | version "3.0.0" 503 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" 504 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== 505 | dependencies: 506 | ini "2.0.0" 507 | 508 | got@^9.6.0: 509 | version "9.6.0" 510 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 511 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 512 | dependencies: 513 | "@sindresorhus/is" "^0.14.0" 514 | "@szmarczak/http-timer" "^1.1.2" 515 | cacheable-request "^6.0.0" 516 | decompress-response "^3.3.0" 517 | duplexer3 "^0.1.4" 518 | get-stream "^4.1.0" 519 | lowercase-keys "^1.0.1" 520 | mimic-response "^1.0.1" 521 | p-cancelable "^1.0.0" 522 | to-readable-stream "^1.0.0" 523 | url-parse-lax "^3.0.0" 524 | 525 | graceful-fs@^4.1.2: 526 | version "4.2.10" 527 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" 528 | integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== 529 | 530 | has-flag@^3.0.0: 531 | version "3.0.0" 532 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 533 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 534 | 535 | has-flag@^4.0.0: 536 | version "4.0.0" 537 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 538 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 539 | 540 | has-symbols@^1.0.3: 541 | version "1.0.3" 542 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 543 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 544 | 545 | has-yarn@^2.1.0: 546 | version "2.1.0" 547 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 548 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 549 | 550 | has@^1.0.3: 551 | version "1.0.3" 552 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 553 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 554 | dependencies: 555 | function-bind "^1.1.1" 556 | 557 | http-cache-semantics@^4.0.0: 558 | version "4.1.0" 559 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 560 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 561 | 562 | http-errors@2.0.0: 563 | version "2.0.0" 564 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 565 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 566 | dependencies: 567 | depd "2.0.0" 568 | inherits "2.0.4" 569 | setprototypeof "1.2.0" 570 | statuses "2.0.1" 571 | toidentifier "1.0.1" 572 | 573 | iconv-lite@0.4.24: 574 | version "0.4.24" 575 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 576 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 577 | dependencies: 578 | safer-buffer ">= 2.1.2 < 3" 579 | 580 | ieee754@^1.1.13: 581 | version "1.2.1" 582 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 583 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 584 | 585 | ignore-by-default@^1.0.1: 586 | version "1.0.1" 587 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 588 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 589 | 590 | import-lazy@^2.1.0: 591 | version "2.1.0" 592 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 593 | integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== 594 | 595 | imurmurhash@^0.1.4: 596 | version "0.1.4" 597 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 598 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 599 | 600 | inherits@2.0.4: 601 | version "2.0.4" 602 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 603 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 604 | 605 | ini@2.0.0: 606 | version "2.0.0" 607 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" 608 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== 609 | 610 | ini@~1.3.0: 611 | version "1.3.8" 612 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 613 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 614 | 615 | ip@^1.1.5: 616 | version "1.1.8" 617 | resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" 618 | integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== 619 | 620 | ipaddr.js@1.9.1: 621 | version "1.9.1" 622 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 623 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 624 | 625 | is-binary-path@~2.1.0: 626 | version "2.1.0" 627 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 628 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 629 | dependencies: 630 | binary-extensions "^2.0.0" 631 | 632 | is-ci@^2.0.0: 633 | version "2.0.0" 634 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 635 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 636 | dependencies: 637 | ci-info "^2.0.0" 638 | 639 | is-extglob@^2.1.1: 640 | version "2.1.1" 641 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 642 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 643 | 644 | is-fullwidth-code-point@^3.0.0: 645 | version "3.0.0" 646 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 647 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 648 | 649 | is-glob@^4.0.1, is-glob@~4.0.1: 650 | version "4.0.3" 651 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 652 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 653 | dependencies: 654 | is-extglob "^2.1.1" 655 | 656 | is-installed-globally@^0.4.0: 657 | version "0.4.0" 658 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" 659 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== 660 | dependencies: 661 | global-dirs "^3.0.0" 662 | is-path-inside "^3.0.2" 663 | 664 | is-npm@^5.0.0: 665 | version "5.0.0" 666 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 667 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 668 | 669 | is-number@^7.0.0: 670 | version "7.0.0" 671 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 672 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 673 | 674 | is-obj@^2.0.0: 675 | version "2.0.0" 676 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 677 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 678 | 679 | is-path-inside@^3.0.2: 680 | version "3.0.3" 681 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 682 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 683 | 684 | is-typedarray@^1.0.0: 685 | version "1.0.0" 686 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 687 | integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== 688 | 689 | is-yarn-global@^0.3.0: 690 | version "0.3.0" 691 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 692 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 693 | 694 | json-buffer@3.0.0: 695 | version "3.0.0" 696 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 697 | integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== 698 | 699 | kareem@2.3.5: 700 | version "2.3.5" 701 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.5.tgz#111fe9dbab754c8ed88b7a2360e2680cec1420ca" 702 | integrity sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg== 703 | 704 | keyv@^3.0.0: 705 | version "3.1.0" 706 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 707 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 708 | dependencies: 709 | json-buffer "3.0.0" 710 | 711 | latest-version@^5.1.0: 712 | version "5.1.0" 713 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 714 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 715 | dependencies: 716 | package-json "^6.3.0" 717 | 718 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 719 | version "1.0.1" 720 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 721 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 722 | 723 | lowercase-keys@^2.0.0: 724 | version "2.0.0" 725 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 726 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 727 | 728 | lru-cache@^6.0.0: 729 | version "6.0.0" 730 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 731 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 732 | dependencies: 733 | yallist "^4.0.0" 734 | 735 | make-dir@^3.0.0: 736 | version "3.1.0" 737 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 738 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 739 | dependencies: 740 | semver "^6.0.0" 741 | 742 | media-typer@0.3.0: 743 | version "0.3.0" 744 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 745 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 746 | 747 | memory-pager@^1.0.2: 748 | version "1.5.0" 749 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 750 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 751 | 752 | merge-descriptors@1.0.1: 753 | version "1.0.1" 754 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 755 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 756 | 757 | methods@~1.1.2: 758 | version "1.1.2" 759 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 760 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 761 | 762 | mime-db@1.52.0: 763 | version "1.52.0" 764 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 765 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 766 | 767 | mime-types@~2.1.24, mime-types@~2.1.34: 768 | version "2.1.35" 769 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 770 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 771 | dependencies: 772 | mime-db "1.52.0" 773 | 774 | mime@1.6.0: 775 | version "1.6.0" 776 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 777 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 778 | 779 | mimic-response@^1.0.0, mimic-response@^1.0.1: 780 | version "1.0.1" 781 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 782 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 783 | 784 | minimatch@^3.0.4: 785 | version "3.1.2" 786 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 787 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 788 | dependencies: 789 | brace-expansion "^1.1.7" 790 | 791 | minimist@^1.2.0: 792 | version "1.2.6" 793 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 794 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 795 | 796 | mongodb-connection-string-url@^2.5.2: 797 | version "2.5.2" 798 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz#f075c8d529e8d3916386018b8a396aed4f16e5ed" 799 | integrity sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA== 800 | dependencies: 801 | "@types/whatwg-url" "^8.2.1" 802 | whatwg-url "^11.0.0" 803 | 804 | mongodb@4.5.0: 805 | version "4.5.0" 806 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.5.0.tgz#d74c2008567b606dccef220f62a44cd7b934eb92" 807 | integrity sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA== 808 | dependencies: 809 | bson "^4.6.2" 810 | denque "^2.0.1" 811 | mongodb-connection-string-url "^2.5.2" 812 | socks "^2.6.2" 813 | optionalDependencies: 814 | saslprep "^1.0.3" 815 | 816 | mongoose@^6.3.6: 817 | version "6.3.6" 818 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.3.6.tgz#a0e0fa3f87a78d390d9d286ac3f5f16a0c7c776f" 819 | integrity sha512-/Cixfo+bA32EHQ5Y7sxMj5ZOXFiAFlvA3X4mFruUET9OsbJZfstg4n2FzxovX8Q7EcoQ7Ry1bnOp9AeXtodF7w== 820 | dependencies: 821 | bson "^4.6.2" 822 | kareem "2.3.5" 823 | mongodb "4.5.0" 824 | mpath "0.9.0" 825 | mquery "4.0.3" 826 | ms "2.1.3" 827 | sift "16.0.0" 828 | 829 | mpath@0.9.0: 830 | version "0.9.0" 831 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" 832 | integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== 833 | 834 | mquery@4.0.3: 835 | version "4.0.3" 836 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" 837 | integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== 838 | dependencies: 839 | debug "4.x" 840 | 841 | ms@2.0.0: 842 | version "2.0.0" 843 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 844 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 845 | 846 | ms@2.1.2: 847 | version "2.1.2" 848 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 849 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 850 | 851 | ms@2.1.3, ms@^2.1.1: 852 | version "2.1.3" 853 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 854 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 855 | 856 | negotiator@0.6.3: 857 | version "0.6.3" 858 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 859 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 860 | 861 | nodemon@^2.0.16: 862 | version "2.0.16" 863 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.16.tgz#d71b31bfdb226c25de34afea53486c8ef225fdef" 864 | integrity sha512-zsrcaOfTWRuUzBn3P44RDliLlp263Z/76FPoHFr3cFFkOz0lTPAcIw8dCzfdVIx/t3AtDYCZRCDkoCojJqaG3w== 865 | dependencies: 866 | chokidar "^3.5.2" 867 | debug "^3.2.7" 868 | ignore-by-default "^1.0.1" 869 | minimatch "^3.0.4" 870 | pstree.remy "^1.1.8" 871 | semver "^5.7.1" 872 | supports-color "^5.5.0" 873 | touch "^3.1.0" 874 | undefsafe "^2.0.5" 875 | update-notifier "^5.1.0" 876 | 877 | nopt@~1.0.10: 878 | version "1.0.10" 879 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 880 | integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== 881 | dependencies: 882 | abbrev "1" 883 | 884 | normalize-path@^3.0.0, normalize-path@~3.0.0: 885 | version "3.0.0" 886 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 887 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 888 | 889 | normalize-url@^4.1.0: 890 | version "4.5.1" 891 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 892 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 893 | 894 | object-assign@^4: 895 | version "4.1.1" 896 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 897 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 898 | 899 | object-inspect@^1.9.0: 900 | version "1.12.2" 901 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 902 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 903 | 904 | on-finished@2.4.1: 905 | version "2.4.1" 906 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 907 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 908 | dependencies: 909 | ee-first "1.1.1" 910 | 911 | once@^1.3.1, once@^1.4.0: 912 | version "1.4.0" 913 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 914 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 915 | dependencies: 916 | wrappy "1" 917 | 918 | p-cancelable@^1.0.0: 919 | version "1.1.0" 920 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 921 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 922 | 923 | package-json@^6.3.0: 924 | version "6.5.0" 925 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 926 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 927 | dependencies: 928 | got "^9.6.0" 929 | registry-auth-token "^4.0.0" 930 | registry-url "^5.0.0" 931 | semver "^6.2.0" 932 | 933 | parseurl@~1.3.3: 934 | version "1.3.3" 935 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 936 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 937 | 938 | path-to-regexp@0.1.7: 939 | version "0.1.7" 940 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 941 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 942 | 943 | picomatch@^2.0.4, picomatch@^2.2.1: 944 | version "2.3.1" 945 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 946 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 947 | 948 | prepend-http@^2.0.0: 949 | version "2.0.0" 950 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 951 | integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== 952 | 953 | proxy-addr@~2.0.7: 954 | version "2.0.7" 955 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 956 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 957 | dependencies: 958 | forwarded "0.2.0" 959 | ipaddr.js "1.9.1" 960 | 961 | pstree.remy@^1.1.8: 962 | version "1.1.8" 963 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 964 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 965 | 966 | pump@^3.0.0: 967 | version "3.0.0" 968 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 969 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 970 | dependencies: 971 | end-of-stream "^1.1.0" 972 | once "^1.3.1" 973 | 974 | punycode@^2.1.1: 975 | version "2.1.1" 976 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 977 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 978 | 979 | pupa@^2.1.1: 980 | version "2.1.1" 981 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 982 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 983 | dependencies: 984 | escape-goat "^2.0.0" 985 | 986 | qs@6.10.3: 987 | version "6.10.3" 988 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" 989 | integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== 990 | dependencies: 991 | side-channel "^1.0.4" 992 | 993 | range-parser@~1.2.1: 994 | version "1.2.1" 995 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 996 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 997 | 998 | raw-body@2.5.1: 999 | version "2.5.1" 1000 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 1001 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 1002 | dependencies: 1003 | bytes "3.1.2" 1004 | http-errors "2.0.0" 1005 | iconv-lite "0.4.24" 1006 | unpipe "1.0.0" 1007 | 1008 | rc@^1.2.8: 1009 | version "1.2.8" 1010 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1011 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1012 | dependencies: 1013 | deep-extend "^0.6.0" 1014 | ini "~1.3.0" 1015 | minimist "^1.2.0" 1016 | strip-json-comments "~2.0.1" 1017 | 1018 | readdirp@~3.6.0: 1019 | version "3.6.0" 1020 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1021 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1022 | dependencies: 1023 | picomatch "^2.2.1" 1024 | 1025 | registry-auth-token@^4.0.0: 1026 | version "4.2.1" 1027 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 1028 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 1029 | dependencies: 1030 | rc "^1.2.8" 1031 | 1032 | registry-url@^5.0.0: 1033 | version "5.1.0" 1034 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1035 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1036 | dependencies: 1037 | rc "^1.2.8" 1038 | 1039 | responselike@^1.0.2: 1040 | version "1.0.2" 1041 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1042 | integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== 1043 | dependencies: 1044 | lowercase-keys "^1.0.0" 1045 | 1046 | safe-buffer@5.2.1: 1047 | version "5.2.1" 1048 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1049 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1050 | 1051 | "safer-buffer@>= 2.1.2 < 3": 1052 | version "2.1.2" 1053 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1054 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1055 | 1056 | saslprep@^1.0.3: 1057 | version "1.0.3" 1058 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 1059 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 1060 | dependencies: 1061 | sparse-bitfield "^3.0.3" 1062 | 1063 | semver-diff@^3.1.1: 1064 | version "3.1.1" 1065 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1066 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1067 | dependencies: 1068 | semver "^6.3.0" 1069 | 1070 | semver@^5.7.1: 1071 | version "5.7.1" 1072 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1073 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1074 | 1075 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1076 | version "6.3.0" 1077 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1078 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1079 | 1080 | semver@^7.3.4: 1081 | version "7.3.7" 1082 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" 1083 | integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== 1084 | dependencies: 1085 | lru-cache "^6.0.0" 1086 | 1087 | send@0.18.0: 1088 | version "0.18.0" 1089 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1090 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1091 | dependencies: 1092 | debug "2.6.9" 1093 | depd "2.0.0" 1094 | destroy "1.2.0" 1095 | encodeurl "~1.0.2" 1096 | escape-html "~1.0.3" 1097 | etag "~1.8.1" 1098 | fresh "0.5.2" 1099 | http-errors "2.0.0" 1100 | mime "1.6.0" 1101 | ms "2.1.3" 1102 | on-finished "2.4.1" 1103 | range-parser "~1.2.1" 1104 | statuses "2.0.1" 1105 | 1106 | serve-static@1.15.0: 1107 | version "1.15.0" 1108 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1109 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1110 | dependencies: 1111 | encodeurl "~1.0.2" 1112 | escape-html "~1.0.3" 1113 | parseurl "~1.3.3" 1114 | send "0.18.0" 1115 | 1116 | setprototypeof@1.2.0: 1117 | version "1.2.0" 1118 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1119 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1120 | 1121 | side-channel@^1.0.4: 1122 | version "1.0.4" 1123 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1124 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1125 | dependencies: 1126 | call-bind "^1.0.0" 1127 | get-intrinsic "^1.0.2" 1128 | object-inspect "^1.9.0" 1129 | 1130 | sift@16.0.0: 1131 | version "16.0.0" 1132 | resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.0.tgz#447991577db61f1a8fab727a8a98a6db57a23eb8" 1133 | integrity sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ== 1134 | 1135 | signal-exit@^3.0.2: 1136 | version "3.0.7" 1137 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1138 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1139 | 1140 | smart-buffer@^4.2.0: 1141 | version "4.2.0" 1142 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 1143 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 1144 | 1145 | socks@^2.6.2: 1146 | version "2.6.2" 1147 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" 1148 | integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== 1149 | dependencies: 1150 | ip "^1.1.5" 1151 | smart-buffer "^4.2.0" 1152 | 1153 | sparse-bitfield@^3.0.3: 1154 | version "3.0.3" 1155 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 1156 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 1157 | dependencies: 1158 | memory-pager "^1.0.2" 1159 | 1160 | statuses@2.0.1: 1161 | version "2.0.1" 1162 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1163 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1164 | 1165 | string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: 1166 | version "4.2.3" 1167 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1168 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1169 | dependencies: 1170 | emoji-regex "^8.0.0" 1171 | is-fullwidth-code-point "^3.0.0" 1172 | strip-ansi "^6.0.1" 1173 | 1174 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1175 | version "6.0.1" 1176 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1177 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1178 | dependencies: 1179 | ansi-regex "^5.0.1" 1180 | 1181 | strip-json-comments@~2.0.1: 1182 | version "2.0.1" 1183 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1184 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1185 | 1186 | supports-color@^5.5.0: 1187 | version "5.5.0" 1188 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1189 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1190 | dependencies: 1191 | has-flag "^3.0.0" 1192 | 1193 | supports-color@^7.1.0: 1194 | version "7.2.0" 1195 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1196 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1197 | dependencies: 1198 | has-flag "^4.0.0" 1199 | 1200 | to-readable-stream@^1.0.0: 1201 | version "1.0.0" 1202 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 1203 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 1204 | 1205 | to-regex-range@^5.0.1: 1206 | version "5.0.1" 1207 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1208 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1209 | dependencies: 1210 | is-number "^7.0.0" 1211 | 1212 | toidentifier@1.0.1: 1213 | version "1.0.1" 1214 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1215 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1216 | 1217 | touch@^3.1.0: 1218 | version "3.1.0" 1219 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1220 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1221 | dependencies: 1222 | nopt "~1.0.10" 1223 | 1224 | tr46@^3.0.0: 1225 | version "3.0.0" 1226 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 1227 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 1228 | dependencies: 1229 | punycode "^2.1.1" 1230 | 1231 | type-fest@^0.20.2: 1232 | version "0.20.2" 1233 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1234 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1235 | 1236 | type-is@~1.6.18: 1237 | version "1.6.18" 1238 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1239 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1240 | dependencies: 1241 | media-typer "0.3.0" 1242 | mime-types "~2.1.24" 1243 | 1244 | typedarray-to-buffer@^3.1.5: 1245 | version "3.1.5" 1246 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1247 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1248 | dependencies: 1249 | is-typedarray "^1.0.0" 1250 | 1251 | undefsafe@^2.0.5: 1252 | version "2.0.5" 1253 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 1254 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 1255 | 1256 | unique-string@^2.0.0: 1257 | version "2.0.0" 1258 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1259 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1260 | dependencies: 1261 | crypto-random-string "^2.0.0" 1262 | 1263 | unpipe@1.0.0, unpipe@~1.0.0: 1264 | version "1.0.0" 1265 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1266 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1267 | 1268 | update-notifier@^5.1.0: 1269 | version "5.1.0" 1270 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" 1271 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== 1272 | dependencies: 1273 | boxen "^5.0.0" 1274 | chalk "^4.1.0" 1275 | configstore "^5.0.1" 1276 | has-yarn "^2.1.0" 1277 | import-lazy "^2.1.0" 1278 | is-ci "^2.0.0" 1279 | is-installed-globally "^0.4.0" 1280 | is-npm "^5.0.0" 1281 | is-yarn-global "^0.3.0" 1282 | latest-version "^5.1.0" 1283 | pupa "^2.1.1" 1284 | semver "^7.3.4" 1285 | semver-diff "^3.1.1" 1286 | xdg-basedir "^4.0.0" 1287 | 1288 | url-parse-lax@^3.0.0: 1289 | version "3.0.0" 1290 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1291 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1292 | dependencies: 1293 | prepend-http "^2.0.0" 1294 | 1295 | utils-merge@1.0.1: 1296 | version "1.0.1" 1297 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1298 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1299 | 1300 | vary@^1, vary@~1.1.2: 1301 | version "1.1.2" 1302 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1303 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1304 | 1305 | webidl-conversions@^7.0.0: 1306 | version "7.0.0" 1307 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 1308 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 1309 | 1310 | whatwg-url@^11.0.0: 1311 | version "11.0.0" 1312 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" 1313 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== 1314 | dependencies: 1315 | tr46 "^3.0.0" 1316 | webidl-conversions "^7.0.0" 1317 | 1318 | widest-line@^3.1.0: 1319 | version "3.1.0" 1320 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1321 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1322 | dependencies: 1323 | string-width "^4.0.0" 1324 | 1325 | wrap-ansi@^7.0.0: 1326 | version "7.0.0" 1327 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1328 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1329 | dependencies: 1330 | ansi-styles "^4.0.0" 1331 | string-width "^4.1.0" 1332 | strip-ansi "^6.0.0" 1333 | 1334 | wrappy@1: 1335 | version "1.0.2" 1336 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1337 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1338 | 1339 | write-file-atomic@^3.0.0: 1340 | version "3.0.3" 1341 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1342 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1343 | dependencies: 1344 | imurmurhash "^0.1.4" 1345 | is-typedarray "^1.0.0" 1346 | signal-exit "^3.0.2" 1347 | typedarray-to-buffer "^3.1.5" 1348 | 1349 | xdg-basedir@^4.0.0: 1350 | version "4.0.0" 1351 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1352 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1353 | 1354 | yallist@^4.0.0: 1355 | version "4.0.0" 1356 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1357 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1358 | -------------------------------------------------------------------------------- /netflix-ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /netflix-ui/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 | -------------------------------------------------------------------------------- /netflix-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "netflix-ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@reduxjs/toolkit": "^1.8.2", 7 | "@testing-library/jest-dom": "^5.16.4", 8 | "@testing-library/react": "^13.0.1", 9 | "@testing-library/user-event": "^13.5.0", 10 | "axios": "^0.27.2", 11 | "firebase": "^9.8.2", 12 | "react": "^18.0.0", 13 | "react-dom": "^18.0.0", 14 | "react-icons": "^4.3.1", 15 | "react-redux": "^8.0.2", 16 | "react-router-dom": "^6.3.0", 17 | "react-scripts": "5.0.1", 18 | "styled-components": "^5.3.5", 19 | "web-vitals": "^2.1.4" 20 | }, 21 | "scripts": { 22 | "start": "react-scripts start", 23 | "build": "react-scripts build", 24 | "test": "react-scripts test", 25 | "eject": "react-scripts eject" 26 | }, 27 | "eslintConfig": { 28 | "extends": [ 29 | "react-app", 30 | "react-app/jest" 31 | ] 32 | }, 33 | "browserslist": { 34 | "production": [ 35 | ">0.2%", 36 | "not dead", 37 | "not op_mini all" 38 | ], 39 | "development": [ 40 | "last 1 chrome version", 41 | "last 1 firefox version", 42 | "last 1 safari version" 43 | ] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /netflix-ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/public/favicon.ico -------------------------------------------------------------------------------- /netflix-ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /netflix-ui/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/public/logo192.png -------------------------------------------------------------------------------- /netflix-ui/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/public/logo512.png -------------------------------------------------------------------------------- /netflix-ui/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /netflix-ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /netflix-ui/src/App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { BrowserRouter, Route, Routes } from "react-router-dom"; 3 | import Login from "./pages/Login"; 4 | import MoviePage from "./pages/Movies"; 5 | import Netflix from "./pages/Netflix"; 6 | import Player from "./pages/Player"; 7 | import Signup from "./pages/Signup"; 8 | import TVShows from "./pages/TVShows"; 9 | import UserListedMovies from "./pages/UserListedMovies"; 10 | 11 | export default function App() { 12 | return ( 13 | 14 | 15 | } /> 16 | } /> 17 | } /> 18 | } /> 19 | } /> 20 | } /> 21 | } /> 22 | } /> 23 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /netflix-ui/src/assets/card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/src/assets/card.jpg -------------------------------------------------------------------------------- /netflix-ui/src/assets/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/src/assets/home.jpg -------------------------------------------------------------------------------- /netflix-ui/src/assets/homeTitle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/src/assets/homeTitle.webp -------------------------------------------------------------------------------- /netflix-ui/src/assets/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/src/assets/login.jpg -------------------------------------------------------------------------------- /netflix-ui/src/assets/logo-logomark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/src/assets/logo-logomark.png -------------------------------------------------------------------------------- /netflix-ui/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koolkishan/netflix-clone-react-node/f3fdbc1384427e0f8f839129dfdbf7ade536cf55/netflix-ui/src/assets/logo.png -------------------------------------------------------------------------------- /netflix-ui/src/components/BackgroundImage.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import styled from "styled-components"; 3 | import background from "../assets/login.jpg"; 4 | 5 | export default function BackgroundImage() { 6 | return ( 7 | 8 | background 9 | 10 | ); 11 | } 12 | 13 | const Container = styled.div` 14 | height: 100vh; 15 | width: 100vw; 16 | img { 17 | height: 100vh; 18 | width: 100vw; 19 | } 20 | `; 21 | -------------------------------------------------------------------------------- /netflix-ui/src/components/Card.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { useNavigate } from "react-router-dom"; 3 | import styled from "styled-components"; 4 | import { IoPlayCircleSharp } from "react-icons/io5"; 5 | import { AiOutlinePlus } from "react-icons/ai"; 6 | import { RiThumbUpFill, RiThumbDownFill } from "react-icons/ri"; 7 | import { BiChevronDown } from "react-icons/bi"; 8 | import { BsCheck } from "react-icons/bs"; 9 | import axios from "axios"; 10 | import { onAuthStateChanged } from "firebase/auth"; 11 | import { firebaseAuth } from "../utils/firebase-config"; 12 | import { useDispatch } from "react-redux"; 13 | import { removeMovieFromLiked } from "../store"; 14 | import video from "../assets/video.mp4"; 15 | 16 | export default React.memo(function Card({ index, movieData, isLiked = false }) { 17 | const navigate = useNavigate(); 18 | const dispatch = useDispatch(); 19 | const [isHovered, setIsHovered] = useState(false); 20 | const [email, setEmail] = useState(undefined); 21 | 22 | onAuthStateChanged(firebaseAuth, (currentUser) => { 23 | if (currentUser) { 24 | setEmail(currentUser.email); 25 | } else navigate("/login"); 26 | }); 27 | 28 | const addToList = async () => { 29 | try { 30 | await axios.post("http://localhost:5000/api/user/add", { 31 | email, 32 | data: movieData, 33 | }); 34 | } catch (error) { 35 | console.log(error); 36 | } 37 | }; 38 | 39 | return ( 40 | setIsHovered(true)} 42 | onMouseLeave={() => setIsHovered(false)} 43 | > 44 | card navigate("/player")} 48 | /> 49 | 50 | {isHovered && ( 51 |
52 |
53 | card navigate("/player")} 57 | /> 58 |
66 |
67 |

navigate("/player")}> 68 | {movieData.name} 69 |

70 |
71 |
72 | navigate("/player")} 75 | /> 76 | 77 | 78 | {isLiked ? ( 79 | 82 | dispatch( 83 | removeMovieFromLiked({ movieId: movieData.id, email }) 84 | ) 85 | } 86 | /> 87 | ) : ( 88 | 89 | )} 90 |
91 |
92 | 93 |
94 |
95 |
96 |
    97 | {movieData.genres.map((genre) => ( 98 |
  • {genre}
  • 99 | ))} 100 |
101 |
102 |
103 |
104 | )} 105 |
106 | ); 107 | }); 108 | 109 | const Container = styled.div` 110 | max-width: 230px; 111 | width: 230px; 112 | height: 100%; 113 | cursor: pointer; 114 | position: relative; 115 | img { 116 | border-radius: 0.2rem; 117 | width: 100%; 118 | height: 100%; 119 | z-index: 10; 120 | } 121 | .hover { 122 | z-index: 99; 123 | height: max-content; 124 | width: 20rem; 125 | position: absolute; 126 | top: -18vh; 127 | left: 0; 128 | border-radius: 0.3rem; 129 | box-shadow: rgba(0, 0, 0, 0.75) 0px 3px 10px; 130 | background-color: #181818; 131 | transition: 0.3s ease-in-out; 132 | .image-video-container { 133 | position: relative; 134 | height: 140px; 135 | img { 136 | width: 100%; 137 | height: 140px; 138 | object-fit: cover; 139 | border-radius: 0.3rem; 140 | top: 0; 141 | z-index: 4; 142 | position: absolute; 143 | } 144 | video { 145 | width: 100%; 146 | height: 140px; 147 | object-fit: cover; 148 | border-radius: 0.3rem; 149 | top: 0; 150 | z-index: 5; 151 | position: absolute; 152 | } 153 | } 154 | .info-container { 155 | padding: 1rem; 156 | gap: 0.5rem; 157 | } 158 | .icons { 159 | .controls { 160 | display: flex; 161 | gap: 1rem; 162 | } 163 | svg { 164 | font-size: 2rem; 165 | cursor: pointer; 166 | transition: 0.3s ease-in-out; 167 | &:hover { 168 | color: #b8b8b8; 169 | } 170 | } 171 | } 172 | .genres { 173 | ul { 174 | gap: 1rem; 175 | li { 176 | padding-right: 0.7rem; 177 | &:first-of-type { 178 | list-style-type: none; 179 | } 180 | } 181 | } 182 | } 183 | } 184 | `; 185 | -------------------------------------------------------------------------------- /netflix-ui/src/components/CardSlider.jsx: -------------------------------------------------------------------------------- 1 | import React, { useRef, useState } from "react"; 2 | import styled from "styled-components"; 3 | import { AiOutlineLeft, AiOutlineRight } from "react-icons/ai"; 4 | import Card from "./Card"; 5 | export default React.memo(function CardSlider({ data, title }) { 6 | const listRef = useRef(); 7 | const [sliderPosition, setSliderPosition] = useState(0); 8 | const [showControls, setShowControls] = useState(false); 9 | const handleDirection = (direction) => { 10 | let distance = listRef.current.getBoundingClientRect().x - 70; 11 | if (direction === "left" && sliderPosition > 0) { 12 | listRef.current.style.transform = `translateX(${230 + distance}px)`; 13 | setSliderPosition(sliderPosition - 1); 14 | } 15 | if (direction === "right" && sliderPosition < 4) { 16 | listRef.current.style.transform = `translateX(${-230 + distance}px)`; 17 | setSliderPosition(sliderPosition + 1); 18 | } 19 | }; 20 | 21 | return ( 22 | setShowControls(true)} 26 | onMouseLeave={() => setShowControls(false)} 27 | > 28 |

{title}

29 |
30 |
35 | handleDirection("left")} /> 36 |
37 |
38 | {data.map((movie, index) => { 39 | return ; 40 | })} 41 |
42 |
47 | handleDirection("right")} /> 48 |
49 |
50 |
51 | ); 52 | }); 53 | const Container = styled.div` 54 | gap: 1rem; 55 | position: relative; 56 | padding: 2rem 0; 57 | h1 { 58 | margin-left: 50px; 59 | } 60 | .wrapper { 61 | .slider { 62 | width: max-content; 63 | gap: 1rem; 64 | transform: translateX(0px); 65 | transition: 0.3s ease-in-out; 66 | margin-left: 50px; 67 | } 68 | .slider-action { 69 | position: absolute; 70 | z-index: 99; 71 | height: 100%; 72 | top: 0; 73 | bottom: 0; 74 | width: 50px; 75 | transition: 0.3s ease-in-out; 76 | svg { 77 | font-size: 2rem; 78 | } 79 | } 80 | .none { 81 | display: none; 82 | } 83 | .left { 84 | left: 0; 85 | } 86 | .right { 87 | right: 0; 88 | } 89 | } 90 | `; 91 | -------------------------------------------------------------------------------- /netflix-ui/src/components/Header.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useNavigate } from "react-router-dom"; 3 | import styled from "styled-components"; 4 | import logo from "../assets/logo.png"; 5 | 6 | export default function Header(props) { 7 | const navigate = useNavigate(); 8 | return ( 9 | 10 |
11 | logo 12 |
13 | 16 |
17 | ); 18 | } 19 | const StyledHeader = styled.header` 20 | padding: 0 4rem; 21 | .logo { 22 | img { 23 | height: 5rem; 24 | } 25 | } 26 | button { 27 | padding: 0.5rem 1rem; 28 | background-color: #e50914; 29 | border: none; 30 | cursor: pointer; 31 | color: white; 32 | border-radius: 0.2rem; 33 | font-weight: bolder; 34 | font-size: 1.05rem; 35 | } 36 | `; 37 | -------------------------------------------------------------------------------- /netflix-ui/src/components/Navbar.jsx: -------------------------------------------------------------------------------- 1 | import { signOut } from "firebase/auth"; 2 | import React, { useState } from "react"; 3 | import { Link } from "react-router-dom"; 4 | import styled from "styled-components"; 5 | import logo from "../assets/logo.png"; 6 | import { firebaseAuth } from "../utils/firebase-config"; 7 | import { FaPowerOff, FaSearch } from "react-icons/fa"; 8 | export default function Navbar({ isScrolled }) { 9 | const [showSearch, setShowSearch] = useState(false); 10 | const [inputHover, setInputHover] = useState(false); 11 | const links = [ 12 | { name: "Home", link: "/" }, 13 | { name: "TV Shows", link: "/tv" }, 14 | { name: "Movies", link: "/movies" }, 15 | { name: "My List", link: "/mylist" }, 16 | ]; 17 | 18 | return ( 19 | 20 | 63 | 64 | ); 65 | } 66 | 67 | const Container = styled.div` 68 | .scrolled { 69 | background-color: black; 70 | } 71 | nav { 72 | position: sticky; 73 | top: 0; 74 | height: 6.5rem; 75 | width: 100%; 76 | justify-content: space-between; 77 | position: fixed; 78 | top: 0; 79 | z-index: 2; 80 | padding: 0 4rem; 81 | align-items: center; 82 | transition: 0.3s ease-in-out; 83 | .left { 84 | gap: 2rem; 85 | .brand { 86 | img { 87 | height: 4rem; 88 | } 89 | } 90 | .links { 91 | list-style-type: none; 92 | gap: 2rem; 93 | li { 94 | a { 95 | color: white; 96 | text-decoration: none; 97 | } 98 | } 99 | } 100 | } 101 | .right { 102 | gap: 1rem; 103 | button { 104 | background-color: transparent; 105 | border: none; 106 | cursor: pointer; 107 | &:focus { 108 | outline: none; 109 | } 110 | svg { 111 | color: #f34242; 112 | font-size: 1.2rem; 113 | } 114 | } 115 | .search { 116 | display: flex; 117 | gap: 0.4rem; 118 | align-items: center; 119 | justify-content: center; 120 | padding: 0.2rem; 121 | padding-left: 0.5rem; 122 | button { 123 | background-color: transparent; 124 | border: none; 125 | &:focus { 126 | outline: none; 127 | } 128 | svg { 129 | color: white; 130 | font-size: 1.2rem; 131 | } 132 | } 133 | input { 134 | width: 0; 135 | opacity: 0; 136 | visibility: hidden; 137 | transition: 0.3s ease-in-out; 138 | background-color: transparent; 139 | border: none; 140 | color: white; 141 | &:focus { 142 | outline: none; 143 | } 144 | } 145 | } 146 | .show-search { 147 | border: 1px solid white; 148 | background-color: rgba(0, 0, 0, 0.6); 149 | input { 150 | width: 100%; 151 | opacity: 1; 152 | visibility: visible; 153 | padding: 0.3rem; 154 | } 155 | } 156 | } 157 | } 158 | `; 159 | -------------------------------------------------------------------------------- /netflix-ui/src/components/NotAvailable.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function NotAvailable() { 4 | return ( 5 |

6 | No Movies avaialble for the selected genre. Please select a different 7 | genre. 8 |

9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /netflix-ui/src/components/SelectGenre.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { useDispatch } from "react-redux"; 3 | import styled from "styled-components"; 4 | import { fetchDataByGenre } from "../store"; 5 | export default function SelectGenre({ genres, type }) { 6 | const dispatch = useDispatch(); 7 | return ( 8 | 28 | ); 29 | } 30 | 31 | const Select = styled.select` 32 | margin-left: 5rem; 33 | cursor: pointer; 34 | font-size: 1.4rem; 35 | background-color: rgba(0, 0, 0, 0.4); 36 | color: white; 37 | `; 38 | -------------------------------------------------------------------------------- /netflix-ui/src/components/Slider.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import styled from "styled-components"; 3 | import CardSlider from "./CardSlider"; 4 | export default function Slider({ movies }) { 5 | const getMoviesFromRange = (from, to) => { 6 | return movies.slice(from, to); 7 | }; 8 | return ( 9 | 10 | 11 | 12 | 16 | 20 | 21 | 22 | 23 | ); 24 | } 25 | 26 | const Container = styled.div``; 27 | -------------------------------------------------------------------------------- /netflix-ui/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | background-color: black; 9 | color: white; 10 | } 11 | 12 | * { 13 | margin: 0; 14 | padding: 0; 15 | box-sizing: border-box; 16 | } 17 | 18 | html, 19 | body { 20 | overflow-x: hidden; 21 | } 22 | 23 | body::-webkit-scrollbar { 24 | display: none; 25 | } 26 | 27 | .flex { 28 | display: flex; 29 | } 30 | 31 | .column { 32 | flex-direction: column; 33 | } 34 | 35 | .j-between { 36 | justify-content: space-between; 37 | } 38 | 39 | .j-center { 40 | justify-content: center; 41 | } 42 | 43 | .a-center { 44 | align-items: center; 45 | } 46 | -------------------------------------------------------------------------------- /netflix-ui/src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import { Provider } from "react-redux"; 4 | import "./index.css"; 5 | import App from "./App"; 6 | import { store } from "./store"; 7 | 8 | const root = ReactDOM.createRoot(document.getElementById("root")); 9 | root.render( 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/Login.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import styled from "styled-components"; 3 | import logo from "../assets/logo.png"; 4 | import background from "../assets/login.jpg"; 5 | import { useNavigate } from "react-router-dom"; 6 | import BackgroundImage from "../components/BackgroundImage"; 7 | import Header from "../components/Header"; 8 | import { onAuthStateChanged, signInWithEmailAndPassword } from "firebase/auth"; 9 | import { firebaseAuth } from "../utils/firebase-config"; 10 | 11 | function Login() { 12 | const [email, setEmail] = useState(""); 13 | const [password, setPassword] = useState(""); 14 | const navigate = useNavigate(); 15 | 16 | const handleLogin = async () => { 17 | try { 18 | await signInWithEmailAndPassword(firebaseAuth, email, password); 19 | } catch (error) { 20 | console.log(error.code); 21 | } 22 | }; 23 | 24 | onAuthStateChanged(firebaseAuth, (currentUser) => { 25 | if (currentUser) navigate("/"); 26 | }); 27 | 28 | return ( 29 | 30 | 31 |
32 |
33 |
34 |
35 |
36 |

Login

37 |
38 |
39 | setEmail(e.target.value)} 43 | value={email} 44 | /> 45 | setPassword(e.target.value)} 49 | value={password} 50 | /> 51 | 52 |
53 |
54 |
55 |
56 |
57 | ); 58 | } 59 | 60 | const Container = styled.div` 61 | position: relative; 62 | .content { 63 | position: absolute; 64 | top: 0; 65 | left: 0; 66 | height: 100vh; 67 | width: 100vw; 68 | background-color: rgba(0, 0, 0, 0.5); 69 | grid-template-rows: 15vh 85vh; 70 | .form-container { 71 | gap: 2rem; 72 | height: 85vh; 73 | .form { 74 | padding: 2rem; 75 | background-color: #000000b0; 76 | width: 25vw; 77 | gap: 2rem; 78 | color: white; 79 | .container { 80 | gap: 2rem; 81 | input { 82 | padding: 0.5rem 1rem; 83 | width: 15rem; 84 | } 85 | button { 86 | padding: 0.5rem 1rem; 87 | background-color: #e50914; 88 | border: none; 89 | cursor: pointer; 90 | color: white; 91 | border-radius: 0.2rem; 92 | font-weight: bolder; 93 | font-size: 1.05rem; 94 | } 95 | } 96 | } 97 | } 98 | } 99 | `; 100 | 101 | export default Login; 102 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/Movies.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import styled from "styled-components"; 3 | import Navbar from "../components/Navbar"; 4 | import CardSlider from "../components/CardSlider"; 5 | import { onAuthStateChanged } from "firebase/auth"; 6 | import { firebaseAuth } from "../utils/firebase-config"; 7 | import { useNavigate } from "react-router-dom"; 8 | import { useSelector, useDispatch } from "react-redux"; 9 | import { fetchMovies, getGenres } from "../store"; 10 | import SelectGenre from "../components/SelectGenre"; 11 | import Slider from "../components/Slider"; 12 | import NotAvailable from "../components/NotAvailable"; 13 | 14 | function MoviePage() { 15 | const [isScrolled, setIsScrolled] = useState(false); 16 | const movies = useSelector((state) => state.netflix.movies); 17 | const genres = useSelector((state) => state.netflix.genres); 18 | const genresLoaded = useSelector((state) => state.netflix.genresLoaded); 19 | 20 | const navigate = useNavigate(); 21 | const dispatch = useDispatch(); 22 | 23 | useEffect(() => { 24 | dispatch(getGenres()); 25 | }, []); 26 | 27 | useEffect(() => { 28 | if (genresLoaded) { 29 | dispatch(fetchMovies({ genres, type: "movie" })); 30 | } 31 | }, [genresLoaded]); 32 | 33 | const [user, setUser] = useState(undefined); 34 | 35 | onAuthStateChanged(firebaseAuth, (currentUser) => { 36 | if (currentUser) setUser(currentUser.uid); 37 | else navigate("/login"); 38 | }); 39 | 40 | window.onscroll = () => { 41 | setIsScrolled(window.pageYOffset === 0 ? false : true); 42 | return () => (window.onscroll = null); 43 | }; 44 | 45 | return ( 46 | 47 |
48 | 49 |
50 |
51 | 52 | {movies.length ? : } 53 |
54 |
55 | ); 56 | } 57 | 58 | const Container = styled.div` 59 | .data { 60 | margin-top: 8rem; 61 | .not-available { 62 | text-align: center; 63 | color: white; 64 | margin-top: 4rem; 65 | } 66 | } 67 | `; 68 | export default MoviePage; 69 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/Netflix.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import styled from "styled-components"; 3 | import Navbar from "../components/Navbar"; 4 | import backgroundImage from "../assets/home.jpg"; 5 | import MovieLogo from "../assets/homeTitle.webp"; 6 | 7 | import { onAuthStateChanged } from "firebase/auth"; 8 | import { firebaseAuth } from "../utils/firebase-config"; 9 | import { useNavigate } from "react-router-dom"; 10 | import { useSelector, useDispatch } from "react-redux"; 11 | import { fetchMovies, getGenres } from "../store"; 12 | import { FaPlay } from "react-icons/fa"; 13 | import { AiOutlineInfoCircle } from "react-icons/ai"; 14 | import Slider from "../components/Slider"; 15 | function Netflix() { 16 | const [isScrolled, setIsScrolled] = useState(false); 17 | const movies = useSelector((state) => state.netflix.movies); 18 | const genres = useSelector((state) => state.netflix.genres); 19 | const genresLoaded = useSelector((state) => state.netflix.genresLoaded); 20 | 21 | const navigate = useNavigate(); 22 | const dispatch = useDispatch(); 23 | 24 | useEffect(() => { 25 | dispatch(getGenres()); 26 | }, []); 27 | 28 | useEffect(() => { 29 | if (genresLoaded) { 30 | dispatch(fetchMovies({ genres, type: "all" })); 31 | } 32 | }, [genresLoaded]); 33 | 34 | onAuthStateChanged(firebaseAuth, (currentUser) => { 35 | if (!currentUser) navigate("/login"); 36 | }); 37 | 38 | window.onscroll = () => { 39 | setIsScrolled(window.pageYOffset === 0 ? false : true); 40 | return () => (window.onscroll = null); 41 | }; 42 | 43 | return ( 44 | 45 | 46 |
47 | background 52 |
53 |
54 | Movie Logo 55 |
56 |
57 | 64 | 68 |
69 |
70 |
71 | 72 |
73 | ); 74 | } 75 | 76 | const Container = styled.div` 77 | background-color: black; 78 | .hero { 79 | position: relative; 80 | .background-image { 81 | filter: brightness(60%); 82 | } 83 | img { 84 | height: 100vh; 85 | width: 100vw; 86 | } 87 | .container { 88 | position: absolute; 89 | bottom: 5rem; 90 | .logo { 91 | img { 92 | width: 100%; 93 | height: 100%; 94 | margin-left: 5rem; 95 | } 96 | } 97 | .buttons { 98 | margin: 5rem; 99 | gap: 2rem; 100 | button { 101 | font-size: 1.4rem; 102 | gap: 1rem; 103 | border-radius: 0.2rem; 104 | padding: 0.5rem; 105 | padding-left: 2rem; 106 | padding-right: 2.4rem; 107 | border: none; 108 | cursor: pointer; 109 | transition: 0.2s ease-in-out; 110 | &:hover { 111 | opacity: 0.8; 112 | } 113 | &:nth-of-type(2) { 114 | background-color: rgba(109, 109, 110, 0.7); 115 | color: white; 116 | svg { 117 | font-size: 1.8rem; 118 | } 119 | } 120 | } 121 | } 122 | } 123 | } 124 | `; 125 | export default Netflix; 126 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/Player.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import styled from "styled-components"; 3 | import { BsArrowLeft } from "react-icons/bs"; 4 | import { useNavigate } from "react-router-dom"; 5 | import video from "../assets/video.mp4"; 6 | export default function Player() { 7 | const navigate = useNavigate(); 8 | 9 | return ( 10 | 11 |
12 |
13 | navigate(-1)} /> 14 |
15 |
17 |
18 | ); 19 | } 20 | 21 | const Container = styled.div` 22 | .player { 23 | width: 100vw; 24 | height: 100vh; 25 | .back { 26 | position: absolute; 27 | padding: 2rem; 28 | z-index: 1; 29 | svg { 30 | font-size: 3rem; 31 | cursor: pointer; 32 | } 33 | } 34 | video { 35 | height: 100%; 36 | width: 100%; 37 | object-fit: cover; 38 | } 39 | } 40 | `; 41 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/Signup.jsx: -------------------------------------------------------------------------------- 1 | import { 2 | createUserWithEmailAndPassword, 3 | onAuthStateChanged, 4 | } from "firebase/auth"; 5 | import React, { useState } from "react"; 6 | import { useNavigate } from "react-router-dom"; 7 | import styled from "styled-components"; 8 | import BackgroundImage from "../components/BackgroundImage"; 9 | import Header from "../components/Header"; 10 | import { firebaseAuth } from "../utils/firebase-config"; 11 | function Signup() { 12 | const [showPassword, setShowPassword] = useState(false); 13 | const [formValues, setFormValues] = useState({ 14 | email: "", 15 | password: "", 16 | }); 17 | const navigate = useNavigate(); 18 | 19 | const handleSignIn = async () => { 20 | try { 21 | const { email, password } = formValues; 22 | await createUserWithEmailAndPassword(firebaseAuth, email, password); 23 | } catch (error) { 24 | console.log(error); 25 | } 26 | }; 27 | 28 | onAuthStateChanged(firebaseAuth, (currentUser) => { 29 | if (currentUser) navigate("/"); 30 | }); 31 | 32 | return ( 33 | 34 | 35 |
36 |
37 |
38 |
39 |

Unlimited movies, TV shows and more.

40 |

Watch anywhere. Cancel anytime.

41 |
42 | Ready to watch? Enter your email to create or restart membership. 43 |
44 |
45 |
46 | 50 | setFormValues({ 51 | ...formValues, 52 | [e.target.name]: e.target.value, 53 | }) 54 | } 55 | name="email" 56 | value={formValues.email} 57 | /> 58 | {showPassword && ( 59 | 63 | setFormValues({ 64 | ...formValues, 65 | [e.target.name]: e.target.value, 66 | }) 67 | } 68 | name="password" 69 | value={formValues.password} 70 | /> 71 | )} 72 | {!showPassword && ( 73 | 74 | )} 75 |
76 | {showPassword && } 77 |
78 |
79 |
80 | ); 81 | } 82 | 83 | const Container = styled.div` 84 | position: relative; 85 | .content { 86 | position: absolute; 87 | top: 0; 88 | left: 0; 89 | background-color: rgba(0, 0, 0, 0.5); 90 | height: 100vh; 91 | width: 100vw; 92 | display: grid; 93 | grid-template-rows: 15vh 85vh; 94 | .body { 95 | gap: 1rem; 96 | .text { 97 | gap: 1rem; 98 | text-align: center; 99 | font-size: 2rem; 100 | h1 { 101 | padding: 0 25rem; 102 | } 103 | } 104 | .form { 105 | display: grid; 106 | grid-template-columns: ${({ showPassword }) => 107 | showPassword ? "1fr 1fr" : "2fr 1fr"}; 108 | width: 60%; 109 | input { 110 | color: black; 111 | border: none; 112 | padding: 1.5rem; 113 | font-size: 1.2rem; 114 | border: 1px solid black; 115 | &:focus { 116 | outline: none; 117 | } 118 | } 119 | button { 120 | padding: 0.5rem 1rem; 121 | background-color: #e50914; 122 | border: none; 123 | cursor: pointer; 124 | color: white; 125 | font-weight: bolder; 126 | font-size: 1.05rem; 127 | } 128 | } 129 | button { 130 | padding: 0.5rem 1rem; 131 | background-color: #e50914; 132 | border: none; 133 | cursor: pointer; 134 | color: white; 135 | border-radius: 0.2rem; 136 | font-weight: bolder; 137 | font-size: 1.05rem; 138 | } 139 | } 140 | } 141 | `; 142 | 143 | export default Signup; 144 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/TVShows.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import styled from "styled-components"; 3 | import Navbar from "../components/Navbar"; 4 | import CardSlider from "../components/CardSlider"; 5 | import { onAuthStateChanged } from "firebase/auth"; 6 | import { firebaseAuth } from "../utils/firebase-config"; 7 | import { useNavigate } from "react-router-dom"; 8 | import { useSelector, useDispatch } from "react-redux"; 9 | import { fetchMovies, getGenres } from "../store"; 10 | import SelectGenre from "../components/SelectGenre"; 11 | import Slider from "../components/Slider"; 12 | 13 | function TVShows() { 14 | const [isScrolled, setIsScrolled] = useState(false); 15 | const movies = useSelector((state) => state.netflix.movies); 16 | const genres = useSelector((state) => state.netflix.genres); 17 | const genresLoaded = useSelector((state) => state.netflix.genresLoaded); 18 | const dataLoading = useSelector((state) => state.netflix.dataLoading); 19 | 20 | const navigate = useNavigate(); 21 | const dispatch = useDispatch(); 22 | 23 | useEffect(() => { 24 | if (!genres.length) dispatch(getGenres()); 25 | }, []); 26 | 27 | useEffect(() => { 28 | if (genresLoaded) { 29 | dispatch(fetchMovies({ genres, type: "tv" })); 30 | } 31 | }, [genresLoaded]); 32 | 33 | const [user, setUser] = useState(undefined); 34 | 35 | onAuthStateChanged(firebaseAuth, (currentUser) => { 36 | if (currentUser) setUser(currentUser.uid); 37 | else navigate("/login"); 38 | }); 39 | 40 | window.onscroll = () => { 41 | setIsScrolled(window.pageYOffset === 0 ? false : true); 42 | return () => (window.onscroll = null); 43 | }; 44 | 45 | return ( 46 | 47 | 48 |
49 | 50 | {movies.length ? ( 51 | <> 52 | 53 | 54 | ) : ( 55 |

56 | No TV Shows avaialble for the selected genre. Please select a 57 | different genre. 58 |

59 | )} 60 |
61 |
62 | ); 63 | } 64 | 65 | const Container = styled.div` 66 | .data { 67 | margin-top: 8rem; 68 | .not-available { 69 | text-align: center; 70 | margin-top: 4rem; 71 | } 72 | } 73 | `; 74 | export default TVShows; 75 | -------------------------------------------------------------------------------- /netflix-ui/src/pages/UserListedMovies.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { onAuthStateChanged } from "firebase/auth"; 3 | import React, { useEffect, useState } from "react"; 4 | import { useNavigate } from "react-router-dom"; 5 | import { firebaseAuth } from "../utils/firebase-config"; 6 | import Card from "../components/Card"; 7 | import styled from "styled-components"; 8 | import Navbar from "../components/Navbar"; 9 | import { getUsersLikedMovies } from "../store"; 10 | import { useDispatch, useSelector } from "react-redux"; 11 | 12 | export default function UserListedMovies() { 13 | const movies = useSelector((state) => state.netflix.movies); 14 | const dispatch = useDispatch(); 15 | const navigate = useNavigate(); 16 | const [isScrolled, setIsScrolled] = useState(false); 17 | const [email, setEmail] = useState(undefined); 18 | 19 | onAuthStateChanged(firebaseAuth, (currentUser) => { 20 | if (currentUser) setEmail(currentUser.email); 21 | else navigate("/login"); 22 | }); 23 | 24 | useEffect(() => { 25 | if (email) { 26 | dispatch(getUsersLikedMovies(email)); 27 | } 28 | }, [email]); 29 | 30 | window.onscroll = () => { 31 | setIsScrolled(window.pageYOffset === 0 ? false : true); 32 | return () => (window.onscroll = null); 33 | }; 34 | 35 | return ( 36 | 37 | 38 |
39 |

My List

40 |
41 | {movies.map((movie, index) => { 42 | return ( 43 | 49 | ); 50 | })} 51 |
52 |
53 |
54 | ); 55 | } 56 | 57 | const Container = styled.div` 58 | .content { 59 | margin: 2.3rem; 60 | margin-top: 8rem; 61 | gap: 3rem; 62 | h1 { 63 | margin-left: 3rem; 64 | } 65 | .grid { 66 | flex-wrap: wrap; 67 | gap: 1rem; 68 | } 69 | } 70 | `; 71 | -------------------------------------------------------------------------------- /netflix-ui/src/store/index.js: -------------------------------------------------------------------------------- 1 | import { 2 | configureStore, 3 | createAsyncThunk, 4 | createSlice, 5 | } from "@reduxjs/toolkit"; 6 | import axios from "axios"; 7 | import { API_KEY, TMDB_BASE_URL } from "../utils/constants"; 8 | 9 | const initialState = { 10 | movies: [], 11 | genresLoaded: false, 12 | genres: [], 13 | }; 14 | 15 | export const getGenres = createAsyncThunk("netflix/genres", async () => { 16 | const { 17 | data: { genres }, 18 | } = await axios.get( 19 | "https://api.themoviedb.org/3/genre/movie/list?api_key=3d39d6bfe362592e6aa293f01fbcf9b9" 20 | ); 21 | return genres; 22 | }); 23 | 24 | const createArrayFromRawData = (array, moviesArray, genres) => { 25 | array.forEach((movie) => { 26 | const movieGenres = []; 27 | movie.genre_ids.forEach((genre) => { 28 | const name = genres.find(({ id }) => id === genre); 29 | if (name) movieGenres.push(name.name); 30 | }); 31 | if (movie.backdrop_path) 32 | moviesArray.push({ 33 | id: movie.id, 34 | name: movie?.original_name ? movie.original_name : movie.original_title, 35 | image: movie.backdrop_path, 36 | genres: movieGenres.slice(0, 3), 37 | }); 38 | }); 39 | }; 40 | 41 | const getRawData = async (api, genres, paging = false) => { 42 | const moviesArray = []; 43 | for (let i = 1; moviesArray.length < 60 && i < 10; i++) { 44 | const { 45 | data: { results }, 46 | } = await axios.get(`${api}${paging ? `&page=${i}` : ""}`); 47 | createArrayFromRawData(results, moviesArray, genres); 48 | } 49 | return moviesArray; 50 | }; 51 | 52 | export const fetchDataByGenre = createAsyncThunk( 53 | "netflix/genre", 54 | async ({ genre, type }, thunkAPI) => { 55 | const { 56 | netflix: { genres }, 57 | } = thunkAPI.getState(); 58 | return getRawData( 59 | `https://api.themoviedb.org/3/discover/${type}?api_key=3d39d6bfe362592e6aa293f01fbcf9b9&with_genres=${genre}`, 60 | genres 61 | ); 62 | } 63 | ); 64 | 65 | export const fetchMovies = createAsyncThunk( 66 | "netflix/trending", 67 | async ({ type }, thunkAPI) => { 68 | const { 69 | netflix: { genres }, 70 | } = thunkAPI.getState(); 71 | return getRawData( 72 | `${TMDB_BASE_URL}/trending/${type}/week?api_key=${API_KEY}`, 73 | genres, 74 | true 75 | ); 76 | } 77 | ); 78 | 79 | export const getUsersLikedMovies = createAsyncThunk( 80 | "netflix/getLiked", 81 | async (email) => { 82 | const { 83 | data: { movies }, 84 | } = await axios.get(`http://localhost:5000/api/user/liked/${email}`); 85 | return movies; 86 | } 87 | ); 88 | 89 | export const removeMovieFromLiked = createAsyncThunk( 90 | "netflix/deleteLiked", 91 | async ({ movieId, email }) => { 92 | const { 93 | data: { movies }, 94 | } = await axios.put("http://localhost:5000/api/user/remove", { 95 | email, 96 | movieId, 97 | }); 98 | return movies; 99 | } 100 | ); 101 | 102 | const NetflixSlice = createSlice({ 103 | name: "Netflix", 104 | initialState, 105 | extraReducers: (builder) => { 106 | builder.addCase(getGenres.fulfilled, (state, action) => { 107 | state.genres = action.payload; 108 | state.genresLoaded = true; 109 | }); 110 | builder.addCase(fetchMovies.fulfilled, (state, action) => { 111 | state.movies = action.payload; 112 | }); 113 | builder.addCase(fetchDataByGenre.fulfilled, (state, action) => { 114 | state.movies = action.payload; 115 | }); 116 | builder.addCase(getUsersLikedMovies.fulfilled, (state, action) => { 117 | state.movies = action.payload; 118 | }); 119 | builder.addCase(removeMovieFromLiked.fulfilled, (state, action) => { 120 | state.movies = action.payload; 121 | }); 122 | }, 123 | }); 124 | 125 | export const store = configureStore({ 126 | reducer: { 127 | netflix: NetflixSlice.reducer, 128 | }, 129 | }); 130 | 131 | export const { setGenres, setMovies } = NetflixSlice.actions; 132 | -------------------------------------------------------------------------------- /netflix-ui/src/utils/constants.js: -------------------------------------------------------------------------------- 1 | export const API_KEY = "3d39d6bfe362592e6aa293f01fbcf9b9"; 2 | export const TMDB_BASE_URL = "https://api.themoviedb.org/3"; 3 | -------------------------------------------------------------------------------- /netflix-ui/src/utils/firebase-config.js: -------------------------------------------------------------------------------- 1 | import { getAuth } from "firebase/auth"; 2 | import { initializeApp } from "firebase/app"; 3 | 4 | const firebaseConfig = { 5 | apiKey: "AIzaSyC1Hf0_rdWLBzDPJPcO9CJN4y6M6-EgKH4", 6 | authDomain: "react-auth-6788d.firebaseapp.com", 7 | projectId: "react-auth-6788d", 8 | storageBucket: "react-auth-6788d.appspot.com", 9 | messagingSenderId: "131797845021", 10 | appId: "1:131797845021:web:3f7ff4766e2b89ca5d32f4", 11 | measurementId: "G-VWPBR1NSLL", 12 | }; 13 | 14 | const app = initializeApp(firebaseConfig); 15 | export const firebaseAuth = getAuth(app); 16 | --------------------------------------------------------------------------------