├── client ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── public │ ├── img │ │ ├── envv.svg │ │ ├── one.svg │ │ ├── tre4e4.png │ │ ├── tree1.png │ │ ├── tree2.webp │ │ ├── tree3.webp │ │ ├── tree4.png │ │ ├── tree5.png │ │ ├── tree55.png │ │ ├── tree6.png │ │ ├── tree7.png │ │ └── two.svg │ ├── index.html │ ├── manifest.json │ └── robots.txt └── src │ ├── App.css │ ├── App.js │ ├── component │ ├── AllProducts.jsx │ ├── CardProducts.jsx │ ├── CartP.jsx │ ├── Footer.jsx │ ├── Navbar.css │ └── Navbar.jsx │ ├── context │ └── DataContext.jsx │ ├── index.js │ └── page │ ├── Cart.jsx │ ├── Contact.jsx │ ├── EditAdd.jsx │ ├── Home.jsx │ ├── Login.jsx │ ├── MyAccount.jsx │ ├── MyOrder.jsx │ ├── PayNow.jsx │ ├── Payment.jsx │ ├── ProductDetails.jsx │ ├── Products.jsx │ ├── Register.jsx │ └── Success.jsx └── server ├── .gitignore ├── index.js ├── package-lock.json └── package.json /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | 7 | /.pnp 8 | .pnp.js 9 | 10 | # testing 11 | /coverage 12 | 13 | # production 14 | /build 15 | 16 | # misc 17 | .DS_Store 18 | .env.local 19 | .env.development.local 20 | .env.test.local 21 | .env.production.local 22 | 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 13 | 14 | The page will reload if you make edits.\ 15 | You will also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 35 | 36 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 39 | 40 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.14.1", 7 | "@testing-library/react": "^11.2.7", 8 | "@testing-library/user-event": "^12.8.3", 9 | "axios": "^0.21.1", 10 | "howler": "^2.2.2", 11 | "react": "^17.0.2", 12 | "react-dom": "^17.0.2", 13 | "react-paginate": "^7.1.3", 14 | "react-router-dom": "^5.2.0", 15 | "react-scripts": "4.0.3", 16 | "react-toastify": "^7.0.4", 17 | "web-vitals": "^1.1.2" 18 | }, 19 | "scripts": { 20 | "start": "react-scripts start", 21 | "build": "react-scripts build", 22 | "test": "react-scripts test", 23 | "eject": "react-scripts eject" 24 | }, 25 | "eslintConfig": { 26 | "extends": [ 27 | "react-app", 28 | "react-app/jest" 29 | ] 30 | }, 31 | "browserslist": { 32 | "production": [ 33 | ">0.2%", 34 | "not dead", 35 | "not op_mini all" 36 | ], 37 | "development": [ 38 | "last 1 chrome version", 39 | "last 1 firefox version", 40 | "last 1 safari version" 41 | ] 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /client/public/img/envv.svg: -------------------------------------------------------------------------------- 1 | environment1 -------------------------------------------------------------------------------- /client/public/img/one.svg: -------------------------------------------------------------------------------- 1 | romantic getaway -------------------------------------------------------------------------------- /client/public/img/tre4e4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tre4e4.png -------------------------------------------------------------------------------- /client/public/img/tree1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree1.png -------------------------------------------------------------------------------- /client/public/img/tree2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree2.webp -------------------------------------------------------------------------------- /client/public/img/tree3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree3.webp -------------------------------------------------------------------------------- /client/public/img/tree4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree4.png -------------------------------------------------------------------------------- /client/public/img/tree5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree5.png -------------------------------------------------------------------------------- /client/public/img/tree55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree55.png -------------------------------------------------------------------------------- /client/public/img/tree6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree6.png -------------------------------------------------------------------------------- /client/public/img/tree7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atanu20/react-mysql-nodejs-e-commerce/c8cab2637b3befdc6491fc572797a0bc5d2ac37a/client/public/img/tree7.png -------------------------------------------------------------------------------- /client/public/img/two.svg: -------------------------------------------------------------------------------- 1 | Waiting _for_you -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 14 | 15 | 16 | GreenX World 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- 1 | * { 2 | padding: 0; 3 | margin: 0; 4 | box-sizing: border-box; 5 | } 6 | .home{ 7 | width: 100%; 8 | height: 100vh; 9 | background-color: #04292e; 10 | color: #fff; 11 | padding-top: 150px; 12 | } 13 | .home h1{ 14 | font-size: 45px; 15 | } 16 | .home h1 span{ 17 | color: rgb(7, 170, 7); 18 | font-weight: 600; 19 | } 20 | .home p{ 21 | font-size: 25px; 22 | } 23 | .btn{ 24 | padding: 10px 30px; 25 | font-weight: 600; 26 | border-radius: 0 !important; 27 | } 28 | .main-img{ 29 | width: 100%; 30 | height: 500px; 31 | } 32 | 33 | @media (max-width:768px) { 34 | .home{ 35 | height: auto; 36 | } 37 | } 38 | 39 | 40 | 41 | /* == */ 42 | .products{ 43 | padding: 75px 0; 44 | 45 | } 46 | .p-img{ 47 | width: 100%; 48 | height: 300px; 49 | } 50 | .products-p .card{ 51 | box-shadow: 0 10px 20px rgb(2, 58, 2); 52 | border: none !important; 53 | 54 | } 55 | .price{ 56 | display: flex; 57 | justify-content: space-between; 58 | } 59 | 60 | .products-p .card .overlay { 61 | position: absolute; 62 | bottom: 0; 63 | background: #04292e; 64 | /* Black see-through */ 65 | color: #f1f1f1; 66 | width: 100%; 67 | transition: .5s ease; 68 | opacity:0; 69 | color: white; 70 | font-size: 20px; 71 | padding: 20px; 72 | text-align: center; 73 | margin-left: -8px; 74 | } 75 | 76 | .products-p .card:hover .overlay { 77 | opacity: 1; 78 | } 79 | 80 | 81 | .desc{ 82 | padding: 75px 0; 83 | background: #04292e; 84 | } 85 | .side-img{ 86 | padding-top: 20px; 87 | height: 500px; 88 | margin-left: -50px; 89 | } 90 | .desc h1{ 91 | color: #fff; 92 | } 93 | .desc p{ 94 | color: #fff; 95 | } 96 | footer{ 97 | padding: 50px 0; 98 | 99 | width: 100%; 100 | 101 | } 102 | .foot-img{ 103 | width: 100%; 104 | height: 250px; 105 | } 106 | footer ul{ 107 | list-style-type: none; 108 | } 109 | footer ul li{ 110 | font-size: 26px; 111 | list-style-type: none; 112 | text-decoration: none; 113 | color:black; 114 | } 115 | footer ul li a{ 116 | 117 | color:black; 118 | } 119 | footer ul li a:hover{ 120 | text-decoration: none; 121 | color:black; 122 | } 123 | .products-p .btn{ 124 | padding: 8px 20px; 125 | } 126 | .inp{ 127 | display: flex; 128 | justify-content:space-between; 129 | 130 | } 131 | 132 | .products .form-group{ 133 | width: 300px; 134 | 135 | 136 | } 137 | 138 | .products .form-control { 139 | border:3px solid rgb(9, 219, 72) !important; 140 | 141 | } 142 | .products .form-control:focus{ 143 | 144 | box-shadow: none; 145 | 146 | } 147 | .details{ 148 | padding: 100px 0; 149 | } 150 | .p-im{ 151 | width: 100%; 152 | height: 350px; 153 | } 154 | .cart{ 155 | padding: 75px 0; 156 | } 157 | .cart .card{ 158 | box-shadow: 0 10px 20px rgb(2, 58, 2); 159 | border: none !important; 160 | 161 | } 162 | .cart-img{ 163 | height: 300px; 164 | } 165 | .cartbox{ 166 | display: flex; 167 | flex-direction: row; 168 | justify-content: space-between; 169 | } 170 | .cartbox p{ 171 | font-size: 20px; 172 | font-weight: 600; 173 | } 174 | .payment{ 175 | padding: 75px 0; 176 | } 177 | .t-img{ 178 | width: 75px; 179 | height: 65px; 180 | } 181 | .table{ 182 | font-size:25px; 183 | } 184 | .address{ 185 | padding: 100px 0; 186 | } 187 | .address .card{ 188 | box-shadow: 0 10px 20px rgb(135, 205, 238); 189 | border: none !important; 190 | padding: 10px; 191 | } 192 | .or-img{ 193 | width: 150px; 194 | height: 130px; 195 | } 196 | .login{ 197 | padding: 75px 0; 198 | } -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { BrowserRouter, Route,Switch } from 'react-router-dom' 3 | import Navbar from './component/Navbar' 4 | import Footer from './component/Footer' 5 | import Home from './page/Home' 6 | import Products from './page/Products' 7 | import Cart from './page/Cart' 8 | import ProductDetails from './page/ProductDetails' 9 | import Contact from './page/Contact' 10 | import Payment from './page/Payment' 11 | import MyAccount from './page/MyAccount' 12 | import EditAdd from './page/EditAdd' 13 | import MyOrder from './page/MyOrder' 14 | import { ConText } from './context/DataContext' 15 | import Register from './page/Register' 16 | import Login from './page/Login' 17 | import Success from './page/Success' 18 | import PayNow from './page/PayNow' 19 | 20 | import './App.css' 21 | 22 | 23 | const App = () => { 24 | return ( 25 | <> 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | ) 53 | } 54 | 55 | export default App 56 | -------------------------------------------------------------------------------- /client/src/component/AllProducts.jsx: -------------------------------------------------------------------------------- 1 | import React,{useEffect,useState} from 'react' 2 | import CardProducts from './CardProducts' 3 | import axios from 'axios' 4 | const AllProducts = () => { 5 | const [getdata, setGetdata] = useState([]) 6 | const getData= async ()=>{ 7 | 8 | const res=await axios.get('http://localhost:8000/getdata') 9 | setGetdata(res.data) 10 | } 11 | useEffect(() => { 12 | getData() 13 | }, []) 14 | return ( 15 | <> 16 |
17 |
18 |

Best Products

