├── 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 | You need to enable JavaScript to run this app.
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 |
11 |
12 |
13 |
{name}
14 |
{price}.00
15 |
16 |
17 | {/* Add To Cart */}
18 | his.push(`/details/${id}`)}>View Details
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 |
21 |
22 |
23 |
24 |
{name}
25 |
({price}.00) * ({qty})
26 |
27 |
28 |
29 |
30 |
31 |
{price*qty}.00
32 |
33 |
34 |
35 |
36 | deleteProduct(id)}>Delete
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 |
8 |
9 |
10 |
11 |
NavLinks
12 |
13 |
14 |
15 | Home
16 |
17 |
18 | Products
19 |
20 |
21 | Contact
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
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 |
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 | his.push('/products')}>Continue Shopping
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 | his.push("/payment")}>Check Out
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 |
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 |
Read More
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
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 |
Read More
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 |
setStatus(false)}>×
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 | Login
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 | Welcome {userdatast}
68 | LogOut
69 |
70 |
71 |
You Not Yet Placed Any Order
72 | his.push('/products')}>Continue Shopping
73 |
74 |
75 | >
76 | )
77 | }
78 |
79 | return (
80 | <>
81 |
82 |
83 |
Welcome {userdatast}
84 |
LogOut
85 |
86 |
87 |
88 |
89 |
90 |
91 | #
92 | Order Date
93 | Payment Method
94 | Order Status
95 | Amount
96 | Operation
97 |
98 |
99 |
100 |
101 |
102 |
103 | {
104 | order.map((val,ind)=>{
105 | return(
106 | <>
107 |
108 | {ind+1}
109 |
110 |
111 | {
112 | new Date(val.timestamp).toDateString()
113 | }
114 |
115 |
116 | {val.paymentmode}
117 |
118 | {
119 | val.orderstatus
120 | }
121 |
122 | {val.totalprice}
123 |
124 | View
125 |
126 |
127 |
128 |
129 |
130 |
131 | >
132 | )
133 | })
134 |
135 | }
136 |
137 |
138 |
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 | Order Details
58 | Price
59 | Qty
60 | Amount
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | {
69 | data.map((val,ind)=>{
70 | return(
71 | <>
72 |
73 | {ind+1}
74 |
75 |
76 |
77 | {val.name}
78 |
79 |
80 |
81 | {val.price}
82 |
83 |
84 | {val.productqty}
85 |
86 | {val.price*val.productqty}
87 |
88 |
89 |
90 | >
91 | )
92 | })
93 | }
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
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 | Pay Now
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 | Product
181 | Price
182 | Qty
183 | Amount
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 | {ind+1}
202 |
203 |
204 |
205 |
206 |
207 | {val.name}
208 |
209 |
210 | {val.price}.00
211 | {val.qty}
212 | {val.price*val.qty}.00
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 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 | {
240 | showaddress && (
241 | <>
242 |
270 |
271 | >
272 | )
273 | }
274 |
275 |
276 |
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 |
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 | Choose Qty:
100 | setPdetails(e.target.value)} required>
101 | 1
102 | 2
103 | 3
104 | 4
105 | 5
106 |
107 |
108 |
109 | Add To Cart
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 |
79 | {/* Choose By Price */}
80 | All
81 | less then 200
82 | 200-500
83 | 500-1000
84 |
85 |
86 |
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 |
setStatus(false)}>×
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 | Register
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 | his.push('/products')}>Continue Shopping
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 |
--------------------------------------------------------------------------------