├── server ├── .gitignore ├── controller │ ├── cart-controller.js │ ├── product-controller.js │ ├── user-controller.js │ └── payment-controller.js ├── model │ ├── orderSchema.js │ ├── productSchema.js │ ├── cartSchema.js │ └── userSchema.js ├── database │ └── db.js ├── package.json ├── routes │ └── route.js ├── index.js ├── constants │ └── product.js └── package-lock.json ├── client ├── public │ ├── robots.txt │ ├── manifest.json │ └── index.html ├── src │ ├── redux │ │ ├── constants │ │ │ ├── cartConstants.js │ │ │ └── productConstant.js │ │ ├── store.js │ │ ├── actions │ │ │ ├── cartActions.js │ │ │ └── productActions.js │ │ └── reducers │ │ │ ├── productReducer.js │ │ │ └── cartReducer.js │ ├── Components │ │ ├── Product.jsx │ │ ├── NotFound.jsx │ │ ├── default.js │ │ ├── Cart │ │ │ ├── EmptyCart.jsx │ │ │ ├── GroupButton.jsx │ │ │ ├── CartItem.jsx │ │ │ ├── TotalView.jsx │ │ │ └── Cart.jsx │ │ ├── Home │ │ │ ├── NarBar.jsx │ │ │ ├── MidSlide.jsx │ │ │ ├── Banner.jsx │ │ │ ├── MidSection.jsx │ │ │ └── Slide.jsx │ │ ├── Header │ │ │ ├── Profile.jsx │ │ │ ├── Search.jsx │ │ │ ├── CustomButtons.jsx │ │ │ └── Header.jsx │ │ ├── Home.jsx │ │ ├── ItemDetails │ │ │ ├── ActionItem.jsx │ │ │ ├── ProductDetail.jsx │ │ │ └── DetailView.jsx │ │ └── Login │ │ │ └── LoginDialog.jsx │ ├── index.js │ ├── index.css │ ├── context │ │ └── ContextProvider.jsx │ ├── reducers │ │ └── reducer.js │ ├── App.css │ ├── service │ │ └── api.js │ ├── App.js │ ├── templates │ │ └── TemplateProvider.js │ ├── razorpay │ │ ├── loadPayment.js │ │ └── razorpay.js │ └── constant │ │ └── data.js ├── .gitignore └── package.json └── README.md /server/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | .env 3 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/src/redux/constants/cartConstants.js: -------------------------------------------------------------------------------- 1 | export const ADD_TO_CART = "addToCart" 2 | export const REMOVE_FROM_CART = "removeFromCart" 3 | export const CART_RESET = "cartReset" -------------------------------------------------------------------------------- /client/src/Components/Product.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | const Product = () => { 5 | return ( 6 |

Hi from Product

7 | ) 8 | } 9 | 10 | export default Product; -------------------------------------------------------------------------------- /client/src/Components/NotFound.jsx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | const NotFound = () => { 5 | return ( 6 |

Not Found! 404

7 | ) 8 | } 9 | 10 | export default NotFound; -------------------------------------------------------------------------------- /server/controller/cart-controller.js: -------------------------------------------------------------------------------- 1 | import Cart from '../model/cartSchema.js'; 2 | 3 | 4 | export const addItemInCart = (request, response) => { 5 | return response.json("Hello"); 6 | } -------------------------------------------------------------------------------- /client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "theme_color": "#000000", 7 | "background_color": "#ffffff" 8 | } 9 | -------------------------------------------------------------------------------- /client/src/Components/default.js: -------------------------------------------------------------------------------- 1 | // export { default as Cart } from './Cart'; 2 | export { default as Home } from './Home'; 3 | export { default as Product } from './Product'; 4 | // export { default as Header} from './Header'; 5 | export { default as NotFound } from './NotFound'; 6 | -------------------------------------------------------------------------------- /server/model/orderSchema.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose" 2 | 3 | export const OrderSchema=mongoose.Schema({ 4 | 5 | isPaid:Boolean, 6 | amount:Number, 7 | razorpay:{ 8 | order_id:String, 9 | payment_id:String, 10 | signature:String, 11 | }, 12 | 13 | }) 14 | 15 | const order=mongoose.model("order",OrderSchema); 16 | 17 | export default order; -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import { Provider } from 'react-redux'; 6 | import store from './redux/store'; 7 | 8 | ReactDOM.render( 9 | 10 | 11 | 12 | 13 | , 14 | document.getElementById('root') 15 | ); 16 | 17 | -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /client/src/redux/constants/productConstant.js: -------------------------------------------------------------------------------- 1 | export const GET_PRODUCTS_SUCCESS = 'getProductsSuccess' 2 | export const GET_PRODUCTS_FAIL = 'getProductsFail' 3 | 4 | 5 | export const GET_PRODUCT_DETAILS_REQUEST = 'getProductDetailsRequest' 6 | export const GET_PRODUCT_DETAILS_SUCCESS = 'getProductDetailSuccess' 7 | export const GET_PRODUCT_DETAILS_FAIL = 'getProductDetailFail' 8 | export const GET_PRODUCT_DETAILS_RESET = 'getProductDetailReset' -------------------------------------------------------------------------------- /client/src/context/ContextProvider.jsx: -------------------------------------------------------------------------------- 1 | import { createContext, useState } from 'react'; 2 | 3 | export const LoginContext = createContext(null); 4 | 5 | const ContextProvider = ({children}) => { 6 | 7 | const [ account, setAccount ] = useState(''); 8 | 9 | return ( 10 | 11 | {children} 12 | 13 | ) 14 | } 15 | 16 | export default ContextProvider; -------------------------------------------------------------------------------- /client/src/reducers/reducer.js: -------------------------------------------------------------------------------- 1 | 2 | export const initialState = { 3 | addToCart: {} 4 | } 5 | 6 | 7 | export const reducer = (state, action) => { 8 | switch (action.type) { 9 | case 'addToCart' : 10 | let a = { ...state, [action.type]: action.value }; 11 | console.log(a) 12 | return a; 13 | case 'reset': 14 | return initialState; 15 | default: 16 | return state; 17 | } 18 | } -------------------------------------------------------------------------------- /server/controller/product-controller.js: -------------------------------------------------------------------------------- 1 | import Product from '../model/productSchema.js'; 2 | 3 | 4 | export const getProducts = async (request, response) => { 5 | try { 6 | const products = await Product.find({}); 7 | 8 | response.json(products); 9 | }catch (error) { 10 | 11 | } 12 | } 13 | 14 | export const getProductById = async (request, response) => { 15 | try { 16 | const products = await Product.findOne({ 'id': request.params.id }); 17 | response.json(products); 18 | }catch (error) { 19 | 20 | } 21 | } -------------------------------------------------------------------------------- /server/database/db.js: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose'; 2 | 3 | const Connection = async (username, password) => { 4 | const URL = `mongodb+srv://${username}:${password}@cluster0.jjowu.mongodb.net/flipkart?retryWrites=true&w=majority`; 5 | try { 6 | await mongoose.connect(URL, { useUnifiedTopology: true, useNewUrlParser: true, useFindAndModify: false }); 7 | console.log('Database Connected Succesfully'); 8 | } catch(error) { 9 | console.log('Error: ', error.message); 10 | } 11 | 12 | }; 13 | 14 | export default Connection; -------------------------------------------------------------------------------- /server/model/productSchema.js: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose'; 2 | import autoIncrement from 'mongoose-auto-increment'; 3 | 4 | const productSchema = new mongoose.Schema({ 5 | id: String, 6 | url: String, 7 | detailUrl: String, 8 | title: Object, 9 | price: Object, 10 | quantity: Number, 11 | description: String, 12 | discount: String, 13 | tagline: String 14 | }); 15 | 16 | autoIncrement.initialize(mongoose.connection); 17 | productSchema.plugin(autoIncrement.plugin, 'product'); 18 | 19 | const products = mongoose.model('product', productSchema); 20 | 21 | export default products; -------------------------------------------------------------------------------- /client/src/redux/store.js: -------------------------------------------------------------------------------- 1 | import { createStore, applyMiddleware, combineReducers } from 'redux'; 2 | import thunk from 'redux-thunk'; 3 | import { composeWithDevTools } from 'redux-devtools-extension'; 4 | 5 | import { cartReducer } from './reducers/cartReducer'; 6 | import { getProductDetailsReducer, getProductReducer } from './reducers/productReducer'; 7 | 8 | const reducer = combineReducers({ 9 | cart: cartReducer, 10 | getProducts: getProductReducer, 11 | getProductDetails: getProductDetailsReducer 12 | }) 13 | 14 | 15 | const middleware = [thunk]; 16 | 17 | const store = createStore( 18 | reducer, 19 | composeWithDevTools(applyMiddleware(...middleware)) 20 | ); 21 | 22 | export default store; -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "start": "nodemon server.js" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "body-parser": "^1.19.0", 15 | "cors": "^2.8.5", 16 | "dot-env": "0.0.1", 17 | "dotenv": "^9.0.2", 18 | "express": "^4.17.1", 19 | "formidable": "^1.2.2", 20 | "https": "^1.0.0", 21 | "mongoose": "^5.12.9", 22 | "mongoose-auto-increment": "^5.0.1", 23 | "nodemon": "^2.0.7", 24 | "razorpay": "^2.0.7", 25 | "uuid": "^8.3.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /server/model/cartSchema.js: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose'; 2 | 3 | const cartSchema = new mongoose.Schema({ 4 | user: { 5 | username: String, 6 | // ref: 'user', 7 | // required: true 8 | }, 9 | cartItems: [ 10 | { 11 | product: { 12 | id: String, 13 | // required: true, 14 | // ref: 'Product' 15 | }, 16 | quantity: { 17 | type: Number, 18 | default: 1 19 | }, 20 | price: { 21 | price: Number, 22 | // required: true 23 | } 24 | } 25 | ] 26 | }); 27 | 28 | let Cart = mongoose.model('Cart', cartSchema); 29 | 30 | export default Cart; -------------------------------------------------------------------------------- /client/src/redux/actions/cartActions.js: -------------------------------------------------------------------------------- 1 | import * as actionTypes from '../constants/cartConstants'; 2 | import axios from 'axios'; 3 | 4 | export const addToCart = (id, quantity) => async (dispatch, getState) => { 5 | try { 6 | const { data } = await axios.get(`http://localhost:8000/product/${id}`); 7 | 8 | dispatch({ type: actionTypes.ADD_TO_CART, payload: { ...data, quantity } }); 9 | 10 | localStorage.setItem('cart', JSON.stringify(getState().cart.cartItems)) 11 | } catch (error) { 12 | console.log('Error while calling cart API'); 13 | } 14 | }; 15 | 16 | export const removeFromCart = (id) => (dispatch, getState) => { 17 | console.log(id); 18 | dispatch({ 19 | type: actionTypes.REMOVE_FROM_CART, 20 | payload: id 21 | }) 22 | 23 | localStorage.setItem('cart', JSON.stringify(getState().cart.cartItems)); 24 | }; -------------------------------------------------------------------------------- /server/model/userSchema.js: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose'; 2 | 3 | const userSchema = new mongoose.Schema({ 4 | firstname: { 5 | type: String, 6 | required: true, 7 | trim: true, 8 | min: 5, 9 | max: 20 10 | }, 11 | lastname: { 12 | type: String, 13 | required: true, 14 | trim: true, 15 | min: 5, 16 | max: 20 17 | }, 18 | username: { 19 | type: String, 20 | required: true, 21 | trim: true, 22 | unique: true, 23 | index: true, 24 | lowercase: true 25 | }, 26 | email: { 27 | type: String, 28 | required: true, 29 | trim: true, 30 | unique: true, 31 | lowercase: true 32 | }, 33 | password: { 34 | type: String, 35 | required: true 36 | }, 37 | phone: { 38 | type: String 39 | } 40 | }); 41 | 42 | const user = mongoose.model('user', userSchema); 43 | 44 | export default user; -------------------------------------------------------------------------------- /client/src/Components/Cart/EmptyCart.jsx: -------------------------------------------------------------------------------- 1 | 2 | import { makeStyles, Typography, Box } from '@material-ui/core'; 3 | 4 | const useStyle = makeStyles({ 5 | component: { 6 | width: '80%%', 7 | height: '65vh', 8 | background: '#fff', 9 | margin: '80px 140px' 10 | }, 11 | image: { 12 | width: '15%' 13 | }, 14 | container: { 15 | textAlign: 'center', 16 | paddingTop: 70 17 | } 18 | }) 19 | 20 | 21 | const EmptyCart = () => { 22 | const imgurl = 'https://rukminim1.flixcart.com/www/800/800/promos/16/05/2019/d438a32e-765a-4d8b-b4a6-520b560971e8.png?q=90'; 23 | const classes = useStyle(); 24 | 25 | return ( 26 | 27 | 28 | 29 | Your cart is empty! 30 | Add items to it now. 31 | 32 | 33 | ) 34 | } 35 | 36 | export default EmptyCart; -------------------------------------------------------------------------------- /client/src/Components/Cart/GroupButton.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { ButtonGroup, Button, makeStyles } from "@material-ui/core"; 3 | 4 | const useStyle = makeStyles({ 5 | component: { 6 | marginTop: 30 7 | }, 8 | button :{ 9 | borderRadius: '50%' 10 | } 11 | }) 12 | 13 | const GroupedButton = () => { 14 | const classes = useStyle(); 15 | const [ counter, setCounter ] = useState(1); 16 | 17 | const handleIncrement = () => { 18 | setCounter(counter => counter + 1 ); 19 | }; 20 | 21 | const handleDecrement = () => { 22 | setCounter(counter => counter - 1 ); 23 | }; 24 | 25 | return ( 26 | 27 | 28 | 29 | 30 | 31 | ); 32 | } 33 | 34 | export default GroupedButton; -------------------------------------------------------------------------------- /server/routes/route.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import { getProductById, getProducts } from '../controller/product-controller.js'; 3 | import { userSignUp, userLogIn } from '../controller/user-controller.js'; 4 | import { addItemInCart } from '../controller/cart-controller.js'; 5 | import { createOrder } from '../controller/payment-controller.js'; 6 | import { payOrder } from '../controller/payment-controller.js'; 7 | import { paymentResponse } from '../controller/payment-controller.js'; 8 | 9 | 10 | const router = express.Router(); 11 | 12 | //login & signup 13 | router.post('/signup', userSignUp); 14 | router.post('/login', userLogIn); 15 | 16 | router.get('/products', getProducts); 17 | router.get('/product/:id', getProductById); 18 | 19 | router.post('/cart/add', addItemInCart); 20 | 21 | router.get('/get-razorpay-key', (req, res) => { 22 | res.send({ key: process.env.RAZORPAY_KEY_ID }); 23 | }); 24 | 25 | router.post("/create-order", createOrder); 26 | router.post('/pay-order', payOrder); 27 | router.get('/pay-res', paymentResponse); 28 | 29 | export default router; -------------------------------------------------------------------------------- /client/src/service/api.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const url = 'http://localhost:8000'; 4 | 5 | export const authenticateLogin = async (user) => { 6 | try { 7 | return await axios.post(`${url}/login`, user) 8 | } catch (error) { 9 | console.log('error while calling login API: ', error); 10 | } 11 | } 12 | 13 | export const authenticateSignup = async (user) => { 14 | try { 15 | return await axios.post(`${url}/signup`, user) 16 | } catch (error) { 17 | console.log('error while calling Signup API: ', error); 18 | } 19 | } 20 | 21 | export const getProductById = async (id) => { 22 | try { 23 | return await axios.get(`${url}/product/${id}`); 24 | } catch (error) { 25 | console.log('Error while getting product by id response', error); 26 | } 27 | } 28 | 29 | export const payUsingPaytm = async (data) => { 30 | try { 31 | console.log('payment api'); 32 | let response = await axios.post(`${url}/payment`, data); 33 | console.log(response.data); 34 | return response.data; 35 | } catch (error) { 36 | console.log('error', error); 37 | } 38 | } 39 | 40 | -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import bodyParser from 'body-parser'; 3 | import cors from 'cors'; 4 | import dotenv from 'dotenv'; 5 | import mongoose from "mongoose"; 6 | // (node:15846) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead. (Use `node --trace-deprecation ...` to show where the warning was created) 7 | //Mongoose is now at v5.4.13. Per their docs, these are the fixes for the deprecation warnings... 8 | mongoose.set('useNewUrlParser', true); 9 | mongoose.set('useFindAndModify', false); 10 | mongoose.set('useCreateIndex', true); 11 | 12 | 13 | import Connection from './database/db.js'; 14 | import Routes from './routes/route.js'; 15 | 16 | 17 | dotenv.config(); 18 | 19 | const app = express(); 20 | 21 | const PORT = 8000; 22 | 23 | const username = process.env.DB_USERNAME; 24 | const password = process.env.DB_PASSWORD; 25 | 26 | Connection(username, password); 27 | 28 | app.listen(PORT, () => console.log(`Server is running successfully on PORT ${PORT}`)); 29 | 30 | 31 | app.use(bodyParser.json({ extended: true })); 32 | app.use(bodyParser.urlencoded({ extended: true })); 33 | app.use(cors()); 34 | app.use('/', Routes); 35 | 36 | -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | import { BrowserRouter, Switch, Route } from 'react-router-dom'; 2 | import { Home, NotFound } from './Components/default'; 3 | import Header from './Components/Header/Header'; 4 | import DetailView from './Components/ItemDetails/DetailView'; 5 | import TemplateProvider from './templates/TemplateProvider'; 6 | import ContextProvider from './context/ContextProvider'; 7 | import Cart from './Components/Cart/Cart'; 8 | import { Box } from '@material-ui/core' 9 | 10 | function App() { 11 | return ( 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | {/* */} 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ); 29 | } 30 | 31 | export default App; 32 | -------------------------------------------------------------------------------- /client/src/redux/actions/productActions.js: -------------------------------------------------------------------------------- 1 | import * as actionTypes from '../constants/productConstant'; 2 | import axios from 'axios'; 3 | 4 | export const getProducts = () => async (dispatch) => { 5 | try { 6 | console.log('Hiiiiii') 7 | const { data } = await axios.get(`http://localhost:8000/products`); 8 | dispatch({ type: actionTypes.GET_PRODUCTS_SUCCESS, payload: data }); 9 | 10 | } catch (error) { 11 | dispatch({ type: actionTypes.GET_PRODUCTS_FAIL, payload: error.response }); 12 | } 13 | }; 14 | 15 | export const getProductDetails = (id) => async (dispatch) => { 16 | try { 17 | dispatch({ type: actionTypes.GET_PRODUCT_DETAILS_REQUEST }); 18 | const { data } = await axios.get(`http://localhost:8000/product/${id}`); 19 | console.log(data); 20 | 21 | dispatch({ type: actionTypes.GET_PRODUCT_DETAILS_SUCCESS, payload: data }); 22 | 23 | } catch (error) { 24 | dispatch({ type: actionTypes.GET_PRODUCT_DETAILS_FAIL, payload: error.response}); 25 | 26 | } 27 | }; 28 | 29 | 30 | export const removeProductDetails = () => (dispatch) => { 31 | 32 | dispatch({ type: actionTypes.GET_PRODUCT_DETAILS_RESET }); 33 | 34 | }; 35 | -------------------------------------------------------------------------------- /client/src/redux/reducers/productReducer.js: -------------------------------------------------------------------------------- 1 | import * as actionTypes from '../constants/productConstant'; 2 | 3 | 4 | export const getProductReducer = (state = {products: []}, action) => { 5 | switch(action.type) { 6 | case actionTypes.GET_PRODUCTS_SUCCESS: 7 | return { products: action.payload } 8 | case actionTypes.GET_PRODUCTS_FAIL: 9 | return { error: action.payload } 10 | default: 11 | return state 12 | } 13 | }; 14 | 15 | export const getProductDetailsReducer = (state = { product: {}}, action) => { 16 | 17 | console.log('Hi', action.type) 18 | switch(action.type){ 19 | case actionTypes.GET_PRODUCT_DETAILS_REQUEST: 20 | return { loading: true } 21 | case actionTypes.GET_PRODUCT_DETAILS_SUCCESS: 22 | return { loading: false, product: action.payload } 23 | case actionTypes.GET_PRODUCT_DETAILS_FAIL: 24 | return { 25 | loading: false, 26 | error: action.payload 27 | } 28 | case actionTypes.GET_PRODUCT_DETAILS_RESET: 29 | return { 30 | product: {} 31 | } 32 | default: 33 | return state 34 | } 35 | } -------------------------------------------------------------------------------- /client/src/templates/TemplateProvider.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { CssBaseline } from "@material-ui/core"; 3 | import { ThemeProvider, createMuiTheme } from "@material-ui/core/styles"; 4 | 5 | const TemplateContext = React.createContext(null); 6 | 7 | export const TemplateProvider = ({ children }) => { 8 | const theme = createMuiTheme({ 9 | overrides: { 10 | MuiDialog: { 11 | paperWidthSm: { 12 | maxWidth: 'unset' 13 | } 14 | }, 15 | MuiDialogContent: { 16 | root: { 17 | padding: 0, 18 | '&:first-child': { 19 | paddingTop: 0 20 | } 21 | } 22 | }, 23 | MuiTableCell: { 24 | root: { 25 | borderBottom: 0 26 | } 27 | } 28 | } 29 | }); 30 | 31 | return ( 32 | 33 | 34 | 35 | {children} 36 | 37 | 38 | ); 39 | } 40 | 41 | export default TemplateProvider; -------------------------------------------------------------------------------- /server/controller/user-controller.js: -------------------------------------------------------------------------------- 1 | import User from '../model/userSchema.js'; 2 | 3 | export const userLogIn = async (request, response) => { 4 | try { 5 | let user = await User.findOne({ email: request.body.email, password: request.body.password }); 6 | console.log(user); 7 | console.log(request.body); 8 | if(user) { 9 | return response.send({username:user.username}); 10 | } else { 11 | return response.status(401).json('Invalid Login'); 12 | } 13 | 14 | } catch (error) { 15 | response.json('Error: ', error.message); 16 | } 17 | } 18 | 19 | export const userSignUp = async (request, response) => { 20 | try { 21 | const exist = await User.findOne({ username: request.body.username }); 22 | if(exist) { 23 | return response.status(401).messagejson({ message: 'User already exist'}); 24 | } 25 | const user = request.body; 26 | const newUser = new User(user); 27 | await newUser.save(); 28 | response.status(200).json(`${user.firstName} has been successfully registered`); 29 | 30 | } catch (error) { 31 | response.json('Error: ', error.message); 32 | } 33 | } 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /client/src/Components/Home/NarBar.jsx: -------------------------------------------------------------------------------- 1 | import { Box, makeStyles, Typography } from '@material-ui/core'; 2 | import { navData } from '../../constant/data'; 3 | 4 | const useStyle = makeStyles(theme => ({ 5 | component: { 6 | display: 'flex', 7 | justifyContent: 'space-between', 8 | margin: '55px 130px 0 130px', 9 | overflowX: 'overlay', 10 | [theme.breakpoints.down('md')]: { 11 | margin: 0 12 | } 13 | }, 14 | container: { 15 | padding: '12px 8px', 16 | textAlign: 'center' 17 | }, 18 | image: { 19 | width: 64 20 | }, 21 | text: { 22 | fontSize: 14, 23 | fontWeight: 600, 24 | fontFamily: 'inherit' 25 | } 26 | })); 27 | 28 | const NavBar = () => { 29 | const classes = useStyle(); 30 | return ( 31 | 32 | { 33 | navData.map(temp => ( 34 | 35 | 36 | {temp.text} 37 | 38 | )) 39 | } 40 | 41 | ) 42 | } 43 | 44 | export default NavBar; -------------------------------------------------------------------------------- /client/src/redux/reducers/cartReducer.js: -------------------------------------------------------------------------------- 1 | import * as actionTypes from '../constants/cartConstants'; 2 | 3 | export const cartReducer = (state = { cartItems: []}, action) => { 4 | console.log('Heyya', action.type); 5 | switch(action.type) { 6 | case actionTypes.ADD_TO_CART: 7 | const item = action.payload; 8 | 9 | const existItem = state.cartItems.find(product => product.id === item.id); 10 | console.log(existItem) 11 | console.log(item); 12 | console.log(state.cartItems) 13 | 14 | if(existItem){ 15 | return { 16 | ...state, cartItems: state.cartItems.map(x => x.product === existItem.product ? item : x) 17 | } 18 | } else { 19 | let a = { ...state, cartItems: [...state.cartItems, item]} 20 | console.log(a) 21 | return a; 22 | } 23 | case actionTypes.REMOVE_FROM_CART: 24 | console.log(state.cartItems) 25 | console.log(action.payload); 26 | let s = { 27 | ...state, cartItems: state.cartItems.filter(product => product.id !== action.payload) 28 | } 29 | console.log(s); 30 | return s; 31 | 32 | default: 33 | return state; 34 | } 35 | } -------------------------------------------------------------------------------- /client/src/Components/Home/MidSlide.jsx: -------------------------------------------------------------------------------- 1 | import { Box, makeStyles } from '@material-ui/core'; 2 | import Slide from './Slide'; 3 | 4 | const useStyle = makeStyles(theme => ({ 5 | component: { 6 | display: 'flex' 7 | }, 8 | leftComponent: { 9 | width: '83%', 10 | [theme.breakpoints.down('md')]: { 11 | width: '100%' 12 | } 13 | }, 14 | rightComponent: { 15 | marginTop: 12, 16 | background: '#FFFFFF', 17 | width: '17%', 18 | marginLeft: 10, 19 | padding: 5, 20 | [theme.breakpoints.down('md')]: { 21 | display: 'none' 22 | } 23 | } 24 | })); 25 | 26 | const MidSlide = ({ products }) => { 27 | const classes = useStyle(); 28 | const adURL = 'https://rukminim1.flixcart.com/flap/464/708/image/633789f7def60050.jpg?q=70'; 29 | 30 | return ( 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | ) 45 | } 46 | 47 | export default MidSlide; -------------------------------------------------------------------------------- /client/src/Components/Home/Banner.jsx: -------------------------------------------------------------------------------- 1 | import Carousel from 'react-material-ui-carousel' 2 | import { makeStyles } from '@material-ui/core' 3 | import { bannerData } from '../../constant/data'; 4 | 5 | 6 | const useStyle = makeStyles(theme => ({ 7 | container: { 8 | }, 9 | image: { 10 | width: '100%', 11 | height: 280, 12 | [theme.breakpoints.down('sm')]: { 13 | objectFit: 'cover', 14 | height: 180 15 | } 16 | } 17 | })) 18 | 19 | const Banner = () => { 20 | const classes = useStyle(); 21 | return ( 22 | 40 | { 41 | bannerData.map(image => ( 42 | 43 | )) 44 | } 45 | 46 | ) 47 | } 48 | 49 | export default Banner; -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@google-pay/button-react": "^2.3.0", 7 | "@material-ui/core": "^4.11.4", 8 | "@material-ui/icons": "^4.11.2", 9 | "@testing-library/jest-dom": "^5.12.0", 10 | "@testing-library/react": "^11.2.6", 11 | "@testing-library/user-event": "^12.8.3", 12 | "axios": "^0.21.4", 13 | "clsx": "^1.1.1", 14 | "react": "^17.0.2", 15 | "react-countdown": "^2.3.2", 16 | "react-dom": "^17.0.2", 17 | "react-material-ui-carousel": "^2.2.6", 18 | "react-multi-carousel": "^2.6.2", 19 | "react-redux": "^7.2.4", 20 | "react-router-dom": "^5.2.0", 21 | "react-scripts": "4.0.3", 22 | "redux": "^4.1.0", 23 | "redux-devtools-extension": "^2.13.9", 24 | "redux-thunk": "^2.3.0", 25 | "web-vitals": "^1.1.2" 26 | }, 27 | "scripts": { 28 | "start": "react-scripts start", 29 | "build": "react-scripts build", 30 | "test": "react-scripts test", 31 | "eject": "react-scripts eject" 32 | }, 33 | "eslintConfig": { 34 | "extends": [ 35 | "react-app", 36 | "react-app/jest" 37 | ] 38 | }, 39 | "browserslist": { 40 | "production": [ 41 | ">0.2%", 42 | "not dead", 43 | "not op_mini all" 44 | ], 45 | "development": [ 46 | "last 1 chrome version", 47 | "last 1 firefox version", 48 | "last 1 safari version" 49 | ] 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /server/controller/payment-controller.js: -------------------------------------------------------------------------------- 1 | import Order from "../model/orderSchema.js"; 2 | import Razorpay from "razorpay"; 3 | 4 | 5 | export const createOrder = (request, response) => { 6 | try { 7 | const instance = (instance = new Razorpay({ 8 | key_id: process.env.RAZORPAY_KEY_ID, 9 | key_secret: process.env.RAZORPAY_KEY_SECRET, 10 | })); 11 | console.log(request.body); 12 | const options = { 13 | amount: request.body.price, 14 | currency: "INR", 15 | }; 16 | const order = instance.create(options); 17 | if (!order) response.send("Some error occured"); 18 | response.send(order); 19 | } catch (error) { 20 | response.send(error); 21 | } 22 | }; 23 | 24 | export const payOrder = async (request, response) => { 25 | // console.log("triiggerd payOder"); 26 | // console.log(request.body); 27 | try { 28 | const { amount, razorpayPaymentId, razorpayOrderId, razorpaySignature } = 29 | request.body; 30 | const newOrder = Order.create({ 31 | isPaid: true, 32 | amount: amount, 33 | razorpay: { 34 | order_id: razorpayOrderId, 35 | payment_id: razorpayPaymentId, 36 | signature: razorpaySignature, 37 | }, 38 | }); 39 | await response.send({msg:"payment was successfull"}); 40 | } catch (error) { 41 | response.send(error); 42 | } 43 | }; 44 | 45 | export const paymentResponse= async(request,response)=>{ 46 | const orders=await Order.find(); 47 | console.log(orders); 48 | response.send(orders); 49 | } 50 | -------------------------------------------------------------------------------- /client/src/Components/Header/Profile.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import { Typography, Menu, MenuItem, makeStyles } from '@material-ui/core'; 4 | import { PowerSettingsNew } from '@material-ui/icons'; 5 | 6 | const useStyle = makeStyles({ 7 | component: { 8 | marginTop: 40, 9 | }, 10 | logout: { 11 | fontSize: 14, 12 | marginLeft: 20 13 | } 14 | }) 15 | 16 | const Profile = ({ account, setAccount }) => { 17 | const [open, setOpen] = useState(false); 18 | const classes = useStyle(); 19 | 20 | const handleClick = (event) => { 21 | setOpen(event.currentTarget); 22 | }; 23 | 24 | const handleClose = () => { 25 | setOpen(false); 26 | }; 27 | 28 | const logout = () => { 29 | setAccount(''); 30 | } 31 | 32 | return ( 33 | <> 34 | {account} 35 | 41 | { handleClose(); logout();}}> 42 | 43 | Logout 44 | 45 | 46 | 47 | ) 48 | } 49 | 50 | export default Profile; -------------------------------------------------------------------------------- /client/src/Components/Home/MidSection.jsx: -------------------------------------------------------------------------------- 1 | import { makeStyles, Grid } from '@material-ui/core'; 2 | import clsx from 'clsx'; 3 | 4 | const ImageURL = [ 5 | 'https://rukminim1.flixcart.com/flap/960/960/image/2f30db9425df5cec.jpg?q=50', 6 | 'https://rukminim1.flixcart.com/flap/960/960/image/084789479074d2b2.jpg', 7 | 'https://rukminim1.flixcart.com/flap/960/960/image/1ce0c4c1fb501b45.jpg?q=50' 8 | ]; 9 | 10 | const useStyle = makeStyles(theme => ({ 11 | wrapper: { 12 | display: 'flex', 13 | marginTop: 20, 14 | justifyContent: 'space-between' 15 | }, 16 | image: { 17 | width: '100%' 18 | }, 19 | help: { 20 | [theme.breakpoints.down('md')]: { 21 | objectFit: 'cover', 22 | height: 120 23 | } 24 | } 25 | })); 26 | 27 | const MidSection = () => { 28 | const classes = useStyle(); 29 | const url = 'https://rukminim1.flixcart.com/flap/3006/433/image/4789bc3aefd54494.jpg?q=50'; 30 | return ( 31 | <> 32 | 33 | { 34 | ImageURL.map(image => ( 35 | 36 | 37 | 38 | )) 39 | } 40 | 41 | 42 | 43 | ) 44 | } 45 | 46 | export default MidSection; -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /client/src/razorpay/loadPayment.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | const url = 'http://localhost:8000'; 3 | 4 | export const loadRazorpay=(price)=> { 5 | const orderAmount=price+"00"; 6 | const script = document.createElement('script'); 7 | script.src = 'https://checkout.razorpay.com/v1/checkout.js'; 8 | script.onerror = () => { 9 | alert('Razorpay SDK failed to load. Are you online?'); 10 | }; 11 | script.onload = async () => { 12 | try { 13 | const result = await axios.post(`${url}/create-order`, { 14 | amount: orderAmount, 15 | }); 16 | const { amount, id: order_id, currency } = result.data; 17 | const { 18 | data: { key: razorpayKey }, 19 | } = await axios.get(`${url}/get-razorpay-key`); 20 | 21 | const options = { 22 | key: razorpayKey, 23 | amount: orderAmount.toString(), 24 | currency: currency, 25 | name: 'example name', 26 | description: 'example transaction', 27 | order_id: order_id, 28 | handler: async function (response) { 29 | const result = await axios.post(`${url}/pay-order`, { 30 | amount: orderAmount, 31 | razorpayPaymentId: response.razorpay_payment_id, 32 | razorpayOrderId: response.razorpay_order_id, 33 | razorpaySignature: response.razorpay_signature, 34 | }); 35 | //console.log(response); 36 | alert(result.data.msg); 37 | //fetchOrders(); 38 | }, 39 | prefill: { 40 | name: 'example name', 41 | email: 'email@example.com', 42 | contact: '111111', 43 | }, 44 | notes: { 45 | address: 'example address', 46 | }, 47 | theme: { 48 | color: '#80c0f0', 49 | }, 50 | }; 51 | const paymentObject = new window.Razorpay(options); 52 | paymentObject.open(); 53 | } catch (err) { 54 | alert(err); 55 | } 56 | }; 57 | document.body.appendChild(script); 58 | } -------------------------------------------------------------------------------- /client/src/Components/Home.jsx: -------------------------------------------------------------------------------- 1 | import { Box, makeStyles } from '@material-ui/core'; 2 | import NavBar from './Home/NarBar'; 3 | import Banner from './Home/Banner'; 4 | import MidSlide from './Home/MidSlide'; 5 | import MidSection from './Home/MidSection'; 6 | import Slide from './Home/Slide'; 7 | import React, { useEffect } from 'react'; 8 | import { useSelector, useDispatch } from 'react-redux'; // hooks 9 | import { getProducts as listProducts } from '../redux/actions/productActions'; 10 | 11 | 12 | const useStyle = makeStyles({ 13 | component: { 14 | padding: 10, 15 | background: '#F2F2F2' 16 | } 17 | }) 18 | 19 | const Home = () => { 20 | const classes = useStyle(); 21 | 22 | const getProducts = useSelector(state => state.getProducts); 23 | const { products} = getProducts; 24 | 25 | const dispatch = useDispatch(); 26 | 27 | useEffect(() => { 28 | dispatch(listProducts()) 29 | }, [dispatch]) 30 | 31 | return ( 32 | <> 33 | 34 | 35 | 36 | 37 | 38 | 44 | 50 | 56 | 62 | 63 | 64 | ) 65 | } 66 | 67 | export default Home; -------------------------------------------------------------------------------- /client/src/Components/Cart/CartItem.jsx: -------------------------------------------------------------------------------- 1 | import { Card, makeStyles, Box, Typography, Button } from '@material-ui/core'; 2 | import clsx from 'clsx'; 3 | import GroupButton from './GroupButton'; 4 | 5 | const useStyle = makeStyles({ 6 | component: { 7 | borderTop: '1px solid #f0f0f0', 8 | borderRadius: 0, 9 | display: 'flex' 10 | }, 11 | leftComponent: { 12 | margin: 20, 13 | display: 'flex', 14 | flexDirection: 'column' 15 | }, 16 | image: { 17 | height: 110, 18 | width: 110 19 | }, 20 | mid: { 21 | margin: 20 22 | }, 23 | greyTextColor: { 24 | color: '#878787' 25 | }, 26 | smallText: { 27 | fontSize: 14, 28 | }, 29 | price: { 30 | fontSize: 18, 31 | fontWeight: 600 32 | }, 33 | remove: { 34 | marginTop: 20, 35 | fontSize: 16 36 | } 37 | }); 38 | 39 | const CartItem = ({ item, removeItemFromCart }) => { 40 | console.log(item) 41 | const classes = useStyle(); 42 | const fassured = 'https://static-assets-web.flixcart.com/www/linchpin/fk-cp-zion/img/fa_62673a.png'; 43 | 44 | return ( 45 | 46 | 47 | 48 | 49 | 50 | 51 | {item.title.longTitle} 52 | Seller:RetailNet 53 | 54 | 55 | 56 | ₹{item.price.cost}    57 | ₹{item.price.mrp}    58 | {item.price.discount} off 59 | 60 | 61 | 62 | 63 | ) 64 | } 65 | 66 | export default CartItem; -------------------------------------------------------------------------------- /client/src/Components/ItemDetails/ActionItem.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useContext, useReducer, useEffect } from 'react'; 2 | import { Button, Box, makeStyles } from '@material-ui/core'; 3 | import { ShoppingCart as Cart, FlashOn as Flash } from '@material-ui/icons'; 4 | import clsx from 'clsx'; 5 | import { useHistory } from 'react-router-dom'; 6 | import { LoginContext } from '../../context/ContextProvider'; 7 | // import { initialState, reducer } from '../../reducers/reducer'; 8 | import { addToCart } from '../../redux/actions/cartActions'; 9 | import { useSelector, useDispatch } from 'react-redux'; 10 | import { loadRazorpay } from '../../razorpay/loadPayment'; 11 | 12 | 13 | const useStyle = makeStyles(theme => ({ 14 | leftContainer: { 15 | minWidth: '40%', 16 | // textAlign: 'center', 17 | padding: '40px 0 0 80px', 18 | [theme.breakpoints.down('md')]: { 19 | padding: '20px 40px' 20 | } 21 | }, 22 | productImage: { 23 | padding: '15px 20px', 24 | border: '1px solid #f0f0f0', 25 | width: '95%' 26 | }, 27 | button: { 28 | width: '46%', 29 | borderRadius: 2, 30 | height: 50 31 | }, 32 | addToCart: { 33 | background: '#ff9f00', 34 | color: '#FFF' 35 | }, 36 | buyNow:{ 37 | background: '#fb641b', 38 | color: '#FFF' 39 | } 40 | })); 41 | 42 | const ActionItem = ({ product }) => { 43 | const classes = useStyle(); 44 | const history = useHistory(); 45 | const { account } = useContext(LoginContext); 46 | const { id, price, detailUrl, title } = product; 47 | 48 | const [quantity, setQuantity] = useState(1); 49 | const dispatch = useDispatch(); 50 | 51 | const buyNow = async () => { 52 | loadRazorpay(600); 53 | } 54 | 55 | const addItemToCart = () => { 56 | dispatch(addToCart(id, quantity)); 57 | history.push('/cart'); 58 | } 59 | 60 | return ( 61 | 62 |
63 | 64 | 65 |
66 | ) 67 | } 68 | 69 | export default ActionItem; -------------------------------------------------------------------------------- /client/src/Components/Cart/TotalView.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | import { Box, makeStyles, Typography } from '@material-ui/core'; 3 | import clsx from 'clsx'; 4 | 5 | const useStyle = makeStyles({ 6 | component: { 7 | // width: '30%' 8 | }, 9 | header: { 10 | padding: '15px 24px', 11 | background: '#fff' 12 | }, 13 | greyTextColor: { 14 | color: '#878787' 15 | }, 16 | container: { 17 | '& > *': { 18 | marginBottom: 20, 19 | fontSize: 14 20 | } 21 | }, 22 | price: { 23 | float: 'right' 24 | }, 25 | totalAmount: { 26 | fontSize: 18, 27 | fontWeight: 600, 28 | borderTop: '1px dashed #e0e0e0', 29 | padding: '20px 0', 30 | borderBottom: '1px dashed #e0e0e0' 31 | } 32 | }) 33 | 34 | 35 | const TotalView = ({ cartItems }) => { 36 | const classes = useStyle(); 37 | const [price, setPrice] = useState(0); 38 | const [discount, setDiscount] = useState(0) 39 | 40 | 41 | const totalAmount = () => { 42 | let price = 0, discount = 0; 43 | console.log(cartItems); 44 | cartItems.map(item => { 45 | price += item.price.mrp 46 | discount += (item.price.mrp - item.price.cost) 47 | }) 48 | setPrice(price); 49 | setDiscount(discount); 50 | } 51 | 52 | 53 | useEffect(() => { 54 | totalAmount(); 55 | }, [cartItems,totalAmount]); 56 | 57 | 58 | return ( 59 | 60 | 61 | PRICE DETAILS 62 | 63 | 64 | Price ({cartItems?.length} item)₹{price} 65 | Discount-₹{discount} 66 | Delivery Charges₹40 67 | Total Amount₹{price - discount + 40} 68 | You will save ₹{discount - 40} on this order 69 | 70 | 71 | ) 72 | } 73 | 74 | export default TotalView; -------------------------------------------------------------------------------- /client/src/Components/Header/Search.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | import SearchIcon from '@material-ui/icons/Search'; 3 | import { makeStyles, InputBase, List, ListItem } from '@material-ui/core'; 4 | import { useSelector, useDispatch } from 'react-redux'; // hooks 5 | import { getProducts as listProducts } from '../../redux/actions/productActions'; 6 | import { Link } from 'react-router-dom'; 7 | 8 | const useStyle = makeStyles(theme => ({ 9 | search: { 10 | borderRadius: 2, 11 | marginLeft: 10, 12 | width: '38%', 13 | backgroundColor: '#fff', 14 | display: 'flex' 15 | }, 16 | searchIcon: { 17 | marginLeft: 'auto', 18 | padding: 5, 19 | display: 'flex', 20 | color: 'blue' 21 | }, 22 | inputRoot: { 23 | fontSize: 'unset', 24 | width: '100%' 25 | }, 26 | inputInput: { 27 | paddingLeft: 20, 28 | width: '100%', 29 | }, 30 | list: { 31 | position: 'absolute', 32 | color: '#000', 33 | background: '#FFFFFF', 34 | marginTop: 36 35 | } 36 | })) 37 | 38 | const Search = () => { 39 | const classes = useStyle(); 40 | const [ text, setText ] = useState(); 41 | const [ open, setOpen ] = useState(true) 42 | 43 | const getText = (text) => { 44 | setText(text); 45 | setOpen(false) 46 | } 47 | 48 | const getProducts = useSelector(state => state.getProducts); 49 | const { products } = getProducts; 50 | 51 | const dispatch = useDispatch(); 52 | 53 | useEffect(() => { 54 | dispatch(listProducts()) 55 | }, [dispatch]) 56 | 57 | return ( 58 |
59 | getText(e.target.value)} 67 | /> 68 |
69 | 70 |
71 | { 72 | text && 73 | 88 | } 89 |
90 | ) 91 | } 92 | 93 | export default Search; -------------------------------------------------------------------------------- /client/src/Components/Header/CustomButtons.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useContext } from 'react'; 2 | import { makeStyles, Box, Typography, Badge, Button } from '@material-ui/core'; 3 | import { Link } from 'react-router-dom'; 4 | import { ShoppingCart } from '@material-ui/icons'; 5 | import LoginDialog from '../Login/LoginDialog'; 6 | import { LoginContext } from '../../context/ContextProvider'; 7 | import { useSelector } from 'react-redux'; 8 | import Profile from './Profile'; 9 | 10 | const useStyle = makeStyles(theme => ({ 11 | container: { 12 | display: 'flex', 13 | [theme.breakpoints.down('sm')]: { 14 | display: 'block' 15 | } 16 | }, 17 | wrapper: { 18 | margin: '0 5% 0 auto', 19 | display: 'flex', 20 | '& > *': { 21 | marginRight: 50, 22 | textDecoration: 'none', 23 | color: '#FFFFFF', 24 | fontSize: 12, 25 | alignItems: 'center', 26 | [theme.breakpoints.down('sm')]: { 27 | color: '#2874f0', 28 | alignItems: 'center', 29 | display: 'flex', 30 | flexDirection: 'column', 31 | marginTop: 10 32 | } 33 | }, 34 | [theme.breakpoints.down('sm')]: { 35 | display: 'block' 36 | } 37 | }, 38 | login: { 39 | color: '#2874f0', 40 | background: '#FFFFFF', 41 | textTransform: 'none', 42 | fontWeight: 600, 43 | borderRadius: 2, 44 | padding: '5px 40px', 45 | height: 32, 46 | boxShadow: 'none', 47 | [theme.breakpoints.down('sm')]: { 48 | background: '#2874f0', 49 | color: '#FFFFFF' 50 | } 51 | } 52 | })); 53 | 54 | 55 | const CustomButtons = () => { 56 | const classes = useStyle(); 57 | const [ open, setOpen ] = useState(false); 58 | const { account, setAccount } = useContext(LoginContext); 59 | 60 | const cartDetails = useSelector(state => state.cart); 61 | const { cartItems } = cartDetails; 62 | 63 | const openDialog = () => { 64 | setOpen(true); 65 | } 66 | 67 | return ( 68 | 69 | { 70 | account ? : 71 | 72 | 73 | 74 | } 75 | 76 | More 77 | 78 | 79 | 80 | 81 | 82 | Cart 83 | 84 | 85 | 86 | ) 87 | } 88 | 89 | export default CustomButtons; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Flipkar Clone MERN stack 3 | 4 | Sijeesh Miziha's Flipkart Clone is done with top-notch features for the entrepreneur startups like Flipkart it has RazorPay Integration and get money from anywhere. This Flipkart clone with the best features in mobile, web, and iOS platforms, Completely responsive design using Material UI. 5 | - 🧪 **Kindly Please Support Me** 6 | - I can provide brand-free products and full technical support for 1 year along with 1-year free update support and moreover 7 | - 👁 **Well typed** 8 | - Clean JavaScript code with good folder structure., 9 | - 📄 **Well documented** 10 | - I can provide full reference & installation documentation alongside detailed guides through my Youtube Channel Sijeesh Miziha feel free to subscribe 11 | - If You supporting me., then I can also create the full lecture video from the scratch..,you can learn React.js as beginer 12 | - **Requirements to fork this repo** 13 | - Strong knowledge of JavaScript 14 | - React js, redux , redux-thunk , context 15 | - Knowledge of Express js & MVC architecture 16 | - Basic knowledge in MongoDB & Mongoose 17 | 18 | 19 | 20 | ![Screenshot from 2021-11-01 18-05-31](https://user-images.githubusercontent.com/91063960/139678469-c631005a-9c20-4321-8022-24f4573427b7.png) 21 | ![Screenshot from 2021-11-01 18-05-52](https://user-images.githubusercontent.com/91063960/139678483-ca95e74e-44a5-422c-9cac-4bfe463215ef.png) 22 | ![Screenshot from 2021-11-01 18-06-08](https://user-images.githubusercontent.com/91063960/139678489-03130e57-7e0b-4bb0-96f6-f4ec85b8efbe.png) 23 | ![Screenshot from 2021-11-01 18-06-32](https://user-images.githubusercontent.com/91063960/139678548-e58c550e-51c5-4695-a0c3-d6563737548a.png) 24 | ![Screenshot from 2021-11-01 18-07-35](https://user-images.githubusercontent.com/91063960/139678663-177aedd5-e622-4441-871b-e0af7be1e363.png) 25 | ![Screenshot from 2021-11-01 18-08-34](https://user-images.githubusercontent.com/91063960/139678729-432bb265-9d98-4a2d-8c27-d66eb2f09b26.png) 26 | ![Screenshot from 2021-11-01 18-08-40](https://user-images.githubusercontent.com/91063960/139678735-0ac4e3e8-591d-4652-8965-22c830fa94db.png) 27 | ![Screenshot from 2021-11-01 18-09-33](https://user-images.githubusercontent.com/91063960/139678737-8d069f75-9d7f-44ff-8e37-4be34ebc95cd.png) 28 | 29 | 30 | Flipkart is one of the best and trending eCommerce sites with a presence throughout India. The online shopping website is for Buying and Selling products online within the network. 31 | 32 | Sijeesh Miziha's Flipkart clone is a ready-made remarkable multi-vendor eCommerce site built-in compleatly JavaScript that helps Entrepreneurs can start their own business like Flipkart, which allows the vendors to add products & users to buy the products easily with just a click. 33 | ## Tech Stack 34 | 35 | - **MERN STACK** 36 | - **React js , Node js , MongoDB , Express js** 37 | - **Materiel UI** 38 | - **RazorPay integration** 39 | 40 | 41 | 42 | 43 | ## Installation 44 | 45 | 1. Clone/Download the repo. 46 | 2. Run npm install on client as well as server. 47 | 3. Run npm start both server and client to spin the up the local dev server port 8000,3000,(http://localhost:8000),(http://localhost:3000). 48 | -------------------------------------------------------------------------------- /client/src/Components/Cart/Cart.jsx: -------------------------------------------------------------------------------- 1 | import { Box, makeStyles, Typography, Button, Grid } from '@material-ui/core'; 2 | import CartItem from './CartItem'; 3 | import { useEffect } from 'react'; 4 | import { useSelector, useDispatch } from 'react-redux'; 5 | import { addToCart, removeFromCart } from '../../redux/actions/cartActions'; 6 | import TotalView from './TotalView'; 7 | import EmptyCart from './EmptyCart'; 8 | import { loadRazorpay } from '../../razorpay/loadPayment'; 9 | 10 | 11 | const useStyle = makeStyles(theme => ({ 12 | component: { 13 | // marginTop: 55, 14 | padding: '30px 135px', 15 | display: 'flex', 16 | [theme.breakpoints.down('sm')]: { 17 | padding: '15px 0' 18 | } 19 | }, 20 | leftComponent: { 21 | // width: '67%', 22 | paddingRight: 15, 23 | [theme.breakpoints.down('sm')]: { 24 | marginBottom: 15 25 | } 26 | }, 27 | header: { 28 | padding: '15px 24px', 29 | background: '#fff' 30 | }, 31 | bottom: { 32 | padding: '16px 22px', 33 | background: '#fff', 34 | boxShadow: '0 -2px 10px 0 rgb(0 0 0 / 10%)', 35 | borderTop: '1px solid #f0f0f0' 36 | }, 37 | placeOrder: { 38 | display: 'flex', 39 | marginLeft: 'auto', 40 | background: '#fb641b', 41 | color: '#fff', 42 | borderRadius: 2, 43 | width: 250, 44 | height: 51 45 | } 46 | })); 47 | 48 | const Cart = ({ match, history }) => { 49 | const classes = useStyle(); 50 | 51 | const cartDetails = useSelector(state => state.cart); 52 | const { cartItems } = cartDetails; 53 | 54 | const dispatch = useDispatch(); 55 | 56 | useEffect(() => { 57 | if(cartItems && match.params.id !== cartItems.id) 58 | dispatch(addToCart(match.params.id)); 59 | console.log(cartItems); 60 | }, [dispatch, cartItems, match]); 61 | 62 | const removeItemFromCart = (id) => { 63 | dispatch(removeFromCart(id)); 64 | } 65 | 66 | const buyNow = async () => { 67 | loadRazorpay(500); 68 | } 69 | 70 | return ( 71 | <> 72 | { cartItems.length ? 73 | 74 | 75 | 76 | My Cart ({cartItems?.length}) 77 | 78 | { cartItems.map(item => ( 79 | 80 | )) 81 | } 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | : 90 | } 91 | 92 | 93 | ) 94 | } 95 | 96 | export default Cart; -------------------------------------------------------------------------------- /client/src/Components/ItemDetails/ProductDetail.jsx: -------------------------------------------------------------------------------- 1 | import { Box, Typography, makeStyles, Table, TableBody, TableRow, TableCell } from '@material-ui/core'; 2 | import { LocalOffer as Badge } from '@material-ui/icons'; 3 | 4 | const useStyle = makeStyles({ 5 | smallText: { 6 | fontSize: 14, 7 | verticalAlign: 'baseline', 8 | '& > *' :{ 9 | fontSize: 14, 10 | marginTop: 10 11 | } 12 | }, 13 | greyTextColor: { 14 | color: '#878787' 15 | }, 16 | badge: { 17 | marginRight: 10, 18 | color: '#00CC00', 19 | fontSize: 15 20 | }, 21 | wrapper: { 22 | display: 'flex' 23 | } 24 | }); 25 | 26 | const ProductDetail = ({ product }) => { 27 | const classes = useStyle(); 28 | const adURL = 'https://rukminim1.flixcart.com/lockin/774/185/images/CCO__PP_2019-07-14.png?q=50'; 29 | const date = new Date(new Date().getTime()+(5*24*60*60*1000)); 30 | 31 | return ( 32 | <> 33 | Available offers 34 | 35 | Bank Offer 5% Unlimited Cashback on Flipkart Axis Bank Credit Card 36 | Bank Offer 10% Off on Bank of Baroda Mastercard debit card first time transaction, Terms and Condition apply 37 | Purchase this Furniture or Appliance and Get Extra ₹500 Off on Select ACs 38 | Partner OfferExtra 10% off upto ₹500 on next furniture purchase 39 | 40 | 41 | 42 | 43 | Delivery 44 | Delivery by {date.toDateString()} | ₹40 45 | 46 | 47 | Warranty 48 | No Warranty 49 | 50 | 51 | Seller 52 | 53 | SuperComNet 54 | GST invoice available 55 | View more sellers starting from ₹329 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Description 65 | {product.description} 66 | 67 | 68 |
69 | 70 | ) 71 | } 72 | 73 | export default ProductDetail; -------------------------------------------------------------------------------- /client/src/Components/Header/Header.jsx: -------------------------------------------------------------------------------- 1 | import { AppBar, Toolbar, makeStyles, Box, Typography, withStyles, IconButton, Drawer, List} from '@material-ui/core'; 2 | import { Link } from 'react-router-dom'; 3 | import CustomButtons from './CustomButtons'; 4 | import Search from './Search'; 5 | import { Menu } from '@material-ui/icons'; 6 | import { useState } from 'react'; 7 | 8 | const useStyle = makeStyles(theme => ({ 9 | header: { 10 | background: '#2874f0', 11 | height: 55 12 | }, 13 | component: { 14 | marginLeft: '12%', 15 | lineHeight: 0, 16 | color: '#FFFFFF', 17 | textDecoration: 'none' 18 | }, 19 | logo: { 20 | width: 75 21 | }, 22 | container: { 23 | display: 'flex', 24 | }, 25 | subHeading: { 26 | fontSize: 10, 27 | fontStyle: 'italic' 28 | }, 29 | subURL: { 30 | width: 10, 31 | height: 10, 32 | marginLeft: 4 33 | }, 34 | list: { 35 | width: 250 36 | }, 37 | menuButton: { 38 | display: 'none', 39 | [theme.breakpoints.down('sm')]: { 40 | display: 'block' 41 | } 42 | }, 43 | customButtons: { 44 | margin: '0 5% 0 auto', 45 | [theme.breakpoints.down('sm')]: { 46 | display: 'none' 47 | } 48 | } 49 | })); 50 | 51 | const ToolBar = withStyles({ 52 | root: { 53 | minHeight: 55 54 | }, 55 | })(Toolbar); 56 | 57 | const Header = () => { 58 | const classes = useStyle(); 59 | const logoURL = 'https://static-assets-web.flixcart.com/www/linchpin/fk-cp-zion/img/flipkart-plus_8d85f4.png'; 60 | const subURL = 'https://static-assets-web.flixcart.com/www/linchpin/fk-cp-zion/img/plus_aef861.png'; 61 | 62 | const [open, setOpen] = useState(false); 63 | 64 | const handleClose = () => { 65 | setOpen(false); 66 | } 67 | 68 | const handleOpen = () => { 69 | setOpen(true); 70 | } 71 | 72 | const list = () => ( 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | ); 81 | 82 | 83 | return ( 84 | 85 | 86 | 91 | 92 | 93 | 94 | 95 | {list()} 96 | 97 | 98 | 99 | 100 | 101 | Explore Plus 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | ) 110 | } 111 | 112 | export default Header; -------------------------------------------------------------------------------- /client/src/razorpay/razorpay.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import React, { useEffect, useState } from 'react'; 3 | 4 | function Razorpay() { 5 | const [loading, setLoading] = useState(false); 6 | const [orderAmount, setOrderAmount] = useState(0); 7 | const [orders, setOrders] = useState([]); 8 | 9 | const url = 'http://localhost:8000'; 10 | 11 | async function fetchOrders() { 12 | const { data } = await axios.get(`${url}/pay-res`); 13 | setOrders(data); 14 | console.log(orders); 15 | } 16 | useEffect(() => { 17 | fetchOrders(); 18 | }, []); 19 | 20 | const loadRazorpay=()=> { 21 | const script = document.createElement('script'); 22 | script.src = 'https://checkout.razorpay.com/v1/checkout.js'; 23 | script.onerror = () => { 24 | alert('Razorpay SDK failed to load. Are you online?'); 25 | }; 26 | script.onload = async () => { 27 | try { 28 | setLoading(true); 29 | const result = await axios.post(`${url}/create-order`, { 30 | amount: orderAmount, 31 | }); 32 | const { amount, id: order_id, currency } = result.data; 33 | const { 34 | data: { key: razorpayKey }, 35 | } = await axios.get(`${url}/get-razorpay-key`); 36 | 37 | const options = { 38 | key: razorpayKey, 39 | amount: orderAmount.toString(), 40 | currency: currency, 41 | name: 'example name', 42 | description: 'example transaction', 43 | order_id: order_id, 44 | handler: async function (response) { 45 | const result = await axios.post(`${url}/pay-order`, { 46 | amount: orderAmount, 47 | razorpayPaymentId: response.razorpay_payment_id, 48 | razorpayOrderId: response.razorpay_order_id, 49 | razorpaySignature: response.razorpay_signature, 50 | }); 51 | console.log(response); 52 | alert(result.data.msg); 53 | fetchOrders(); 54 | }, 55 | prefill: { 56 | name: 'example name', 57 | email: 'email@example.com', 58 | contact: '111111', 59 | }, 60 | notes: { 61 | address: 'example address', 62 | }, 63 | theme: { 64 | color: '#80c0f0', 65 | }, 66 | }; 67 | 68 | setLoading(false); 69 | const paymentObject = new window.Razorpay(options); 70 | paymentObject.open(); 71 | } catch (err) { 72 | alert(err); 73 | setLoading(false); 74 | } 75 | }; 76 | document.body.appendChild(script); 77 | } 78 | 79 | return ( 80 |
81 |

Razorpay Example: Node & React

82 |
83 |
84 |

Pay Order

85 | 94 | 95 | 98 | {loading &&
Loading...
} 99 |
100 |
101 |

List Orders

102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | {orders.map((x) => ( 113 | 114 | 115 | 116 | 117 | {/* */} 118 | 119 | ))} 120 | 121 |
IDAMOUNTISPAIDRAZORPAY
{x._id}{x.amount / 100}{x.isPaid ? 'YES' : 'NO'}{x.razorpay.paymentId}
122 |
123 |
124 | ); 125 | } 126 | 127 | export default Razorpay; -------------------------------------------------------------------------------- /client/src/Components/ItemDetails/DetailView.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | import { Box, Typography, makeStyles, Grid } from '@material-ui/core'; 3 | import ProductDetail from './ProductDetail'; 4 | import ActionItem from './ActionItem'; 5 | import { useParams } from 'react-router-dom'; 6 | import clsx from 'clsx'; 7 | import { getProductById } from '../../service/api'; 8 | import { useDispatch, useSelector } from 'react-redux'; 9 | 10 | import { getProductDetails } from '../../redux/actions/productActions'; 11 | 12 | const useStyles = makeStyles(theme => ({ 13 | component: { 14 | marginTop: 55, 15 | background: '#F2F2F2' 16 | }, 17 | container: { 18 | background: '#FFFFFF', 19 | // margin: '0 80px', 20 | display: 'flex', 21 | [theme.breakpoints.down('md')]: { 22 | margin: 0 23 | } 24 | }, 25 | rightContainer: { 26 | marginTop: 50, 27 | '& > *': { 28 | marginTop: 10 29 | } 30 | }, 31 | price: { 32 | fontSize: 28 33 | }, 34 | smallText: { 35 | fontSize: 14, 36 | }, 37 | greyTextColor: { 38 | color: '#878787' 39 | } 40 | })); 41 | 42 | const data = { 43 | id: '', 44 | url: '', 45 | detailUrl: '', 46 | title: { 47 | shortTitle: '', 48 | longTitle: '', 49 | }, 50 | price: { 51 | mrp: 0, 52 | cost: 0, 53 | discount: '' 54 | }, 55 | description: '', 56 | discount: '', 57 | tagline: '' 58 | }; 59 | 60 | const DetailView = ({ history, match }) => { 61 | const classes = useStyles(); 62 | const fassured = 'https://static-assets-web.flixcart.com/www/linchpin/fk-cp-zion/img/fa_62673a.png' 63 | const [ product, setProduct ] = useState(data); 64 | const [ loading, setLoading ] = useState(false); 65 | const { id } = useParams(); 66 | 67 | const [ quantity, setQuantity ] = useState(1); 68 | 69 | const productDetails = useSelector(state => state.getProductDetails); 70 | // const { loading, product } = productDetails; 71 | 72 | const dispatch = useDispatch(); 73 | 74 | useEffect(() => { 75 | if(product && match.params.id !== product.id) 76 | dispatch(getProductDetails(match.params.id)); 77 | }, [dispatch, product, match, loading]); 78 | 79 | 80 | const getProductValues = async () => { 81 | setLoading(true); 82 | const response = await getProductById(id); 83 | console.log(response.data); 84 | setProduct(response.data); 85 | setLoading(false); 86 | } 87 | useEffect(() => { 88 | getProductValues(); 89 | }, [getProductValues]); 90 | 91 | return ( 92 | 93 | 94 | { product && Object.keys(product).length && 95 | 96 | 97 | 98 | 99 | 100 | {product.title.longTitle} 101 | 102 | 8 Ratings & 1 Reviews 103 | 104 | 105 | 106 | ₹{product.price.cost}    107 | ₹{product.price.mrp}    108 | {product.price.discount} off 109 | 110 | 111 | 112 | 113 | } 114 | 115 | ) 116 | } 117 | 118 | export default DetailView; -------------------------------------------------------------------------------- /client/src/Components/Home/Slide.jsx: -------------------------------------------------------------------------------- 1 | import { Box, Typography, makeStyles, Button, Divider } from '@material-ui/core'; 2 | import Carousel from 'react-multi-carousel'; 3 | import "react-multi-carousel/lib/styles.css"; 4 | import Countdown from 'react-countdown'; 5 | import { Link } from 'react-router-dom'; 6 | 7 | 8 | const responsive = { 9 | desktop: { 10 | breakpoint: { max: 3000, min: 1024 }, 11 | items: 5, 12 | }, 13 | tablet: { 14 | breakpoint: { max: 1024, min: 464 }, 15 | items: 2, 16 | }, 17 | mobile: { 18 | breakpoint: { max: 464, min: 0 }, 19 | items: 1, 20 | } 21 | }; 22 | 23 | const useStyle = makeStyles(theme => ({ 24 | component: { 25 | marginTop: 12, 26 | background: '#FFFFFF' 27 | }, 28 | timer: { 29 | color: '#7f7f7f', 30 | marginLeft: 10, 31 | display: 'flex', 32 | alignItems: 'center', 33 | [theme.breakpoints.down('sm')]: { 34 | display: 'none' 35 | } 36 | }, 37 | image: { 38 | width: 'auto', 39 | height: 150 40 | }, 41 | text: { 42 | fontSize: 14, 43 | marginTop: 5 44 | }, 45 | deal: { 46 | display: 'flex', 47 | padding: '15px 20px' 48 | }, 49 | dealText: { 50 | fontSize: 22, 51 | fontWeight: 600, 52 | lineHeight: '32px', 53 | marginRight: 25 54 | }, 55 | button: { 56 | marginLeft: 'auto', 57 | backgroundColor: '#2874f0', 58 | borderRadius: 2, 59 | fontSize: 13 60 | }, 61 | wrapper: { 62 | padding: '25px 15px' 63 | }, 64 | 65 | })); 66 | 67 | const MultiSlide = ({ data, timer, title }) => { 68 | const classes = useStyle(); 69 | const timerURL = 'https://static-assets-web.flixcart.com/www/linchpin/fk-cp-zion/img/timer_a73398.svg'; 70 | 71 | const renderer = ({ hours, minutes, seconds }) => { 72 | return {hours} : {minutes} : {seconds} Left; 73 | }; 74 | 75 | return ( 76 | 77 | 78 | {title} 79 | { 80 | timer && 81 | time clock 82 | 83 | 84 | } 85 | 86 | 87 | 88 | 103 | { 104 | data.map(temp => ( 105 | 106 | 107 | 108 | {temp.title.shortTitle} 109 | {temp.discount} 110 | {temp.tagline} 111 | 112 | 113 | )) 114 | } 115 | 116 | 117 | ) 118 | } 119 | 120 | const Slide = (props) => { 121 | return ( 122 | <> 123 | { 124 | props.multi === true ? : '' 125 | } 126 | 127 | ) 128 | } 129 | 130 | export default Slide; -------------------------------------------------------------------------------- /client/src/constant/data.js: -------------------------------------------------------------------------------- 1 | export const navData = [ 2 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/f15c02bfeb02d15d.png?q=100', text: 'Top Offers' }, 3 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/29327f40e9c4d26b.png?q=100', text: 'Grocery' }, 4 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/22fddf3c7da4c4f4.png?q=100', text: 'Mobile' }, 5 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/82b3ca5fb2301045.png?q=100', text: 'Fashion' }, 6 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/69c6589653afdb9a.png?q=100', text: 'Electronics' }, 7 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/ee162bad964c46ae.png?q=100', text: 'Home' }, 8 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/0ff199d1bd27eb98.png?q=100', text: 'Appliances' }, 9 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/71050627a56b4693.png?q=100', text: 'Travel' }, 10 | { url: 'https://rukminim1.flixcart.com/flap/128/128/image/dff3f7adcf3a90c6.png?q=100', text: 'Beauty, Toys & More' } 11 | ]; 12 | 13 | export const bannerData = [ 14 | 'https://rukminim1.flixcart.com/flap/3376/560/image/d117a62eb5fbb8e1.jpg?q=50', 15 | 'https://rukminim1.flixcart.com/flap/3376/560/image/57267a180af306fe.jpg?q=50', 16 | 'https://rukminim1.flixcart.com/flap/3376/560/image/ae9966569097a8b7.jpg?q=50', 17 | 'https://rukminim1.flixcart.com/flap/3376/560/image/f6202f13b6f89b03.jpg?q=50' 18 | ] 19 | 20 | export const dealData = [ 21 | { 22 | id: 'product1', 23 | url: 'https://rukminim1.flixcart.com/image/200/200/khf63680/cases-covers/back-cover/d/7/g/spigen-acs02256-original-imafxfgbffqaugur.jpeg?q=70', 24 | detailUrl: '', 25 | title: { 26 | shortTitle: 'Mobile Covers' 27 | }, 28 | discount: 'Extra 10% Off', 29 | tagline: 'Deal of the day' 30 | }, 31 | { 32 | id: 'product2', 33 | url: 'https://rukminim1.flixcart.com/image/200/200/k5lcvbk0/moisturizer-cream/9/w/g/600-body-lotion-aloe-hydration-for-normal-skin-nivea-lotion-original-imafz8jb3ftt8gf9.jpeg?q=70', 34 | title: { 35 | shortTitle: 'Skin & Hair Care' 36 | }, 37 | discount: 'From 99+5% Off', 38 | tagline: 'Shampoos, Face Washes & More' 39 | }, 40 | { 41 | id: 'product3', 42 | url: 'https://rukminim1.flixcart.com/flap/200/200/image/74bc985c62f19245.jpeg?q=70', 43 | title: { 44 | shortTitle: 'Skybags & Safari' 45 | }, 46 | discount: 'Upto 70% Off', 47 | tagline: 'Deal of the Day' 48 | }, 49 | { 50 | id: 'product4', 51 | url: 'https://rukminim1.flixcart.com/image/300/300/kll7bm80/smartwatch/c/1/n/43-mo-sw-sense-500-android-ios-molife-original-imagyzyycnpujyjh.jpeg?q=70', 52 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kll7bm80/smartwatch/c/1/n/43-mo-sw-sense-500-android-ios-molife-original-imagyzyycnpujyjh.jpeg?q=70', 53 | title: { 54 | shortTitle: 'Smart Watches', 55 | longTitle: 'Molife Sense 500 Smartwatch (Black Strap, Freesize)', 56 | }, 57 | price: { 58 | mrp: 6999, 59 | cost: 4049, 60 | discount: '42%' 61 | }, 62 | description: 'The Molife Sense 500, a brilliant smartwatch with a beautiful large display. Say hello to the infinity 1.7-inch display with 2.5D curved edges. Thanks to seamless Bluetooth 5.0 connectivity, you wont have to keep waiting. Bring a change to your outfit every day with changeable straps. A splash of color every day keeps the boredom away.', 63 | discount: 'Grab Now', 64 | tagline: 'Best Seller' 65 | }, 66 | { 67 | id: 'product5', 68 | url: 'https://rukminim1.flixcart.com/flap/150/150/image/b616a7aa607d3be0.jpg?q=70', 69 | title: { 70 | shortTitle: 'Sports & Fitness Essentials' 71 | }, 72 | discount: 'Upto 80% Off', 73 | tagline: 'Ab Exerciser, Yoga & more' 74 | } 75 | ]; 76 | 77 | export const furnitureData = [ 78 | { 79 | url: 'https://rukminim1.flixcart.com/image/300/300/ke7ff680/hammock-swing/j/f/u/q3-jkaf-y3l0-furniture-kart-original-imafux96kpy7grch.jpeg?q=70', 80 | title: { 81 | shortTitle: 'Hammock And Swings' 82 | }, 83 | discount: 'From ₹199', 84 | tagline: 'Trendy Collection' 85 | }, 86 | { 87 | url: 'https://rukminim1.flixcart.com/image/300/300/bean-bag/h/v/b/f8-the-furniture-store-xxxl-original-imae65d3wg7qzpkn.jpeg?q=70', 88 | title: { 89 | shortTitle: 'Bean Bag Covers' 90 | }, 91 | discount: 'Min 80% Off', 92 | tagline: 'XL, XXL & More' 93 | }, 94 | { 95 | url: 'https://rukminim1.flixcart.com/image/300/300/jlcmavk0/aquarium-tank/s/4/5/usb-desktop-aquarium-with-running-water-calendar-temperature-and-original-imaf8hv4nkv55gx8.jpeg?q=70', 96 | title: { 97 | shortTitle: 'Aquarium Tank' 98 | }, 99 | discount: 'From ₹299', 100 | tagline: 'Flat, Round, Cube & More' 101 | }, 102 | { 103 | url: 'https://rukminim1.flixcart.com/image/300/300/jffpoy80/office-study-chair/v/v/z/pp-am-5001cb-apex-original-imaf3u8rbr5cdycv.jpeg?q=70', 104 | title: { 105 | shortTitle: 'Office & Study Chairs' 106 | }, 107 | discount: 'Min 50% Off', 108 | tagline: 'Fabric & Leatherette' 109 | }, 110 | { 111 | url: 'https://rukminim1.flixcart.com/image/300/300/jvcp9jk0/recliner/z/w/x/brown-top-grain-leather-sf7018011-1-royaloak-original-imafg9s9hh9vzpf3.jpeg?q=70', 112 | title: { 113 | shortTitle: 'Recliner' 114 | }, 115 | discount: 'From ₹4999', 116 | tagline: 'Bantia, RoyalOak & More' 117 | }, 118 | { 119 | url: 'https://rukminim1.flixcart.com/image/300/300/jlqwpe80-1/tv-entertainment-unit/d/t/f/particle-board-holland-tv-unit-black-forzza-black-original-imaf8t5ybywcdtys.jpeg?q=70', 120 | title: { 121 | shortTitle: 'Tv Units' 122 | }, 123 | discount: 'From ₹2100', 124 | tagline: 'Forzza, Zuari & more' 125 | }, 126 | { 127 | url: 'https://rukminim1.flixcart.com/image/300/300/inflatable-sofa/6/j/s/wsb031a-velvet-wds-original-imaeaphzbkgrz3xp.jpeg?q=70', 128 | title: { 129 | shortTitle: 'Inflatable Sofas' 130 | }, 131 | discount: 'Min 50% Off', 132 | tagline: 'Furn Central & more' 133 | }, 134 | ]; -------------------------------------------------------------------------------- /client/src/Components/Login/LoginDialog.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from 'react'; 2 | import { Dialog, DialogContent, TextField, Box, Button, makeStyles, Typography } from '@material-ui/core'; 3 | import { authenticateLogin, authenticateSignup } from '../../service/api'; 4 | 5 | const useStyle = makeStyles({ 6 | component: { 7 | height: '70vh', 8 | width: '90vh', 9 | maxWidth: 'unset !important' 10 | }, 11 | image: { 12 | backgroundImage: `url(${'https://static-assets-web.flixcart.com/www/linchpin/fk-cp-zion/img/login_img_c4a81e.png'})`, 13 | background: '#2874f0', 14 | backgroundPosition: 'center 85%', 15 | backgroundRepeat: 'no-repeat', 16 | height: '70vh', 17 | width: '40%', 18 | padding: '45px 35px', 19 | '& > *': { 20 | color: '#FFFFFF', 21 | fontWeight: 600 22 | } 23 | }, 24 | login: { 25 | padding: '25px 35px', 26 | display: 'flex', 27 | flex: 1, 28 | flexDirection: 'column', 29 | '& > *': { 30 | marginTop: 20 31 | } 32 | }, 33 | loginbtn: { 34 | textTransform: 'none', 35 | background: '#FB641B', 36 | color: '#fff', 37 | height: 48, 38 | borderRadius: 2 39 | }, 40 | requestbtn: { 41 | textTransform: 'none', 42 | background: '#fff', 43 | color: '#2874f0', 44 | height: 48, 45 | borderRadius: 2, 46 | boxShadow: '0 2px 4px 0 rgb(0 0 0 / 20%)' 47 | }, 48 | text: { 49 | color: '#878787', 50 | fontSize: 12 51 | }, 52 | createText: { 53 | margin: 'auto 0 5px 0', 54 | textAlign: 'center', 55 | color: '#2874f0', 56 | fontWeight: 600, 57 | fontSize: 14, 58 | cursor: 'pointer' 59 | }, 60 | error: { 61 | fontSize: 10, 62 | color: '#ff6161', 63 | lineHeight: 0, 64 | marginTop: 10, 65 | fontWeight: 600 66 | } 67 | }) 68 | 69 | const loginInitialValues = { 70 | email: '', 71 | password: '' 72 | }; 73 | 74 | const signupInitialValues = { 75 | firstname: '', 76 | lastname: '', 77 | username: '', 78 | email: '', 79 | password: '', 80 | phone: '' 81 | }; 82 | 83 | const accountInitialValues = { 84 | login: { 85 | view: 'login', 86 | heading: 'Login', 87 | subHeading: 'Get access to your Orders, Wishlist and Recommendations' 88 | }, 89 | signup: { 90 | view: 'signup', 91 | heading: "Looks like you're new here", 92 | subHeading: 'Signup to get started' 93 | } 94 | } 95 | 96 | const LoginDialog = ({ open, setOpen, setAccount }) => { 97 | const classes = useStyle(); 98 | const [ login, setLogin ] = useState(loginInitialValues); 99 | const [ signup, setSignup ] = useState(signupInitialValues); 100 | const [ error, showError] = useState(false); 101 | const [ account, toggleAccount ] = useState(accountInitialValues.login); 102 | 103 | useEffect(() => { 104 | showError(false); 105 | }, [login]) 106 | 107 | const onValueChange = (e) => { 108 | setLogin({ ...login, [e.target.name]: e.target.value }); 109 | } 110 | 111 | const onInputChange = (e) => { 112 | setSignup({ ...signup, [e.target.name]: e.target.value }); 113 | } 114 | 115 | const loginUser = async() => { 116 | let response = await authenticateLogin(login); 117 | if(!response) 118 | showError(true); 119 | else { 120 | showError(false); 121 | handleClose(); 122 | setAccount(response.data.username); 123 | } 124 | } 125 | 126 | const signupUser = async() => { 127 | let response = await authenticateSignup(signup); 128 | if(!response) return; 129 | handleClose(); 130 | setAccount(signup.username); 131 | } 132 | 133 | const toggleSignup = () => { 134 | toggleAccount(accountInitialValues.signup); 135 | } 136 | 137 | const handleClose = () => { 138 | setOpen(false); 139 | toggleAccount(accountInitialValues.login); 140 | } 141 | 142 | return ( 143 | 144 | 145 | 146 | 147 | {account.heading} 148 | {account.subHeading} 149 | 150 | { 151 | account.view === 'login' ? 152 | 153 | onValueChange(e)} name='email' label='Enter Email/Mobile number' /> 154 | { error && Please enter valid Email ID/Mobile number } 155 | onValueChange(e)} name='password' label='Enter Password' /> 156 | By continuing, you agree to Flipkart's Terms of Use and Privacy Policy. 157 | 158 | OR 159 | 160 | toggleSignup()}>New to Flipkart? Create an account 161 | : 162 | 163 | onInputChange(e)} name='firstname' label='Enter Firstname' /> 164 | onInputChange(e)} name='lastname' label='Enter Lastname' /> 165 | onInputChange(e)} name='username' label='Enter Username' /> 166 | onInputChange(e)} name='email' label='Enter Email' /> 167 | onInputChange(e)} name='password' label='Enter Password' /> 168 | onInputChange(e)} name='phone' label='Enter Phone' /> 169 | 170 | 171 | } 172 | 173 | 174 | 175 | ) 176 | } 177 | 178 | export default LoginDialog; -------------------------------------------------------------------------------- /server/constants/product.js: -------------------------------------------------------------------------------- 1 | export const products = [ 2 | { 3 | id: 'product1', 4 | url: 'https://rukminim1.flixcart.com/image/150/150/kapoo7k0/electric-kettle/p/6/s/pigeon-favourite-original-imafs7xhj5uwgrh4.jpeg?q=70', 5 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kapoo7k0/electric-kettle/p/6/s/pigeon-favourite-original-imafs7xhj5uwgrh4.jpeg?q=70', 6 | title: { 7 | shortTitle: 'Home & Kitchen', 8 | longTitle: 'Pigeon FAVOURITE Electric Kettle (1.5 L, Silver, Black)' 9 | }, 10 | price: { 11 | mrp: 1195, 12 | cost: 625, 13 | discount: '47%' 14 | }, 15 | quantity: 1, 16 | description: 'This electric kettle from Pigeon will soon become a travelers best friend, a hostelite saviour and an answer to all the midnight cravings. With this handy appliance, you can boil water and use it to make instant noodles, packet soup, coffee and green tea.', 17 | discount: 'Extra 10% Off', 18 | tagline: 'Deal of the day' 19 | }, 20 | { 21 | id: 'product2', 22 | url: 'https://rukminim1.flixcart.com/image/416/416/kl6wx3k0/sandwich-maker/8/r/d/sandwich-01-flipkart-smartbuy-original-imagydds4zthxt8z.jpeg?q=70', 23 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kl6wx3k0/sandwich-maker/8/r/d/sandwich-01-flipkart-smartbuy-original-imagydds4zthxt8z.jpeg?q=70', 24 | title: { 25 | shortTitle: 'Sandwich Makers', 26 | longTitle: 'Flipkart SmartBuy Sandwich 01 Grill (Black)' 27 | }, 28 | price: { 29 | mrp: 1499, 30 | cost: 899, 31 | discount: '40%' 32 | }, 33 | quantity: 1, 34 | description: 'This non-stick sandwich toaster .easy to use and very handy. Directly hold over flame to make tasty toasts and toasted sandwiches. Specially designed by keeping your needs in mind, the sandwich maker makes whatever youre doing simpler, smarter and better', 35 | discount: 'From 99+5% Off', 36 | tagline: 'Pestige, Nova & more' 37 | }, 38 | { 39 | id: 'product3', 40 | url: 'https://rukminim1.flixcart.com/image/150/150/kohigsw0/resistance-tube/c/s/e/new-adjustable-single-resistance-tube-multicolor-na-ajro-deal-original-imag2xg88mhmwxz5.jpeg?q=70', 41 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kohigsw0/resistance-tube/c/s/e/new-adjustable-single-resistance-tube-multicolor-na-ajro-deal-original-imag2xg88mhmwxz5.jpeg?q=70', 42 | title: { 43 | shortTitle: 'Fitness Gear', 44 | longTitle: 'AJRO DEAL New Adjustable Single Resistance Tube (Multicolor) Resistance Tube (Multicolor)' 45 | }, 46 | price: { 47 | mrp: 499, 48 | cost: 166, 49 | discount: '66%' 50 | }, 51 | quantity: 1, 52 | description: 'This unique product can tone your back muscles, reduce belly fat, improve blood circulation and also improves your body posture. It increases the stamina, energy and vitality of the body. The elastic resistance of the rubber training rope can be used to train and exercise in whichever way you want, according to your physical needs.', 53 | discount: 'Upto 70% Off', 54 | tagline: 'Deal of the Day' 55 | }, 56 | { 57 | id: 'product4', 58 | url: 'https://rukminim1.flixcart.com/image/300/300/kll7bm80/smartwatch/c/1/n/43-mo-sw-sense-500-android-ios-molife-original-imagyzyycnpujyjh.jpeg?q=70', 59 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kll7bm80/smartwatch/c/1/n/43-mo-sw-sense-500-android-ios-molife-original-imagyzyycnpujyjh.jpeg?q=70', 60 | title: { 61 | shortTitle: 'Smart Watches', 62 | longTitle: 'Molife Sense 500 Smartwatch (Black Strap, Freesize)', 63 | }, 64 | price: { 65 | mrp: 6999, 66 | cost: 4049, 67 | discount: '42%' 68 | }, 69 | quantity: 1, 70 | description: 'The Molife Sense 500, a brilliant smartwatch with a beautiful large display. Say hello to the infinity 1.7-inch display with 2.5D curved edges. Thanks to seamless Bluetooth 5.0 connectivity, you wont have to keep waiting. Bring a change to your outfit every day with changeable straps. A splash of color every day keeps the boredom away.', 71 | discount: 'Grab Now', 72 | tagline: 'Best Seller' 73 | }, 74 | { 75 | id: 'product5', 76 | url: 'https://rukminim1.flixcart.com/image/416/416/k3uhhu80/hair-dryer/n/m/t/nova-2800-w-professional-nhp-8220-original-imafmvwfhmzsxdrw.jpeg?q=70', 77 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/k3uhhu80/hair-dryer/n/m/t/nova-2800-w-professional-nhp-8220-original-imafmvwfhmzsxdrw.jpeg?q=70', 78 | title: { 79 | shortTitle: 'Trimmers, Dryers & more', 80 | longTitle: 'Nova Professional NHP 8220 Hair Dryer (1800 W, Multicolor)' 81 | }, 82 | price: { 83 | mrp: 1899, 84 | cost: 1124, 85 | discount: '40%' 86 | }, 87 | quantity: 1, 88 | description: '', 89 | discount: 'From ₹499', 90 | tagline: 'Kubra, Nova & more' 91 | }, 92 | { 93 | id: 'product6', 94 | url: 'https://rukminim1.flixcart.com/image/150/150/kk01pjk0/fan/d/d/l/tiktik-quiet-portable-table-fan-zigma-original-imafzg7ftzuckpad.jpeg?q=70', 95 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kk01pjk0/fan/d/d/l/tiktik-quiet-portable-table-fan-zigma-original-imafzg7ftzuckpad.jpeg?q=70', 96 | title: { 97 | shortTitle: 'Table Fans', 98 | longTitle: 'Portable 300 mm Ultra High Speed 3 Blade Table Fan (Black, Pack of 1)' 99 | }, 100 | price: { 101 | mrp: 2250, 102 | cost: 1199, 103 | discount: '46%' 104 | }, 105 | quantity: 1, 106 | description: 'Table Fan. Perfect size fan for use on a table, desk or in an RV. Whisper quiet, powerful airflow and reliable operation in a compact 6" size. Two adjustable speeds to customize airflow: high or low settings. Tough break-resistant ABS plastic blades. ', 107 | discount: 'Minimum 40% Off', 108 | tagline: 'Top Selling' 109 | }, 110 | { 111 | id: 'product7', 112 | url: 'https://rukminim1.flixcart.com/image/150/150/kcgk1ow0/headphone/n/u/a/235v2-fast-charging-boat-original-imaftk6us4af7bca.jpeg?q=70', 113 | detailUrl: 'https://rukminim1.flixcart.com/image/416/416/kcgk1ow0/headphone/n/u/a/235v2-fast-charging-boat-original-imaftk6us4af7bca.jpeg?q=70', 114 | title: { 115 | shortTitle: 'Headphones', 116 | longTitle: 'boAt Rockerz 235v2 with ASAP charging Version 5.0 Bluetooth Headset ' 117 | }, 118 | price: { 119 | mrp: 2990, 120 | cost: 1199, 121 | discount: '59%' 122 | }, 123 | quantity: 1, 124 | description: 'Let music brighten up your mood anytime, anywhere with the boAt 235v2 Fast Charging Bluetooth Headset. This Bluetooth headset features a Call Vibration Alert, a Fast Charging Technology, and Easy Access Controls to listen to and manage your favorite music with ease.', 125 | discount: 'Minimum 50% Off', 126 | tagline: 'Grab Now!' 127 | } 128 | ]; -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@sindresorhus/is": { 8 | "version": "0.14.0", 9 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", 10 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" 11 | }, 12 | "@szmarczak/http-timer": { 13 | "version": "1.1.2", 14 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", 15 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", 16 | "requires": { 17 | "defer-to-connect": "^1.0.1" 18 | } 19 | }, 20 | "@types/bson": { 21 | "version": "4.0.3", 22 | "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", 23 | "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", 24 | "requires": { 25 | "@types/node": "*" 26 | } 27 | }, 28 | "@types/mongodb": { 29 | "version": "3.6.12", 30 | "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.12.tgz", 31 | "integrity": "sha512-49aEzQD5VdHPxyd5dRyQdqEveAg9LanwrH8RQipnMuulwzKmODXIZRp0umtxi1eBUfEusRkoy8AVOMr+kVuFog==", 32 | "requires": { 33 | "@types/bson": "*", 34 | "@types/node": "*" 35 | } 36 | }, 37 | "@types/node": { 38 | "version": "15.0.3", 39 | "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.3.tgz", 40 | "integrity": "sha512-/WbxFeBU+0F79z9RdEOXH4CsDga+ibi5M8uEYr91u3CkT/pdWcV8MCook+4wDPnZBexRdwWS+PiVZ2xJviAzcQ==" 41 | }, 42 | "abbrev": { 43 | "version": "1.1.1", 44 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 45 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 46 | }, 47 | "accepts": { 48 | "version": "1.3.7", 49 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 50 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 51 | "requires": { 52 | "mime-types": "~2.1.24", 53 | "negotiator": "0.6.2" 54 | } 55 | }, 56 | "ajv": { 57 | "version": "6.12.6", 58 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 59 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 60 | "requires": { 61 | "fast-deep-equal": "^3.1.1", 62 | "fast-json-stable-stringify": "^2.0.0", 63 | "json-schema-traverse": "^0.4.1", 64 | "uri-js": "^4.2.2" 65 | } 66 | }, 67 | "ansi-align": { 68 | "version": "3.0.0", 69 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", 70 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", 71 | "requires": { 72 | "string-width": "^3.0.0" 73 | }, 74 | "dependencies": { 75 | "string-width": { 76 | "version": "3.1.0", 77 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 78 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 79 | "requires": { 80 | "emoji-regex": "^7.0.1", 81 | "is-fullwidth-code-point": "^2.0.0", 82 | "strip-ansi": "^5.1.0" 83 | } 84 | } 85 | } 86 | }, 87 | "ansi-regex": { 88 | "version": "4.1.0", 89 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 90 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 91 | }, 92 | "ansi-styles": { 93 | "version": "4.3.0", 94 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 95 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 96 | "requires": { 97 | "color-convert": "^2.0.1" 98 | } 99 | }, 100 | "anymatch": { 101 | "version": "3.1.2", 102 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 103 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 104 | "requires": { 105 | "normalize-path": "^3.0.0", 106 | "picomatch": "^2.0.4" 107 | } 108 | }, 109 | "array-flatten": { 110 | "version": "1.1.1", 111 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 112 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 113 | }, 114 | "asap": { 115 | "version": "2.0.6", 116 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 117 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 118 | }, 119 | "asn1": { 120 | "version": "0.2.4", 121 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 122 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 123 | "requires": { 124 | "safer-buffer": "~2.1.0" 125 | } 126 | }, 127 | "assert-plus": { 128 | "version": "1.0.0", 129 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 130 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 131 | }, 132 | "asynckit": { 133 | "version": "0.4.0", 134 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 135 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 136 | }, 137 | "aws-sign2": { 138 | "version": "0.7.0", 139 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 140 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 141 | }, 142 | "aws4": { 143 | "version": "1.11.0", 144 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 145 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 146 | }, 147 | "balanced-match": { 148 | "version": "1.0.2", 149 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 150 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 151 | }, 152 | "bcrypt-pbkdf": { 153 | "version": "1.0.2", 154 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 155 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 156 | "requires": { 157 | "tweetnacl": "^0.14.3" 158 | } 159 | }, 160 | "binary-extensions": { 161 | "version": "2.2.0", 162 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 163 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 164 | }, 165 | "bl": { 166 | "version": "2.2.1", 167 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", 168 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", 169 | "requires": { 170 | "readable-stream": "^2.3.5", 171 | "safe-buffer": "^5.1.1" 172 | } 173 | }, 174 | "bluebird": { 175 | "version": "3.5.1", 176 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 177 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 178 | }, 179 | "body-parser": { 180 | "version": "1.19.0", 181 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 182 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 183 | "requires": { 184 | "bytes": "3.1.0", 185 | "content-type": "~1.0.4", 186 | "debug": "2.6.9", 187 | "depd": "~1.1.2", 188 | "http-errors": "1.7.2", 189 | "iconv-lite": "0.4.24", 190 | "on-finished": "~2.3.0", 191 | "qs": "6.7.0", 192 | "raw-body": "2.4.0", 193 | "type-is": "~1.6.17" 194 | } 195 | }, 196 | "boxen": { 197 | "version": "4.2.0", 198 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", 199 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", 200 | "requires": { 201 | "ansi-align": "^3.0.0", 202 | "camelcase": "^5.3.1", 203 | "chalk": "^3.0.0", 204 | "cli-boxes": "^2.2.0", 205 | "string-width": "^4.1.0", 206 | "term-size": "^2.1.0", 207 | "type-fest": "^0.8.1", 208 | "widest-line": "^3.1.0" 209 | } 210 | }, 211 | "brace-expansion": { 212 | "version": "1.1.11", 213 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 214 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 215 | "requires": { 216 | "balanced-match": "^1.0.0", 217 | "concat-map": "0.0.1" 218 | } 219 | }, 220 | "braces": { 221 | "version": "3.0.2", 222 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 223 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 224 | "requires": { 225 | "fill-range": "^7.0.1" 226 | } 227 | }, 228 | "bson": { 229 | "version": "1.1.6", 230 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", 231 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" 232 | }, 233 | "bytes": { 234 | "version": "3.1.0", 235 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 236 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 237 | }, 238 | "cacheable-request": { 239 | "version": "6.1.0", 240 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 241 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", 242 | "requires": { 243 | "clone-response": "^1.0.2", 244 | "get-stream": "^5.1.0", 245 | "http-cache-semantics": "^4.0.0", 246 | "keyv": "^3.0.0", 247 | "lowercase-keys": "^2.0.0", 248 | "normalize-url": "^4.1.0", 249 | "responselike": "^1.0.2" 250 | }, 251 | "dependencies": { 252 | "get-stream": { 253 | "version": "5.2.0", 254 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 255 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 256 | "requires": { 257 | "pump": "^3.0.0" 258 | } 259 | }, 260 | "lowercase-keys": { 261 | "version": "2.0.0", 262 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 263 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" 264 | } 265 | } 266 | }, 267 | "camelcase": { 268 | "version": "5.3.1", 269 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 270 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 271 | }, 272 | "caseless": { 273 | "version": "0.12.0", 274 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 275 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 276 | }, 277 | "chalk": { 278 | "version": "3.0.0", 279 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 280 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 281 | "requires": { 282 | "ansi-styles": "^4.1.0", 283 | "supports-color": "^7.1.0" 284 | }, 285 | "dependencies": { 286 | "has-flag": { 287 | "version": "4.0.0", 288 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 289 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 290 | }, 291 | "supports-color": { 292 | "version": "7.2.0", 293 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 294 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 295 | "requires": { 296 | "has-flag": "^4.0.0" 297 | } 298 | } 299 | } 300 | }, 301 | "chokidar": { 302 | "version": "3.5.1", 303 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 304 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 305 | "requires": { 306 | "anymatch": "~3.1.1", 307 | "braces": "~3.0.2", 308 | "fsevents": "~2.3.1", 309 | "glob-parent": "~5.1.0", 310 | "is-binary-path": "~2.1.0", 311 | "is-glob": "~4.0.1", 312 | "normalize-path": "~3.0.0", 313 | "readdirp": "~3.5.0" 314 | } 315 | }, 316 | "ci-info": { 317 | "version": "2.0.0", 318 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", 319 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" 320 | }, 321 | "cli-boxes": { 322 | "version": "2.2.1", 323 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", 324 | "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" 325 | }, 326 | "clone-response": { 327 | "version": "1.0.2", 328 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 329 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", 330 | "requires": { 331 | "mimic-response": "^1.0.0" 332 | } 333 | }, 334 | "color-convert": { 335 | "version": "2.0.1", 336 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 337 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 338 | "requires": { 339 | "color-name": "~1.1.4" 340 | } 341 | }, 342 | "color-name": { 343 | "version": "1.1.4", 344 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 345 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 346 | }, 347 | "combined-stream": { 348 | "version": "1.0.8", 349 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 350 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 351 | "requires": { 352 | "delayed-stream": "~1.0.0" 353 | } 354 | }, 355 | "concat-map": { 356 | "version": "0.0.1", 357 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 358 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 359 | }, 360 | "configstore": { 361 | "version": "5.0.1", 362 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", 363 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", 364 | "requires": { 365 | "dot-prop": "^5.2.0", 366 | "graceful-fs": "^4.1.2", 367 | "make-dir": "^3.0.0", 368 | "unique-string": "^2.0.0", 369 | "write-file-atomic": "^3.0.0", 370 | "xdg-basedir": "^4.0.0" 371 | } 372 | }, 373 | "content-disposition": { 374 | "version": "0.5.3", 375 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 376 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 377 | "requires": { 378 | "safe-buffer": "5.1.2" 379 | } 380 | }, 381 | "content-type": { 382 | "version": "1.0.4", 383 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 384 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 385 | }, 386 | "cookie": { 387 | "version": "0.4.0", 388 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 389 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 390 | }, 391 | "cookie-signature": { 392 | "version": "1.0.6", 393 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 394 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 395 | }, 396 | "core-util-is": { 397 | "version": "1.0.2", 398 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 399 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 400 | }, 401 | "cors": { 402 | "version": "2.8.5", 403 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 404 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 405 | "requires": { 406 | "object-assign": "^4", 407 | "vary": "^1" 408 | } 409 | }, 410 | "crypto-random-string": { 411 | "version": "2.0.0", 412 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 413 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" 414 | }, 415 | "dashdash": { 416 | "version": "1.14.1", 417 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 418 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 419 | "requires": { 420 | "assert-plus": "^1.0.0" 421 | } 422 | }, 423 | "debug": { 424 | "version": "2.6.9", 425 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 426 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 427 | "requires": { 428 | "ms": "2.0.0" 429 | } 430 | }, 431 | "decompress-response": { 432 | "version": "3.3.0", 433 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 434 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 435 | "requires": { 436 | "mimic-response": "^1.0.0" 437 | } 438 | }, 439 | "deep-extend": { 440 | "version": "0.6.0", 441 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 442 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 443 | }, 444 | "defer-to-connect": { 445 | "version": "1.1.3", 446 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", 447 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" 448 | }, 449 | "delayed-stream": { 450 | "version": "1.0.0", 451 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 452 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 453 | }, 454 | "denque": { 455 | "version": "1.5.0", 456 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", 457 | "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" 458 | }, 459 | "depd": { 460 | "version": "1.1.2", 461 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 462 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 463 | }, 464 | "destroy": { 465 | "version": "1.0.4", 466 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 467 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 468 | }, 469 | "dot-env": { 470 | "version": "0.0.1", 471 | "resolved": "https://registry.npmjs.org/dot-env/-/dot-env-0.0.1.tgz", 472 | "integrity": "sha1-5ENMuMaRQ+RFvCinKUN+T6vYjIA=" 473 | }, 474 | "dot-prop": { 475 | "version": "5.3.0", 476 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 477 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", 478 | "requires": { 479 | "is-obj": "^2.0.0" 480 | } 481 | }, 482 | "dotenv": { 483 | "version": "9.0.2", 484 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", 485 | "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==" 486 | }, 487 | "duplexer3": { 488 | "version": "0.1.4", 489 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", 490 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" 491 | }, 492 | "ecc-jsbn": { 493 | "version": "0.1.2", 494 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 495 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 496 | "requires": { 497 | "jsbn": "~0.1.0", 498 | "safer-buffer": "^2.1.0" 499 | } 500 | }, 501 | "ee-first": { 502 | "version": "1.1.1", 503 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 504 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 505 | }, 506 | "emoji-regex": { 507 | "version": "7.0.3", 508 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 509 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 510 | }, 511 | "encodeurl": { 512 | "version": "1.0.2", 513 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 514 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 515 | }, 516 | "end-of-stream": { 517 | "version": "1.4.4", 518 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 519 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 520 | "requires": { 521 | "once": "^1.4.0" 522 | } 523 | }, 524 | "escape-goat": { 525 | "version": "2.1.1", 526 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", 527 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" 528 | }, 529 | "escape-html": { 530 | "version": "1.0.3", 531 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 532 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 533 | }, 534 | "etag": { 535 | "version": "1.8.1", 536 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 537 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 538 | }, 539 | "express": { 540 | "version": "4.17.1", 541 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 542 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 543 | "requires": { 544 | "accepts": "~1.3.7", 545 | "array-flatten": "1.1.1", 546 | "body-parser": "1.19.0", 547 | "content-disposition": "0.5.3", 548 | "content-type": "~1.0.4", 549 | "cookie": "0.4.0", 550 | "cookie-signature": "1.0.6", 551 | "debug": "2.6.9", 552 | "depd": "~1.1.2", 553 | "encodeurl": "~1.0.2", 554 | "escape-html": "~1.0.3", 555 | "etag": "~1.8.1", 556 | "finalhandler": "~1.1.2", 557 | "fresh": "0.5.2", 558 | "merge-descriptors": "1.0.1", 559 | "methods": "~1.1.2", 560 | "on-finished": "~2.3.0", 561 | "parseurl": "~1.3.3", 562 | "path-to-regexp": "0.1.7", 563 | "proxy-addr": "~2.0.5", 564 | "qs": "6.7.0", 565 | "range-parser": "~1.2.1", 566 | "safe-buffer": "5.1.2", 567 | "send": "0.17.1", 568 | "serve-static": "1.14.1", 569 | "setprototypeof": "1.1.1", 570 | "statuses": "~1.5.0", 571 | "type-is": "~1.6.18", 572 | "utils-merge": "1.0.1", 573 | "vary": "~1.1.2" 574 | } 575 | }, 576 | "extend": { 577 | "version": "3.0.2", 578 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 579 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 580 | }, 581 | "extsprintf": { 582 | "version": "1.3.0", 583 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 584 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 585 | }, 586 | "fast-deep-equal": { 587 | "version": "3.1.3", 588 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 589 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 590 | }, 591 | "fast-json-stable-stringify": { 592 | "version": "2.1.0", 593 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 594 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 595 | }, 596 | "fill-range": { 597 | "version": "7.0.1", 598 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 599 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 600 | "requires": { 601 | "to-regex-range": "^5.0.1" 602 | } 603 | }, 604 | "finalhandler": { 605 | "version": "1.1.2", 606 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 607 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 608 | "requires": { 609 | "debug": "2.6.9", 610 | "encodeurl": "~1.0.2", 611 | "escape-html": "~1.0.3", 612 | "on-finished": "~2.3.0", 613 | "parseurl": "~1.3.3", 614 | "statuses": "~1.5.0", 615 | "unpipe": "~1.0.0" 616 | } 617 | }, 618 | "forever-agent": { 619 | "version": "0.6.1", 620 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 621 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 622 | }, 623 | "form-data": { 624 | "version": "2.3.3", 625 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 626 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 627 | "requires": { 628 | "asynckit": "^0.4.0", 629 | "combined-stream": "^1.0.6", 630 | "mime-types": "^2.1.12" 631 | } 632 | }, 633 | "formidable": { 634 | "version": "1.2.2", 635 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", 636 | "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" 637 | }, 638 | "forwarded": { 639 | "version": "0.1.2", 640 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 641 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 642 | }, 643 | "fresh": { 644 | "version": "0.5.2", 645 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 646 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 647 | }, 648 | "fsevents": { 649 | "version": "2.3.2", 650 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 651 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 652 | "optional": true 653 | }, 654 | "get-stream": { 655 | "version": "4.1.0", 656 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 657 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 658 | "requires": { 659 | "pump": "^3.0.0" 660 | } 661 | }, 662 | "getpass": { 663 | "version": "0.1.7", 664 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 665 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 666 | "requires": { 667 | "assert-plus": "^1.0.0" 668 | } 669 | }, 670 | "glob-parent": { 671 | "version": "5.1.2", 672 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 673 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 674 | "requires": { 675 | "is-glob": "^4.0.1" 676 | } 677 | }, 678 | "global-dirs": { 679 | "version": "2.1.0", 680 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", 681 | "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", 682 | "requires": { 683 | "ini": "1.3.7" 684 | } 685 | }, 686 | "got": { 687 | "version": "9.6.0", 688 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", 689 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", 690 | "requires": { 691 | "@sindresorhus/is": "^0.14.0", 692 | "@szmarczak/http-timer": "^1.1.2", 693 | "cacheable-request": "^6.0.0", 694 | "decompress-response": "^3.3.0", 695 | "duplexer3": "^0.1.4", 696 | "get-stream": "^4.1.0", 697 | "lowercase-keys": "^1.0.1", 698 | "mimic-response": "^1.0.1", 699 | "p-cancelable": "^1.0.0", 700 | "to-readable-stream": "^1.0.0", 701 | "url-parse-lax": "^3.0.0" 702 | } 703 | }, 704 | "graceful-fs": { 705 | "version": "4.2.6", 706 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 707 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" 708 | }, 709 | "har-schema": { 710 | "version": "2.0.0", 711 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 712 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 713 | }, 714 | "har-validator": { 715 | "version": "5.1.5", 716 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 717 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 718 | "requires": { 719 | "ajv": "^6.12.3", 720 | "har-schema": "^2.0.0" 721 | } 722 | }, 723 | "has-flag": { 724 | "version": "3.0.0", 725 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 726 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 727 | }, 728 | "has-yarn": { 729 | "version": "2.1.0", 730 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", 731 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" 732 | }, 733 | "http-cache-semantics": { 734 | "version": "4.1.0", 735 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 736 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 737 | }, 738 | "http-errors": { 739 | "version": "1.7.2", 740 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 741 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 742 | "requires": { 743 | "depd": "~1.1.2", 744 | "inherits": "2.0.3", 745 | "setprototypeof": "1.1.1", 746 | "statuses": ">= 1.5.0 < 2", 747 | "toidentifier": "1.0.0" 748 | } 749 | }, 750 | "http-signature": { 751 | "version": "1.2.0", 752 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 753 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 754 | "requires": { 755 | "assert-plus": "^1.0.0", 756 | "jsprim": "^1.2.2", 757 | "sshpk": "^1.7.0" 758 | } 759 | }, 760 | "https": { 761 | "version": "1.0.0", 762 | "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", 763 | "integrity": "sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=" 764 | }, 765 | "iconv-lite": { 766 | "version": "0.4.24", 767 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 768 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 769 | "requires": { 770 | "safer-buffer": ">= 2.1.2 < 3" 771 | } 772 | }, 773 | "ignore-by-default": { 774 | "version": "1.0.1", 775 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 776 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" 777 | }, 778 | "import-lazy": { 779 | "version": "2.1.0", 780 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", 781 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" 782 | }, 783 | "imurmurhash": { 784 | "version": "0.1.4", 785 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 786 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 787 | }, 788 | "inherits": { 789 | "version": "2.0.3", 790 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 791 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 792 | }, 793 | "ini": { 794 | "version": "1.3.7", 795 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", 796 | "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" 797 | }, 798 | "ipaddr.js": { 799 | "version": "1.9.1", 800 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 801 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 802 | }, 803 | "is-binary-path": { 804 | "version": "2.1.0", 805 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 806 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 807 | "requires": { 808 | "binary-extensions": "^2.0.0" 809 | } 810 | }, 811 | "is-ci": { 812 | "version": "2.0.0", 813 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", 814 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", 815 | "requires": { 816 | "ci-info": "^2.0.0" 817 | } 818 | }, 819 | "is-extglob": { 820 | "version": "2.1.1", 821 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 822 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 823 | }, 824 | "is-fullwidth-code-point": { 825 | "version": "2.0.0", 826 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 827 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 828 | }, 829 | "is-glob": { 830 | "version": "4.0.1", 831 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 832 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 833 | "requires": { 834 | "is-extglob": "^2.1.1" 835 | } 836 | }, 837 | "is-installed-globally": { 838 | "version": "0.3.2", 839 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", 840 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", 841 | "requires": { 842 | "global-dirs": "^2.0.1", 843 | "is-path-inside": "^3.0.1" 844 | } 845 | }, 846 | "is-npm": { 847 | "version": "4.0.0", 848 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", 849 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" 850 | }, 851 | "is-number": { 852 | "version": "7.0.0", 853 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 854 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 855 | }, 856 | "is-obj": { 857 | "version": "2.0.0", 858 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 859 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" 860 | }, 861 | "is-path-inside": { 862 | "version": "3.0.3", 863 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 864 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" 865 | }, 866 | "is-typedarray": { 867 | "version": "1.0.0", 868 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 869 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 870 | }, 871 | "is-yarn-global": { 872 | "version": "0.3.0", 873 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", 874 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" 875 | }, 876 | "isarray": { 877 | "version": "1.0.0", 878 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 879 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 880 | }, 881 | "isstream": { 882 | "version": "0.1.2", 883 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 884 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 885 | }, 886 | "jsbn": { 887 | "version": "0.1.1", 888 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 889 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 890 | }, 891 | "json-buffer": { 892 | "version": "3.0.0", 893 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", 894 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" 895 | }, 896 | "json-schema": { 897 | "version": "0.2.3", 898 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 899 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 900 | }, 901 | "json-schema-traverse": { 902 | "version": "0.4.1", 903 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 904 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 905 | }, 906 | "json-stringify-safe": { 907 | "version": "5.0.1", 908 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 909 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 910 | }, 911 | "jsprim": { 912 | "version": "1.4.1", 913 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 914 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 915 | "requires": { 916 | "assert-plus": "1.0.0", 917 | "extsprintf": "1.3.0", 918 | "json-schema": "0.2.3", 919 | "verror": "1.10.0" 920 | } 921 | }, 922 | "kareem": { 923 | "version": "2.3.2", 924 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", 925 | "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" 926 | }, 927 | "keyv": { 928 | "version": "3.1.0", 929 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", 930 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", 931 | "requires": { 932 | "json-buffer": "3.0.0" 933 | } 934 | }, 935 | "latest-version": { 936 | "version": "5.1.0", 937 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", 938 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", 939 | "requires": { 940 | "package-json": "^6.3.0" 941 | } 942 | }, 943 | "lodash": { 944 | "version": "4.17.21", 945 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 946 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 947 | }, 948 | "lowercase-keys": { 949 | "version": "1.0.1", 950 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", 951 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" 952 | }, 953 | "make-dir": { 954 | "version": "3.1.0", 955 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 956 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 957 | "requires": { 958 | "semver": "^6.0.0" 959 | }, 960 | "dependencies": { 961 | "semver": { 962 | "version": "6.3.0", 963 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 964 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 965 | } 966 | } 967 | }, 968 | "media-typer": { 969 | "version": "0.3.0", 970 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 971 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 972 | }, 973 | "memory-pager": { 974 | "version": "1.5.0", 975 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 976 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 977 | "optional": true 978 | }, 979 | "merge-descriptors": { 980 | "version": "1.0.1", 981 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 982 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 983 | }, 984 | "methods": { 985 | "version": "1.1.2", 986 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 987 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 988 | }, 989 | "mime": { 990 | "version": "1.6.0", 991 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 992 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 993 | }, 994 | "mime-db": { 995 | "version": "1.47.0", 996 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", 997 | "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" 998 | }, 999 | "mime-types": { 1000 | "version": "2.1.30", 1001 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", 1002 | "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", 1003 | "requires": { 1004 | "mime-db": "1.47.0" 1005 | } 1006 | }, 1007 | "mimic-response": { 1008 | "version": "1.0.1", 1009 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1010 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" 1011 | }, 1012 | "minimatch": { 1013 | "version": "3.0.4", 1014 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1015 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1016 | "requires": { 1017 | "brace-expansion": "^1.1.7" 1018 | } 1019 | }, 1020 | "minimist": { 1021 | "version": "1.2.5", 1022 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1023 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1024 | }, 1025 | "mongodb": { 1026 | "version": "3.6.6", 1027 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.6.tgz", 1028 | "integrity": "sha512-WlirMiuV1UPbej5JeCMqE93JRfZ/ZzqE7nJTwP85XzjAF4rRSeq2bGCb1cjfoHLOF06+HxADaPGqT0g3SbVT1w==", 1029 | "requires": { 1030 | "bl": "^2.2.1", 1031 | "bson": "^1.1.4", 1032 | "denque": "^1.4.1", 1033 | "optional-require": "^1.0.2", 1034 | "safe-buffer": "^5.1.2", 1035 | "saslprep": "^1.0.0" 1036 | } 1037 | }, 1038 | "mongoose": { 1039 | "version": "5.12.9", 1040 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.9.tgz", 1041 | "integrity": "sha512-ZSDjW15DmUbHQcZ2PqoXsJeYnpYipISi6QJH/XHR9dcSg3IRNCa86apcTptBux03/YBPiSZlKNYUNDx7iuMWoA==", 1042 | "requires": { 1043 | "@types/mongodb": "^3.5.27", 1044 | "bson": "^1.1.4", 1045 | "kareem": "2.3.2", 1046 | "mongodb": "3.6.6", 1047 | "mongoose-legacy-pluralize": "1.0.2", 1048 | "mpath": "0.8.3", 1049 | "mquery": "3.2.5", 1050 | "ms": "2.1.2", 1051 | "regexp-clone": "1.0.0", 1052 | "safe-buffer": "5.2.1", 1053 | "sift": "13.5.2", 1054 | "sliced": "1.0.1" 1055 | }, 1056 | "dependencies": { 1057 | "ms": { 1058 | "version": "2.1.2", 1059 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1060 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1061 | }, 1062 | "safe-buffer": { 1063 | "version": "5.2.1", 1064 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1065 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1066 | } 1067 | } 1068 | }, 1069 | "mongoose-auto-increment": { 1070 | "version": "5.0.1", 1071 | "resolved": "https://registry.npmjs.org/mongoose-auto-increment/-/mongoose-auto-increment-5.0.1.tgz", 1072 | "integrity": "sha1-gn4FHZzDcdq+i/8acEQx00HLed8=", 1073 | "requires": { 1074 | "extend": "^3.0.0" 1075 | } 1076 | }, 1077 | "mongoose-legacy-pluralize": { 1078 | "version": "1.0.2", 1079 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 1080 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 1081 | }, 1082 | "mpath": { 1083 | "version": "0.8.3", 1084 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", 1085 | "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" 1086 | }, 1087 | "mquery": { 1088 | "version": "3.2.5", 1089 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", 1090 | "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", 1091 | "requires": { 1092 | "bluebird": "3.5.1", 1093 | "debug": "3.1.0", 1094 | "regexp-clone": "^1.0.0", 1095 | "safe-buffer": "5.1.2", 1096 | "sliced": "1.0.1" 1097 | }, 1098 | "dependencies": { 1099 | "debug": { 1100 | "version": "3.1.0", 1101 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1102 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1103 | "requires": { 1104 | "ms": "2.0.0" 1105 | } 1106 | } 1107 | } 1108 | }, 1109 | "ms": { 1110 | "version": "2.0.0", 1111 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1112 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1113 | }, 1114 | "negotiator": { 1115 | "version": "0.6.2", 1116 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1117 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1118 | }, 1119 | "nodemon": { 1120 | "version": "2.0.7", 1121 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", 1122 | "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", 1123 | "requires": { 1124 | "chokidar": "^3.2.2", 1125 | "debug": "^3.2.6", 1126 | "ignore-by-default": "^1.0.1", 1127 | "minimatch": "^3.0.4", 1128 | "pstree.remy": "^1.1.7", 1129 | "semver": "^5.7.1", 1130 | "supports-color": "^5.5.0", 1131 | "touch": "^3.1.0", 1132 | "undefsafe": "^2.0.3", 1133 | "update-notifier": "^4.1.0" 1134 | }, 1135 | "dependencies": { 1136 | "debug": { 1137 | "version": "3.2.7", 1138 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 1139 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 1140 | "requires": { 1141 | "ms": "^2.1.1" 1142 | } 1143 | }, 1144 | "ms": { 1145 | "version": "2.1.3", 1146 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1147 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1148 | } 1149 | } 1150 | }, 1151 | "nopt": { 1152 | "version": "1.0.10", 1153 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1154 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1155 | "requires": { 1156 | "abbrev": "1" 1157 | } 1158 | }, 1159 | "normalize-path": { 1160 | "version": "3.0.0", 1161 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1162 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1163 | }, 1164 | "normalize-url": { 1165 | "version": "4.5.0", 1166 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", 1167 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" 1168 | }, 1169 | "oauth-sign": { 1170 | "version": "0.9.0", 1171 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1172 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1173 | }, 1174 | "object-assign": { 1175 | "version": "4.1.1", 1176 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1177 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1178 | }, 1179 | "on-finished": { 1180 | "version": "2.3.0", 1181 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1182 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1183 | "requires": { 1184 | "ee-first": "1.1.1" 1185 | } 1186 | }, 1187 | "once": { 1188 | "version": "1.4.0", 1189 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1190 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1191 | "requires": { 1192 | "wrappy": "1" 1193 | } 1194 | }, 1195 | "optional-require": { 1196 | "version": "1.0.3", 1197 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", 1198 | "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" 1199 | }, 1200 | "p-cancelable": { 1201 | "version": "1.1.0", 1202 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", 1203 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" 1204 | }, 1205 | "package-json": { 1206 | "version": "6.5.0", 1207 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", 1208 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", 1209 | "requires": { 1210 | "got": "^9.6.0", 1211 | "registry-auth-token": "^4.0.0", 1212 | "registry-url": "^5.0.0", 1213 | "semver": "^6.2.0" 1214 | }, 1215 | "dependencies": { 1216 | "semver": { 1217 | "version": "6.3.0", 1218 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1219 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1220 | } 1221 | } 1222 | }, 1223 | "parseurl": { 1224 | "version": "1.3.3", 1225 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1226 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1227 | }, 1228 | "path-to-regexp": { 1229 | "version": "0.1.7", 1230 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1231 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1232 | }, 1233 | "performance-now": { 1234 | "version": "2.1.0", 1235 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1236 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1237 | }, 1238 | "picomatch": { 1239 | "version": "2.2.3", 1240 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", 1241 | "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" 1242 | }, 1243 | "prepend-http": { 1244 | "version": "2.0.0", 1245 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", 1246 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" 1247 | }, 1248 | "process-nextick-args": { 1249 | "version": "2.0.1", 1250 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1251 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1252 | }, 1253 | "promise": { 1254 | "version": "8.1.0", 1255 | "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", 1256 | "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", 1257 | "requires": { 1258 | "asap": "~2.0.6" 1259 | } 1260 | }, 1261 | "proxy-addr": { 1262 | "version": "2.0.6", 1263 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1264 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1265 | "requires": { 1266 | "forwarded": "~0.1.2", 1267 | "ipaddr.js": "1.9.1" 1268 | } 1269 | }, 1270 | "psl": { 1271 | "version": "1.8.0", 1272 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1273 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 1274 | }, 1275 | "pstree.remy": { 1276 | "version": "1.1.8", 1277 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1278 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 1279 | }, 1280 | "pump": { 1281 | "version": "3.0.0", 1282 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1283 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1284 | "requires": { 1285 | "end-of-stream": "^1.1.0", 1286 | "once": "^1.3.1" 1287 | } 1288 | }, 1289 | "punycode": { 1290 | "version": "2.1.1", 1291 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1292 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1293 | }, 1294 | "pupa": { 1295 | "version": "2.1.1", 1296 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", 1297 | "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", 1298 | "requires": { 1299 | "escape-goat": "^2.0.0" 1300 | } 1301 | }, 1302 | "qs": { 1303 | "version": "6.7.0", 1304 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1305 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1306 | }, 1307 | "range-parser": { 1308 | "version": "1.2.1", 1309 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1310 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1311 | }, 1312 | "raw-body": { 1313 | "version": "2.4.0", 1314 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 1315 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 1316 | "requires": { 1317 | "bytes": "3.1.0", 1318 | "http-errors": "1.7.2", 1319 | "iconv-lite": "0.4.24", 1320 | "unpipe": "1.0.0" 1321 | } 1322 | }, 1323 | "razorpay": { 1324 | "version": "2.0.7", 1325 | "resolved": "https://registry.npmjs.org/razorpay/-/razorpay-2.0.7.tgz", 1326 | "integrity": "sha512-aRgumzf2CtQEVwaB87WGRihng+WkKm0oYDWdE1Xq63KTzQQYmHvdlewtzG8KC5GKCf6kUjo+srLcd8e29ax+Jw==", 1327 | "requires": { 1328 | "promise": "^8.1.0", 1329 | "request": "^2.88.0", 1330 | "request-promise": "^4.2.6" 1331 | } 1332 | }, 1333 | "rc": { 1334 | "version": "1.2.8", 1335 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1336 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1337 | "requires": { 1338 | "deep-extend": "^0.6.0", 1339 | "ini": "~1.3.0", 1340 | "minimist": "^1.2.0", 1341 | "strip-json-comments": "~2.0.1" 1342 | } 1343 | }, 1344 | "readable-stream": { 1345 | "version": "2.3.7", 1346 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1347 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1348 | "requires": { 1349 | "core-util-is": "~1.0.0", 1350 | "inherits": "~2.0.3", 1351 | "isarray": "~1.0.0", 1352 | "process-nextick-args": "~2.0.0", 1353 | "safe-buffer": "~5.1.1", 1354 | "string_decoder": "~1.1.1", 1355 | "util-deprecate": "~1.0.1" 1356 | } 1357 | }, 1358 | "readdirp": { 1359 | "version": "3.5.0", 1360 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 1361 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 1362 | "requires": { 1363 | "picomatch": "^2.2.1" 1364 | } 1365 | }, 1366 | "regexp-clone": { 1367 | "version": "1.0.0", 1368 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 1369 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 1370 | }, 1371 | "registry-auth-token": { 1372 | "version": "4.2.1", 1373 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", 1374 | "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", 1375 | "requires": { 1376 | "rc": "^1.2.8" 1377 | } 1378 | }, 1379 | "registry-url": { 1380 | "version": "5.1.0", 1381 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", 1382 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", 1383 | "requires": { 1384 | "rc": "^1.2.8" 1385 | } 1386 | }, 1387 | "request": { 1388 | "version": "2.88.2", 1389 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1390 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1391 | "requires": { 1392 | "aws-sign2": "~0.7.0", 1393 | "aws4": "^1.8.0", 1394 | "caseless": "~0.12.0", 1395 | "combined-stream": "~1.0.6", 1396 | "extend": "~3.0.2", 1397 | "forever-agent": "~0.6.1", 1398 | "form-data": "~2.3.2", 1399 | "har-validator": "~5.1.3", 1400 | "http-signature": "~1.2.0", 1401 | "is-typedarray": "~1.0.0", 1402 | "isstream": "~0.1.2", 1403 | "json-stringify-safe": "~5.0.1", 1404 | "mime-types": "~2.1.19", 1405 | "oauth-sign": "~0.9.0", 1406 | "performance-now": "^2.1.0", 1407 | "qs": "~6.5.2", 1408 | "safe-buffer": "^5.1.2", 1409 | "tough-cookie": "~2.5.0", 1410 | "tunnel-agent": "^0.6.0", 1411 | "uuid": "^3.3.2" 1412 | }, 1413 | "dependencies": { 1414 | "qs": { 1415 | "version": "6.5.2", 1416 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1417 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1418 | }, 1419 | "uuid": { 1420 | "version": "3.4.0", 1421 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1422 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1423 | } 1424 | } 1425 | }, 1426 | "request-promise": { 1427 | "version": "4.2.6", 1428 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", 1429 | "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", 1430 | "requires": { 1431 | "bluebird": "^3.5.0", 1432 | "request-promise-core": "1.1.4", 1433 | "stealthy-require": "^1.1.1", 1434 | "tough-cookie": "^2.3.3" 1435 | } 1436 | }, 1437 | "request-promise-core": { 1438 | "version": "1.1.4", 1439 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", 1440 | "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", 1441 | "requires": { 1442 | "lodash": "^4.17.19" 1443 | } 1444 | }, 1445 | "responselike": { 1446 | "version": "1.0.2", 1447 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", 1448 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", 1449 | "requires": { 1450 | "lowercase-keys": "^1.0.0" 1451 | } 1452 | }, 1453 | "safe-buffer": { 1454 | "version": "5.1.2", 1455 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1456 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1457 | }, 1458 | "safer-buffer": { 1459 | "version": "2.1.2", 1460 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1461 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1462 | }, 1463 | "saslprep": { 1464 | "version": "1.0.3", 1465 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 1466 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 1467 | "optional": true, 1468 | "requires": { 1469 | "sparse-bitfield": "^3.0.3" 1470 | } 1471 | }, 1472 | "semver": { 1473 | "version": "5.7.1", 1474 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1475 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1476 | }, 1477 | "semver-diff": { 1478 | "version": "3.1.1", 1479 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", 1480 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", 1481 | "requires": { 1482 | "semver": "^6.3.0" 1483 | }, 1484 | "dependencies": { 1485 | "semver": { 1486 | "version": "6.3.0", 1487 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1488 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1489 | } 1490 | } 1491 | }, 1492 | "send": { 1493 | "version": "0.17.1", 1494 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1495 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1496 | "requires": { 1497 | "debug": "2.6.9", 1498 | "depd": "~1.1.2", 1499 | "destroy": "~1.0.4", 1500 | "encodeurl": "~1.0.2", 1501 | "escape-html": "~1.0.3", 1502 | "etag": "~1.8.1", 1503 | "fresh": "0.5.2", 1504 | "http-errors": "~1.7.2", 1505 | "mime": "1.6.0", 1506 | "ms": "2.1.1", 1507 | "on-finished": "~2.3.0", 1508 | "range-parser": "~1.2.1", 1509 | "statuses": "~1.5.0" 1510 | }, 1511 | "dependencies": { 1512 | "ms": { 1513 | "version": "2.1.1", 1514 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1515 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1516 | } 1517 | } 1518 | }, 1519 | "serve-static": { 1520 | "version": "1.14.1", 1521 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1522 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1523 | "requires": { 1524 | "encodeurl": "~1.0.2", 1525 | "escape-html": "~1.0.3", 1526 | "parseurl": "~1.3.3", 1527 | "send": "0.17.1" 1528 | } 1529 | }, 1530 | "setprototypeof": { 1531 | "version": "1.1.1", 1532 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1533 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1534 | }, 1535 | "sift": { 1536 | "version": "13.5.2", 1537 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", 1538 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" 1539 | }, 1540 | "signal-exit": { 1541 | "version": "3.0.3", 1542 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1543 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1544 | }, 1545 | "sliced": { 1546 | "version": "1.0.1", 1547 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1548 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1549 | }, 1550 | "sparse-bitfield": { 1551 | "version": "3.0.3", 1552 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1553 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1554 | "optional": true, 1555 | "requires": { 1556 | "memory-pager": "^1.0.2" 1557 | } 1558 | }, 1559 | "sshpk": { 1560 | "version": "1.16.1", 1561 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1562 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1563 | "requires": { 1564 | "asn1": "~0.2.3", 1565 | "assert-plus": "^1.0.0", 1566 | "bcrypt-pbkdf": "^1.0.0", 1567 | "dashdash": "^1.12.0", 1568 | "ecc-jsbn": "~0.1.1", 1569 | "getpass": "^0.1.1", 1570 | "jsbn": "~0.1.0", 1571 | "safer-buffer": "^2.0.2", 1572 | "tweetnacl": "~0.14.0" 1573 | } 1574 | }, 1575 | "statuses": { 1576 | "version": "1.5.0", 1577 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1578 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1579 | }, 1580 | "stealthy-require": { 1581 | "version": "1.1.1", 1582 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 1583 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 1584 | }, 1585 | "string-width": { 1586 | "version": "4.2.2", 1587 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 1588 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 1589 | "requires": { 1590 | "emoji-regex": "^8.0.0", 1591 | "is-fullwidth-code-point": "^3.0.0", 1592 | "strip-ansi": "^6.0.0" 1593 | }, 1594 | "dependencies": { 1595 | "ansi-regex": { 1596 | "version": "5.0.0", 1597 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 1598 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 1599 | }, 1600 | "emoji-regex": { 1601 | "version": "8.0.0", 1602 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1603 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1604 | }, 1605 | "is-fullwidth-code-point": { 1606 | "version": "3.0.0", 1607 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1608 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1609 | }, 1610 | "strip-ansi": { 1611 | "version": "6.0.0", 1612 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1613 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1614 | "requires": { 1615 | "ansi-regex": "^5.0.0" 1616 | } 1617 | } 1618 | } 1619 | }, 1620 | "string_decoder": { 1621 | "version": "1.1.1", 1622 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1623 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1624 | "requires": { 1625 | "safe-buffer": "~5.1.0" 1626 | } 1627 | }, 1628 | "strip-ansi": { 1629 | "version": "5.2.0", 1630 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1631 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1632 | "requires": { 1633 | "ansi-regex": "^4.1.0" 1634 | } 1635 | }, 1636 | "strip-json-comments": { 1637 | "version": "2.0.1", 1638 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1639 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1640 | }, 1641 | "supports-color": { 1642 | "version": "5.5.0", 1643 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1644 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1645 | "requires": { 1646 | "has-flag": "^3.0.0" 1647 | } 1648 | }, 1649 | "term-size": { 1650 | "version": "2.2.1", 1651 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", 1652 | "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" 1653 | }, 1654 | "to-readable-stream": { 1655 | "version": "1.0.0", 1656 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", 1657 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" 1658 | }, 1659 | "to-regex-range": { 1660 | "version": "5.0.1", 1661 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1662 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1663 | "requires": { 1664 | "is-number": "^7.0.0" 1665 | } 1666 | }, 1667 | "toidentifier": { 1668 | "version": "1.0.0", 1669 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1670 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1671 | }, 1672 | "touch": { 1673 | "version": "3.1.0", 1674 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1675 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1676 | "requires": { 1677 | "nopt": "~1.0.10" 1678 | } 1679 | }, 1680 | "tough-cookie": { 1681 | "version": "2.5.0", 1682 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1683 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1684 | "requires": { 1685 | "psl": "^1.1.28", 1686 | "punycode": "^2.1.1" 1687 | } 1688 | }, 1689 | "tunnel-agent": { 1690 | "version": "0.6.0", 1691 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1692 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1693 | "requires": { 1694 | "safe-buffer": "^5.0.1" 1695 | } 1696 | }, 1697 | "tweetnacl": { 1698 | "version": "0.14.5", 1699 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1700 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1701 | }, 1702 | "type-fest": { 1703 | "version": "0.8.1", 1704 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1705 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 1706 | }, 1707 | "type-is": { 1708 | "version": "1.6.18", 1709 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1710 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1711 | "requires": { 1712 | "media-typer": "0.3.0", 1713 | "mime-types": "~2.1.24" 1714 | } 1715 | }, 1716 | "typedarray-to-buffer": { 1717 | "version": "3.1.5", 1718 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1719 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1720 | "requires": { 1721 | "is-typedarray": "^1.0.0" 1722 | } 1723 | }, 1724 | "undefsafe": { 1725 | "version": "2.0.3", 1726 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", 1727 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", 1728 | "requires": { 1729 | "debug": "^2.2.0" 1730 | } 1731 | }, 1732 | "unique-string": { 1733 | "version": "2.0.0", 1734 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 1735 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 1736 | "requires": { 1737 | "crypto-random-string": "^2.0.0" 1738 | } 1739 | }, 1740 | "unpipe": { 1741 | "version": "1.0.0", 1742 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1743 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1744 | }, 1745 | "update-notifier": { 1746 | "version": "4.1.3", 1747 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", 1748 | "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", 1749 | "requires": { 1750 | "boxen": "^4.2.0", 1751 | "chalk": "^3.0.0", 1752 | "configstore": "^5.0.1", 1753 | "has-yarn": "^2.1.0", 1754 | "import-lazy": "^2.1.0", 1755 | "is-ci": "^2.0.0", 1756 | "is-installed-globally": "^0.3.1", 1757 | "is-npm": "^4.0.0", 1758 | "is-yarn-global": "^0.3.0", 1759 | "latest-version": "^5.0.0", 1760 | "pupa": "^2.0.1", 1761 | "semver-diff": "^3.1.1", 1762 | "xdg-basedir": "^4.0.0" 1763 | } 1764 | }, 1765 | "uri-js": { 1766 | "version": "4.4.1", 1767 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1768 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1769 | "requires": { 1770 | "punycode": "^2.1.0" 1771 | } 1772 | }, 1773 | "url-parse-lax": { 1774 | "version": "3.0.0", 1775 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", 1776 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", 1777 | "requires": { 1778 | "prepend-http": "^2.0.0" 1779 | } 1780 | }, 1781 | "util-deprecate": { 1782 | "version": "1.0.2", 1783 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1784 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1785 | }, 1786 | "utils-merge": { 1787 | "version": "1.0.1", 1788 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1789 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1790 | }, 1791 | "uuid": { 1792 | "version": "8.3.2", 1793 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1794 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1795 | }, 1796 | "vary": { 1797 | "version": "1.1.2", 1798 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1799 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1800 | }, 1801 | "verror": { 1802 | "version": "1.10.0", 1803 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1804 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1805 | "requires": { 1806 | "assert-plus": "^1.0.0", 1807 | "core-util-is": "1.0.2", 1808 | "extsprintf": "^1.2.0" 1809 | } 1810 | }, 1811 | "widest-line": { 1812 | "version": "3.1.0", 1813 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", 1814 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", 1815 | "requires": { 1816 | "string-width": "^4.0.0" 1817 | } 1818 | }, 1819 | "wrappy": { 1820 | "version": "1.0.2", 1821 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1822 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1823 | }, 1824 | "write-file-atomic": { 1825 | "version": "3.0.3", 1826 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 1827 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 1828 | "requires": { 1829 | "imurmurhash": "^0.1.4", 1830 | "is-typedarray": "^1.0.0", 1831 | "signal-exit": "^3.0.2", 1832 | "typedarray-to-buffer": "^3.1.5" 1833 | } 1834 | }, 1835 | "xdg-basedir": { 1836 | "version": "4.0.0", 1837 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1838 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 1839 | } 1840 | } 1841 | } 1842 | --------------------------------------------------------------------------------