19 |
20 | { 21 | getdata.map((val,ind)=>{ 22 | return( 23 | <> 24 | 32 | 33 | 34 | ) 35 | }) 36 | } 37 | 38 | 39 |
40 |
41 |
42 | 43 | 44 | ) 45 | } 46 | 47 | export default AllProducts 48 | -------------------------------------------------------------------------------- /client/src/component/CardProducts.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { useHistory } from 'react-router-dom' 3 | 4 | const CardProducts = ({id,name,price,plant_image}) => { 5 | const his= useHistory() 6 | return ( 7 | <> 8 |
9 |
10 | tree 11 |
12 |
13 |

{name}

14 |

{price}.00

15 |
16 |
17 | {/* */} 18 | 19 |
20 | 21 |
22 |
23 |
24 | 25 | 26 | ) 27 | } 28 | 29 | export default CardProducts 30 | -------------------------------------------------------------------------------- /client/src/component/CartP.jsx: -------------------------------------------------------------------------------- 1 | import React, { useContext } from 'react' 2 | import { DataContext } from '../context/DataContext' 3 | const CartP = ({id,name,price,plant_image,qty}) => { 4 | const {cart,setCart}= useContext(DataContext) 5 | const deleteProduct=(id)=>{ 6 | const exist=cart.find((x)=>x.id===id) 7 | if(exist) 8 | { 9 | setCart( 10 | cart.filter((x)=>x.id !==id) 11 | ) 12 | // console.log(`pre ${id}`) 13 | } 14 | 15 | } 16 | return ( 17 | <> 18 |
19 |
20 | {plant_image} 21 |
22 |
23 |
24 |

{name}

25 |

({price}.00) * ({qty})

26 | 27 | 28 |
29 |
30 |
31 |

{price*qty}.00

32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 |
40 |
41 | 42 | 43 | ) 44 | } 45 | 46 | export default CartP 47 | -------------------------------------------------------------------------------- /client/src/component/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { NavLink } from 'react-router-dom' 3 | import '../App.css' 4 | const Footer = () => { 5 | return ( 6 | <> 7 | 33 | 34 | 35 | ) 36 | } 37 | 38 | export default Footer 39 | -------------------------------------------------------------------------------- /client/src/component/Navbar.css: -------------------------------------------------------------------------------- 1 | *{ 2 | padding: 0; 3 | margin: 0; 4 | text-decoration: none; 5 | list-style: none; 6 | box-sizing: border-box; 7 | } 8 | body{ 9 | font-family: montserrat; 10 | } 11 | .code-nav nav{ 12 | background: #011727; 13 | height: 80px; 14 | width: 100%; 15 | } 16 | .code-nav label.logo{ 17 | color: white; 18 | font-size: 35px; 19 | line-height: 80px; 20 | padding: 0 100px; 21 | font-weight: bold; 22 | /* margin-top: -13px; */ 23 | 24 | } 25 | .code-nav nav ul{ 26 | float: right; 27 | margin-right: 20px; 28 | /* margin-top: -13px; */ 29 | } 30 | .code-nav nav ul li{ 31 | display: inline-block; 32 | line-height: 80px; 33 | margin: 0 5px; 34 | } 35 | .code-nav nav ul li a{ 36 | color: white; 37 | font-size: 17px; 38 | padding: 10px 15px; 39 | border-radius: 3px; 40 | text-transform: uppercase; 41 | 42 | } 43 | .code-nav a:hover{ 44 | background: #1b9bff; 45 | transition: .5s; 46 | text-decoration: none; 47 | } 48 | .code-nav .checkbtn{ 49 | font-size: 30px; 50 | color: white; 51 | float: right; 52 | line-height: 80px; 53 | margin-right: 40px; 54 | cursor: pointer; 55 | display: none; 56 | } 57 | .code-nav #check{ 58 | display: none; 59 | } 60 | @media (max-width: 952px){ 61 | .code-nav label.logo{ 62 | font-size: 30px; 63 | padding-left: 50px; 64 | } 65 | .code-nav nav ul li a{ 66 | font-size: 16px; 67 | } 68 | } 69 | @media (max-width: 858px){ 70 | .code-nav .checkbtn{ 71 | display: block; 72 | /* margin-top: -13px; */ 73 | } 74 | .code-nav ul{ 75 | position: fixed; 76 | width: 100%; 77 | height: 100vh; 78 | background: #04292e; 79 | top: 80px; 80 | left: -100%; 81 | z-index: 9999; 82 | text-align: center; 83 | transition: all .5s; 84 | } 85 | .code-nav nav ul li{ 86 | display: block; 87 | margin: 50px 0; 88 | line-height: 30px; 89 | } 90 | .code-nav nav ul li a{ 91 | font-size: 20px; 92 | } 93 | 94 | .code-nav #check:checked ~ ul{ 95 | left: 0; 96 | } 97 | } 98 | 99 | .cart-box span{ 100 | 101 | width: 20px !important; 102 | height: 20px !important; 103 | background-color: coral; 104 | padding: 5px; 105 | border-radius: 15px; 106 | 107 | } 108 | .logo a{ 109 | color: #fff !important; 110 | } 111 | .logo a:hover{ 112 | background-color: transparent !important; 113 | color: #fff !important; 114 | } -------------------------------------------------------------------------------- /client/src/component/Navbar.jsx: -------------------------------------------------------------------------------- 1 | import React, { useContext } from 'react' 2 | import './Navbar.css' 3 | import { NavLink } from 'react-router-dom' 4 | import { DataContext } from '../context/DataContext' 5 | 6 | const Navbar = () => { 7 | const {cart}=useContext(DataContext) 8 | // console.log(cart) 9 | 10 | return ( 11 | <> 12 |
13 | 30 |
31 | 32 | 33 | ) 34 | } 35 | 36 | export default Navbar 37 | -------------------------------------------------------------------------------- /client/src/context/DataContext.jsx: -------------------------------------------------------------------------------- 1 | import React, { createContext ,useState ,useEffect } from 'react' 2 | import axios from 'axios' 3 | 4 | export const DataContext=createContext() 5 | 6 | export const ConText=(props)=>{ 7 | const [cart, setCart] = useState([]) 8 | const [isAuth,setIsAuth]= useState(false) 9 | 10 | const checkAuth=()=>{ 11 | axios.get("http://localhost:8000/isAuth",{ 12 | headers:{ 13 | "x-access-token":localStorage.getItem("Ecomtoken") 14 | } 15 | }).then((response)=>{ 16 | // console.log() 17 | if(response.data.login) 18 | { 19 | setIsAuth(true) 20 | 21 | } 22 | }) 23 | 24 | } 25 | 26 | useEffect(()=>{ 27 | checkAuth() 28 | 29 | 30 | },[]) 31 | setInterval(checkAuth, 1000); 32 | 33 | return( 34 | <> 35 | 36 | {props.children} 37 | 38 | 39 | 40 | ) 41 | } -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDom from 'react-dom' 3 | 4 | import App from './App'; 5 | 6 | ReactDom.render(,document.getElementById('root')); -------------------------------------------------------------------------------- /client/src/page/Cart.jsx: -------------------------------------------------------------------------------- 1 | import React, { useContext ,useRef, useEffect} from 'react' 2 | import { useHistory } from 'react-router-dom' 3 | import CartP from '../component/CartP' 4 | import { DataContext } from '../context/DataContext' 5 | import axios from 'axios' 6 | const Cart = () => { 7 | 8 | const {cart}= useContext(DataContext) 9 | const timeout = useRef(null) 10 | const his= useHistory() 11 | const checkAuth=()=>{ 12 | axios.get("http://localhost:8000/isAuth",{ 13 | headers:{ 14 | "x-access-token":localStorage.getItem("Ecomtoken") 15 | } 16 | }).then((response)=>{ 17 | // console.log() 18 | if(!response.data.login) 19 | { 20 | his.push("/"); 21 | } 22 | }) 23 | 24 | } 25 | 26 | useEffect(()=>{ 27 | timeout.current=setTimeout(checkAuth,100) 28 | return function(){ 29 | if(timeout.current) 30 | { 31 | clearTimeout(timeout.current) 32 | } 33 | } 34 | 35 | 36 | },[]) 37 | return ( 38 | <> 39 |
40 | { 41 | !cart.length ? ( 42 | <> 43 |
44 |

There is No Items In the Cart

45 | 46 |
47 | 48 | 49 | ):( 50 | <> 51 |
52 |

Your Cart Items

53 |
54 |
55 | { 56 | cart.map((val,ind)=>{ 57 | return( 58 | <> 59 | 68 | 69 | 70 | ) 71 | }) 72 | } 73 | 74 | 75 | 76 |
77 |
78 |
79 |
80 | 81 |
82 |
83 |
84 | 85 |
86 | 87 | 88 | ) 89 | } 90 | 91 | 92 |
93 | 94 | 95 | ) 96 | } 97 | 98 | export default Cart 99 | -------------------------------------------------------------------------------- /client/src/page/Contact.jsx: -------------------------------------------------------------------------------- 1 | import React,{useRef, useEffect} from 'react' 2 | import { useHistory } from 'react-router-dom' 3 | 4 | import axios from 'axios' 5 | 6 | const Contact = () => { 7 | const timeout = useRef(null) 8 | const his= useHistory() 9 | const checkAuth=()=>{ 10 | axios.get("http://localhost:8000/isAuth",{ 11 | headers:{ 12 | "x-access-token":localStorage.getItem("Ecomtoken") 13 | } 14 | }).then((response)=>{ 15 | // console.log() 16 | if(!response.data.login) 17 | { 18 | his.push("/"); 19 | } 20 | }) 21 | 22 | } 23 | 24 | useEffect(()=>{ 25 | timeout.current=setTimeout(checkAuth,1000) 26 | return function(){ 27 | if(timeout.current) 28 | { 29 | clearTimeout(timeout.current) 30 | } 31 | } 32 | 33 | 34 | },[]) 35 | return ( 36 | <> 37 | hii 38 | 39 | 40 | ) 41 | } 42 | 43 | export default Contact 44 | -------------------------------------------------------------------------------- /client/src/page/EditAdd.jsx: -------------------------------------------------------------------------------- 1 | import React,{useState,useEffect,useRef} from 'react' 2 | import { useHistory, useParams } from 'react-router-dom' 3 | import axios from 'axios' 4 | 5 | const EditAdd = () => { 6 | const datemail=localStorage.getItem('EcomEmail') 7 | const [name, setName] = useState("") 8 | const [email, setEmail] = useState(datemail) 9 | const [phone, setPhone] = useState("") 10 | const [addr, setAddr] = useState("") 11 | 12 | const {id}= useParams() 13 | 14 | 15 | 16 | const timeout = useRef(null) 17 | const his= useHistory() 18 | const checkAuth=()=>{ 19 | axios.get("http://localhost:8000/isAuth",{ 20 | headers:{ 21 | "x-access-token":localStorage.getItem("Ecomtoken") 22 | } 23 | }).then((response)=>{ 24 | // console.log() 25 | if(!response.data.login) 26 | { 27 | his.push("/"); 28 | } 29 | }) 30 | 31 | } 32 | 33 | useEffect(()=>{ 34 | timeout.current=setTimeout(checkAuth,100) 35 | return function(){ 36 | if(timeout.current) 37 | { 38 | clearTimeout(timeout.current) 39 | } 40 | } 41 | 42 | 43 | },[]) 44 | 45 | 46 | 47 | 48 | const getaddress=async ()=>{ 49 | const res=await axios.get(`http://localhost:8000/getaddress/${id}`) 50 | setName(res.data[0].name) 51 | setEmail(res.data[0].email) 52 | setPhone(res.data[0].phone) 53 | setAddr(res.data[0].address) 54 | // console.log(res.data) 55 | // setYourAddress(res.data) 56 | 57 | } 58 | useEffect(() => { 59 | getaddress() 60 | }, []) 61 | 62 | 63 | const onSub= async(e)=>{ 64 | e.preventDefault() 65 | const data={ 66 | name:name, 67 | email:email, 68 | phone:phone, 69 | address:addr, 70 | userId:id 71 | } 72 | 73 | const res=await axios.post(`http://localhost:8000/editadd`,data) 74 | his.push("/payment") 75 | 76 | } 77 | 78 | return ( 79 | <> 80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | 88 | setName(e.target.value)} required /> 89 |
90 |
91 | 92 | setEmail(e.target.value)} required /> 93 |
94 |
95 | 96 | setPhone(e.target.value)} required /> 97 |
98 | 99 |
100 | 101 | 102 | 103 |
104 | 105 | 106 | 107 |
108 | 109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 | 117 | ) 118 | } 119 | 120 | export default EditAdd 121 | -------------------------------------------------------------------------------- /client/src/page/Home.jsx: -------------------------------------------------------------------------------- 1 | import React,{useEffect,useRef} from 'react' 2 | import { useHistory } from 'react-router-dom' 3 | import '../App.css' 4 | import AllProducts from '../component/AllProducts' 5 | // import { DataContext } from '../context/DataContext' 6 | import axios from 'axios' 7 | 8 | const Home = () => { 9 | const timeout = useRef(null) 10 | const his= useHistory() 11 | const checkAuth=()=>{ 12 | axios.get("http://localhost:8000/isAuth",{ 13 | headers:{ 14 | "x-access-token":localStorage.getItem("Ecomtoken") 15 | } 16 | }).then((response)=>{ 17 | // console.log() 18 | if(!response.data.login) 19 | { 20 | // window.location.reload() 21 | his.push("/"); 22 | } 23 | }) 24 | 25 | } 26 | 27 | useEffect(()=>{ 28 | timeout.current=setTimeout(checkAuth,1000) 29 | return function(){ 30 | if(timeout.current) 31 | { 32 | clearTimeout(timeout.current) 33 | } 34 | } 35 | 36 | 37 | },[]) 38 | // setInterval(checkAuth, 1000); 39 | useEffect(() => { 40 | const datafet=async()=>{ 41 | const res=await axios.get(`https://open.mapquestapi.com/geocoding/v1/address?key=ccxeu5eQ2pEdTe7UvyQNbbE9XXdeLKdi&street=Hanschara%20M%20D%20High%20School&city=chandipur&state=wb&postalCode=721625`) 42 | console.log(res) 43 | } 44 | datafet() 45 | 46 | }, []) 47 | 48 | return ( 49 | <> 50 |
51 |
52 |
53 |
54 |

Welcome to GreenX World

55 |

Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque, quos.

56 | 57 | 58 |
59 |
60 | home 61 | 62 |
63 |
64 |
65 |
66 | 67 |
68 |
69 |
70 |
71 | ok 72 |
73 |
74 |

Welcome to GreenX World

75 |

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Placeat cupiditate aspernatur, aperiam consequatur fugiat nisi! At labore corrupti, non vitae libero obcaecati, necessitatibus, odio facilis aliquid odit nulla porro itaque.

76 | 77 |
78 |
79 |
80 |
81 | 82 | ) 83 | } 84 | 85 | export default Home 86 | -------------------------------------------------------------------------------- /client/src/page/Login.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState,useRef } from 'react' 2 | import { NavLink , useHistory} from 'react-router-dom' 3 | import axios from 'axios' 4 | // import { DataContext } from '../context/DataContext' 5 | const Login = () => { 6 | 7 | 8 | const [email,setEmail]=useState("") 9 | const [password,setPassword]=useState("") 10 | const [status,setStatus]=useState(false) 11 | const [msg,setMsg]=useState("") 12 | const timeout = useRef(null) 13 | 14 | const his= useHistory() 15 | const checkAuth=()=>{ 16 | axios.get("http://localhost:8000/isAuth",{ 17 | headers:{ 18 | "x-access-token":localStorage.getItem("Ecomtoken") 19 | } 20 | }).then((response)=>{ 21 | // console.log() 22 | if(response.data.login) 23 | { 24 | his.push("/home"); 25 | } 26 | }) 27 | 28 | } 29 | 30 | useEffect(()=>{ 31 | timeout.current=setTimeout(checkAuth,1000) 32 | return function(){ 33 | if(timeout.current) 34 | { 35 | clearTimeout(timeout.current) 36 | } 37 | } 38 | // checkAuth() 39 | 40 | 41 | },[]) 42 | // setInterval(checkAuth, 1000); 43 | 44 | 45 | 46 | 47 | 48 | 49 | const onSub=async (e)=>{ 50 | e.preventDefault() 51 | const data={ 52 | 53 | email:email, 54 | password:password 55 | } 56 | 57 | const res=await axios.post("http://localhost:8000/login",data) 58 | if(res.data.msg) 59 | { 60 | setStatus(true) 61 | setMsg(res.data.msg) 62 | 63 | } 64 | else{ 65 | localStorage.setItem("Ecomtoken",res.data.token) 66 | localStorage.setItem("EcomUser",res.data.user) 67 | localStorage.setItem("EcomUserId",res.data.userID) 68 | localStorage.setItem("EcomEmail",res.data.userEmail) 69 | his.push("/home") 70 | } 71 | // console.log(res) 72 | } 73 | 74 | return ( 75 | <> 76 |
77 |
78 |
79 |
80 | { 81 | status ?( 82 | <> 83 |
84 | 85 |

{msg}

86 |
87 | 88 | 89 | ):null 90 | } 91 |
92 |

