├── shopitel-client-react-ui
├── src
│ ├── index.css
│ ├── images
│ │ └── Shopitel.PNG
│ ├── components
│ │ ├── Announcement.jsx
│ │ ├── Categories.jsx
│ │ ├── CategoryItem.jsx
│ │ ├── Newsletter.jsx
│ │ ├── Product.jsx
│ │ ├── Products.jsx
│ │ ├── Slider.jsx
│ │ ├── Navbar.jsx
│ │ └── Footer.jsx
│ ├── index.js
│ ├── requestMethods.js
│ ├── redux
│ │ ├── cartRedux.js
│ │ ├── apiCalls.js
│ │ ├── store.js
│ │ └── userRedux.js
│ ├── pages
│ │ ├── Home.jsx
│ │ ├── Success.jsx
│ │ ├── Login.jsx
│ │ ├── ProductList.jsx
│ │ ├── Register.jsx
│ │ ├── Product.jsx
│ │ └── Cart.jsx
│ ├── App.jsx
│ └── data.js
├── public
│ ├── robots.txt
│ ├── manifest.json
│ └── index.html
├── .gitignore
└── package.json
├── shopitel-api
├── .gitignore
├── models
│ ├── User.js
│ ├── Cart.js
│ ├── Product.js
│ └── Order.js
├── routes
│ ├── stripe.js
│ ├── verifyToken.js
│ ├── cart.js
│ ├── product.js
│ ├── auth.js
│ ├── order.js
│ └── user.js
├── package.json
├── index.js
└── yarn.lock
├── LICENSE
├── README.md
└── .github
└── workflows
└── codeql-analysis.yml
/shopitel-client-react-ui/src/index.css:
--------------------------------------------------------------------------------
1 | #inputID::placeholder {
2 | color: white;
3 | font-size: 16px;
4 | }
5 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/shopitel-api/.gitignore:
--------------------------------------------------------------------------------
1 | .env.local
2 | .env.development.local
3 | .env.test.local
4 | .env.production.local
5 | .env
6 |
7 | # dependencies
8 | /node_modules
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/images/Shopitel.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AbihaFatima/shopitel-ecommerce-app/HEAD/shopitel-client-react-ui/src/images/Shopitel.PNG
--------------------------------------------------------------------------------
/shopitel-client-react-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 | .env
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 |
--------------------------------------------------------------------------------
/shopitel-api/models/User.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const UserSchema = new mongoose.Schema(
4 | {
5 | username: { type: String, required: true, unique: true },
6 | email: { type: String, required: true, unique: true },
7 | password: { type: String, required: true },
8 | isAdmin: {
9 | type: Boolean,
10 | default: false,
11 | },
12 | },
13 | { timestamps: true }
14 | );
15 |
16 | module.exports = mongoose.model("User", UserSchema);
--------------------------------------------------------------------------------
/shopitel-api/models/Cart.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const CartSchema = new mongoose.Schema(
4 | {
5 | userId: { type: String, required: true },
6 | products: [
7 | {
8 | productId: {
9 | type: String,
10 | },
11 | quantity: {
12 | type: Number,
13 | default: 1,
14 | },
15 | },
16 | ],
17 | },
18 | { timestamps: true }
19 | );
20 |
21 | module.exports = mongoose.model("Cart", CartSchema);
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Announcement.jsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 |
3 | const Container = styled.div`
4 | height: 40px;
5 | background-color: #d5cdd5;
6 | color: black;
7 | display: flex;
8 | align-items: center;
9 | justify-content: center;
10 | font-size: 16px;
11 | font-weight: 500;
12 | `;
13 |
14 | const Announcement = () => {
15 | return Super Deal! Free Shipping on Orders Over $ 50 ;
16 | };
17 |
18 | export default Announcement;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 | import {Provider} from "react-redux"
5 | import { store, persistor } from "./redux/store";
6 | import { PersistGate } from 'redux-persist/integration/react'
7 |
8 |
9 | ReactDOM.render(
10 |
11 |
12 |
13 |
14 | ,
15 | document.getElementById('root')
16 | );
17 |
18 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/requestMethods.js:
--------------------------------------------------------------------------------
1 |
2 | import axios from "axios";
3 |
4 | const BASE_URL = "http://localhost:3000/api/";
5 |
6 | const user = JSON.parse(localStorage.getItem("persist:root"))?.user;
7 | const currentUser = user && JSON.parse(user).currentUser;
8 | const TOKEN = currentUser?.accessToken;
9 |
10 | export const publicRequest = axios.create({
11 | baseURL: BASE_URL,
12 | });
13 |
14 | export const userRequest = axios.create({
15 | baseURL: BASE_URL,
16 | header: { token: `Bearer ${TOKEN}` },
17 | });
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Categories.jsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import { categories } from "../data";
3 | import CategoryItem from "./CategoryItem";
4 |
5 | const Container = styled.div`
6 | display: flex;
7 | padding: 20px;
8 | justify-content: space-between;
9 | `;
10 |
11 | const Categories = () => {
12 | return (
13 |
14 | {categories.map((item) => (
15 |
16 | ))}
17 |
18 | );
19 | };
20 |
21 | export default Categories;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/redux/cartRedux.js:
--------------------------------------------------------------------------------
1 |
2 | import { createSlice } from "@reduxjs/toolkit";
3 |
4 | const cartSlice = createSlice({
5 | name: "cart",
6 | initialState: {
7 | products: [],
8 | quantity: 0,
9 | total: 0,
10 | },
11 | reducers: {
12 | addProduct: (state, action) => {
13 | state.quantity += 1;
14 | state.products.push(action.payload);
15 | state.total += action.payload.price * action.payload.quantity;
16 | },
17 | },
18 | });
19 |
20 | export const { addProduct } = cartSlice.actions;
21 | export default cartSlice.reducer;
--------------------------------------------------------------------------------
/shopitel-api/models/Product.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const ProductSchema = new mongoose.Schema(
4 | {
5 | title: { type: String, required: true, unique: true },
6 | desc: { type: String, required: true, },
7 | img: { type: String, required: true },
8 | categories: { type: Array },
9 | size: { type: Array },
10 | color: { type: Array },
11 | price: { type: Number, required: true },
12 | inStock: { type: Boolean, default: true },
13 | },
14 | { timestamps: true }
15 | );
16 |
17 | module.exports = mongoose.model("Product", ProductSchema);
--------------------------------------------------------------------------------
/shopitel-api/routes/stripe.js:
--------------------------------------------------------------------------------
1 | const router = require("express").Router();
2 | const KEY = process.env.STRIPE_KEY
3 | const stripe = require("stripe")(KEY);
4 |
5 |
6 | router.post("/payment", (req, res) => {
7 | stripe.charges.create(
8 | {
9 | source: req.body.tokenId,
10 | amount: req.body.amount,
11 | currency: "AED",
12 | },
13 | (stripeErr, stripeRes) => {
14 | if (stripeErr) {
15 | res.status(500).json(stripeErr);
16 | } else {
17 | res.status(200).json(stripeRes);
18 | }
19 | }
20 | );
21 | });
22 |
23 | module.exports = router;
--------------------------------------------------------------------------------
/shopitel-client-react-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 |
--------------------------------------------------------------------------------
/shopitel-api/models/Order.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const OrderSchema = new mongoose.Schema(
4 | {
5 | userId: { type: String, required: true },
6 | products: [
7 | {
8 | productId: {
9 | type: String,
10 | },
11 | quantity: {
12 | type: Number,
13 | default: 1,
14 | },
15 | },
16 | ],
17 | amount: { type: Number, required: true },
18 | address: { type: Object, required: true },
19 | status: { type: String, default: "pending" },
20 | },
21 | { timestamps: true }
22 | );
23 |
24 | module.exports = mongoose.model("Order", OrderSchema);
--------------------------------------------------------------------------------
/shopitel-api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Shopitel-API",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon index.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "cookie-parser": "^1.4.6",
14 | "cors": "^2.8.5",
15 | "crypto-js": "^4.1.1",
16 | "dotenv": "^10.0.0",
17 | "express": "^4.17.1",
18 | "express-session": "^1.17.2",
19 | "jsonwebtoken": "^8.5.1",
20 | "mongoose": "^6.0.13",
21 | "nodemon": "^2.0.15",
22 | "passport": "^0.5.0",
23 | "stripe": "^8.191.0"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/Home.jsx:
--------------------------------------------------------------------------------
1 | import Announcement from "../components/Announcement";
2 | import React from 'react'
3 | import Navbar from '../components/Navbar'
4 | import Slider from "../components/Slider"
5 | import Categories from "../components/Categories";
6 | import Products from "../components/Products";
7 | import Newsletter from "../components/Newsletter";
8 | import Footer from "../components/Footer";
9 |
10 | const Home = () => {
11 | return (
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | )
22 | }
23 |
24 | export default Home
25 |
26 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
17 | React App
18 |
19 |
20 |
21 | You need to enable JavaScript to run this app.
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/redux/apiCalls.js:
--------------------------------------------------------------------------------
1 | import { loginFailure, loginStart, loginSuccess, registerFailure,registerStart, registerSuccess,logout } from "./userRedux";
2 | import { publicRequest } from "../requestMethods";
3 |
4 | export const login = async (dispatch, user) => {
5 | dispatch(loginStart());
6 | try {
7 | const res = await publicRequest.post("/auth/login", user);
8 | dispatch(loginSuccess(res.data));
9 | } catch (err) {
10 | dispatch(loginFailure());
11 | }
12 | };
13 | export const register = async (dispatch, user) => {
14 | dispatch(registerStart());
15 | try {
16 | const res = await publicRequest.post("/auth/register", user);
17 | dispatch(registerSuccess(res.data));
18 | } catch (err) {
19 | dispatch(registerFailure());
20 | }
21 | };
22 |
23 | export const logOut = async (dispatch, user) => {
24 | try {
25 | const res = await publicRequest.delete("/logout", user);
26 | dispatch(logout(res.data));
27 | } catch (err) {
28 |
29 | }
30 | };
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/redux/store.js:
--------------------------------------------------------------------------------
1 | import { configureStore, combineReducers } from "@reduxjs/toolkit";
2 | import cartReducer from "./cartRedux";
3 | import userReducer from "./userRedux";
4 | import {
5 | persistStore,
6 | persistReducer,
7 | FLUSH,
8 | REHYDRATE,
9 | PAUSE,
10 | PERSIST,
11 | PURGE,
12 | REGISTER,
13 | } from "redux-persist";
14 | import storage from "redux-persist/lib/storage";
15 |
16 | const persistConfig = {
17 | key: "root",
18 | version: 1,
19 | storage,
20 | };
21 |
22 | const rootReducer = combineReducers({ user: userReducer, cart: cartReducer });
23 |
24 | const persistedReducer = persistReducer(persistConfig, rootReducer);
25 |
26 | export const store = configureStore({
27 | reducer: persistedReducer,
28 | middleware: (getDefaultMiddleware) =>
29 | getDefaultMiddleware({
30 | serializableCheck: {
31 | ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
32 | },
33 | }),
34 | });
35 |
36 | export let persistor = persistStore(store);
--------------------------------------------------------------------------------
/shopitel-api/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const dotenv = require("dotenv");
5 | const userRoute = require("./routes/user")
6 | const authRoute = require("./routes/auth")
7 | const productRoute = require("./routes/product");
8 | const cartRoute = require("./routes/cart");
9 | const orderRoute = require("./routes/order");
10 | const stripeRoute = require("./routes/stripe");
11 | const cors = require("cors");
12 |
13 | dotenv.config();
14 |
15 | mongoose.connect(process.env.MONGO_URL)
16 | .then(()=>console.log("Database connection successful"))
17 | .catch((err)=>{
18 | console.log(err);
19 | });
20 |
21 | app.use(cors());
22 | app.use(express.json());
23 | app.use("/api/auth", authRoute);
24 | app.use("/api/user", userRoute);
25 | app.use("/api/products", productRoute);
26 | app.use("/api/carts", cartRoute);
27 | app.use("/api/orders", orderRoute);
28 | app.use("/api/checkout", stripeRoute);
29 |
30 | app.listen(process.env.PORT || 3000, ()=>{
31 | console.log("Backend server is runnning!");
32 | });
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Abiha Fatima
4 |
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/shopitel-api/routes/verifyToken.js:
--------------------------------------------------------------------------------
1 | const jwt = require("jsonwebtoken");
2 |
3 | const verifyToken = (req, res, next) => {
4 | const authHeader = req.headers.token;
5 | if (authHeader) {
6 | const token = authHeader.split(" ")[1];
7 | jwt.verify(token, process.env.JWT_SEC, (err, user) => {
8 | if (err) res.status(403).json("Token is not valid!");
9 | req.user = user;
10 | next();
11 | });
12 | } else {
13 | return res.status(401).json("You are not authenticated!");
14 | }
15 | };
16 |
17 | const verifyTokenAndAuthorization = (req, res, next) => {
18 | verifyToken(req, res, () => {
19 | if (req.user.id === req.params.id || req.user.isAdmin) {
20 | next();
21 | } else {
22 | res.status(403).json("You are not alowed to do that!");
23 | }
24 | });
25 | };
26 |
27 | const verifyTokenAndAdmin = (req, res, next) => {
28 | verifyToken(req, res, () => {
29 | if (req.user.isAdmin) {
30 | next();
31 | } else {
32 | res.status(403).json("You are not alowed to do that!");
33 | }
34 | });
35 | };
36 |
37 | module.exports = {
38 | verifyToken,
39 | verifyTokenAndAuthorization,
40 | verifyTokenAndAdmin,
41 | };
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/CategoryItem.jsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 | import styled from "styled-components";
3 |
4 | const Container = styled.div`
5 | flex: 1;
6 | margin: 5px;
7 | height: 70vh;
8 | position: relative;
9 | `;
10 |
11 | const Image = styled.img`
12 | width: 100%;
13 | height: 100%;
14 | object-fit: cover;
15 | `;
16 |
17 | const Info = styled.div`
18 | position: absolute;
19 | top: 0;
20 | left: 0;
21 | width: 100%;
22 | height: 100%;
23 | display: flex;
24 | flex-direction: column;
25 | align-items: center;
26 | justify-content: center;
27 | `;
28 |
29 | const Title = styled.h1`
30 | color:white;
31 | margin-bottom: 20px;
32 | `;
33 |
34 | const Button = styled.button`
35 | border:none;
36 | padding: 10px;
37 | background-color: white;
38 | color:gray;
39 | cursor: pointer;
40 | font-weight: 600;
41 | `;
42 |
43 | const CategoryItem = ({ item }) => {
44 | return (
45 |
46 |
47 |
48 |
49 | {item.title}
50 | SHOP NOW
51 |
52 |
53 |
54 | );
55 | };
56 |
57 | export default CategoryItem;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/redux/userRedux.js:
--------------------------------------------------------------------------------
1 | import { createSlice } from "@reduxjs/toolkit";
2 |
3 | const userSlice = createSlice({
4 | name: "user",
5 | initialState: {
6 | currentUser : null,
7 | isFetching : false,
8 | error : false
9 | },
10 | reducers: {
11 | loginStart: (state) => {
12 | state.isFetching = true;
13 | },
14 | loginSuccess: (state, action) => {
15 | state.isFetching = false;
16 | state.currentUser = action.payload;
17 | },
18 | loginFailure: (state) => {
19 | state.isFetching = false;
20 | state.error = true;
21 | },
22 | registerStart: (state) => {
23 | state.isFetching = true;
24 | },
25 | registerSuccess: (state, action) => {
26 | state.isFetching = false;
27 | state.currentUser = action.payload;
28 | },
29 | registerFailure: (state) => {
30 | state.isFetching = false;
31 | state.error = true;
32 | },
33 |
34 | },
35 | logout: (state) => {
36 | state.currentUser = null;
37 | },
38 | });
39 |
40 | export const { loginStart, loginSuccess, loginFailure, registerStart, registerSuccess, registerFailure,logout } = userSlice.actions;
41 | export default userSlice.reducer;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/App.jsx:
--------------------------------------------------------------------------------
1 |
2 | import Product from "./pages/Product";
3 | import Home from "./pages/Home";
4 | import ProductList from "./pages/ProductList";
5 | import Register from "./pages/Register";
6 | import Login from "./pages/Login";
7 | import Cart from "./pages/Cart";
8 | import {
9 | BrowserRouter as Router,
10 | Switch,
11 | Route,
12 | Redirect,
13 | } from "react-router-dom";
14 | import Success from "./pages/Success";
15 | import { useSelector } from "react-redux";
16 |
17 | const App = () => {
18 | const user = useSelector((state) => state.user.currentUser);
19 | // const user = false;
20 | //localStorage.clear();
21 | return (
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | {user ? : }
40 |
41 | {user ? : }
42 |
43 |
44 |
45 | );
46 | };
47 |
48 | export default App;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Newsletter.jsx:
--------------------------------------------------------------------------------
1 | import { Send } from "@material-ui/icons";
2 | import styled from "styled-components";
3 |
4 | const Container = styled.div`
5 | height: 60vh;
6 | background-color: #fcf5f5;
7 | display: flex;
8 | align-items: center;
9 | justify-content: center;
10 | flex-direction: column;
11 | `;
12 | const Title = styled.h1`
13 | font-size: 70px;
14 | margin-bottom: 20px;
15 | `;
16 |
17 | const Desc = styled.div`
18 | font-size: 24px;
19 | font-weight: 300;
20 | margin-bottom: 20px;
21 | `;
22 |
23 | const InputContainer = styled.div`
24 | width: 50%;
25 | height: 40px;
26 | background-color: white;
27 | display: flex;
28 | justify-content: space-between;
29 | border: 1px solid lightgray;
30 | `;
31 |
32 | const Input = styled.input`
33 | border: none;
34 | flex: 8;
35 | padding-left: 20px;
36 | `;
37 |
38 | const Button = styled.button`
39 | flex: 1;
40 | border: none;
41 | background-color: teal;
42 | color: white;
43 | `;
44 |
45 | const Newsletter = () => {
46 | return (
47 |
48 | Newsletter
49 | Get timely updates from your favorite products.
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | );
58 | };
59 |
60 | export default Newsletter;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "shopitel-client-react-ui",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@material-ui/core": "^4.12.3",
7 | "@material-ui/icons": "^4.11.2",
8 | "@reduxjs/toolkit": "^1.6.2",
9 | "@testing-library/jest-dom": "^5.11.4",
10 | "@testing-library/react": "^11.1.0",
11 | "@testing-library/user-event": "^12.1.10",
12 | "axios": "^0.24.0",
13 | "dotenv": "^10.0.0",
14 | "react": "^17.0.2",
15 | "react-bootstrap": "^2.0.2",
16 | "react-dom": "^17.0.2",
17 | "react-redux": "^7.2.6",
18 | "react-router-dom": "5.3.0",
19 | "react-scripts": "4.0.3",
20 | "react-stripe-checkout": "^2.6.3",
21 | "redux-persist": "^6.0.0",
22 | "semantic-ui-react": "^2.0.4",
23 | "styled-components": "^5.3.3",
24 | "web-vitals": "^1.0.1"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": [
34 | "react-app",
35 | "react-app/jest"
36 | ]
37 | },
38 | "browserslist": {
39 | "production": [
40 | ">0.2%",
41 | "not dead",
42 | "not op_mini all"
43 | ],
44 | "development": [
45 | "last 1 chrome version",
46 | "last 1 firefox version",
47 | "last 1 safari version"
48 | ]
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/Success.jsx:
--------------------------------------------------------------------------------
1 |
2 | import { useEffect, useState } from "react";
3 | import { useSelector } from "react-redux";
4 | import { useLocation } from "react-router";
5 | import { userRequest } from "../requestMethods";
6 |
7 | const Success = () => {
8 | const location = useLocation();
9 | const data = location.state.stripeData;
10 | const cart = location.state.cart;
11 | const currentUser = useSelector((state) => state.user.currentUser);
12 | const [orderId, setOrderId] = useState(null);
13 |
14 | useEffect(() => {
15 | const createOrder = async () => {
16 | try {
17 | const res = await userRequest.post("/orders", {
18 | userId: currentUser._id,
19 | products: cart.products.map((item) => ({
20 | productId: item._id,
21 | quantity: item._quantity,
22 | })),
23 | amount: cart.total,
24 | address: data.billing_details.address,
25 | });
26 | setOrderId(res.data._id);
27 | } catch {}
28 | };
29 | data && createOrder();
30 | }, [cart, data, currentUser]);
31 |
32 | return (
33 |
42 | {orderId
43 | ? `Order has been created successfully. Your order number is ${orderId}`
44 | : `Successfull. Your order is being prepared...`}
45 | Go to Homepage
46 |
47 | );
48 | };
49 |
50 | export default Success;
--------------------------------------------------------------------------------
/shopitel-api/routes/cart.js:
--------------------------------------------------------------------------------
1 | const Cart = require("../models/Cart");
2 | const {
3 | verifyToken,
4 | verifyTokenAndAuthorization,
5 | verifyTokenAndAdmin,
6 | } = require("./verifyToken");
7 |
8 | const router = require("express").Router();
9 |
10 | //CREATE
11 |
12 | router.post("/", verifyToken, async (req, res) => {
13 | const newCart = new Cart(req.body);
14 |
15 | try {
16 | const savedCart = await newCart.save();
17 | res.status(200).json(savedCart);
18 | } catch (err) {
19 | res.status(500).json(err);
20 | }
21 | });
22 |
23 | //UPDATE
24 | router.put("/:id", verifyTokenAndAuthorization, async (req, res) => {
25 | try {
26 | const updatedCart = await Cart.findByIdAndUpdate(
27 | req.params.id,
28 | {
29 | $set: req.body,
30 | },
31 | { new: true }
32 | );
33 | res.status(200).json(updatedCart);
34 | } catch (err) {
35 | res.status(500).json(err);
36 | }
37 | });
38 |
39 | //DELETE
40 | router.delete("/:id", verifyTokenAndAuthorization, async (req, res) => {
41 | try {
42 | await Cart.findByIdAndDelete(req.params.id);
43 | res.status(200).json("Cart has been deleted...");
44 | } catch (err) {
45 | res.status(500).json(err);
46 | }
47 | });
48 |
49 | //GET USER CART
50 | router.get("/find/:userId", verifyTokenAndAuthorization, async (req, res) => {
51 | try {
52 | const cart = await Cart.findOne({ userId: req.params.userId });
53 | res.status(200).json(cart);
54 | } catch (err) {
55 | res.status(500).json(err);
56 | }
57 | });
58 |
59 | // //GET ALL
60 |
61 | router.get("/", verifyTokenAndAdmin, async (req, res) => {
62 | try {
63 | const carts = await Cart.find();
64 | res.status(200).json(carts);
65 | } catch (err) {
66 | res.status(500).json(err);
67 | }
68 | });
69 |
70 | module.exports = router;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Product.jsx:
--------------------------------------------------------------------------------
1 | import {
2 | FavoriteBorderOutlined,
3 | SearchOutlined,
4 | ShoppingCartOutlined,
5 | } from "@material-ui/icons";
6 | import { Link } from "react-router-dom";
7 | import styled from "styled-components";
8 |
9 | const Info = styled.div`
10 | opacity: 0;
11 | width: 100%;
12 | height: 100%;
13 | position: absolute;
14 | top: 0;
15 | left: 0;
16 | background-color: rgba(0, 0, 0, 0.2);
17 | z-index: 3;
18 | display: flex;
19 | align-items: center;
20 | justify-content: center;
21 | transition: all 0.5s ease;
22 | cursor: pointer;
23 | `;
24 |
25 | const Container = styled.div`
26 | flex: 1;
27 | margin: 5px;
28 | min-width: 280px;
29 | height: 350px;
30 | display: flex;
31 | align-items: center;
32 | justify-content: center;
33 | background-color: #f5fbfd;
34 | position: relative;
35 | &:hover ${Info}{
36 | opacity: 1;
37 | }
38 | `;
39 |
40 | const Circle = styled.div`
41 | width: 200px;
42 | height: 200px;
43 | border-radius: 50%;
44 | background-color: white;
45 | position: absolute;
46 | `;
47 |
48 | const Image = styled.img`
49 | height: 75%;
50 | z-index: 2;
51 | `;
52 |
53 | const Icon = styled.div`
54 | width: 40px;
55 | height: 40px;
56 | border-radius: 50%;
57 | background-color: white;
58 | display: flex;
59 | align-items: center;
60 | justify-content: center;
61 | margin: 10px;
62 | transition: all 0.5s ease;
63 | &:hover {
64 | background-color: #e9f5f5;
65 | transform: scale(1.1);
66 | }
67 | `;
68 |
69 | const Product = ({ item }) => {
70 | return (
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | );
89 | };
90 |
91 | export default Product;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Products.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 | import styled from "styled-components";
3 | import { popularProducts } from "../data";
4 | import Product from "./Product";
5 | import axios from "axios";
6 |
7 | const Container = styled.div`
8 | padding: 20px;
9 | display: flex;
10 | flex-wrap: wrap;
11 | justify-content: space-between;
12 | `;
13 |
14 | const Products = ({ cat, filters, sort }) => {
15 | const [products, setProducts] = useState([]);
16 | const [filteredProducts, setFilteredProducts] = useState([]);
17 |
18 | useEffect(() => {
19 | const getProducts = async () => {
20 | try {
21 | const res = await axios.get(
22 | cat
23 | ? `http://localhost:3000/api/products?category=${cat}`
24 | : "http://localhost:3000/api/products"
25 | );
26 | setProducts(res.data);
27 | } catch (err) {}
28 | };
29 | getProducts();
30 | }, [cat]);
31 |
32 | useEffect(() => {
33 | cat &&
34 | setFilteredProducts(
35 | products.filter((item) =>
36 | Object.entries(filters).every(([key, value]) =>
37 | item[key].includes(value)
38 | )
39 | )
40 | );
41 | }, [products, cat, filters]);
42 |
43 | useEffect(() => {
44 | if (sort === "newest") {
45 | setFilteredProducts((prev) =>
46 | [...prev].sort((a, b) => a.createdAt - b.createdAt)
47 | );
48 | } else if (sort === "asc") {
49 | setFilteredProducts((prev) =>
50 | [...prev].sort((a, b) => a.price - b.price)
51 | );
52 | } else {
53 | setFilteredProducts((prev) =>
54 | [...prev].sort((a, b) => b.price - a.price)
55 | );
56 | }
57 | }, [sort]);
58 |
59 | return (
60 |
61 | {/* {filteredProducts.map((item) => ( ))} */}
62 | {cat
63 | ? filteredProducts.map((item) => )
64 | : products
65 | .slice(0, 8)
66 | .map((item) => )}
67 |
68 | );
69 | };
70 |
71 | export default Products;
--------------------------------------------------------------------------------
/shopitel-api/routes/product.js:
--------------------------------------------------------------------------------
1 | const Product = require("../models/Product");
2 | const {
3 | verifyToken,
4 | verifyTokenAndAuthorization,
5 | verifyTokenAndAdmin,
6 | } = require("./verifyToken");
7 |
8 | const router = require("express").Router();
9 |
10 | //CREATE
11 |
12 | router.post("/", verifyTokenAndAdmin, async (req, res) => {
13 | const newProduct = new Product(req.body);
14 |
15 | try {
16 | const savedProduct = await newProduct.save();
17 | res.status(200).json(savedProduct);
18 | } catch (err) {
19 | res.status(500).json(err);
20 | }
21 | });
22 |
23 | //UPDATE
24 | router.put("/:id", verifyTokenAndAdmin, async (req, res) => {
25 | try {
26 | const updatedProduct = await Product.findByIdAndUpdate(
27 | req.params.id,
28 | {
29 | $set: req.body,
30 | },
31 | { new: true }
32 | );
33 | res.status(200).json(updatedProduct);
34 | } catch (err) {
35 | res.status(500).json(err);
36 | }
37 | });
38 |
39 | //DELETE
40 | router.delete("/:id", verifyTokenAndAdmin, async (req, res) => {
41 | try {
42 | await Product.findByIdAndDelete(req.params.id);
43 | res.status(200).json("Product has been deleted...");
44 | } catch (err) {
45 | res.status(500).json(err);
46 | }
47 | });
48 |
49 | //GET PRODUCT
50 | router.get("/find/:id", async (req, res) => {
51 | try {
52 | const product = await Product.findById(req.params.id);
53 | res.status(200).json(product);
54 | } catch (err) {
55 | res.status(500).json(err);
56 | }
57 | });
58 |
59 | //GET ALL PRODUCTS
60 | router.get("/", async (req, res) => {
61 | const qNew = req.query.new;
62 | const qCategory = req.query.category;
63 | try {
64 | let products;
65 |
66 | if (qNew) {
67 | products = await Product.find().sort({ createdAt: -1 }).limit(1);
68 | } else if (qCategory) {
69 | products = await Product.find({
70 | categories: {
71 | $in: [qCategory],
72 | },
73 | });
74 | } else {
75 | products = await Product.find();
76 | }
77 |
78 | res.status(200).json(products);
79 | } catch (err) {
80 | res.status(500).json(err);
81 | }
82 | });
83 |
84 | module.exports = router;
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 🛍️ Shopitel 🛒
2 |
3 | https://user-images.githubusercontent.com/70844041/169762271-d50fef91-0664-4b17-a4a8-bfe54f9cdfe0.mp4
4 |
5 | ### To Get Started ⚡
6 |
7 | 1. Clone the `shopitel-ecommerce-app` repository using git:
8 |
9 | ```bash
10 | git clone git@github.com:AbihaFatima/shopitel-ecommerce-app.git
11 |
12 | cd shopitel-api
13 | ```
14 |
15 | 2. Install dependencies with this command:
16 |
17 | ```bash
18 | yarn add
19 | ```
20 |
21 | or if you are using npm package manager:
22 |
23 | ```bash
24 | npm install
25 | ```
26 |
27 | 3. Run the backend application with this command:
28 |
29 | ```bash
30 | yarn start
31 | ```
32 |
33 | now the node server will be running at `http://localhost:3000/` (for server side development)
34 |
35 | 4. To connect to the react client side :
36 |
37 | ```bash
38 | cd shopitel-client-react-ui
39 | ```
40 |
41 | 5. Install dependencies (required for the front-end) with this command:
42 |
43 | ```bash
44 | yarn add
45 | ```
46 |
47 | 6. Run the application with this command:
48 |
49 | ```bash
50 | yarn start
51 | ```
52 |
53 | #### We're finally all set to go🎉
54 |
55 | The web application will be running at `http://localhost:3001/`
56 |
57 | #### Happy Shopping! 🛍️
58 |
59 | ### Tech Stack Used:
60 |
61 | #### Backend
62 |
63 | - Express.js
64 | - Node.js
65 | - MongoDB
66 | - Mongoose
67 | - JWT (for authentication)
68 | - CryptoJS (for data encryption)
69 | - Stripe API (for checkout 💳)
70 |
71 | #### Frontend
72 |
73 | - React
74 | - Redux (to manage app state)
75 | - Redux Persist (for local storage)
76 | - React-router-dom (to handle routing)
77 | - Axios (for http requests)
78 | - Material-UI and styled-components (for component-level design)
79 |
80 | #### Future Plans 🚀
81 |
82 | - [ ] To add an Admin Dashboard that would support CRUD operations for new products as well as create charts for user analytics, cost and total revenue.
83 | - [ ] To make this application mobile responsive.
84 | - [ ] And last but not the least is to use a hosting service like Heroku to deploy this application.
85 |
86 | ---
87 |
88 | ```javascript
89 | if (youEnjoyed) {
90 | starThisRepository(⭐);
91 | }
92 | ```
93 | ---
94 | #### Status 🛠️ 🚧
95 | This project is _in progress_
96 |
97 |
98 |
--------------------------------------------------------------------------------
/shopitel-api/routes/auth.js:
--------------------------------------------------------------------------------
1 | const router = require("express").Router();
2 | const User = require("../models/User")
3 | const CryptoJS = require("crypto-js")
4 | const jwt = require("jsonwebtoken");
5 | const cookieParser = require('cookie-parser');
6 | const session = require('express-session');
7 | const passport = require("passport");
8 | //Register
9 | router.post("/register", async (req,res) => {
10 | const newUser = new User({
11 | username: req.body.username,
12 | email: req.body.email,
13 | password: CryptoJS.AES.encrypt(req.body.password,process.env.PASS_SEC).toString(),
14 | });
15 | try
16 | {
17 | const savedUser = await newUser.save()
18 | res.status(201).json(savedUser);
19 | }catch(err){
20 | res.status(500).json(err);
21 | }
22 | });
23 |
24 | //Login
25 | router.post("/login", async(req, res)=>{
26 | try{
27 | const user = await User.findOne({username : req.body.username});
28 |
29 | !user && res.status(401).json("Wrong User Name");
30 | const hashedPassword = CryptoJS.AES.decrypt(user.password, process.env.PASS_SEC);
31 |
32 | const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
33 |
34 | const inputPassword = req.body.password;
35 |
36 | originalPassword != inputPassword &&
37 | res.status(401).json("Wrong Password");
38 |
39 | //Creating json web token
40 | const accessToken = jwt.sign(
41 | {
42 | id: user._id,
43 | isAdmin: user.isAdmin,
44 | },
45 | process.env.JWT_SEC,
46 | {expiresIn:"3d"}
47 | );
48 |
49 | const { password, ...others } = user._doc;
50 | res.status(200).json({...others, accessToken});
51 | }catch(err){
52 | res.status(500).json(err)
53 | }
54 | });
55 |
56 | router.delete('/logout', (req, res) => {
57 | if (req.session) {
58 | req.session.destroy(err => {
59 | if (err) {
60 | res.status(400).send('Unable to log out')
61 | } else {
62 | res.send('Logout successful')
63 | }
64 | });
65 | } else {
66 | res.end()
67 | }
68 | });
69 |
70 |
71 | module.exports = router
--------------------------------------------------------------------------------
/shopitel-api/routes/order.js:
--------------------------------------------------------------------------------
1 | const Order = require("../models/Order");
2 | const {
3 | verifyToken,
4 | verifyTokenAndAuthorization,
5 | verifyTokenAndAdmin,
6 | } = require("./verifyToken");
7 |
8 | const router = require("express").Router();
9 |
10 | //CREATE
11 |
12 | router.post("/", verifyToken, async (req, res) => {
13 | const newOrder = new Order(req.body);
14 |
15 | try {
16 | const savedOrder = await newOrder.save();
17 | res.status(200).json(savedOrder);
18 | } catch (err) {
19 | res.status(500).json(err);
20 | }
21 | });
22 |
23 | //UPDATE
24 | router.put("/:id", verifyTokenAndAdmin, async (req, res) => {
25 | try {
26 | const updatedOrder = await Order.findByIdAndUpdate(
27 | req.params.id,
28 | {
29 | $set: req.body,
30 | },
31 | { new: true }
32 | );
33 | res.status(200).json(updatedOrder);
34 | } catch (err) {
35 | res.status(500).json(err);
36 | }
37 | });
38 |
39 | //DELETE
40 | router.delete("/:id", verifyTokenAndAdmin, async (req, res) => {
41 | try {
42 | await Order.findByIdAndDelete(req.params.id);
43 | res.status(200).json("Order has been deleted...");
44 | } catch (err) {
45 | res.status(500).json(err);
46 | }
47 | });
48 |
49 | //GET USER ORDERS
50 | router.get("/find/:userId", verifyTokenAndAuthorization, async (req, res) => {
51 | try {
52 | const orders = await Order.find({ userId: req.params.userId });
53 | res.status(200).json(orders);
54 | } catch (err) {
55 | res.status(500).json(err);
56 | }
57 | });
58 |
59 | // //GET ALL
60 |
61 | router.get("/", verifyTokenAndAdmin, async (req, res) => {
62 | try {
63 | const orders = await Order.find();
64 | res.status(200).json(orders);
65 | } catch (err) {
66 | res.status(500).json(err);
67 | }
68 | });
69 |
70 | // GET MONTHLY INCOME
71 |
72 | router.get("/income", verifyTokenAndAdmin, async (req, res) => {
73 | const date = new Date();
74 | const lastMonth = new Date(date.setMonth(date.getMonth() - 1));
75 | const previousMonth = new Date(new Date().setMonth(lastMonth.getMonth() - 1));
76 |
77 | try {
78 | const income = await Order.aggregate([
79 | { $match: { createdAt: { $gte: previousMonth } } },
80 | {
81 | $project: {
82 | month: { $month: "$createdAt" },
83 | sales: "$amount",
84 | },
85 | },
86 | {
87 | $group: {
88 | _id: "$month",
89 | total: { $sum: "$sales" },
90 | },
91 | },
92 | ]);
93 | res.status(200).json(income);
94 | } catch (err) {
95 | res.status(500).json(err);
96 | }
97 | });
98 |
99 | module.exports = router;
--------------------------------------------------------------------------------
/shopitel-api/routes/user.js:
--------------------------------------------------------------------------------
1 | const User = require("../models/User");
2 | const router = require("express").Router();
3 | const {
4 | verifyToken,
5 | verifyTokenAndAuthorization,
6 | verifyTokenAndAdmin,
7 | } = require("./verifyToken");
8 |
9 | //For Updating
10 | router.put("/:id", verifyTokenAndAuthorization, async(req,res) => {
11 | if (req.body.password) {
12 | req.body.password = CryptoJS.AES.encrypt(
13 | req.body.password,
14 | process.env.PASS_SEC
15 | ).toString();
16 | }
17 |
18 | try {
19 | const updatedUser = await User.findByIdAndUpdate(
20 | req.params.id,
21 | {
22 | $set: req.body,
23 | },
24 | { new: true }
25 | );
26 | res.status(200).json(updatedUser);
27 | } catch (err) {
28 | res.status(500).json(err);
29 | }
30 | });
31 |
32 | //DELETE
33 | router.delete("/:id", verifyTokenAndAuthorization, async (req, res) => {
34 | try {
35 | await User.findByIdAndDelete(req.params.id);
36 | res.status(200).json("User has been deleted...");
37 | } catch (err) {
38 | res.status(500).json(err);
39 | }
40 | });
41 |
42 | //GET USER
43 | router.get("/find/:id", verifyTokenAndAdmin, async (req, res) => {
44 | try {
45 | const user = await User.findById(req.params.id);
46 | const { password, ...others } = user._doc;
47 | res.status(200).json(others);
48 | } catch (err) {
49 | res.status(500).json(err);
50 | }
51 | });
52 |
53 | //GET ALL USER
54 | router.get("/", verifyTokenAndAdmin, async (req, res) => {
55 | const query = req.query.new;
56 | try {
57 | const users = query
58 | ? await User.find().sort({ _id: -1 }).limit(5)
59 | : await User.find();
60 | res.status(200).json(users);
61 | } catch (err) {
62 | res.status(500).json(err);
63 | }
64 | });
65 |
66 | //GET USER STATS
67 |
68 | router.get("/stats", verifyTokenAndAdmin, async (req, res) => {
69 | const date = new Date();
70 | const lastYear = new Date(date.setFullYear(date.getFullYear() - 1));
71 |
72 | try {
73 | const data = await User.aggregate([
74 | { $match: { createdAt: { $gte: lastYear } } },
75 | {
76 | $project: {
77 | month: { $month: "$createdAt" },
78 | },
79 | },
80 | {
81 | $group: {
82 | _id: "$month",
83 | total: { $sum: 1 },
84 | },
85 | },
86 | ]);
87 | res.status(200).json(data)
88 | } catch (err) {
89 | res.status(500).json(err);
90 | }
91 | });
92 |
93 | module.exports = router
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/Login.jsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import { login } from "../redux/apiCalls";
3 | import { useState } from "react";
4 | import { useDispatch, useSelector } from "react-redux";
5 | import { Link } from "react-router-dom";
6 | const Container = styled.div`
7 | width: 100vw;
8 | height: 100vh;
9 | background: linear-gradient(
10 | rgba(255, 255, 255, 0.5),
11 | rgba(255, 255, 255, 0.5)
12 | ),
13 | url("https://www.bdcmagazine.com/files/uploads/2020/10/fj300705670.jpg")
14 | center;
15 | background-size: cover;
16 | display: flex;
17 | align-items: center;
18 | justify-content: center;
19 | `;
20 |
21 | const Wrapper = styled.div`
22 | width: 25%;
23 | padding: 20px;
24 | background-color: white;
25 | `;
26 |
27 | const Title = styled.h1`
28 | font-size: 24px;
29 | font-weight: 300;
30 | `;
31 |
32 | const Error = styled.span`
33 | color: red;
34 | `;
35 |
36 | const Form = styled.form`
37 | display: flex;
38 | flex-direction: column;
39 | `;
40 |
41 | const Input = styled.input`
42 | flex: 1;
43 | min-width: 40%;
44 | margin: 10px 0;
45 | padding: 10px;
46 | `;
47 |
48 | const Button = styled.button`
49 | width: 40%;
50 | border: none;
51 | padding: 15px 20px;
52 | background-color: teal;
53 | color: white;
54 | cursor: pointer;
55 | margin-bottom: 10px;
56 | &:disabled {
57 | color: green;
58 | cursor: not-allowed;
59 | }
60 | `;
61 |
62 |
63 | const Login = () => {
64 | const [username, setUsername] = useState("");
65 | const [password, setPassword] = useState("");
66 | const dispatch = useDispatch();
67 | const { isFetching, error } = useSelector((state) => state.user);
68 |
69 | const handleClick = (e) => {
70 | e.preventDefault();
71 | login(dispatch, { username, password });
72 | alert("Successfully Logged In as " + username);
73 | };
74 | return (
75 |
76 |
77 | SIGN IN
78 |
95 |
96 |
97 | );
98 | };
99 |
100 | export default Login;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/ProductList.jsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import Navbar from "../components/Navbar";
3 | import Announcement from "../components/Announcement";
4 | import Products from "../components/Products";
5 | import Newsletter from "../components/Newsletter";
6 | import Footer from "../components/Footer";
7 | import { useLocation } from "react-router";
8 | import { useState } from "react";
9 |
10 | const Container = styled.div``;
11 |
12 | const Title = styled.h1`
13 | margin: 20px;
14 | `;
15 |
16 | const FilterContainer = styled.div`
17 | display: flex;
18 | justify-content: space-between;
19 | `;
20 |
21 | const Filter = styled.div`
22 | margin: 20px;
23 | `;
24 |
25 | const FilterText = styled.span`
26 | font-size: 20px;
27 | font-weight: 600;
28 | margin-right: 20px;
29 | `;
30 |
31 | const Select = styled.select`
32 | padding: 10px;
33 | margin-right: 20px;
34 | `;
35 | const Option = styled.option``;
36 |
37 | const ProductList = () => {
38 | const location = useLocation();
39 | const cat = location.pathname.split("/")[2];
40 | const [filters, setFilters] = useState({});
41 | const [sort, setSort] = useState("newest");
42 |
43 | const handleFilters = (e) => {
44 | const value = e.target.value;
45 | setFilters({
46 | ...filters,
47 | [e.target.name]: value,
48 | });
49 | };
50 | return (
51 |
52 |
53 |
54 | {cat}
55 |
56 |
57 | Filter Products:
58 |
59 |
60 | Color
61 |
62 | white
63 | black
64 | red
65 | blue
66 | yellow
67 | green
68 |
69 |
70 |
71 | Size
72 |
73 | XS
74 | S
75 | M
76 | L
77 | XL
78 |
79 |
80 |
81 | Sort Products:
82 | setSort(e.target.value)}>
83 | Newest
84 | Price (asc)
85 | Price (desc)
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 | );
94 | };
95 |
96 | export default ProductList;
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | # For most projects, this workflow file will not need changing; you simply need
2 | # to commit it to your repository.
3 | #
4 | # You may wish to alter this file to override the set of languages analyzed,
5 | # or to provide custom queries or build logic.
6 | #
7 | # ******** NOTE ********
8 | # We have attempted to detect the languages in your repository. Please check
9 | # the `language` matrix defined below to confirm you have the correct set of
10 | # supported CodeQL languages.
11 | #
12 | name: "CodeQL"
13 |
14 | on:
15 | push:
16 | branches: [ "main" ]
17 | pull_request:
18 | # The branches below must be a subset of the branches above
19 | branches: [ "main" ]
20 | schedule:
21 | - cron: '39 9 * * 0'
22 |
23 | jobs:
24 | analyze:
25 | name: Analyze
26 | runs-on: ubuntu-latest
27 | permissions:
28 | actions: read
29 | contents: read
30 | security-events: write
31 |
32 | strategy:
33 | fail-fast: false
34 | matrix:
35 | language: [ 'javascript' ]
36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
37 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
38 |
39 | steps:
40 | - name: Checkout repository
41 | uses: actions/checkout@v3
42 |
43 | # Initializes the CodeQL tools for scanning.
44 | - name: Initialize CodeQL
45 | uses: github/codeql-action/init@v2
46 | with:
47 | languages: ${{ matrix.language }}
48 | # If you wish to specify custom queries, you can do so here or in a config file.
49 | # By default, queries listed here will override any specified in a config file.
50 | # Prefix the list here with "+" to use these queries and those in the config file.
51 |
52 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
53 | # queries: security-extended,security-and-quality
54 |
55 |
56 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
57 | # If this step fails, then you should remove it and run the build manually (see below)
58 | - name: Autobuild
59 | uses: github/codeql-action/autobuild@v2
60 |
61 | # ℹ️ Command-line programs to run using the OS shell.
62 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
63 |
64 | # If the Autobuild fails above, remove it and uncomment the following three lines.
65 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
66 |
67 | # - run: |
68 | # echo "Run, Build Application using script"
69 | # ./location_of_script_within_repo/buildscript.sh
70 |
71 | - name: Perform CodeQL Analysis
72 | uses: github/codeql-action/analyze@v2
73 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/Register.jsx:
--------------------------------------------------------------------------------
1 | import styled from "styled-components";
2 | import React from "react"
3 | import {useState} from 'react'
4 | import { register } from "../redux/apiCalls";
5 | import { useDispatch, useSelector } from "react-redux";
6 | import axios from "axios";
7 |
8 |
9 | const Container = styled.div`
10 | width: 100vw;
11 | height: 100vh;
12 | background: linear-gradient(
13 | rgba(255, 255, 255, 0.5),
14 | rgba(255, 255, 255, 0.5)
15 | ),
16 | url("https://fashionista.com/.image/c_fit%2Ccs_srgb%2Cfl_progressive%2Cq_auto:good%2Cw_620/MTM5NDU0OTMzODExMzQwNDUy/kl1_0420jpg.jpg")
17 | center;
18 | background-size: cover;
19 | display: flex;
20 | align-items: center;
21 | justify-content: center;
22 | `;
23 |
24 | const Wrapper = styled.div`
25 | width: 40%;
26 | padding: 20px;
27 | background-color: white;
28 | `;
29 |
30 | const Title = styled.h1`
31 | font-size: 24px;
32 | font-weight: 300;
33 | `;
34 |
35 | const Form = styled.form`
36 | display: flex;
37 | flex-wrap: wrap;
38 | `;
39 |
40 | const Input = styled.input`
41 | flex: 1;
42 | min-width: 40%;
43 | margin: 20px 10px 0px 0px;
44 | padding: 10px;
45 | `;
46 |
47 | const Agreement = styled.span`
48 | font-size: 12px;
49 | margin: 20px 0px;
50 | `;
51 |
52 | const Button = styled.button`
53 | width: 40%;
54 | border: none;
55 | padding: 15px 20px;
56 | background-color: teal;
57 | color: white;
58 | cursor: pointer;
59 | `;
60 |
61 | const Register = () => {
62 |
63 | const [username, setUsername] = useState("");
64 | const [password, setPassword] = useState("");
65 | const [confirmPassword, setconfirmPassword] = useState("");
66 | const [email, setEmail] = useState("");
67 | const dispatch = useDispatch();
68 | const { isFetching, error } = useSelector((state) => state.user);
69 |
70 | const handleClick = (e) => {
71 | if (password !== confirmPassword) {
72 | alert("passwords don't match");
73 | return;
74 | }
75 | else{
76 | e.preventDefault();
77 | register(dispatch, { username, password, email});
78 | }
79 | };
80 |
81 | return (
82 |
83 |
84 | CREATE AN ACCOUNT
85 |
98 |
99 |
100 | );
101 | };
102 |
103 | export default Register;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Slider.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { ArrowLeftOutlined, ArrowRightOutlined } from "@material-ui/icons";
3 | import styled from "styled-components";
4 | import { sliderItems } from '../data';
5 | import { useState } from "react";
6 |
7 | const Container = styled.div`
8 | width: 100%;
9 | height: 100vh;
10 | display: flex;
11 | position: relative;
12 | overflow: hidden;
13 | `;
14 |
15 | const Arrow = styled.div`
16 | width: 50px;
17 | height: 50px;
18 | background-color: #fff7f7;
19 | border-radius: 50%;
20 | display: flex;
21 | align-items: center;
22 | justify-content: center;
23 | position: absolute;
24 | top: 0;
25 | bottom: 0;
26 | left: ${(props) => props.direction === "left" && "10px"};
27 | right: ${(props) => props.direction === "right" && "10px"};
28 | margin: auto;
29 | cursor: pointer;
30 | opacity: 0.5;
31 | z-index: 2;
32 | `;
33 | const Wrapper = styled.div`
34 | height: 100%;
35 | display: flex;
36 | transition: all 1.5s ease;
37 | transform: translateX(${(props) => props.slideIndex * -100}vw);
38 | `;
39 |
40 | const Slide = styled.div`
41 | width: 100vw;
42 | height: 100vh;
43 | display: flex;
44 | align-items: center;
45 | background-color: #${(props) => props.bg};
46 | `;
47 | const ImgContainer = styled.div`
48 | height: 100%;
49 | flex: 1;
50 | `;
51 | const Image = styled.img`
52 | height: 100%;
53 | width: 90%;
54 | `;
55 | const InfoContainer = styled.div`
56 | flex: 1;
57 | padding: 50px;
58 | `;
59 | const Title = styled.h1`
60 | font-size: 70px;
61 | `;
62 |
63 | const Desc = styled.p`
64 | margin: 50px 0px;
65 | font-size: 20px;
66 | font-weight: 500;
67 | letter-spacing: 3px;
68 | `;
69 |
70 | const Button = styled.button`
71 | padding: 10px;
72 | font-size: 20px;
73 | background-color: transparent;
74 | cursor: pointer;
75 | `;
76 |
77 | const Slider = () => {
78 | const [slideIndex, setSlideIndex] = useState(0);
79 | const handleClick = (direction) => {
80 | if (direction === "left") {
81 | setSlideIndex(slideIndex > 0 ? slideIndex - 1 : 3);
82 | } else {
83 | setSlideIndex(slideIndex < 3 ? slideIndex + 1 : 0);
84 | }
85 | };
86 |
87 | return (
88 |
89 | handleClick("left")}>
90 |
91 |
92 |
93 | {sliderItems.map((item) => (
94 |
95 |
96 |
97 |
98 |
99 | {item.title}
100 | {item.desc}
101 | SHOW NOW
102 |
103 |
104 | ))}
105 |
106 | handleClick("right")}>
107 |
108 |
109 |
110 | );
111 | };
112 |
113 | export default Slider;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/data.js:
--------------------------------------------------------------------------------
1 | export const sliderItems = [
2 | {
3 | id: 1,
4 | img: "https://images.pexels.com/photos/792725/pexels-photo-792725.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500",
5 | title: "SUMMER SALE",
6 | desc: "DON'T COMPROMISE ON STYLE! GET FLAT 30% OFF FOR NEW ARRIVALS.",
7 | bg: "f5fafd",
8 | },
9 | {
10 | id: 2,
11 | img: "http://www.uniqlo.com/ines/common/images/women/170811-ines-lookbook03.jpg",
12 | title: "WINTER COLLECTION",
13 | desc: "DON'T COMPROMISE ON STYLE! GET FLAT 30% OFF FOR NEW ARRIVALS.",
14 | bg: "fcf1ed",
15 | },
16 | {
17 | id: 3,
18 | img: "https://images.pexels.com/photos/9476353/pexels-photo-9476353.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500",
19 | title: "AUTUMN COLLECTION",
20 | desc: "DON'T COMPROMISE ON STYLE! GET FLAT 30% OFF FOR NEW ARRIVALS.",
21 | bg: "fbf0f4",
22 | },
23 | {
24 | id: 4,
25 | img: "https://media.istockphoto.com/photos/young-couple-wearing-comfy-loungewear-drinking-tea-near-christmas-picture-id1342113626?b=1&k=20&m=1342113626&s=170667a&w=0&h=qcah1PveOKHy7zA21EMFaQ3adQiLHgnikfs9g8IQe9I=",
26 | title: "LOUNGEWEAR LOVE",
27 | desc: "DON'T COMPROMISE ON STYLE! GET FLAT 30% OFF FOR NEW ARRIVALS.",
28 | bg: "fbf0f4",
29 | },
30 | ];
31 |
32 | export const categories = [
33 | {
34 | id: 1,
35 | img: "https://images.pexels.com/photos/5886041/pexels-photo-5886041.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940",
36 | title: "SHIRT STYLE!",
37 | cat:"women"
38 | },
39 | {
40 | id: 2,
41 | img: "https://images.pexels.com/photos/2983464/pexels-photo-2983464.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940",
42 | title: "LOUNGEWEAR LOVE",
43 | cat:"coat"
44 | },
45 | {
46 | id: 3,
47 | img: "https://images.pexels.com/photos/5480696/pexels-photo-5480696.jpeg?auto=compress&cs=tinysrgb&dpr=2&w=500",
48 | title: "LIGHT JACKETS",
49 | cat:"jeans"
50 | },
51 | ];
52 |
53 | export const popularProducts = [
54 | {
55 | id:1,
56 | img:"https://d3o2e4jr3mxnm3.cloudfront.net/Mens-Jake-Guitar-Vintage-Crusher-Tee_68382_1_lg.png",
57 | },
58 | {
59 | id:2,
60 | img:"https://cdn.shopify.com/s/files/1/0101/4832/products/Angela_Natural_Tee.png?v=1606780388",
61 | },
62 | {
63 | id:3,
64 | img:"https://www.prada.com/content/dam/pradanux_products/U/UCS/UCS319/1YOTF010O/UCS319_1YOT_F010O_S_182_SLF.png",
65 | },
66 | {
67 | id:4,
68 | img:"https://www.burdastyle.com/pub/media/catalog/product/cache/7bd3727382ce0a860b68816435d76e26/107/BUS-PAT-BURTE-1320516/1170x1470_BS_2016_05_132_front.png",
69 | },
70 | {
71 | id:5,
72 | img:"https://images.ctfassets.net/5gvckmvm9289/3BlDoZxSSjqAvv1jBJP7TH/65f9a95484117730ace42abf64e89572/Noissue-x-Creatsy-Tote-Bag-Mockup-Bundle-_4_-2.png",
73 | },
74 | {
75 | id:6,
76 | img:"https://d3o2e4jr3mxnm3.cloudfront.net/Rocket-Vintage-Chill-Cap_66374_1_lg.png",
77 | },
78 | {
79 | id:7,
80 | img:"https://www.vintageindustries.nl/download_front/qympzk1762/2217_Arrow_Jacket_Forest.png",
81 | },
82 | {
83 | id:8,
84 | img:"https://www.pngarts.com/files/3/Women-Jacket-PNG-High-Quality-Image.png",
85 | },
86 | ]
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Navbar.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import styled from "styled-components"
3 | import { Search, ShoppingCartOutlined } from "@material-ui/icons";
4 | import { Badge } from "@material-ui/core";
5 | import "../index.css";
6 | import { useSelector } from "react-redux";
7 | import { Link} from "react-router-dom";
8 | import {useState} from 'react'
9 |
10 |
11 | const Container = styled.div`
12 | height : 70px;
13 | background-color : #587272;
14 | font-color: white;
15 | `;
16 | const Wrapper = styled.div`
17 | color: white;
18 | padding: 10px 24px;
19 | display: flex;
20 | align-items: center;
21 | justify-content: space-between;
22 | `;
23 |
24 | const Left = styled.div`
25 | flex: 1;
26 | display: flex;
27 | align-items: center;
28 | color: white;
29 | `;
30 |
31 | const Center = styled.div`
32 | flex: 1;
33 | text-align: center;
34 | color: white;
35 | `;
36 | const Right = styled.div`
37 | flex: 1;
38 | display: flex;
39 | align-items: center;
40 | justify-content: flex-end;
41 | color: white;
42 | `;
43 | const Language = styled.span`
44 | font-size: 18px;
45 | cursor: pointer;
46 | color: white;
47 | `;
48 |
49 | const SearchContainer = styled.div`
50 | border: 0.5px solid lightgray;
51 | display: flex;
52 | align-items: center;
53 | margin-left: 25px;
54 | padding: 5px;
55 | background-color : #587272;
56 | `;
57 |
58 | const Input = styled.input`
59 | border: none;
60 | background-color : #587272;
61 | `;
62 | const Logo = styled.h1`
63 | font-weight: bold;
64 | font-size: 35px;
65 | color: white;
66 |
67 | `;
68 |
69 | const MenuItem = styled.div`
70 | font-size: 18px;
71 | cursor: pointer;
72 | margin-left: 25px;
73 | font-color: white;
74 | `;
75 |
76 | const Navbar = () => {
77 | // const user = localStorage.getItem('persist:root');
78 | const user = useSelector((state) => state.user.currentUser);
79 | const quantity = useSelector(state=>state.cart.quantity);
80 |
81 | return (
82 |
83 |
84 |
85 | EN
86 |
87 |
88 |
89 |
90 |
91 |
92 | Shopitel.
93 |
94 |
95 |
96 |
97 |
98 | Register
99 |
100 |
101 |
102 | Sign In
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 | )
118 | }
119 |
120 | export default Navbar
121 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/components/Footer.jsx:
--------------------------------------------------------------------------------
1 | import {
2 | Facebook,
3 | Instagram,
4 | MailOutline,
5 | Phone,
6 | Pinterest,
7 | Room,
8 | Twitter,
9 | } from "@material-ui/icons";
10 | import styled from "styled-components";
11 | import { Link } from "react-router-dom";
12 |
13 | const Container = styled.div`
14 | display: flex;
15 | background-color : #324040;
16 | font-color: white;
17 | `;
18 |
19 | const Left = styled.div`
20 | flex: 1;
21 | display: flex;
22 | flex-direction: column;
23 | padding: 20px;
24 | `;
25 |
26 | const Logo = styled.h1`
27 | color: white;
28 | `;
29 |
30 | const Desc = styled.p`
31 | color: white;
32 | margin: 20px 0px;
33 | `;
34 |
35 | const SocialContainer = styled.div`
36 | display: flex;
37 | `;
38 |
39 | const SocialIcon = styled.div`
40 | width: 40px;
41 | height: 40px;
42 | border-radius: 50%;
43 | color: white;
44 | background-color: #${(props) => props.color};
45 | display: flex;
46 | align-items: center;
47 | justify-content: center;
48 | margin-right: 20px;
49 | cursor: pointer;
50 | `;
51 |
52 | const Center = styled.div`
53 | flex: 1;
54 | padding: 20px;
55 | `;
56 |
57 | const Title = styled.h3`
58 | color: white;
59 | margin-bottom: 30px;
60 | `;
61 |
62 | const List = styled.ul`
63 | color: white;
64 | margin: 0;
65 | padding: 0;
66 | list-style: none;
67 | display: flex;
68 | flex-wrap: wrap;
69 | `;
70 |
71 | const ListItem = styled.li`
72 | color: white;
73 | width: 50%;
74 | margin-bottom: 10px;
75 | cursor: pointer;
76 | `;
77 |
78 | const Right = styled.div`
79 | flex: 1;
80 | padding: 20px;
81 | `;
82 | const Bottom = styled.div`
83 | background-color : #324040;
84 | padding-bottom: 10px;
85 | `;
86 |
87 | const ContactItem = styled.div`
88 | color: white;
89 | margin-bottom: 20px;
90 | display: flex;
91 | align-items: center;
92 | `;
93 |
94 | const Payment = styled.img`
95 | width: 50%;
96 | `;
97 |
98 | const Footer = () => {
99 | return (
100 |
101 |
102 |
103 | Shopitel.
104 |
105 | There are many variations of passages of Lorem Ipsum available, but
106 | the majority have suffered alteration in some form, by injected
107 | humour, or randomised words which don’t look even slightly believable.
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 | Useful Links
126 |
127 | Home
128 | Cart
129 | Women Fashion
130 | Men Fashion
131 |
132 | Accessories
133 | My Account
134 | Wishlist
135 | Terms
136 |
137 |
138 |
139 | Contact
140 |
141 | 622 , Dubai Silicon Oasis 98336
142 |
143 |
144 | +971 X56 78X X0XX
145 |
146 |
147 | contact@shopitel.dev
148 |
149 |
150 |
151 |
152 |
153 |
154 | Made with 💚
155 | ©2021. All rights reserved.
156 |
157 |
158 | );
159 | };
160 |
161 | export default Footer;
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/Product.jsx:
--------------------------------------------------------------------------------
1 | import { Add, Remove } from "@material-ui/icons";
2 | import styled from "styled-components";
3 | import Announcement from "../components/Announcement";
4 | import Footer from "../components/Footer";
5 | import Navbar from "../components/Navbar";
6 | import Newsletter from "../components/Newsletter";
7 | import { useLocation } from "react-router-dom";
8 | import { useEffect, useState } from "react";
9 | import { publicRequest } from "../requestMethods";
10 | import { addProduct } from "../redux/cartRedux";
11 | import { useDispatch } from "react-redux";
12 |
13 | const Container = styled.div``;
14 |
15 | const Wrapper = styled.div`
16 | padding: 50px;
17 | display: flex;
18 | `;
19 |
20 | const ImgContainer = styled.div`
21 | flex: 1;
22 | `;
23 |
24 | const Image = styled.img`
25 | width: 100%;
26 | height: 90vh;
27 | object-fit: cover;
28 |
29 | `;
30 |
31 | const InfoContainer = styled.div`
32 | flex: 1;
33 | padding: 0px 50px;
34 |
35 | `;
36 |
37 | const Title = styled.h1`
38 | font-weight: 200;
39 | `;
40 |
41 | const Desc = styled.p`
42 | margin: 20px 0px;
43 | `;
44 |
45 | const Price = styled.span`
46 | font-weight: 100;
47 | font-size: 40px;
48 | `;
49 |
50 | const FilterContainer = styled.div`
51 | width: 50%;
52 | margin: 30px 0px;
53 | display: flex;
54 | justify-content: space-between;
55 | `;
56 |
57 | const Filter = styled.div`
58 | display: flex;
59 | align-items: center;
60 | `;
61 |
62 | const FilterTitle = styled.span`
63 | font-size: 20px;
64 | font-weight: 200;
65 | `;
66 |
67 | const FilterColor = styled.div`
68 | width: 20px;
69 | height: 20px;
70 | border-radius: 50%;
71 | background-color: ${(props) => props.color};
72 | margin: 0px 5px;
73 | cursor: pointer;
74 | `;
75 |
76 | const FilterSize = styled.select`
77 | margin-left: 10px;
78 | padding: 5px;
79 | `;
80 |
81 | const FilterSizeOption = styled.option``;
82 |
83 | const AddContainer = styled.div`
84 | width: 50%;
85 | display: flex;
86 | align-items: center;
87 | justify-content: space-between;
88 | `;
89 |
90 | const AmountContainer = styled.div`
91 | display: flex;
92 | align-items: center;
93 | font-weight: 700;
94 | `;
95 |
96 | const Amount = styled.span`
97 | width: 30px;
98 | height: 30px;
99 | border-radius: 10px;
100 | border: 1px solid teal;
101 | display: flex;
102 | align-items: center;
103 | justify-content: center;
104 | margin: 0px 5px;
105 | `;
106 |
107 | const Button = styled.button`
108 | padding: 15px;
109 | border: 2px solid teal;
110 | background-color: white;
111 | cursor: pointer;
112 | font-weight: 500;
113 | &:hover {
114 | background-color: #f8f4f4;
115 | }
116 | `;
117 |
118 | const Product = () => {
119 | const location = useLocation();
120 | const id = location.pathname.split("/")[2];
121 | const [product, setProduct] = useState({});
122 | const [quantity, setQuantity] = useState(1);
123 | const [color, setColor] = useState("");
124 | const [size, setSize] = useState("");
125 | const dispatch = useDispatch();
126 |
127 | useEffect(() => {
128 | const getProduct = async () => {
129 | try {
130 | const res = await publicRequest.get("/products/find/" + id);
131 | setProduct(res.data);
132 | } catch {}
133 | };
134 | getProduct();
135 | }, [id]);
136 |
137 | const handleQuantity = (type) => {
138 | if (type === "dec") {
139 | quantity > 1 && setQuantity(quantity - 1);
140 | } else {
141 | setQuantity(quantity + 1);
142 | }
143 | };
144 |
145 | const handleClick = () => {
146 | dispatch(
147 | addProduct({ ...product, quantity, color, size })
148 | );
149 | };
150 | return (
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 | {product.title}
160 | {product.desc}
161 | $ {product.price}
162 |
163 |
164 | Color
165 | {product.color?.map((c) => (
166 | setColor(c)} />
167 | ))}
168 |
169 |
170 | Size
171 | setSize(e.target.value)}>
172 | {product.size?.map((s) => (
173 | {s}
174 | ))}
175 |
176 |
177 |
178 |
179 |
180 | handleQuantity("dec")} />
181 | {quantity}
182 | handleQuantity("inc")} />
183 |
184 | ADD TO CART
185 |
186 |
187 |
188 |
189 |
190 |
191 | );
192 | };
193 |
194 | export default Product;
195 |
--------------------------------------------------------------------------------
/shopitel-client-react-ui/src/pages/Cart.jsx:
--------------------------------------------------------------------------------
1 | import { Add, Remove } from "@material-ui/icons";
2 | import styled from "styled-components";
3 | import Announcement from "../components/Announcement";
4 | import Footer from "../components/Footer";
5 | import Navbar from "../components/Navbar";
6 | import { useSelector } from "react-redux";
7 | import { useEffect, useState } from "react";
8 | import StripeCheckout from "react-stripe-checkout";
9 | import { userRequest } from "../requestMethods";
10 | import { useHistory } from "react-router";
11 |
12 | require('dotenv').config();
13 | const KEY = process.env.REACT_APP_STRIPE;
14 |
15 | const Container = styled.div``;
16 |
17 | const Wrapper = styled.div`
18 | padding: 20px;
19 | `;
20 |
21 | const Title = styled.h1`
22 | font-weight: 300;
23 | text-align: center;
24 | `;
25 |
26 | const Top = styled.div`
27 | display: flex;
28 | align-items: center;
29 | justify-content: space-between;
30 | padding: 20px;
31 | `;
32 |
33 | const TopButton = styled.button`
34 | padding: 10px;
35 | font-weight: 600;
36 | cursor: pointer;
37 | border: ${(props) => props.type === "filled" && "none"};
38 | background-color: ${(props) =>
39 | props.type === "filled" ? "black" : "transparent"};
40 | color: ${(props) => props.type === "filled" && "white"};
41 | `;
42 |
43 | const TopTexts = styled.div`
44 | `;
45 | const TopText = styled.span`
46 | text-decoration: underline;
47 | cursor: pointer;
48 | margin: 0px 10px;
49 | `;
50 |
51 | const Bottom = styled.div`
52 | display: flex;
53 | justify-content: space-between;
54 | `;
55 |
56 | const Info = styled.div`
57 | flex: 3;
58 | `;
59 |
60 | const Product = styled.div`
61 | display: flex;
62 | justify-content: space-between;
63 | `;
64 |
65 | const ProductDetail = styled.div`
66 | flex: 2;
67 | display: flex;
68 | `;
69 |
70 | const Image = styled.img`
71 | width: 200px;
72 | `;
73 |
74 | const Details = styled.div`
75 | padding: 20px;
76 | display: flex;
77 | flex-direction: column;
78 | justify-content: space-around;
79 | `;
80 |
81 | const ProductName = styled.span``;
82 |
83 | const ProductId = styled.span``;
84 |
85 | const ProductColor = styled.div`
86 | width: 20px;
87 | height: 20px;
88 | border-radius: 50%;
89 | background-color: ${(props) => props.color};
90 | `;
91 |
92 | const ProductSize = styled.span``;
93 |
94 | const PriceDetail = styled.div`
95 | flex: 1;
96 | display: flex;
97 | flex-direction: column;
98 | align-items: center;
99 | justify-content: center;
100 | `;
101 |
102 | const ProductAmountContainer = styled.div`
103 | display: flex;
104 | align-items: center;
105 | margin-bottom: 20px;
106 | `;
107 |
108 | const ProductAmount = styled.div`
109 | font-size: 24px;
110 | margin: 5px;
111 | `;
112 |
113 | const ProductPrice = styled.div`
114 | font-size: 30px;
115 | font-weight: 200;
116 | `;
117 |
118 | const Hr = styled.hr`
119 | background-color: #eee;
120 | border: none;
121 | height: 1px;
122 | `;
123 |
124 | const Summary = styled.div`
125 | flex: 1;
126 | border: 0.5px solid lightgray;
127 | border-radius: 10px;
128 | padding: 20px;
129 | height: 50vh;
130 | `;
131 |
132 | const SummaryTitle = styled.h1`
133 | font-weight: 200;
134 | `;
135 |
136 | const SummaryItem = styled.div`
137 | margin: 30px 0px;
138 | display: flex;
139 | justify-content: space-between;
140 | font-weight: ${(props) => props.type === "total" && "500"};
141 | font-size: ${(props) => props.type === "total" && "24px"};
142 | `;
143 |
144 | const SummaryItemText = styled.span``;
145 |
146 | const SummaryItemPrice = styled.span``;
147 |
148 | const Button = styled.button`
149 | width: 100%;
150 | padding: 10px;
151 | background-color: black;
152 | color: white;
153 | font-weight: 600;
154 | `;
155 |
156 | const Cart = () => {
157 | // const user = useSelector((state) => state.user.currentUser);
158 | // console.log(user);
159 |
160 | const cart = useSelector((state) => state.cart);
161 | const [stripeToken, setStripeToken] = useState(null);
162 | const history = useHistory();
163 |
164 | const onToken = (token) => {
165 | setStripeToken(token);
166 | };
167 |
168 | useEffect(() => {
169 | const makeRequest = async () => {
170 | try {
171 | const res = await userRequest.post("/checkout/payment", {
172 | tokenId: stripeToken.id,
173 | amount: 500,
174 | });
175 | history.push("/success", {
176 | stripeData: res.data,
177 | products: cart, });
178 | } catch {}
179 | };
180 | stripeToken && makeRequest();
181 | }, [stripeToken, cart.total, history]);
182 |
183 |
184 | return (
185 |
186 |
187 |
188 |
189 | YOUR BAG
190 |
191 | CONTINUE SHOPPING
192 |
193 | Shopping Bag(2)
194 | Your Wishlist (0)
195 |
196 | CHECKOUT NOW
197 |
198 |
199 |
200 | {cart.products.map((product) => (
201 |
202 |
203 |
204 |
205 |
206 | Product: {product.title}
207 |
208 |
209 | ID: {product._id}
210 |
211 |
212 |
213 | Size: {product.size}
214 |
215 |
216 |
217 |
218 |
219 |
220 | {product.quantity}
221 |
222 |
223 |
224 | $ {product.price * product.quantity}
225 |
226 |
227 |
228 | ))}
229 |
230 |
231 |
232 | ORDER SUMMARY
233 |
234 | Subtotal
235 | $ {cart.total}
236 |
237 |
238 | Estimated Shipping
239 | $ 5.0
240 |
241 |
242 | Shipping Discount
243 | $ -5.0
244 |
245 |
246 | Total
247 | $ {cart.total}
248 |
249 |
259 | CHECKOUT NOW
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 | );
268 | };
269 |
270 | export default Cart;
271 |
--------------------------------------------------------------------------------
/shopitel-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@*", "@types/node@>=8.1.0":
18 | version "16.11.9"
19 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.9.tgz#879be3ad7af29f4c1a5c433421bf99fab7047185"
20 | integrity sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==
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.7:
41 | version "1.3.7"
42 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
43 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
44 | dependencies:
45 | mime-types "~2.1.24"
46 | negotiator "0.6.2"
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 sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
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.19.0:
96 | version "1.19.0"
97 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
98 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
99 | dependencies:
100 | bytes "3.1.0"
101 | content-type "~1.0.4"
102 | debug "2.6.9"
103 | depd "~1.1.2"
104 | http-errors "1.7.2"
105 | iconv-lite "0.4.24"
106 | on-finished "~2.3.0"
107 | qs "6.7.0"
108 | raw-body "2.4.0"
109 | type-is "~1.6.17"
110 |
111 | boxen@^5.0.0:
112 | version "5.1.2"
113 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
114 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
115 | dependencies:
116 | ansi-align "^3.0.0"
117 | camelcase "^6.2.0"
118 | chalk "^4.1.0"
119 | cli-boxes "^2.2.1"
120 | string-width "^4.2.2"
121 | type-fest "^0.20.2"
122 | widest-line "^3.1.0"
123 | wrap-ansi "^7.0.0"
124 |
125 | brace-expansion@^1.1.7:
126 | version "1.1.11"
127 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
128 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
129 | dependencies:
130 | balanced-match "^1.0.0"
131 | concat-map "0.0.1"
132 |
133 | braces@~3.0.2:
134 | version "3.0.2"
135 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
136 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
137 | dependencies:
138 | fill-range "^7.0.1"
139 |
140 | bson@^4.2.2, bson@^4.5.4:
141 | version "4.5.4"
142 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.5.4.tgz#5f74f1e11f743ea8aec30b5e24bfddae82846873"
143 | integrity sha512-wIt0bPACnx8Ju9r6IsS2wVtGDHBr9Dxb+U29A1YED2pu8XOhS8aKjOnLZ8sxyXkPwanoK7iWWVhS1+coxde6xA==
144 | dependencies:
145 | buffer "^5.6.0"
146 |
147 | buffer-equal-constant-time@1.0.1:
148 | version "1.0.1"
149 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
150 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
151 |
152 | buffer@^5.6.0:
153 | version "5.7.1"
154 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
155 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
156 | dependencies:
157 | base64-js "^1.3.1"
158 | ieee754 "^1.1.13"
159 |
160 | bytes@3.1.0:
161 | version "3.1.0"
162 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
163 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
164 |
165 | cacheable-request@^6.0.0:
166 | version "6.1.0"
167 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
168 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
169 | dependencies:
170 | clone-response "^1.0.2"
171 | get-stream "^5.1.0"
172 | http-cache-semantics "^4.0.0"
173 | keyv "^3.0.0"
174 | lowercase-keys "^2.0.0"
175 | normalize-url "^4.1.0"
176 | responselike "^1.0.2"
177 |
178 | call-bind@^1.0.0:
179 | version "1.0.2"
180 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
181 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
182 | dependencies:
183 | function-bind "^1.1.1"
184 | get-intrinsic "^1.0.2"
185 |
186 | camelcase@^6.2.0:
187 | version "6.2.1"
188 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e"
189 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==
190 |
191 | chalk@^4.1.0:
192 | version "4.1.2"
193 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
194 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
195 | dependencies:
196 | ansi-styles "^4.1.0"
197 | supports-color "^7.1.0"
198 |
199 | chokidar@^3.5.2:
200 | version "3.5.2"
201 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
202 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
203 | dependencies:
204 | anymatch "~3.1.2"
205 | braces "~3.0.2"
206 | glob-parent "~5.1.2"
207 | is-binary-path "~2.1.0"
208 | is-glob "~4.0.1"
209 | normalize-path "~3.0.0"
210 | readdirp "~3.6.0"
211 | optionalDependencies:
212 | fsevents "~2.3.2"
213 |
214 | ci-info@^2.0.0:
215 | version "2.0.0"
216 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
217 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
218 |
219 | cli-boxes@^2.2.1:
220 | version "2.2.1"
221 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
222 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
223 |
224 | clone-response@^1.0.2:
225 | version "1.0.2"
226 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
227 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
228 | dependencies:
229 | mimic-response "^1.0.0"
230 |
231 | color-convert@^2.0.1:
232 | version "2.0.1"
233 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
234 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
235 | dependencies:
236 | color-name "~1.1.4"
237 |
238 | color-name@~1.1.4:
239 | version "1.1.4"
240 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
241 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
242 |
243 | concat-map@0.0.1:
244 | version "0.0.1"
245 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
246 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
247 |
248 | configstore@^5.0.1:
249 | version "5.0.1"
250 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
251 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
252 | dependencies:
253 | dot-prop "^5.2.0"
254 | graceful-fs "^4.1.2"
255 | make-dir "^3.0.0"
256 | unique-string "^2.0.0"
257 | write-file-atomic "^3.0.0"
258 | xdg-basedir "^4.0.0"
259 |
260 | content-disposition@0.5.3:
261 | version "0.5.3"
262 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
263 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
264 | dependencies:
265 | safe-buffer "5.1.2"
266 |
267 | content-type@~1.0.4:
268 | version "1.0.4"
269 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
270 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
271 |
272 | cookie-parser@^1.4.6:
273 | version "1.4.6"
274 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594"
275 | integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==
276 | dependencies:
277 | cookie "0.4.1"
278 | cookie-signature "1.0.6"
279 |
280 | cookie-signature@1.0.6:
281 | version "1.0.6"
282 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
283 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
284 |
285 | cookie@0.4.0:
286 | version "0.4.0"
287 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
288 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
289 |
290 | cookie@0.4.1:
291 | version "0.4.1"
292 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
293 | integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
294 |
295 | cors@^2.8.5:
296 | version "2.8.5"
297 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
298 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
299 | dependencies:
300 | object-assign "^4"
301 | vary "^1"
302 |
303 | crypto-js@^4.1.1:
304 | version "4.1.1"
305 | resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
306 | integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
307 |
308 | crypto-random-string@^2.0.0:
309 | version "2.0.0"
310 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
311 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
312 |
313 | debug@2.6.9:
314 | version "2.6.9"
315 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
316 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
317 | dependencies:
318 | ms "2.0.0"
319 |
320 | debug@4.x:
321 | version "4.3.2"
322 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
323 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
324 | dependencies:
325 | ms "2.1.2"
326 |
327 | debug@^3.2.7:
328 | version "3.2.7"
329 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
330 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
331 | dependencies:
332 | ms "^2.1.1"
333 |
334 | decompress-response@^3.3.0:
335 | version "3.3.0"
336 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
337 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
338 | dependencies:
339 | mimic-response "^1.0.0"
340 |
341 | deep-extend@^0.6.0:
342 | version "0.6.0"
343 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
344 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
345 |
346 | defer-to-connect@^1.0.1:
347 | version "1.1.3"
348 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
349 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
350 |
351 | denque@^2.0.1:
352 | version "2.0.1"
353 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
354 | integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==
355 |
356 | depd@~1.1.2:
357 | version "1.1.2"
358 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
359 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
360 |
361 | depd@~2.0.0:
362 | version "2.0.0"
363 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
364 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
365 |
366 | destroy@~1.0.4:
367 | version "1.0.4"
368 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
369 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
370 |
371 | dot-prop@^5.2.0:
372 | version "5.3.0"
373 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
374 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
375 | dependencies:
376 | is-obj "^2.0.0"
377 |
378 | dotenv@^10.0.0:
379 | version "10.0.0"
380 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81"
381 | integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==
382 |
383 | duplexer3@^0.1.4:
384 | version "0.1.4"
385 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
386 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
387 |
388 | ecdsa-sig-formatter@1.0.11:
389 | version "1.0.11"
390 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
391 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
392 | dependencies:
393 | safe-buffer "^5.0.1"
394 |
395 | ee-first@1.1.1:
396 | version "1.1.1"
397 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
398 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
399 |
400 | emoji-regex@^8.0.0:
401 | version "8.0.0"
402 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
403 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
404 |
405 | encodeurl@~1.0.2:
406 | version "1.0.2"
407 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
408 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
409 |
410 | end-of-stream@^1.1.0:
411 | version "1.4.4"
412 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
413 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
414 | dependencies:
415 | once "^1.4.0"
416 |
417 | escape-goat@^2.0.0:
418 | version "2.1.1"
419 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
420 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
421 |
422 | escape-html@~1.0.3:
423 | version "1.0.3"
424 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
425 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
426 |
427 | etag@~1.8.1:
428 | version "1.8.1"
429 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
430 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
431 |
432 | express-session@^1.17.2:
433 | version "1.17.2"
434 | resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.2.tgz#397020374f9bf7997f891b85ea338767b30d0efd"
435 | integrity sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==
436 | dependencies:
437 | cookie "0.4.1"
438 | cookie-signature "1.0.6"
439 | debug "2.6.9"
440 | depd "~2.0.0"
441 | on-headers "~1.0.2"
442 | parseurl "~1.3.3"
443 | safe-buffer "5.2.1"
444 | uid-safe "~2.1.5"
445 |
446 | express@^4.17.1:
447 | version "4.17.1"
448 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
449 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
450 | dependencies:
451 | accepts "~1.3.7"
452 | array-flatten "1.1.1"
453 | body-parser "1.19.0"
454 | content-disposition "0.5.3"
455 | content-type "~1.0.4"
456 | cookie "0.4.0"
457 | cookie-signature "1.0.6"
458 | debug "2.6.9"
459 | depd "~1.1.2"
460 | encodeurl "~1.0.2"
461 | escape-html "~1.0.3"
462 | etag "~1.8.1"
463 | finalhandler "~1.1.2"
464 | fresh "0.5.2"
465 | merge-descriptors "1.0.1"
466 | methods "~1.1.2"
467 | on-finished "~2.3.0"
468 | parseurl "~1.3.3"
469 | path-to-regexp "0.1.7"
470 | proxy-addr "~2.0.5"
471 | qs "6.7.0"
472 | range-parser "~1.2.1"
473 | safe-buffer "5.1.2"
474 | send "0.17.1"
475 | serve-static "1.14.1"
476 | setprototypeof "1.1.1"
477 | statuses "~1.5.0"
478 | type-is "~1.6.18"
479 | utils-merge "1.0.1"
480 | vary "~1.1.2"
481 |
482 | fill-range@^7.0.1:
483 | version "7.0.1"
484 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
485 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
486 | dependencies:
487 | to-regex-range "^5.0.1"
488 |
489 | finalhandler@~1.1.2:
490 | version "1.1.2"
491 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
492 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
493 | dependencies:
494 | debug "2.6.9"
495 | encodeurl "~1.0.2"
496 | escape-html "~1.0.3"
497 | on-finished "~2.3.0"
498 | parseurl "~1.3.3"
499 | statuses "~1.5.0"
500 | unpipe "~1.0.0"
501 |
502 | forwarded@0.2.0:
503 | version "0.2.0"
504 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
505 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
506 |
507 | fresh@0.5.2:
508 | version "0.5.2"
509 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
510 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
511 |
512 | fsevents@~2.3.2:
513 | version "2.3.2"
514 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
515 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
516 |
517 | function-bind@^1.1.1:
518 | version "1.1.1"
519 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
520 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
521 |
522 | get-intrinsic@^1.0.2:
523 | version "1.1.1"
524 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
525 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
526 | dependencies:
527 | function-bind "^1.1.1"
528 | has "^1.0.3"
529 | has-symbols "^1.0.1"
530 |
531 | get-stream@^4.1.0:
532 | version "4.1.0"
533 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
534 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
535 | dependencies:
536 | pump "^3.0.0"
537 |
538 | get-stream@^5.1.0:
539 | version "5.2.0"
540 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
541 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
542 | dependencies:
543 | pump "^3.0.0"
544 |
545 | glob-parent@~5.1.2:
546 | version "5.1.2"
547 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
548 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
549 | dependencies:
550 | is-glob "^4.0.1"
551 |
552 | global-dirs@^3.0.0:
553 | version "3.0.0"
554 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
555 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
556 | dependencies:
557 | ini "2.0.0"
558 |
559 | got@^9.6.0:
560 | version "9.6.0"
561 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
562 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
563 | dependencies:
564 | "@sindresorhus/is" "^0.14.0"
565 | "@szmarczak/http-timer" "^1.1.2"
566 | cacheable-request "^6.0.0"
567 | decompress-response "^3.3.0"
568 | duplexer3 "^0.1.4"
569 | get-stream "^4.1.0"
570 | lowercase-keys "^1.0.1"
571 | mimic-response "^1.0.1"
572 | p-cancelable "^1.0.0"
573 | to-readable-stream "^1.0.0"
574 | url-parse-lax "^3.0.0"
575 |
576 | graceful-fs@^4.1.2:
577 | version "4.2.8"
578 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
579 | integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
580 |
581 | has-flag@^3.0.0:
582 | version "3.0.0"
583 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
584 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
585 |
586 | has-flag@^4.0.0:
587 | version "4.0.0"
588 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
589 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
590 |
591 | has-symbols@^1.0.1:
592 | version "1.0.2"
593 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
594 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
595 |
596 | has-yarn@^2.1.0:
597 | version "2.1.0"
598 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
599 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
600 |
601 | has@^1.0.3:
602 | version "1.0.3"
603 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
604 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
605 | dependencies:
606 | function-bind "^1.1.1"
607 |
608 | http-cache-semantics@^4.0.0:
609 | version "4.1.0"
610 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
611 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
612 |
613 | http-errors@1.7.2:
614 | version "1.7.2"
615 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
616 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
617 | dependencies:
618 | depd "~1.1.2"
619 | inherits "2.0.3"
620 | setprototypeof "1.1.1"
621 | statuses ">= 1.5.0 < 2"
622 | toidentifier "1.0.0"
623 |
624 | http-errors@~1.7.2:
625 | version "1.7.3"
626 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
627 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
628 | dependencies:
629 | depd "~1.1.2"
630 | inherits "2.0.4"
631 | setprototypeof "1.1.1"
632 | statuses ">= 1.5.0 < 2"
633 | toidentifier "1.0.0"
634 |
635 | iconv-lite@0.4.24:
636 | version "0.4.24"
637 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
638 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
639 | dependencies:
640 | safer-buffer ">= 2.1.2 < 3"
641 |
642 | ieee754@^1.1.13:
643 | version "1.2.1"
644 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
645 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
646 |
647 | ignore-by-default@^1.0.1:
648 | version "1.0.1"
649 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
650 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
651 |
652 | import-lazy@^2.1.0:
653 | version "2.1.0"
654 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
655 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
656 |
657 | imurmurhash@^0.1.4:
658 | version "0.1.4"
659 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
660 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
661 |
662 | inherits@2.0.3:
663 | version "2.0.3"
664 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
665 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
666 |
667 | inherits@2.0.4:
668 | version "2.0.4"
669 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
670 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
671 |
672 | ini@2.0.0:
673 | version "2.0.0"
674 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
675 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
676 |
677 | ini@~1.3.0:
678 | version "1.3.8"
679 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
680 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
681 |
682 | ipaddr.js@1.9.1:
683 | version "1.9.1"
684 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
685 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
686 |
687 | is-binary-path@~2.1.0:
688 | version "2.1.0"
689 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
690 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
691 | dependencies:
692 | binary-extensions "^2.0.0"
693 |
694 | is-ci@^2.0.0:
695 | version "2.0.0"
696 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
697 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
698 | dependencies:
699 | ci-info "^2.0.0"
700 |
701 | is-extglob@^2.1.1:
702 | version "2.1.1"
703 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
704 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
705 |
706 | is-fullwidth-code-point@^3.0.0:
707 | version "3.0.0"
708 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
709 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
710 |
711 | is-glob@^4.0.1, is-glob@~4.0.1:
712 | version "4.0.3"
713 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
714 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
715 | dependencies:
716 | is-extglob "^2.1.1"
717 |
718 | is-installed-globally@^0.4.0:
719 | version "0.4.0"
720 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
721 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
722 | dependencies:
723 | global-dirs "^3.0.0"
724 | is-path-inside "^3.0.2"
725 |
726 | is-npm@^5.0.0:
727 | version "5.0.0"
728 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8"
729 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==
730 |
731 | is-number@^7.0.0:
732 | version "7.0.0"
733 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
734 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
735 |
736 | is-obj@^2.0.0:
737 | version "2.0.0"
738 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
739 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
740 |
741 | is-path-inside@^3.0.2:
742 | version "3.0.3"
743 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
744 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
745 |
746 | is-typedarray@^1.0.0:
747 | version "1.0.0"
748 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
749 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
750 |
751 | is-yarn-global@^0.3.0:
752 | version "0.3.0"
753 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
754 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
755 |
756 | json-buffer@3.0.0:
757 | version "3.0.0"
758 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
759 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
760 |
761 | jsonwebtoken@^8.5.1:
762 | version "8.5.1"
763 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
764 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
765 | dependencies:
766 | jws "^3.2.2"
767 | lodash.includes "^4.3.0"
768 | lodash.isboolean "^3.0.3"
769 | lodash.isinteger "^4.0.4"
770 | lodash.isnumber "^3.0.3"
771 | lodash.isplainobject "^4.0.6"
772 | lodash.isstring "^4.0.1"
773 | lodash.once "^4.0.0"
774 | ms "^2.1.1"
775 | semver "^5.6.0"
776 |
777 | jwa@^1.4.1:
778 | version "1.4.1"
779 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
780 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
781 | dependencies:
782 | buffer-equal-constant-time "1.0.1"
783 | ecdsa-sig-formatter "1.0.11"
784 | safe-buffer "^5.0.1"
785 |
786 | jws@^3.2.2:
787 | version "3.2.2"
788 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
789 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
790 | dependencies:
791 | jwa "^1.4.1"
792 | safe-buffer "^5.0.1"
793 |
794 | kareem@2.3.2:
795 | version "2.3.2"
796 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93"
797 | integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==
798 |
799 | keyv@^3.0.0:
800 | version "3.1.0"
801 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
802 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
803 | dependencies:
804 | json-buffer "3.0.0"
805 |
806 | latest-version@^5.1.0:
807 | version "5.1.0"
808 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
809 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
810 | dependencies:
811 | package-json "^6.3.0"
812 |
813 | lodash.includes@^4.3.0:
814 | version "4.3.0"
815 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
816 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
817 |
818 | lodash.isboolean@^3.0.3:
819 | version "3.0.3"
820 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
821 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
822 |
823 | lodash.isinteger@^4.0.4:
824 | version "4.0.4"
825 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
826 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
827 |
828 | lodash.isnumber@^3.0.3:
829 | version "3.0.3"
830 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
831 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
832 |
833 | lodash.isplainobject@^4.0.6:
834 | version "4.0.6"
835 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
836 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
837 |
838 | lodash.isstring@^4.0.1:
839 | version "4.0.1"
840 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
841 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
842 |
843 | lodash.once@^4.0.0:
844 | version "4.1.1"
845 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
846 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
847 |
848 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
849 | version "1.0.1"
850 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
851 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
852 |
853 | lowercase-keys@^2.0.0:
854 | version "2.0.0"
855 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
856 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
857 |
858 | lru-cache@^6.0.0:
859 | version "6.0.0"
860 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
861 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
862 | dependencies:
863 | yallist "^4.0.0"
864 |
865 | make-dir@^3.0.0:
866 | version "3.1.0"
867 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
868 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
869 | dependencies:
870 | semver "^6.0.0"
871 |
872 | media-typer@0.3.0:
873 | version "0.3.0"
874 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
875 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
876 |
877 | memory-pager@^1.0.2:
878 | version "1.5.0"
879 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
880 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
881 |
882 | merge-descriptors@1.0.1:
883 | version "1.0.1"
884 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
885 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
886 |
887 | methods@~1.1.2:
888 | version "1.1.2"
889 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
890 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
891 |
892 | mime-db@1.51.0:
893 | version "1.51.0"
894 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
895 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
896 |
897 | mime-types@~2.1.24:
898 | version "2.1.34"
899 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
900 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
901 | dependencies:
902 | mime-db "1.51.0"
903 |
904 | mime@1.6.0:
905 | version "1.6.0"
906 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
907 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
908 |
909 | mimic-response@^1.0.0, mimic-response@^1.0.1:
910 | version "1.0.1"
911 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
912 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
913 |
914 | minimatch@^3.0.4:
915 | version "3.0.4"
916 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
917 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
918 | dependencies:
919 | brace-expansion "^1.1.7"
920 |
921 | minimist@^1.2.0:
922 | version "1.2.6"
923 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
924 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
925 |
926 | mongodb-connection-string-url@^2.1.0:
927 | version "2.2.0"
928 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.2.0.tgz#e2422bae91a953dc4ae5882e401301f5be39a227"
929 | integrity sha512-U0cDxLUrQrl7DZA828CA+o69EuWPWEJTwdMPozyd7cy/dbtncUZczMw7wRHcwMD7oKOn0NM2tF9jdf5FFVW9CA==
930 | dependencies:
931 | "@types/whatwg-url" "^8.2.1"
932 | whatwg-url "^11.0.0"
933 |
934 | mongodb@4.1.4:
935 | version "4.1.4"
936 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.1.4.tgz#ba8062c7c67e7a22db5a059dbac1e3044b48453b"
937 | integrity sha512-Cv/sk8on/tpvvqbEvR1h03mdyNdyvvO+WhtFlL4jrZ+DSsN/oSQHVqmJQI/sBCqqbOArFcYCAYDfyzqFwV4GSQ==
938 | dependencies:
939 | bson "^4.5.4"
940 | denque "^2.0.1"
941 | mongodb-connection-string-url "^2.1.0"
942 | optionalDependencies:
943 | saslprep "^1.0.3"
944 |
945 | mongoose@^6.0.13:
946 | version "6.0.13"
947 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.13.tgz#e419c2ae0db3164e4c234ed783d8f8844f4bce53"
948 | integrity sha512-/M/YKgx23fCX+j0lwObaHbCibXnMjyWeQrXZf0WaQeS/hL86wQVSmaOxh+kZXfyLOUr+vT2Hl44o50GZHUrKWw==
949 | dependencies:
950 | bson "^4.2.2"
951 | kareem "2.3.2"
952 | mongodb "4.1.4"
953 | mpath "0.8.4"
954 | mquery "4.0.0"
955 | ms "2.1.2"
956 | regexp-clone "1.0.0"
957 | sift "13.5.2"
958 | sliced "1.0.1"
959 |
960 | mpath@0.8.4:
961 | version "0.8.4"
962 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313"
963 | integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==
964 |
965 | mquery@4.0.0:
966 | version "4.0.0"
967 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.0.tgz#6c62160ad25289e99e0840907757cdfd62bde775"
968 | integrity sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==
969 | dependencies:
970 | debug "4.x"
971 | regexp-clone "^1.0.0"
972 | sliced "1.0.1"
973 |
974 | ms@2.0.0:
975 | version "2.0.0"
976 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
977 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
978 |
979 | ms@2.1.1:
980 | version "2.1.1"
981 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
982 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
983 |
984 | ms@2.1.2:
985 | version "2.1.2"
986 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
987 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
988 |
989 | ms@^2.1.1:
990 | version "2.1.3"
991 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
992 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
993 |
994 | negotiator@0.6.2:
995 | version "0.6.2"
996 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
997 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
998 |
999 | nodemon@^2.0.15:
1000 | version "2.0.15"
1001 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e"
1002 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==
1003 | dependencies:
1004 | chokidar "^3.5.2"
1005 | debug "^3.2.7"
1006 | ignore-by-default "^1.0.1"
1007 | minimatch "^3.0.4"
1008 | pstree.remy "^1.1.8"
1009 | semver "^5.7.1"
1010 | supports-color "^5.5.0"
1011 | touch "^3.1.0"
1012 | undefsafe "^2.0.5"
1013 | update-notifier "^5.1.0"
1014 |
1015 | nopt@~1.0.10:
1016 | version "1.0.10"
1017 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
1018 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
1019 | dependencies:
1020 | abbrev "1"
1021 |
1022 | normalize-path@^3.0.0, normalize-path@~3.0.0:
1023 | version "3.0.0"
1024 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
1025 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
1026 |
1027 | normalize-url@^4.1.0:
1028 | version "4.5.1"
1029 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
1030 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==
1031 |
1032 | object-assign@^4:
1033 | version "4.1.1"
1034 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1035 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
1036 |
1037 | object-inspect@^1.9.0:
1038 | version "1.11.0"
1039 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
1040 | integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
1041 |
1042 | on-finished@~2.3.0:
1043 | version "2.3.0"
1044 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
1045 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
1046 | dependencies:
1047 | ee-first "1.1.1"
1048 |
1049 | on-headers@~1.0.2:
1050 | version "1.0.2"
1051 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
1052 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
1053 |
1054 | once@^1.3.1, once@^1.4.0:
1055 | version "1.4.0"
1056 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
1057 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
1058 | dependencies:
1059 | wrappy "1"
1060 |
1061 | p-cancelable@^1.0.0:
1062 | version "1.1.0"
1063 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
1064 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
1065 |
1066 | package-json@^6.3.0:
1067 | version "6.5.0"
1068 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
1069 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
1070 | dependencies:
1071 | got "^9.6.0"
1072 | registry-auth-token "^4.0.0"
1073 | registry-url "^5.0.0"
1074 | semver "^6.2.0"
1075 |
1076 | parseurl@~1.3.3:
1077 | version "1.3.3"
1078 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
1079 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
1080 |
1081 | passport-strategy@1.x.x:
1082 | version "1.0.0"
1083 | resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
1084 | integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=
1085 |
1086 | passport@^0.5.0:
1087 | version "0.5.0"
1088 | resolved "https://registry.yarnpkg.com/passport/-/passport-0.5.0.tgz#7914aaa55844f9dce8c3aa28f7d6b73647ee0169"
1089 | integrity sha512-ln+ue5YaNDS+fes6O5PCzXKSseY5u8MYhX9H5Co4s+HfYI5oqvnHKoOORLYDUPh+8tHvrxugF2GFcUA1Q1Gqfg==
1090 | dependencies:
1091 | passport-strategy "1.x.x"
1092 | pause "0.0.1"
1093 |
1094 | path-to-regexp@0.1.7:
1095 | version "0.1.7"
1096 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
1097 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
1098 |
1099 | pause@0.0.1:
1100 | version "0.0.1"
1101 | resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
1102 | integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
1103 |
1104 | picomatch@^2.0.4, picomatch@^2.2.1:
1105 | version "2.3.0"
1106 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
1107 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
1108 |
1109 | prepend-http@^2.0.0:
1110 | version "2.0.0"
1111 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
1112 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
1113 |
1114 | proxy-addr@~2.0.5:
1115 | version "2.0.7"
1116 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
1117 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
1118 | dependencies:
1119 | forwarded "0.2.0"
1120 | ipaddr.js "1.9.1"
1121 |
1122 | pstree.remy@^1.1.8:
1123 | version "1.1.8"
1124 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
1125 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
1126 |
1127 | pump@^3.0.0:
1128 | version "3.0.0"
1129 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
1130 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
1131 | dependencies:
1132 | end-of-stream "^1.1.0"
1133 | once "^1.3.1"
1134 |
1135 | punycode@^2.1.1:
1136 | version "2.1.1"
1137 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1138 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1139 |
1140 | pupa@^2.1.1:
1141 | version "2.1.1"
1142 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62"
1143 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==
1144 | dependencies:
1145 | escape-goat "^2.0.0"
1146 |
1147 | qs@6.7.0:
1148 | version "6.7.0"
1149 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
1150 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
1151 |
1152 | qs@^6.6.0:
1153 | version "6.10.1"
1154 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
1155 | integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
1156 | dependencies:
1157 | side-channel "^1.0.4"
1158 |
1159 | random-bytes@~1.0.0:
1160 | version "1.0.0"
1161 | resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
1162 | integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=
1163 |
1164 | range-parser@~1.2.1:
1165 | version "1.2.1"
1166 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
1167 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
1168 |
1169 | raw-body@2.4.0:
1170 | version "2.4.0"
1171 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
1172 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
1173 | dependencies:
1174 | bytes "3.1.0"
1175 | http-errors "1.7.2"
1176 | iconv-lite "0.4.24"
1177 | unpipe "1.0.0"
1178 |
1179 | rc@^1.2.8:
1180 | version "1.2.8"
1181 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
1182 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
1183 | dependencies:
1184 | deep-extend "^0.6.0"
1185 | ini "~1.3.0"
1186 | minimist "^1.2.0"
1187 | strip-json-comments "~2.0.1"
1188 |
1189 | readdirp@~3.6.0:
1190 | version "3.6.0"
1191 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
1192 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
1193 | dependencies:
1194 | picomatch "^2.2.1"
1195 |
1196 | regexp-clone@1.0.0, regexp-clone@^1.0.0:
1197 | version "1.0.0"
1198 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63"
1199 | integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==
1200 |
1201 | registry-auth-token@^4.0.0:
1202 | version "4.2.1"
1203 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
1204 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==
1205 | dependencies:
1206 | rc "^1.2.8"
1207 |
1208 | registry-url@^5.0.0:
1209 | version "5.1.0"
1210 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
1211 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
1212 | dependencies:
1213 | rc "^1.2.8"
1214 |
1215 | responselike@^1.0.2:
1216 | version "1.0.2"
1217 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
1218 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
1219 | dependencies:
1220 | lowercase-keys "^1.0.0"
1221 |
1222 | safe-buffer@5.1.2:
1223 | version "5.1.2"
1224 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1225 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1226 |
1227 | safe-buffer@5.2.1, safe-buffer@^5.0.1:
1228 | version "5.2.1"
1229 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1230 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1231 |
1232 | "safer-buffer@>= 2.1.2 < 3":
1233 | version "2.1.2"
1234 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1235 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1236 |
1237 | saslprep@^1.0.3:
1238 | version "1.0.3"
1239 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
1240 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
1241 | dependencies:
1242 | sparse-bitfield "^3.0.3"
1243 |
1244 | semver-diff@^3.1.1:
1245 | version "3.1.1"
1246 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
1247 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
1248 | dependencies:
1249 | semver "^6.3.0"
1250 |
1251 | semver@^5.6.0, semver@^5.7.1:
1252 | version "5.7.1"
1253 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1254 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1255 |
1256 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
1257 | version "6.3.0"
1258 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1259 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1260 |
1261 | semver@^7.3.4:
1262 | version "7.3.5"
1263 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
1264 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
1265 | dependencies:
1266 | lru-cache "^6.0.0"
1267 |
1268 | send@0.17.1:
1269 | version "0.17.1"
1270 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
1271 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
1272 | dependencies:
1273 | debug "2.6.9"
1274 | depd "~1.1.2"
1275 | destroy "~1.0.4"
1276 | encodeurl "~1.0.2"
1277 | escape-html "~1.0.3"
1278 | etag "~1.8.1"
1279 | fresh "0.5.2"
1280 | http-errors "~1.7.2"
1281 | mime "1.6.0"
1282 | ms "2.1.1"
1283 | on-finished "~2.3.0"
1284 | range-parser "~1.2.1"
1285 | statuses "~1.5.0"
1286 |
1287 | serve-static@1.14.1:
1288 | version "1.14.1"
1289 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
1290 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
1291 | dependencies:
1292 | encodeurl "~1.0.2"
1293 | escape-html "~1.0.3"
1294 | parseurl "~1.3.3"
1295 | send "0.17.1"
1296 |
1297 | setprototypeof@1.1.1:
1298 | version "1.1.1"
1299 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
1300 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
1301 |
1302 | side-channel@^1.0.4:
1303 | version "1.0.4"
1304 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
1305 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
1306 | dependencies:
1307 | call-bind "^1.0.0"
1308 | get-intrinsic "^1.0.2"
1309 | object-inspect "^1.9.0"
1310 |
1311 | sift@13.5.2:
1312 | version "13.5.2"
1313 | resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6"
1314 | integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==
1315 |
1316 | signal-exit@^3.0.2:
1317 | version "3.0.6"
1318 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
1319 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
1320 |
1321 | sliced@1.0.1:
1322 | version "1.0.1"
1323 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
1324 | integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
1325 |
1326 | sparse-bitfield@^3.0.3:
1327 | version "3.0.3"
1328 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
1329 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
1330 | dependencies:
1331 | memory-pager "^1.0.2"
1332 |
1333 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
1334 | version "1.5.0"
1335 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
1336 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
1337 |
1338 | string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2:
1339 | version "4.2.3"
1340 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1341 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
1342 | dependencies:
1343 | emoji-regex "^8.0.0"
1344 | is-fullwidth-code-point "^3.0.0"
1345 | strip-ansi "^6.0.1"
1346 |
1347 | strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1348 | version "6.0.1"
1349 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1350 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
1351 | dependencies:
1352 | ansi-regex "^5.0.1"
1353 |
1354 | strip-json-comments@~2.0.1:
1355 | version "2.0.1"
1356 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1357 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1358 |
1359 | stripe@^8.191.0:
1360 | version "8.191.0"
1361 | resolved "https://registry.yarnpkg.com/stripe/-/stripe-8.191.0.tgz#7bb56080dce2e2e9cc4f52dc05792626ea46bfd6"
1362 | integrity sha512-3oyuIbuW3WDsbGnMUtIZPkr+sOUJ3NEtEwghd81ZuWc+Tq09MrgWXGekbVnbxA3TMFwfKOILw6QoiPA7za4JUg==
1363 | dependencies:
1364 | "@types/node" ">=8.1.0"
1365 | qs "^6.6.0"
1366 |
1367 | supports-color@^5.5.0:
1368 | version "5.5.0"
1369 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1370 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1371 | dependencies:
1372 | has-flag "^3.0.0"
1373 |
1374 | supports-color@^7.1.0:
1375 | version "7.2.0"
1376 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
1377 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
1378 | dependencies:
1379 | has-flag "^4.0.0"
1380 |
1381 | to-readable-stream@^1.0.0:
1382 | version "1.0.0"
1383 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
1384 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
1385 |
1386 | to-regex-range@^5.0.1:
1387 | version "5.0.1"
1388 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1389 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1390 | dependencies:
1391 | is-number "^7.0.0"
1392 |
1393 | toidentifier@1.0.0:
1394 | version "1.0.0"
1395 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
1396 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
1397 |
1398 | touch@^3.1.0:
1399 | version "3.1.0"
1400 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
1401 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
1402 | dependencies:
1403 | nopt "~1.0.10"
1404 |
1405 | tr46@^3.0.0:
1406 | version "3.0.0"
1407 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
1408 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
1409 | dependencies:
1410 | punycode "^2.1.1"
1411 |
1412 | type-fest@^0.20.2:
1413 | version "0.20.2"
1414 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
1415 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
1416 |
1417 | type-is@~1.6.17, type-is@~1.6.18:
1418 | version "1.6.18"
1419 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
1420 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1421 | dependencies:
1422 | media-typer "0.3.0"
1423 | mime-types "~2.1.24"
1424 |
1425 | typedarray-to-buffer@^3.1.5:
1426 | version "3.1.5"
1427 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
1428 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
1429 | dependencies:
1430 | is-typedarray "^1.0.0"
1431 |
1432 | uid-safe@~2.1.5:
1433 | version "2.1.5"
1434 | resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a"
1435 | integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==
1436 | dependencies:
1437 | random-bytes "~1.0.0"
1438 |
1439 | undefsafe@^2.0.5:
1440 | version "2.0.5"
1441 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
1442 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
1443 |
1444 | unique-string@^2.0.0:
1445 | version "2.0.0"
1446 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
1447 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
1448 | dependencies:
1449 | crypto-random-string "^2.0.0"
1450 |
1451 | unpipe@1.0.0, unpipe@~1.0.0:
1452 | version "1.0.0"
1453 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1454 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
1455 |
1456 | update-notifier@^5.1.0:
1457 | version "5.1.0"
1458 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9"
1459 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==
1460 | dependencies:
1461 | boxen "^5.0.0"
1462 | chalk "^4.1.0"
1463 | configstore "^5.0.1"
1464 | has-yarn "^2.1.0"
1465 | import-lazy "^2.1.0"
1466 | is-ci "^2.0.0"
1467 | is-installed-globally "^0.4.0"
1468 | is-npm "^5.0.0"
1469 | is-yarn-global "^0.3.0"
1470 | latest-version "^5.1.0"
1471 | pupa "^2.1.1"
1472 | semver "^7.3.4"
1473 | semver-diff "^3.1.1"
1474 | xdg-basedir "^4.0.0"
1475 |
1476 | url-parse-lax@^3.0.0:
1477 | version "3.0.0"
1478 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
1479 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
1480 | dependencies:
1481 | prepend-http "^2.0.0"
1482 |
1483 | utils-merge@1.0.1:
1484 | version "1.0.1"
1485 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1486 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
1487 |
1488 | vary@^1, vary@~1.1.2:
1489 | version "1.1.2"
1490 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1491 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
1492 |
1493 | webidl-conversions@^7.0.0:
1494 | version "7.0.0"
1495 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
1496 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
1497 |
1498 | whatwg-url@^11.0.0:
1499 | version "11.0.0"
1500 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
1501 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
1502 | dependencies:
1503 | tr46 "^3.0.0"
1504 | webidl-conversions "^7.0.0"
1505 |
1506 | widest-line@^3.1.0:
1507 | version "3.1.0"
1508 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
1509 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
1510 | dependencies:
1511 | string-width "^4.0.0"
1512 |
1513 | wrap-ansi@^7.0.0:
1514 | version "7.0.0"
1515 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1516 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
1517 | dependencies:
1518 | ansi-styles "^4.0.0"
1519 | string-width "^4.1.0"
1520 | strip-ansi "^6.0.0"
1521 |
1522 | wrappy@1:
1523 | version "1.0.2"
1524 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1525 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1526 |
1527 | write-file-atomic@^3.0.0:
1528 | version "3.0.3"
1529 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
1530 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
1531 | dependencies:
1532 | imurmurhash "^0.1.4"
1533 | is-typedarray "^1.0.0"
1534 | signal-exit "^3.0.2"
1535 | typedarray-to-buffer "^3.1.5"
1536 |
1537 | xdg-basedir@^4.0.0:
1538 | version "4.0.0"
1539 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
1540 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
1541 |
1542 | yallist@^4.0.0:
1543 | version "4.0.0"
1544 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1545 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1546 |
--------------------------------------------------------------------------------