├── 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 |
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 |
74 | {
75 | products.filter(product => product.title.longTitle.toLowerCase().includes(text.toLowerCase())).map(product => (
76 |
77 | setOpen(true)}
81 | >
82 | {product.title.longTitle}
83 |
84 |
85 | ))
86 | }
87 |
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 | 
21 | 
22 | 
23 | 
24 | 
25 | 
26 | 
27 | 
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 | | ID |
106 | AMOUNT |
107 | ISPAID |
108 | RAZORPAY |
109 |
110 |
111 |
112 | {orders.map((x) => (
113 |
114 | | {x._id} |
115 | {x.amount / 100} |
116 | {x.isPaid ? 'YES' : 'NO'} |
117 | {/* {x.razorpay.paymentId} | */}
118 |
119 | ))}
120 |
121 |
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 |
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 |
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 |
--------------------------------------------------------------------------------