Login Now

93 |
94 | 95 |
96 | setEmail(e.target.value)} required /> 97 |
98 |
99 | 100 | setPassword(e.target.value)} required /> 101 |
102 | 103 | 104 |
105 |
106 | Register Now 107 |
108 |
109 |
110 | 111 |
112 | 113 | 114 | ) 115 | } 116 | 117 | export default Login 118 | -------------------------------------------------------------------------------- /client/src/page/MyAccount.jsx: -------------------------------------------------------------------------------- 1 | import React,{useEffect, useState,useRef} from 'react' 2 | import { NavLink, useHistory } from 'react-router-dom' 3 | import axios from 'axios' 4 | 5 | const MyAccount = () => { 6 | const [order, setOrder] = useState([]) 7 | 8 | const userdatast=localStorage.getItem('EcomUser') 9 | 10 | const logout=()=>{ 11 | localStorage.removeItem("Ecomtoken"); 12 | localStorage.removeItem("Ecomlongid"); 13 | localStorage.removeItem("EcomEmail"); 14 | localStorage.removeItem("EcomUser"); 15 | localStorage.removeItem("Ecompaymentmode"); 16 | localStorage.removeItem("EcomUserId") 17 | window.location.reload() 18 | } 19 | 20 | const timeout = useRef(null) 21 | const his= useHistory() 22 | const checkAuth=()=>{ 23 | axios.get("http://localhost:8000/isAuth",{ 24 | headers:{ 25 | "x-access-token":localStorage.getItem("Ecomtoken") 26 | } 27 | }).then((response)=>{ 28 | // console.log() 29 | if(!response.data.login) 30 | { 31 | his.push("/"); 32 | } 33 | }) 34 | 35 | } 36 | 37 | useEffect(()=>{ 38 | timeout.current=setTimeout(checkAuth,10) 39 | return function(){ 40 | if(timeout.current) 41 | { 42 | clearTimeout(timeout.current) 43 | } 44 | } 45 | 46 | 47 | },[]) 48 | 49 | 50 | 51 | const getOrderDetails=async(id)=>{ 52 | 53 | const res=await axios.get(`http://localhost:8000/account/${id}`) 54 | setOrder(res.data) 55 | } 56 | 57 | useEffect(()=>{ 58 | const dat=localStorage.getItem('EcomUserId') 59 | 60 | getOrderDetails(dat) 61 | },[]) 62 | if(!order.length) 63 | { 64 | return ( 65 | <> 66 |
67 | 68 | 69 |

70 | 71 |

You Not Yet Placed Any Order

72 | 73 |
74 | 75 | 76 | ) 77 | } 78 | 79 | return ( 80 | <> 81 |
82 |
83 | 84 | 85 |

86 |
87 |
88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | { 104 | order.map((val,ind)=>{ 105 | return( 106 | <> 107 | 108 | 109 | 115 | 116 | 117 | 122 | 123 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | ) 133 | }) 134 | 135 | } 136 | 137 | 138 |
#Order DatePayment MethodOrder StatusAmountOperation
{ind+1} 110 | 111 | { 112 | new Date(val.timestamp).toDateString() 113 | } 114 | {val.paymentmode} 118 | { 119 | val.orderstatus 120 | } 121 | {val.totalprice} 124 | View 125 |
139 |
140 | 141 |
142 |
143 |
144 | 145 | 146 | ) 147 | } 148 | 149 | export default MyAccount 150 | -------------------------------------------------------------------------------- /client/src/page/MyOrder.jsx: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import React, { useEffect, useState,useRef } from 'react' 3 | import { NavLink, useParams ,useHistory} from 'react-router-dom' 4 | 5 | const MyOrder = () => { 6 | const [data,setData]= useState([]) 7 | const {id}=useParams() 8 | 9 | 10 | const timeout = useRef(null) 11 | const his= useHistory() 12 | const checkAuth=()=>{ 13 | axios.get("http://localhost:8000/isAuth",{ 14 | headers:{ 15 | "x-access-token":localStorage.getItem("Ecomtoken") 16 | } 17 | }).then((response)=>{ 18 | // console.log() 19 | if(!response.data.login) 20 | { 21 | his.push("/"); 22 | } 23 | }) 24 | 25 | } 26 | 27 | useEffect(()=>{ 28 | timeout.current=setTimeout(checkAuth,100) 29 | return function(){ 30 | if(timeout.current) 31 | { 32 | clearTimeout(timeout.current) 33 | } 34 | } 35 | 36 | 37 | },[]) 38 | 39 | 40 | const getData=async()=>{ 41 | const {data}= await axios.get(`http://localhost:8000/myorder/${id}`) 42 | setData(data) 43 | } 44 | useEffect(()=>{ 45 | getData() 46 | },[]) 47 | return ( 48 | <> 49 |
50 |
51 |
52 |
53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | { 69 | data.map((val,ind)=>{ 70 | return( 71 | <> 72 | 73 | 74 | 80 | 84 | 85 | 88 | 89 | 90 | 91 | ) 92 | }) 93 | } 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |
#Order DetailsPriceQtyAmount
{ind+1} 75 | 76 | {val.plant_image} 77 |

{val.name}

78 |
79 |
81 | {val.price} 82 | 83 | {val.productqty} 86 | {val.price*val.productqty} 87 |
103 |
104 | 105 |
106 |
107 |
108 | 109 | 110 | 111 | ) 112 | } 113 | 114 | export default MyOrder 115 | -------------------------------------------------------------------------------- /client/src/page/PayNow.jsx: -------------------------------------------------------------------------------- 1 | import React,{useContext,useState, useEffect} from 'react' 2 | import { NavLink, useParams } from 'react-router-dom' 3 | import { DataContext } from '../context/DataContext' 4 | import axios from 'axios' 5 | const PayNow = () => { 6 | const {pid}= useParams() 7 | const urll=localStorage.getItem('Ecomlongurl') 8 | const dat=localStorage.getItem('EcomUserId') 9 | const Ecompaymentmode=localStorage.getItem('Ecompaymentmode') 10 | const [total, setTotal] = useState("") 11 | const {cart,setCart}=useContext(DataContext) 12 | 13 | useEffect(()=>{ 14 | // console.log() 15 | let totamo=0; 16 | for(let i=0;i{ 26 | // let str = urll; 27 | // const myArr = str.split("/"); 28 | // const pyid=myArr[myArr.length-1]; 29 | // console.log(pyid ) 30 | // console.log(urll) 31 | // const data={ 32 | // userid:dat, 33 | // totalprice:total, 34 | // orderstatus:"order done", 35 | // paymentmode:Ecompaymentmode, 36 | // payId:pyid, 37 | // cart:cart 38 | // } 39 | // window.location.href=urll 40 | // const res= await axios.post(`http://localhost:8000/paydetails`,data) 41 | console.log("hi") 42 | 43 | 44 | 45 | } 46 | return ( 47 | <> 48 |
49 |
50 | {/* Pay Now */} 51 | 52 |
53 |
54 | 55 | 56 | ) 57 | } 58 | 59 | export default PayNow 60 | -------------------------------------------------------------------------------- /client/src/page/Payment.jsx: -------------------------------------------------------------------------------- 1 | import React, { useContext ,useEffect,useState,useRef} from 'react' 2 | import { NavLink, useHistory } from 'react-router-dom' 3 | import { DataContext } from '../context/DataContext' 4 | import axios from 'axios' 5 | const Payment = () => { 6 | const his = useHistory() 7 | const datemail=localStorage.getItem('EcomEmail') 8 | const [name, setName] = useState("") 9 | const [email, setEmail] = useState(datemail) 10 | const [phone, setPhone] = useState("") 11 | const [addr, setAddr] = useState("") 12 | const [yourAddress, setYourAddress] = useState([]) 13 | const [inputAddres, setInputAddres] = useState("") 14 | const [showaddress,setShowaddress]=useState(false) 15 | const [payment, setPayment] = useState("") 16 | const [UserId,setUserId]= useState("") 17 | 18 | const {cart,setCart}=useContext(DataContext) 19 | const [total, setTotal] = useState("") 20 | var tot=0; 21 | 22 | 23 | 24 | const timeout = useRef(null) 25 | 26 | const checkAuth=()=>{ 27 | axios.get("http://localhost:8000/isAuth",{ 28 | headers:{ 29 | "x-access-token":localStorage.getItem("Ecomtoken") 30 | } 31 | }).then((response)=>{ 32 | // console.log() 33 | if(!response.data.login) 34 | { 35 | his.push("/"); 36 | } 37 | }) 38 | 39 | } 40 | 41 | useEffect(()=>{ 42 | timeout.current=setTimeout(checkAuth,1000) 43 | return function(){ 44 | if(timeout.current) 45 | { 46 | clearTimeout(timeout.current) 47 | } 48 | } 49 | 50 | 51 | },[]) 52 | 53 | 54 | useEffect(()=>{ 55 | // console.log() 56 | let totamo=0; 57 | for(let i=0;i{ 70 | const dat=localStorage.getItem('EcomUserId') 71 | 72 | 73 | const res=await axios.get(`http://localhost:8000/getaddress/${dat}`) 74 | // 75 | setYourAddress(res.data) 76 | 77 | } 78 | 79 | 80 | const onSub=(e)=>{ 81 | e.preventDefault() 82 | const dat=localStorage.getItem('EcomUserId') 83 | const adddata={ 84 | name:name, 85 | email:email, 86 | phone:phone, 87 | address:addr, 88 | userId:dat 89 | } 90 | const sendData=async ()=>{ 91 | const res=await axios.post(`http://localhost:8000/addaddress`,adddata) 92 | // console.log(res) 93 | setShowaddress(false) 94 | 95 | } 96 | sendData() 97 | getaddress() 98 | // console.log(data) 99 | } 100 | 101 | useEffect(()=>{ 102 | getaddress() 103 | },[]) 104 | 105 | useEffect(()=>{ 106 | getaddress() 107 | },[yourAddress]) 108 | 109 | 110 | 111 | const OnBuyNow=async (e)=>{ 112 | e.preventDefault() 113 | // console.log(inputAddres + payment) 114 | const dat=localStorage.getItem('EcomUserId') 115 | const datemail=localStorage.getItem('EcomEmail') 116 | const datname=localStorage.getItem('EcomUser') 117 | localStorage.setItem('Ecompaymentmode',payment) 118 | 119 | 120 | const data={ 121 | userid:dat, 122 | totalprice:total, 123 | // orderstatus:"order Not Done", 124 | paymentmode:payment, 125 | paymentemail:datemail, 126 | name:datname, 127 | cart:cart 128 | } 129 | // console.log(data) 130 | 131 | const res=await axios.post(`http://localhost:8000/buynow`,data) 132 | // console.log(res.data.payment_request.longurl) 133 | 134 | if(res.data.success) 135 | { 136 | setCart([]) 137 | localStorage.setItem('Ecomlongid',res.data.payment_request.id) 138 | 139 | his.push(`/myaccount`) 140 | }else{ 141 | console.log("order not placed") 142 | } 143 | window.open(res.data.payment_request.longurl,'_self') 144 | // window.close('http://localhost:3000/payment') 145 | } 146 | 147 | useEffect(()=>{ 148 | const dat=localStorage.getItem('EcomUserId') 149 | setUserId(dat) 150 | },[]) 151 | 152 | 153 | 154 | 155 | if(!cart.length) 156 | { 157 | return ( 158 | <> 159 |
160 |

There is No cart items

161 |
162 | 163 | 164 | ) 165 | } 166 | 167 | 168 | 169 | 170 | return ( 171 | <> 172 |
173 |
174 |
175 |
176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | { 191 | 192 | cart.map((val,ind)=>{ 193 | tot=tot+val.price*val.qty 194 | 195 | // tot >0 ? setTotal(tot) :null 196 | 197 | // console.log(tot) 198 | return( 199 | <> 200 | 201 | 202 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | ) 219 | }) 220 | } 221 |
222 |

Sub Total : {tot}.00

223 |

Delivery Fees: 50.00

224 |

Total Amount : {tot+50}.00

225 | 226 |
227 | 228 | 229 |
#ProductPriceQtyAmount
{ind+1} 203 | 204 | 205 | 206 | {`../img/${val.image}`} 207 |

{val.name}

208 |
209 |
{val.price}.00{val.qty}{val.price*val.qty}.00
230 |
231 | 232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 | { 240 | showaddress && ( 241 | <> 242 |
243 |
244 |
245 | 246 | setName(e.target.value)} required /> 247 |
248 |
249 | 250 | setEmail(e.target.value)} required /> 251 |
252 |
253 | 254 | setPhone(e.target.value)} required /> 255 |
256 | 257 |
258 | 259 | 260 | 261 |
262 | 263 | 264 | 265 |
266 | 267 |
268 |
269 |
270 | 271 | 272 | ) 273 | } 274 | 275 |
276 |
277 |
278 |

Add Recived Address

279 |
280 | { 281 | yourAddress.length ? ( 282 | <> 283 |
284 | 285 | { 286 | yourAddress.map((val,ind)=>{ 287 | return( 288 | <> 289 | 290 |
291 | 295 |
296 | 297 | ) 298 | }) 299 | } 300 | 301 | 302 | 303 | 304 | 305 |

Choose payment option

306 | 307 | {/*
308 | 311 |
*/} 312 |
313 | 316 |
317 | 318 | 319 |
320 | 321 |
322 | 323 | 324 | 325 | 326 |
327 | 328 | 329 | ): 330 | 331 | } 332 | 333 |
334 |
335 |
336 |
337 |
338 | 339 | 340 | ) 341 | } 342 | 343 | export default Payment 344 | 345 | -------------------------------------------------------------------------------- /client/src/page/ProductDetails.jsx: -------------------------------------------------------------------------------- 1 | import React,{useContext, useEffect,useState,useRef} from 'react' 2 | import { useParams,useHistory } from 'react-router-dom' 3 | import axios from 'axios' 4 | import { DataContext } from '../context/DataContext' 5 | 6 | const ProductDetails = () => { 7 | const {id}= useParams() 8 | 9 | const {cart,setCart}= useContext(DataContext) 10 | const [detdata, setDetdata] = useState([]) 11 | const [pdetails, setPdetails] = useState("1") 12 | 13 | const timeout = useRef(null) 14 | const his= useHistory() 15 | const checkAuth=()=>{ 16 | axios.get("http://localhost:8000/isAuth",{ 17 | headers:{ 18 | "x-access-token":localStorage.getItem("Ecomtoken") 19 | } 20 | }).then((response)=>{ 21 | // console.log() 22 | if(!response.data.login) 23 | { 24 | his.push("/"); 25 | } 26 | }) 27 | 28 | } 29 | 30 | useEffect(()=>{ 31 | timeout.current=setTimeout(checkAuth,100) 32 | return function(){ 33 | if(timeout.current) 34 | { 35 | clearTimeout(timeout.current) 36 | } 37 | } 38 | 39 | 40 | },[]) 41 | 42 | 43 | 44 | const onSub=(e)=>{ 45 | e.preventDefault() 46 | // console.log(pdetails) 47 | const data={ 48 | id:detdata[0].id, 49 | name:detdata[0].name, 50 | price:detdata[0].price, 51 | image:detdata[0].plant_image, 52 | qty:pdetails 53 | } 54 | // console.log(data) 55 | 56 | // setCart([...cart,data]) 57 | const exist=cart.find((x)=>x.id===data.id) 58 | if(exist) 59 | { 60 | setCart( 61 | cart.map((x)=>x.id===data.id?data:x) 62 | ) 63 | } 64 | else{ 65 | setCart([...cart,data]) 66 | } 67 | 68 | } 69 | 70 | 71 | const getData= async ()=>{ 72 | 73 | const res=await axios.get(`http://localhost:8000/getdata/${id}`) 74 | setDetdata(res.data) 75 | } 76 | useEffect(() => { 77 | getData() 78 | }, []) 79 | if(!detdata.length) 80 | { 81 | return

Loading..

82 | } 83 | 84 | return ( 85 | <> 86 |
87 |
88 |
89 |
90 | {detdata[0].plant_image} 91 |
92 |
93 |

{detdata[0].name}

94 |

Price : {detdata[0].price}.00

95 |

Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ab quisquam quae ex maiores possimus nihil eum assumenda asperiores! Autem maxime incidunt voluptatibus quidem quaerat corrupti ex natus sed mollitia modi.

96 |
97 | 98 |
99 | 100 | 107 |
108 |
109 | 110 |
111 | {/* */} 112 |
113 |
114 |
115 |
116 |
117 | 118 | 119 | ) 120 | } 121 | 122 | export default ProductDetails 123 | -------------------------------------------------------------------------------- /client/src/page/Products.jsx: -------------------------------------------------------------------------------- 1 | import React,{useEffect,useState,useRef} from 'react' 2 | import axios from 'axios' 3 | import CardProducts from '../component/CardProducts' 4 | // import { DataContext } from '../context/DataContext' 5 | import { useHistory } from 'react-router-dom' 6 | const Products = () => { 7 | const [getdata, setGetdata] = useState([]) 8 | 9 | const timeout = useRef(null) 10 | const his= useHistory() 11 | const checkAuth=()=>{ 12 | axios.get("http://localhost:8000/isAuth",{ 13 | headers:{ 14 | "x-access-token":localStorage.getItem("Ecomtoken") 15 | } 16 | }).then((response)=>{ 17 | // console.log() 18 | if(!response.data.login) 19 | { 20 | his.push("/"); 21 | } 22 | }) 23 | 24 | } 25 | 26 | useEffect(()=>{ 27 | timeout.current=setTimeout(checkAuth,1000) 28 | return function(){ 29 | if(timeout.current) 30 | { 31 | clearTimeout(timeout.current) 32 | } 33 | } 34 | 35 | 36 | },[]) 37 | 38 | 39 | const getData= async ()=>{ 40 | 41 | const res=await axios.get('http://localhost:8000/getdataall') 42 | setGetdata(res.data) 43 | } 44 | useEffect(() => { 45 | getData() 46 | }, []) 47 | 48 | const sortData= async (sort)=>{ 49 | const res=await axios.get(`http://localhost:8000/sort/${sort}`) 50 | setGetdata(res.data) 51 | } 52 | const sortHandel=(e)=>{ 53 | const sort=e.target.value 54 | if(sort==='all') 55 | { 56 | getData() 57 | } 58 | else { 59 | sortData(sort) 60 | } 61 | 62 | } 63 | 64 | if(!getdata.length) 65 | { 66 | return

Loading..

67 | } 68 | 69 | return ( 70 | <> 71 |
72 |
73 |

Best Products

74 |
75 |

76 |
77 | 78 | 87 |
88 |
89 |
90 | { 91 | getdata.map((val,ind)=>{ 92 | return( 93 | <> 94 | 101 | 102 | ) 103 | }) 104 | } 105 | 106 | 107 | 108 |
109 |
110 |
111 | 112 | 113 | 114 | ) 115 | } 116 | 117 | export default Products 118 | -------------------------------------------------------------------------------- /client/src/page/Register.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState,useRef ,useEffect} from 'react' 2 | import { NavLink, useHistory } from 'react-router-dom' 3 | import axios from 'axios' 4 | // import { DataContext } from '../context/DataContext' 5 | const Register = () => { 6 | const [username,setUserName]=useState("") 7 | const [email,setEmail]=useState("") 8 | const [password,setPassword]=useState("") 9 | const [status,setStatus]=useState(false) 10 | const [msg,setMsg]=useState("") 11 | const timeout = useRef(null) 12 | 13 | const his= useHistory() 14 | const checkAuth=()=>{ 15 | axios.get("http://localhost:8000/isAuth",{ 16 | headers:{ 17 | "x-access-token":localStorage.getItem("Ecomtoken") 18 | } 19 | }).then((response)=>{ 20 | // console.log() 21 | if(response.data.login) 22 | { 23 | his.push("/home"); 24 | } 25 | }) 26 | 27 | } 28 | 29 | useEffect(()=>{ 30 | timeout.current=setTimeout(checkAuth,1000) 31 | return function(){ 32 | if(timeout.current) 33 | { 34 | clearTimeout(timeout.current) 35 | } 36 | } 37 | // checkAuth() 38 | 39 | 40 | },[]) 41 | 42 | const onSub=async (e)=>{ 43 | e.preventDefault() 44 | const data={ 45 | username:username, 46 | email:email, 47 | password:password 48 | } 49 | // console.log(data) 50 | const res=await axios.post("http://localhost:8000/register",data) 51 | // console.log(res) 52 | if(res.data.msg) 53 | { 54 | setStatus(true) 55 | setMsg(res.data.msg) 56 | 57 | } 58 | else 59 | { 60 | his.push("/") 61 | } 62 | } 63 | 64 | return ( 65 | <> 66 |
67 |
68 |
69 |
70 | { 71 | status ?( 72 | <> 73 |
74 | 75 |

{msg}

76 |
77 | 78 | 79 | ):null 80 | } 81 |
82 | 83 |

Register Now

84 |
85 |
86 | setUserName(e.target.value)} required /> 87 |
88 |
89 | setEmail(e.target.value)} required /> 90 |
91 |
92 | 93 | setPassword(e.target.value)} required /> 94 |
95 | 96 | 97 |
98 |
99 | Login Now 100 |
101 |
102 |
103 | 104 |
105 | 106 | 107 | ) 108 | } 109 | 110 | export default Register 111 | -------------------------------------------------------------------------------- /client/src/page/Success.jsx: -------------------------------------------------------------------------------- 1 | 2 | import React,{useEffect,useRef} from 'react' 3 | import { useHistory, useLocation } from 'react-router-dom' 4 | import axios from 'axios' 5 | const Success = () => { 6 | const his= useHistory() 7 | const loc=useLocation() 8 | const pid=localStorage.getItem('Ecomlongid') 9 | useEffect(() => { 10 | const paydet=async()=>{ 11 | // console.log(loc.search) 12 | const str=loc.search; 13 | const myArr = str.split("="); 14 | const pyid=myArr[myArr.length-1]; 15 | // console.log(pyid) 16 | const data={ 17 | pid:pid, 18 | pyid:pyid 19 | } 20 | const res= await axios.post(`http://localhost:8000/paydetails`,data) 21 | // console.log(his) 22 | console.log(res) 23 | 24 | } 25 | paydet() 26 | 27 | }, []) 28 | 29 | 30 | 31 | const timeout = useRef(null) 32 | // const his= useHistory() 33 | const checkAuth=()=>{ 34 | axios.get("http://localhost:8000/isAuth",{ 35 | headers:{ 36 | "x-access-token":localStorage.getItem("Ecomtoken") 37 | } 38 | }).then((response)=>{ 39 | // console.log() 40 | if(!response.data.login) 41 | { 42 | his.push("/"); 43 | } 44 | }) 45 | 46 | } 47 | 48 | useEffect(()=>{ 49 | timeout.current=setTimeout(checkAuth,10) 50 | return function(){ 51 | if(timeout.current) 52 | { 53 | clearTimeout(timeout.current) 54 | } 55 | } 56 | 57 | 58 | },[]) 59 | 60 | 61 | 62 | return ( 63 | <> 64 |
65 |
66 |
67 |

Thank You for Buy This

68 | 69 |
70 |
71 |
72 | 73 | 74 | ) 75 | } 76 | 77 | export default Success 78 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | const express=require("express"); 2 | const mysql=require("mysql"); 3 | const cors=require("cors"); 4 | const bcrypt = require('bcrypt'); 5 | var jwt = require('jsonwebtoken'); 6 | const Insta = require("instamojo-nodejs"); 7 | const url = require('url'); 8 | const open = require('openurl'); 9 | const saltRounds = 10; 10 | const PORT =process.env.PORT || 8000; 11 | 12 | const API_KEY = "test_******"; 13 | const AUTH_KEY = "test_*****"; 14 | 15 | 16 | Insta.setKeys(API_KEY, AUTH_KEY); 17 | 18 | Insta.isSandboxMode(true); 19 | 20 | const app =express() 21 | app.use(cors()) 22 | app.use(express.json()) 23 | var db = mysql.createConnection({ 24 | host : 'localhost', 25 | user : 'root', 26 | password : '', 27 | database : 'ecom-react' 28 | }); 29 | 30 | app.get("/",(req,res)=>{ 31 | res.send("hi") 32 | }) 33 | // get data 34 | app.get("/getdataall",(req,res)=>{ 35 | let sql=`select * from products`; 36 | db.query(sql,(err,result)=>{ 37 | if(err) 38 | { 39 | console.log(err) 40 | } 41 | else{ 42 | res.send(result) 43 | } 44 | }) 45 | }) 46 | app.get("/getdata",(req,res)=>{ 47 | let sql=`select * from products ORDER BY RAND() limit 6`; 48 | db.query(sql,(err,result)=>{ 49 | if(err) 50 | { 51 | console.log(err) 52 | } 53 | else{ 54 | res.send(result) 55 | } 56 | }) 57 | 58 | }) 59 | app.get("/getdata/:id",(req,res)=>{ 60 | const id=req.params.id; 61 | let sqll=`select * from products where id=${id}`; 62 | db.query(sqll,(err,result)=>{ 63 | if(err) 64 | { 65 | console.log(err) 66 | } 67 | else{ 68 | res.send(result) 69 | } 70 | }) 71 | 72 | 73 | }) 74 | app.get("/sort/:price",(req,res)=>{ 75 | const price=req.params.price; 76 | if(price==='200') 77 | { 78 | let sqll=`select * from products WHERE price < 200`; 79 | db.query(sqll,(err,result)=>{ 80 | if(err) 81 | { 82 | console.log(err) 83 | } 84 | else{ 85 | res.send(result) 86 | } 87 | }) 88 | 89 | } 90 | else if(price==='200_500') 91 | { 92 | let sqll=`select * from products WHERE price >=200 && price <= 500`; 93 | db.query(sqll,(err,result)=>{ 94 | if(err) 95 | { 96 | console.log(err) 97 | } 98 | else{ 99 | res.send(result) 100 | } 101 | }) 102 | 103 | } 104 | else if(price==='500_1000') 105 | { 106 | let sqll=`select * from products WHERE price > 500 && price <= 1000`; 107 | db.query(sqll,(err,result)=>{ 108 | if(err) 109 | { 110 | console.log(err) 111 | } 112 | else{ 113 | res.send(result) 114 | } 115 | }) 116 | 117 | } 118 | 119 | 120 | 121 | }) 122 | 123 | app.get("/getaddress/:userid",(req,res)=>{ 124 | const userid=req.params.userid 125 | let sql=`select * from user_data where user_id=${userid}`; 126 | db.query(sql,(err,result)=>{ 127 | if(err) 128 | { 129 | console.log(err) 130 | } 131 | else{ 132 | res.send(result) 133 | } 134 | }) 135 | }) 136 | 137 | 138 | app.get("/account/:id",(req,res)=>{ 139 | const id=req.params.id; 140 | let sqll=`select * from orders where userid=${id} && orderstatus='order done'`; 141 | db.query(sqll,(err,result)=>{ 142 | if(err) 143 | { 144 | console.log(err) 145 | } 146 | else{ 147 | 148 | res.send(result) 149 | } 150 | }) 151 | 152 | }) 153 | app.get("/myorder/:id",(req,res)=>{ 154 | const id=req.params.id; 155 | // let sqll=`select * from orderitems where orderid=${id}`; 156 | let sqll=`SELECT * FROM orderitems,products WHERE orderitems.productid = products.id && orderitems.orderid=${id}` 157 | db.query(sqll,(err,result)=>{ 158 | if(err) 159 | { 160 | console.log(err) 161 | } 162 | else{ 163 | 164 | res.send(result) 165 | } 166 | }) 167 | }) 168 | 169 | // post details 170 | 171 | app.post("/addaddress",(req,res)=>{ 172 | const data={ 173 | name:req.body.name, 174 | email:req.body.email, 175 | phone:req.body.phone, 176 | address:req.body.address, 177 | user_id:req.body.userId 178 | 179 | } 180 | let sql="INSERT INTO `user_data` SET ?"; 181 | db.query(sql,data,(err,result)=>{ 182 | if(err) 183 | { 184 | console.log(err) 185 | } 186 | else{ 187 | 188 | res.send({msg:"Address inserted Successfully"}) 189 | 190 | } 191 | }) 192 | // console.log(data) 193 | 194 | 195 | 196 | }) 197 | 198 | app.post("/buynow",(req,res)=>{ 199 | // const data={ 200 | // userid:req.body.userid, 201 | // totalprice:req.body.totalprice, 202 | // orderstatus:req.body.orderstatus, 203 | // paymentmode:req.body.paymentmode, 204 | 205 | 206 | // } 207 | 208 | 209 | 210 | const cartdata=req.body.cart 211 | const paymentemail=req.body.paymentemail 212 | const name=req.body.name; 213 | var insta = new Insta.PaymentData(); 214 | 215 | const REDIRECT_URL = "http://localhost:3000/success"; 216 | 217 | insta.setRedirectUrl(REDIRECT_URL); 218 | insta.send_email = "True"; 219 | insta.send_sms = "False"; 220 | insta.purpose = "React Ecom"; // REQUIRED 221 | insta.amount = req.body.totalprice; 222 | insta.name = name; 223 | insta.email = paymentemail; // REQUIRED 224 | 225 | // console.log(paymentemail+ name) 226 | 227 | Insta.createPayment(insta, function (error, response) { 228 | if (error) { 229 | console.log("something went wrong") 230 | } else { 231 | // console.log(response[0].success) 232 | const responseData = JSON.parse( response ); 233 | const redirectUrl = responseData.payment_request.longurl; 234 | // console.log(redirectUrl) 235 | // open(response.payment_request.longurl); 236 | const data={ 237 | userid:req.body.userid, 238 | totalprice:req.body.totalprice, 239 | orderstatus:responseData.payment_request.status, 240 | paymentmode:req.body.paymentmode, 241 | paymentid:responseData.payment_request.id 242 | 243 | 244 | } 245 | 246 | 247 | let sql="INSERT INTO `orders` SET ?"; 248 | db.query(sql,data,(err,result)=>{ 249 | if(err) 250 | { 251 | // console.log("hi1") 252 | console.log(err) 253 | } 254 | else{ 255 | // console.log(result.insertId) 256 | 257 | for(let i=0;i{ 269 | if(er) 270 | { 271 | // console.log("hi2") 272 | console.log(er) 273 | } 274 | 275 | }) 276 | 277 | 278 | 279 | } 280 | // open.open(redirectUrl) 281 | res.send(response) 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | } 295 | }) 296 | 297 | 298 | 299 | 300 | // res.send(response) 301 | // res.send({msg:"pay done"}) 302 | } 303 | }); 304 | 305 | 306 | // console.log(data) 307 | }) 308 | 309 | app.post("/paydetails",(req,res)=>{ 310 | 311 | const pid=req.body.pid 312 | const pyid=req.body.pyid 313 | 314 | if(pid === pyid) 315 | { 316 | let sql=`update orders set orderstatus="order done" where paymentid='${pid}'` 317 | db.query(sql,(err,result)=>{ 318 | if(err) 319 | { 320 | console.log(err) 321 | } 322 | else{ 323 | 324 | res.send({msg:"order done Successfully"}) 325 | 326 | } 327 | }) 328 | } 329 | 330 | 331 | }) 332 | 333 | // edit address 334 | 335 | app.post("/editadd",(req,res)=>{ 336 | 337 | const name= req.body.name 338 | const email=req.body.email 339 | const phone=req.body.phone 340 | const address=req.body.address 341 | const user_id=req.body.userId 342 | 343 | 344 | let sql=`update user_data set name='${name}',email='${email}',phone='${phone}',address='${address}' where user_id=${user_id}`; 345 | db.query(sql,(err,result)=>{ 346 | if(err) 347 | { 348 | console.log(err) 349 | } 350 | else{ 351 | 352 | res.send({msg:"edit Successfully"}) 353 | 354 | } 355 | }) 356 | 357 | }) 358 | 359 | 360 | 361 | app.post("/register",(req,res)=>{ 362 | const email=req.body.email; 363 | 364 | const username=req.body.username; 365 | const password=req.body.password; 366 | bcrypt.hash(password,saltRounds,(errr,hash)=>{ 367 | const data={ 368 | username:req.body.username, 369 | email:req.body.email, 370 | password:hash, 371 | 372 | }; 373 | if(errr) 374 | { 375 | console.log(err); 376 | } 377 | else{ 378 | let sqll=`select * from users where email='${email}'`; 379 | db.query(sqll,(er,ress)=>{ 380 | if(ress.length > 0) 381 | { 382 | res.send({msg:"User Email Already Present"}) 383 | 384 | } 385 | else{ 386 | let sql="INSERT INTO `users` SET ?"; 387 | db.query(sql,data,(err,result)=>{ 388 | if(err) 389 | { 390 | console.log(err) 391 | } 392 | else{ 393 | // console.log(result); 394 | res.send(result); 395 | // res.send() 396 | 397 | } 398 | }) 399 | } 400 | }) 401 | 402 | 403 | 404 | } 405 | 406 | 407 | }) 408 | 409 | 410 | 411 | }) 412 | 413 | const verifyJwt=(req,res,next)=>{ 414 | const token=req.headers["x-access-token"] 415 | 416 | if(!token) 417 | { 418 | res.send({login:false,msg:"need token"}); 419 | } 420 | else{ 421 | jwt.verify(token,'ecomreact',(err,decoded)=>{ 422 | if(err) 423 | { 424 | res.send({login:false,msg:"need for token"}); 425 | } 426 | else{ 427 | req.userID=decoded.id; 428 | next(); 429 | } 430 | }) 431 | } 432 | } 433 | 434 | app.get("/isAuth",verifyJwt,(req,res)=>{ 435 | res.send({login:true,msg:"done"}); 436 | }) 437 | 438 | app.post("/login",(req,res)=>{ 439 | const email=req.body.email; 440 | const password=req.body.password; 441 | 442 | // console.log(email); 443 | 444 | 445 | let sql=`select * from users where email='${email}'`; 446 | // console.log(sql); 447 | db.query(sql,(err,result)=>{ 448 | if(err) 449 | { 450 | // res.send({err:err}) 451 | console.log(err); 452 | } 453 | else{ 454 | 455 | if(result.length > 0) 456 | { 457 | bcrypt.compare(password,result[0].password,(errr,response)=>{ 458 | if(response) 459 | { 460 | 461 | const id=result[0].id; 462 | const token=jwt.sign({id},"ecomreact",{ 463 | expiresIn:60*60*24, 464 | }) 465 | res.send({login:true,token:token,user:result[0].username,userID:result[0].id,userEmail:result[0].email}) 466 | // res.send({login:true,user:result[0].name}) 467 | 468 | } 469 | else{ 470 | res.send({login:false,msg:"Wrong Password"}); 471 | 472 | } 473 | }) 474 | 475 | 476 | 477 | } 478 | else{ 479 | res.send({login:false,msg:"User Email Not Exits"}); 480 | // console.log("noo email ") 481 | } 482 | 483 | 484 | } 485 | }) 486 | 487 | 488 | 489 | 490 | }) 491 | 492 | 493 | app.listen(PORT , ()=>{ 494 | console.log(`app running on port ${PORT}`) 495 | }) 496 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@mapbox/node-pre-gyp": { 8 | "version": "1.0.5", 9 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", 10 | "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", 11 | "requires": { 12 | "detect-libc": "^1.0.3", 13 | "https-proxy-agent": "^5.0.0", 14 | "make-dir": "^3.1.0", 15 | "node-fetch": "^2.6.1", 16 | "nopt": "^5.0.0", 17 | "npmlog": "^4.1.2", 18 | "rimraf": "^3.0.2", 19 | "semver": "^7.3.4", 20 | "tar": "^6.1.0" 21 | } 22 | }, 23 | "abbrev": { 24 | "version": "1.1.1", 25 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 26 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 27 | }, 28 | "accepts": { 29 | "version": "1.3.7", 30 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 31 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 32 | "requires": { 33 | "mime-types": "~2.1.24", 34 | "negotiator": "0.6.2" 35 | } 36 | }, 37 | "agent-base": { 38 | "version": "6.0.2", 39 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 40 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 41 | "requires": { 42 | "debug": "4" 43 | }, 44 | "dependencies": { 45 | "debug": { 46 | "version": "4.3.2", 47 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 48 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 49 | "requires": { 50 | "ms": "2.1.2" 51 | } 52 | }, 53 | "ms": { 54 | "version": "2.1.2", 55 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 56 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 57 | } 58 | } 59 | }, 60 | "ajv": { 61 | "version": "6.12.6", 62 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 63 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 64 | "requires": { 65 | "fast-deep-equal": "^3.1.1", 66 | "fast-json-stable-stringify": "^2.0.0", 67 | "json-schema-traverse": "^0.4.1", 68 | "uri-js": "^4.2.2" 69 | } 70 | }, 71 | "ansi-regex": { 72 | "version": "2.1.1", 73 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 74 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 75 | }, 76 | "aproba": { 77 | "version": "1.2.0", 78 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 79 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 80 | }, 81 | "are-we-there-yet": { 82 | "version": "1.1.5", 83 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 84 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 85 | "requires": { 86 | "delegates": "^1.0.0", 87 | "readable-stream": "^2.0.6" 88 | } 89 | }, 90 | "array-flatten": { 91 | "version": "1.1.1", 92 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 93 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 94 | }, 95 | "asn1": { 96 | "version": "0.2.4", 97 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 98 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 99 | "requires": { 100 | "safer-buffer": "~2.1.0" 101 | } 102 | }, 103 | "assert-plus": { 104 | "version": "1.0.0", 105 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 106 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 107 | }, 108 | "asynckit": { 109 | "version": "0.4.0", 110 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 111 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 112 | }, 113 | "aws-sign2": { 114 | "version": "0.7.0", 115 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 116 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 117 | }, 118 | "aws4": { 119 | "version": "1.11.0", 120 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 121 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 122 | }, 123 | "balanced-match": { 124 | "version": "1.0.2", 125 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 126 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 127 | }, 128 | "bcrypt": { 129 | "version": "5.0.1", 130 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", 131 | "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==", 132 | "requires": { 133 | "@mapbox/node-pre-gyp": "^1.0.0", 134 | "node-addon-api": "^3.1.0" 135 | } 136 | }, 137 | "bcrypt-pbkdf": { 138 | "version": "1.0.2", 139 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 140 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 141 | "requires": { 142 | "tweetnacl": "^0.14.3" 143 | } 144 | }, 145 | "bignumber.js": { 146 | "version": "9.0.0", 147 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 148 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" 149 | }, 150 | "body-parser": { 151 | "version": "1.19.0", 152 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 153 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 154 | "requires": { 155 | "bytes": "3.1.0", 156 | "content-type": "~1.0.4", 157 | "debug": "2.6.9", 158 | "depd": "~1.1.2", 159 | "http-errors": "1.7.2", 160 | "iconv-lite": "0.4.24", 161 | "on-finished": "~2.3.0", 162 | "qs": "6.7.0", 163 | "raw-body": "2.4.0", 164 | "type-is": "~1.6.17" 165 | } 166 | }, 167 | "brace-expansion": { 168 | "version": "1.1.11", 169 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 170 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 171 | "requires": { 172 | "balanced-match": "^1.0.0", 173 | "concat-map": "0.0.1" 174 | } 175 | }, 176 | "buffer-equal-constant-time": { 177 | "version": "1.0.1", 178 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 179 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 180 | }, 181 | "bytes": { 182 | "version": "3.1.0", 183 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 184 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 185 | }, 186 | "caseless": { 187 | "version": "0.12.0", 188 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 189 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 190 | }, 191 | "chownr": { 192 | "version": "2.0.0", 193 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 194 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" 195 | }, 196 | "code-point-at": { 197 | "version": "1.1.0", 198 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 199 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 200 | }, 201 | "combined-stream": { 202 | "version": "1.0.8", 203 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 204 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 205 | "requires": { 206 | "delayed-stream": "~1.0.0" 207 | } 208 | }, 209 | "concat-map": { 210 | "version": "0.0.1", 211 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 212 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 213 | }, 214 | "console-control-strings": { 215 | "version": "1.1.0", 216 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 217 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 218 | }, 219 | "content-disposition": { 220 | "version": "0.5.3", 221 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 222 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 223 | "requires": { 224 | "safe-buffer": "5.1.2" 225 | } 226 | }, 227 | "content-type": { 228 | "version": "1.0.4", 229 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 230 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 231 | }, 232 | "cookie": { 233 | "version": "0.4.0", 234 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 235 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 236 | }, 237 | "cookie-signature": { 238 | "version": "1.0.6", 239 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 240 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 241 | }, 242 | "core-util-is": { 243 | "version": "1.0.2", 244 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 245 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 246 | }, 247 | "cors": { 248 | "version": "2.8.5", 249 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 250 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 251 | "requires": { 252 | "object-assign": "^4", 253 | "vary": "^1" 254 | } 255 | }, 256 | "dashdash": { 257 | "version": "1.14.1", 258 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 259 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 260 | "requires": { 261 | "assert-plus": "^1.0.0" 262 | } 263 | }, 264 | "debug": { 265 | "version": "2.6.9", 266 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 267 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 268 | "requires": { 269 | "ms": "2.0.0" 270 | } 271 | }, 272 | "define-lazy-prop": { 273 | "version": "2.0.0", 274 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", 275 | "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" 276 | }, 277 | "delayed-stream": { 278 | "version": "1.0.0", 279 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 280 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 281 | }, 282 | "delegates": { 283 | "version": "1.0.0", 284 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 285 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 286 | }, 287 | "depd": { 288 | "version": "1.1.2", 289 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 290 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 291 | }, 292 | "destroy": { 293 | "version": "1.0.4", 294 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 295 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 296 | }, 297 | "detect-libc": { 298 | "version": "1.0.3", 299 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 300 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 301 | }, 302 | "ecc-jsbn": { 303 | "version": "0.1.2", 304 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 305 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 306 | "requires": { 307 | "jsbn": "~0.1.0", 308 | "safer-buffer": "^2.1.0" 309 | } 310 | }, 311 | "ecdsa-sig-formatter": { 312 | "version": "1.0.11", 313 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 314 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 315 | "requires": { 316 | "safe-buffer": "^5.0.1" 317 | } 318 | }, 319 | "ee-first": { 320 | "version": "1.1.1", 321 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 322 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 323 | }, 324 | "encodeurl": { 325 | "version": "1.0.2", 326 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 327 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 328 | }, 329 | "escape-html": { 330 | "version": "1.0.3", 331 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 332 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 333 | }, 334 | "etag": { 335 | "version": "1.8.1", 336 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 337 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 338 | }, 339 | "express": { 340 | "version": "4.17.1", 341 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 342 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 343 | "requires": { 344 | "accepts": "~1.3.7", 345 | "array-flatten": "1.1.1", 346 | "body-parser": "1.19.0", 347 | "content-disposition": "0.5.3", 348 | "content-type": "~1.0.4", 349 | "cookie": "0.4.0", 350 | "cookie-signature": "1.0.6", 351 | "debug": "2.6.9", 352 | "depd": "~1.1.2", 353 | "encodeurl": "~1.0.2", 354 | "escape-html": "~1.0.3", 355 | "etag": "~1.8.1", 356 | "finalhandler": "~1.1.2", 357 | "fresh": "0.5.2", 358 | "merge-descriptors": "1.0.1", 359 | "methods": "~1.1.2", 360 | "on-finished": "~2.3.0", 361 | "parseurl": "~1.3.3", 362 | "path-to-regexp": "0.1.7", 363 | "proxy-addr": "~2.0.5", 364 | "qs": "6.7.0", 365 | "range-parser": "~1.2.1", 366 | "safe-buffer": "5.1.2", 367 | "send": "0.17.1", 368 | "serve-static": "1.14.1", 369 | "setprototypeof": "1.1.1", 370 | "statuses": "~1.5.0", 371 | "type-is": "~1.6.18", 372 | "utils-merge": "1.0.1", 373 | "vary": "~1.1.2" 374 | } 375 | }, 376 | "extend": { 377 | "version": "3.0.2", 378 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 379 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 380 | }, 381 | "extsprintf": { 382 | "version": "1.3.0", 383 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 384 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 385 | }, 386 | "fast-deep-equal": { 387 | "version": "3.1.3", 388 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 389 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 390 | }, 391 | "fast-json-stable-stringify": { 392 | "version": "2.1.0", 393 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 394 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 395 | }, 396 | "finalhandler": { 397 | "version": "1.1.2", 398 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 399 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 400 | "requires": { 401 | "debug": "2.6.9", 402 | "encodeurl": "~1.0.2", 403 | "escape-html": "~1.0.3", 404 | "on-finished": "~2.3.0", 405 | "parseurl": "~1.3.3", 406 | "statuses": "~1.5.0", 407 | "unpipe": "~1.0.0" 408 | } 409 | }, 410 | "forever-agent": { 411 | "version": "0.6.1", 412 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 413 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 414 | }, 415 | "form-data": { 416 | "version": "2.3.3", 417 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 418 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 419 | "requires": { 420 | "asynckit": "^0.4.0", 421 | "combined-stream": "^1.0.6", 422 | "mime-types": "^2.1.12" 423 | } 424 | }, 425 | "forwarded": { 426 | "version": "0.2.0", 427 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 428 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 429 | }, 430 | "fresh": { 431 | "version": "0.5.2", 432 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 433 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 434 | }, 435 | "fs-minipass": { 436 | "version": "2.1.0", 437 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 438 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 439 | "requires": { 440 | "minipass": "^3.0.0" 441 | } 442 | }, 443 | "fs.realpath": { 444 | "version": "1.0.0", 445 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 446 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 447 | }, 448 | "gauge": { 449 | "version": "2.7.4", 450 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 451 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 452 | "requires": { 453 | "aproba": "^1.0.3", 454 | "console-control-strings": "^1.0.0", 455 | "has-unicode": "^2.0.0", 456 | "object-assign": "^4.1.0", 457 | "signal-exit": "^3.0.0", 458 | "string-width": "^1.0.1", 459 | "strip-ansi": "^3.0.1", 460 | "wide-align": "^1.1.0" 461 | } 462 | }, 463 | "getpass": { 464 | "version": "0.1.7", 465 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 466 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 467 | "requires": { 468 | "assert-plus": "^1.0.0" 469 | } 470 | }, 471 | "glob": { 472 | "version": "7.1.7", 473 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 474 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 475 | "requires": { 476 | "fs.realpath": "^1.0.0", 477 | "inflight": "^1.0.4", 478 | "inherits": "2", 479 | "minimatch": "^3.0.4", 480 | "once": "^1.3.0", 481 | "path-is-absolute": "^1.0.0" 482 | } 483 | }, 484 | "har-schema": { 485 | "version": "2.0.0", 486 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 487 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 488 | }, 489 | "har-validator": { 490 | "version": "5.1.5", 491 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 492 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 493 | "requires": { 494 | "ajv": "^6.12.3", 495 | "har-schema": "^2.0.0" 496 | } 497 | }, 498 | "has-unicode": { 499 | "version": "2.0.1", 500 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 501 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 502 | }, 503 | "http-errors": { 504 | "version": "1.7.2", 505 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 506 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 507 | "requires": { 508 | "depd": "~1.1.2", 509 | "inherits": "2.0.3", 510 | "setprototypeof": "1.1.1", 511 | "statuses": ">= 1.5.0 < 2", 512 | "toidentifier": "1.0.0" 513 | } 514 | }, 515 | "http-signature": { 516 | "version": "1.2.0", 517 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 518 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 519 | "requires": { 520 | "assert-plus": "^1.0.0", 521 | "jsprim": "^1.2.2", 522 | "sshpk": "^1.7.0" 523 | } 524 | }, 525 | "https-proxy-agent": { 526 | "version": "5.0.0", 527 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 528 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 529 | "requires": { 530 | "agent-base": "6", 531 | "debug": "4" 532 | }, 533 | "dependencies": { 534 | "debug": { 535 | "version": "4.3.2", 536 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 537 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 538 | "requires": { 539 | "ms": "2.1.2" 540 | } 541 | }, 542 | "ms": { 543 | "version": "2.1.2", 544 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 545 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 546 | } 547 | } 548 | }, 549 | "iconv-lite": { 550 | "version": "0.4.24", 551 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 552 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 553 | "requires": { 554 | "safer-buffer": ">= 2.1.2 < 3" 555 | } 556 | }, 557 | "inflight": { 558 | "version": "1.0.6", 559 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 560 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 561 | "requires": { 562 | "once": "^1.3.0", 563 | "wrappy": "1" 564 | } 565 | }, 566 | "inherits": { 567 | "version": "2.0.3", 568 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 569 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 570 | }, 571 | "instamojo-nodejs": { 572 | "version": "0.0.5", 573 | "resolved": "https://registry.npmjs.org/instamojo-nodejs/-/instamojo-nodejs-0.0.5.tgz", 574 | "integrity": "sha1-93DjpIGoamgtXG2OurE21IqLGjw=", 575 | "requires": { 576 | "request": "^2.69.0" 577 | } 578 | }, 579 | "ipaddr.js": { 580 | "version": "1.9.1", 581 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 582 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 583 | }, 584 | "is-docker": { 585 | "version": "2.2.1", 586 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", 587 | "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" 588 | }, 589 | "is-fullwidth-code-point": { 590 | "version": "1.0.0", 591 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 592 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 593 | "requires": { 594 | "number-is-nan": "^1.0.0" 595 | } 596 | }, 597 | "is-typedarray": { 598 | "version": "1.0.0", 599 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 600 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 601 | }, 602 | "is-wsl": { 603 | "version": "2.2.0", 604 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", 605 | "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", 606 | "requires": { 607 | "is-docker": "^2.0.0" 608 | } 609 | }, 610 | "isarray": { 611 | "version": "1.0.0", 612 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 613 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 614 | }, 615 | "isstream": { 616 | "version": "0.1.2", 617 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 618 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 619 | }, 620 | "jsbn": { 621 | "version": "0.1.1", 622 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 623 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 624 | }, 625 | "json-schema": { 626 | "version": "0.2.3", 627 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 628 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 629 | }, 630 | "json-schema-traverse": { 631 | "version": "0.4.1", 632 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 633 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 634 | }, 635 | "json-stringify-safe": { 636 | "version": "5.0.1", 637 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 638 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 639 | }, 640 | "jsonwebtoken": { 641 | "version": "8.5.1", 642 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", 643 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", 644 | "requires": { 645 | "jws": "^3.2.2", 646 | "lodash.includes": "^4.3.0", 647 | "lodash.isboolean": "^3.0.3", 648 | "lodash.isinteger": "^4.0.4", 649 | "lodash.isnumber": "^3.0.3", 650 | "lodash.isplainobject": "^4.0.6", 651 | "lodash.isstring": "^4.0.1", 652 | "lodash.once": "^4.0.0", 653 | "ms": "^2.1.1", 654 | "semver": "^5.6.0" 655 | }, 656 | "dependencies": { 657 | "ms": { 658 | "version": "2.1.3", 659 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 660 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 661 | }, 662 | "semver": { 663 | "version": "5.7.1", 664 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 665 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 666 | } 667 | } 668 | }, 669 | "jsprim": { 670 | "version": "1.4.1", 671 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 672 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 673 | "requires": { 674 | "assert-plus": "1.0.0", 675 | "extsprintf": "1.3.0", 676 | "json-schema": "0.2.3", 677 | "verror": "1.10.0" 678 | } 679 | }, 680 | "jwa": { 681 | "version": "1.4.1", 682 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 683 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 684 | "requires": { 685 | "buffer-equal-constant-time": "1.0.1", 686 | "ecdsa-sig-formatter": "1.0.11", 687 | "safe-buffer": "^5.0.1" 688 | } 689 | }, 690 | "jws": { 691 | "version": "3.2.2", 692 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 693 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 694 | "requires": { 695 | "jwa": "^1.4.1", 696 | "safe-buffer": "^5.0.1" 697 | } 698 | }, 699 | "lodash.includes": { 700 | "version": "4.3.0", 701 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 702 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 703 | }, 704 | "lodash.isboolean": { 705 | "version": "3.0.3", 706 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 707 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 708 | }, 709 | "lodash.isinteger": { 710 | "version": "4.0.4", 711 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 712 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 713 | }, 714 | "lodash.isnumber": { 715 | "version": "3.0.3", 716 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 717 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 718 | }, 719 | "lodash.isplainobject": { 720 | "version": "4.0.6", 721 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 722 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 723 | }, 724 | "lodash.isstring": { 725 | "version": "4.0.1", 726 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 727 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 728 | }, 729 | "lodash.once": { 730 | "version": "4.1.1", 731 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 732 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 733 | }, 734 | "lru-cache": { 735 | "version": "6.0.0", 736 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 737 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 738 | "requires": { 739 | "yallist": "^4.0.0" 740 | } 741 | }, 742 | "make-dir": { 743 | "version": "3.1.0", 744 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 745 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 746 | "requires": { 747 | "semver": "^6.0.0" 748 | }, 749 | "dependencies": { 750 | "semver": { 751 | "version": "6.3.0", 752 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 753 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 754 | } 755 | } 756 | }, 757 | "media-typer": { 758 | "version": "0.3.0", 759 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 760 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 761 | }, 762 | "merge-descriptors": { 763 | "version": "1.0.1", 764 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 765 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 766 | }, 767 | "methods": { 768 | "version": "1.1.2", 769 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 770 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 771 | }, 772 | "mime": { 773 | "version": "1.6.0", 774 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 775 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 776 | }, 777 | "mime-db": { 778 | "version": "1.48.0", 779 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 780 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" 781 | }, 782 | "mime-types": { 783 | "version": "2.1.31", 784 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", 785 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", 786 | "requires": { 787 | "mime-db": "1.48.0" 788 | } 789 | }, 790 | "minimatch": { 791 | "version": "3.0.4", 792 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 793 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 794 | "requires": { 795 | "brace-expansion": "^1.1.7" 796 | } 797 | }, 798 | "minipass": { 799 | "version": "3.1.3", 800 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", 801 | "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", 802 | "requires": { 803 | "yallist": "^4.0.0" 804 | } 805 | }, 806 | "minizlib": { 807 | "version": "2.1.2", 808 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 809 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 810 | "requires": { 811 | "minipass": "^3.0.0", 812 | "yallist": "^4.0.0" 813 | } 814 | }, 815 | "mkdirp": { 816 | "version": "1.0.4", 817 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 818 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 819 | }, 820 | "ms": { 821 | "version": "2.0.0", 822 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 823 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 824 | }, 825 | "mysql": { 826 | "version": "2.18.1", 827 | "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", 828 | "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", 829 | "requires": { 830 | "bignumber.js": "9.0.0", 831 | "readable-stream": "2.3.7", 832 | "safe-buffer": "5.1.2", 833 | "sqlstring": "2.3.1" 834 | } 835 | }, 836 | "negotiator": { 837 | "version": "0.6.2", 838 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 839 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 840 | }, 841 | "node-addon-api": { 842 | "version": "3.2.1", 843 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", 844 | "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" 845 | }, 846 | "node-fetch": { 847 | "version": "2.6.1", 848 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 849 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 850 | }, 851 | "nopt": { 852 | "version": "5.0.0", 853 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 854 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 855 | "requires": { 856 | "abbrev": "1" 857 | } 858 | }, 859 | "npmlog": { 860 | "version": "4.1.2", 861 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 862 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 863 | "requires": { 864 | "are-we-there-yet": "~1.1.2", 865 | "console-control-strings": "~1.1.0", 866 | "gauge": "~2.7.3", 867 | "set-blocking": "~2.0.0" 868 | } 869 | }, 870 | "number-is-nan": { 871 | "version": "1.0.1", 872 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 873 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 874 | }, 875 | "oauth-sign": { 876 | "version": "0.9.0", 877 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 878 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 879 | }, 880 | "object-assign": { 881 | "version": "4.1.1", 882 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 883 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 884 | }, 885 | "on-finished": { 886 | "version": "2.3.0", 887 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 888 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 889 | "requires": { 890 | "ee-first": "1.1.1" 891 | } 892 | }, 893 | "once": { 894 | "version": "1.4.0", 895 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 896 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 897 | "requires": { 898 | "wrappy": "1" 899 | } 900 | }, 901 | "open": { 902 | "version": "8.2.1", 903 | "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", 904 | "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", 905 | "requires": { 906 | "define-lazy-prop": "^2.0.0", 907 | "is-docker": "^2.1.1", 908 | "is-wsl": "^2.2.0" 909 | } 910 | }, 911 | "openurl": { 912 | "version": "1.1.1", 913 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", 914 | "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=" 915 | }, 916 | "parseurl": { 917 | "version": "1.3.3", 918 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 919 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 920 | }, 921 | "path-is-absolute": { 922 | "version": "1.0.1", 923 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 924 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 925 | }, 926 | "path-to-regexp": { 927 | "version": "0.1.7", 928 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 929 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 930 | }, 931 | "performance-now": { 932 | "version": "2.1.0", 933 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 934 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 935 | }, 936 | "process-nextick-args": { 937 | "version": "2.0.1", 938 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 939 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 940 | }, 941 | "proxy-addr": { 942 | "version": "2.0.7", 943 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 944 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 945 | "requires": { 946 | "forwarded": "0.2.0", 947 | "ipaddr.js": "1.9.1" 948 | } 949 | }, 950 | "psl": { 951 | "version": "1.8.0", 952 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 953 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 954 | }, 955 | "punycode": { 956 | "version": "2.1.1", 957 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 958 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 959 | }, 960 | "qs": { 961 | "version": "6.7.0", 962 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 963 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 964 | }, 965 | "querystring": { 966 | "version": "0.2.0", 967 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 968 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 969 | }, 970 | "range-parser": { 971 | "version": "1.2.1", 972 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 973 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 974 | }, 975 | "raw-body": { 976 | "version": "2.4.0", 977 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 978 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 979 | "requires": { 980 | "bytes": "3.1.0", 981 | "http-errors": "1.7.2", 982 | "iconv-lite": "0.4.24", 983 | "unpipe": "1.0.0" 984 | } 985 | }, 986 | "readable-stream": { 987 | "version": "2.3.7", 988 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 989 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 990 | "requires": { 991 | "core-util-is": "~1.0.0", 992 | "inherits": "~2.0.3", 993 | "isarray": "~1.0.0", 994 | "process-nextick-args": "~2.0.0", 995 | "safe-buffer": "~5.1.1", 996 | "string_decoder": "~1.1.1", 997 | "util-deprecate": "~1.0.1" 998 | } 999 | }, 1000 | "request": { 1001 | "version": "2.88.2", 1002 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1003 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1004 | "requires": { 1005 | "aws-sign2": "~0.7.0", 1006 | "aws4": "^1.8.0", 1007 | "caseless": "~0.12.0", 1008 | "combined-stream": "~1.0.6", 1009 | "extend": "~3.0.2", 1010 | "forever-agent": "~0.6.1", 1011 | "form-data": "~2.3.2", 1012 | "har-validator": "~5.1.3", 1013 | "http-signature": "~1.2.0", 1014 | "is-typedarray": "~1.0.0", 1015 | "isstream": "~0.1.2", 1016 | "json-stringify-safe": "~5.0.1", 1017 | "mime-types": "~2.1.19", 1018 | "oauth-sign": "~0.9.0", 1019 | "performance-now": "^2.1.0", 1020 | "qs": "~6.5.2", 1021 | "safe-buffer": "^5.1.2", 1022 | "tough-cookie": "~2.5.0", 1023 | "tunnel-agent": "^0.6.0", 1024 | "uuid": "^3.3.2" 1025 | }, 1026 | "dependencies": { 1027 | "qs": { 1028 | "version": "6.5.2", 1029 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1030 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1031 | } 1032 | } 1033 | }, 1034 | "rimraf": { 1035 | "version": "3.0.2", 1036 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1037 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1038 | "requires": { 1039 | "glob": "^7.1.3" 1040 | } 1041 | }, 1042 | "safe-buffer": { 1043 | "version": "5.1.2", 1044 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1045 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1046 | }, 1047 | "safer-buffer": { 1048 | "version": "2.1.2", 1049 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1050 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1051 | }, 1052 | "semver": { 1053 | "version": "7.3.5", 1054 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1055 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1056 | "requires": { 1057 | "lru-cache": "^6.0.0" 1058 | } 1059 | }, 1060 | "send": { 1061 | "version": "0.17.1", 1062 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1063 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1064 | "requires": { 1065 | "debug": "2.6.9", 1066 | "depd": "~1.1.2", 1067 | "destroy": "~1.0.4", 1068 | "encodeurl": "~1.0.2", 1069 | "escape-html": "~1.0.3", 1070 | "etag": "~1.8.1", 1071 | "fresh": "0.5.2", 1072 | "http-errors": "~1.7.2", 1073 | "mime": "1.6.0", 1074 | "ms": "2.1.1", 1075 | "on-finished": "~2.3.0", 1076 | "range-parser": "~1.2.1", 1077 | "statuses": "~1.5.0" 1078 | }, 1079 | "dependencies": { 1080 | "ms": { 1081 | "version": "2.1.1", 1082 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1083 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1084 | } 1085 | } 1086 | }, 1087 | "serve-static": { 1088 | "version": "1.14.1", 1089 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1090 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1091 | "requires": { 1092 | "encodeurl": "~1.0.2", 1093 | "escape-html": "~1.0.3", 1094 | "parseurl": "~1.3.3", 1095 | "send": "0.17.1" 1096 | } 1097 | }, 1098 | "set-blocking": { 1099 | "version": "2.0.0", 1100 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1101 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1102 | }, 1103 | "setprototypeof": { 1104 | "version": "1.1.1", 1105 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1106 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1107 | }, 1108 | "signal-exit": { 1109 | "version": "3.0.3", 1110 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1111 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1112 | }, 1113 | "sqlstring": { 1114 | "version": "2.3.1", 1115 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1116 | "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" 1117 | }, 1118 | "sshpk": { 1119 | "version": "1.16.1", 1120 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1121 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1122 | "requires": { 1123 | "asn1": "~0.2.3", 1124 | "assert-plus": "^1.0.0", 1125 | "bcrypt-pbkdf": "^1.0.0", 1126 | "dashdash": "^1.12.0", 1127 | "ecc-jsbn": "~0.1.1", 1128 | "getpass": "^0.1.1", 1129 | "jsbn": "~0.1.0", 1130 | "safer-buffer": "^2.0.2", 1131 | "tweetnacl": "~0.14.0" 1132 | } 1133 | }, 1134 | "statuses": { 1135 | "version": "1.5.0", 1136 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1137 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1138 | }, 1139 | "string-width": { 1140 | "version": "1.0.2", 1141 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1142 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1143 | "requires": { 1144 | "code-point-at": "^1.0.0", 1145 | "is-fullwidth-code-point": "^1.0.0", 1146 | "strip-ansi": "^3.0.0" 1147 | } 1148 | }, 1149 | "string_decoder": { 1150 | "version": "1.1.1", 1151 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1152 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1153 | "requires": { 1154 | "safe-buffer": "~5.1.0" 1155 | } 1156 | }, 1157 | "strip-ansi": { 1158 | "version": "3.0.1", 1159 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1160 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1161 | "requires": { 1162 | "ansi-regex": "^2.0.0" 1163 | } 1164 | }, 1165 | "tar": { 1166 | "version": "6.1.1", 1167 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.1.tgz", 1168 | "integrity": "sha512-GG0R7yt/CQkvG4fueXDi52Zskqxe2AyRJ+Wm54yqarnBgcX3qRIWh10qLVAAN+mlPFGTfP5UxvD3Fbi11UOTUQ==", 1169 | "requires": { 1170 | "chownr": "^2.0.0", 1171 | "fs-minipass": "^2.0.0", 1172 | "minipass": "^3.0.0", 1173 | "minizlib": "^2.1.1", 1174 | "mkdirp": "^1.0.3", 1175 | "yallist": "^4.0.0" 1176 | } 1177 | }, 1178 | "toidentifier": { 1179 | "version": "1.0.0", 1180 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1181 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1182 | }, 1183 | "tough-cookie": { 1184 | "version": "2.5.0", 1185 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1186 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1187 | "requires": { 1188 | "psl": "^1.1.28", 1189 | "punycode": "^2.1.1" 1190 | } 1191 | }, 1192 | "tunnel-agent": { 1193 | "version": "0.6.0", 1194 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1195 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1196 | "requires": { 1197 | "safe-buffer": "^5.0.1" 1198 | } 1199 | }, 1200 | "tweetnacl": { 1201 | "version": "0.14.5", 1202 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1203 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1204 | }, 1205 | "type-is": { 1206 | "version": "1.6.18", 1207 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1208 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1209 | "requires": { 1210 | "media-typer": "0.3.0", 1211 | "mime-types": "~2.1.24" 1212 | } 1213 | }, 1214 | "unpipe": { 1215 | "version": "1.0.0", 1216 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1217 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1218 | }, 1219 | "uri-js": { 1220 | "version": "4.4.1", 1221 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1222 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1223 | "requires": { 1224 | "punycode": "^2.1.0" 1225 | } 1226 | }, 1227 | "url": { 1228 | "version": "0.11.0", 1229 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1230 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1231 | "requires": { 1232 | "punycode": "1.3.2", 1233 | "querystring": "0.2.0" 1234 | }, 1235 | "dependencies": { 1236 | "punycode": { 1237 | "version": "1.3.2", 1238 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1239 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 1240 | } 1241 | } 1242 | }, 1243 | "util-deprecate": { 1244 | "version": "1.0.2", 1245 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1246 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1247 | }, 1248 | "utils-merge": { 1249 | "version": "1.0.1", 1250 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1251 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1252 | }, 1253 | "uuid": { 1254 | "version": "3.4.0", 1255 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1256 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1257 | }, 1258 | "vary": { 1259 | "version": "1.1.2", 1260 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1261 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1262 | }, 1263 | "verror": { 1264 | "version": "1.10.0", 1265 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1266 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1267 | "requires": { 1268 | "assert-plus": "^1.0.0", 1269 | "core-util-is": "1.0.2", 1270 | "extsprintf": "^1.2.0" 1271 | } 1272 | }, 1273 | "wide-align": { 1274 | "version": "1.1.3", 1275 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1276 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1277 | "requires": { 1278 | "string-width": "^1.0.2 || 2" 1279 | } 1280 | }, 1281 | "wrappy": { 1282 | "version": "1.0.2", 1283 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1284 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1285 | }, 1286 | "yallist": { 1287 | "version": "4.0.0", 1288 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1289 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1290 | } 1291 | } 1292 | } 1293 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "nodemon index.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "bcrypt": "^5.0.1", 15 | "cors": "^2.8.5", 16 | "express": "^4.17.1", 17 | "instamojo-nodejs": "0.0.5", 18 | "jsonwebtoken": "^8.5.1", 19 | "mysql": "^2.18.1", 20 | "open": "^8.2.1", 21 | "openurl": "^1.1.1", 22 | "url": "^0.11.0" 23 | } 24 | } 25 | --------------------------------------------------------------------------------