├── .github
└── FUNDING.yml
├── .gitignore
├── README.md
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
├── server
├── .env
├── .gitignore
├── db
│ └── connect.js
├── index.js
├── middleware
│ └── auth.js
├── package.json
├── routes
│ ├── auth.js
│ └── profile.js
├── scripts.sql
├── utils
│ └── common.js
└── yarn.lock
├── src
├── actions
│ ├── auth.js
│ ├── errors.js
│ └── profile.js
├── components
│ ├── Header.js
│ ├── Login.js
│ ├── Logout.js
│ ├── Profile.js
│ └── Register.js
├── css
│ └── main.scss
├── index.js
├── reducers
│ ├── auth.js
│ ├── errors.js
│ └── profile.js
├── router
│ └── AppRouter.js
├── store
│ └── store.js
└── utils
│ ├── api.js
│ ├── common.js
│ └── constants.js
└── yarn.lock
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: https://www.buymeacoffee.com/myogeshchavan97
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Connect to Postgresql Database
2 |
3 | Add Postgresql database connection details in `server/db/connect.js` file
4 |
5 | ## Add database tables
6 |
7 | Execute sql scripts from `server/scripts.sql` file
8 |
9 | ## To run the project execute following commands in sequence
10 |
11 | 1. cd server
12 | 2. yarn install
13 | 3. yarn start
14 | 4. cd ..
15 | 5. yarn install
16 | 6. yarn start
17 |
18 |
19 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
20 |
21 | ## Available Scripts
22 |
23 | In the project directory, you can run:
24 |
25 | ### `yarn start`
26 |
27 | Runs the app in the development mode.
28 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
29 |
30 | The page will reload if you make edits.
31 | You will also see any lint errors in the console.
32 |
33 | ### `yarn test`
34 |
35 | Launches the test runner in the interactive watch mode.
36 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
37 |
38 | ### `yarn build`
39 |
40 | Builds the app for production to the `build` folder.
41 | It correctly bundles React in production mode and optimizes the build for the best performance.
42 |
43 | The build is minified and the filenames include the hashes.
44 | Your app is ready to be deployed!
45 |
46 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
47 |
48 | ### `yarn eject`
49 |
50 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!**
51 |
52 | 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.
53 |
54 | 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.
55 |
56 | 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.
57 |
58 | ## Learn More
59 |
60 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
61 |
62 | To learn React, check out the [React documentation](https://reactjs.org/).
63 |
64 | ### Code Splitting
65 |
66 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
67 |
68 | ### Analyzing the Bundle Size
69 |
70 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
71 |
72 | ### Making a Progressive Web App
73 |
74 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
75 |
76 | ### Advanced Configuration
77 |
78 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
79 |
80 | ### Deployment
81 |
82 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
83 |
84 | ### `yarn build` fails to minify
85 |
86 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify
87 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jwt-authentication-security",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^4.2.4",
7 | "@testing-library/react": "^9.3.2",
8 | "@testing-library/user-event": "^7.1.2",
9 | "react": "^16.13.1",
10 | "react-dom": "^16.13.1",
11 | "react-scripts": "3.4.1",
12 | "axios": "^0.19.2",
13 | "node-sass": "^4.14.1",
14 | "bootstrap": "4.4.1",
15 | "history": "4.10.1",
16 | "jwt-decode": "2.2.0",
17 | "lodash": "4.17.15",
18 | "moment": "2.25.3",
19 | "react-bootstrap": "1.0.1",
20 | "react-redux": "7.2.0",
21 | "react-router-dom": "5.1.2",
22 | "redux": "4.0.5",
23 | "redux-thunk": "2.3.0"
24 | },
25 | "scripts": {
26 | "start": "react-scripts start",
27 | "build": "react-scripts build",
28 | "test": "react-scripts test",
29 | "eject": "react-scripts eject"
30 | },
31 | "eslintConfig": {
32 | "extends": "react-app"
33 | },
34 | "browserslist": {
35 | "production": [
36 | ">0.2%",
37 | "not dead",
38 | "not op_mini all"
39 | ],
40 | "development": [
41 | "last 1 chrome version",
42 | "last 1 firefox version",
43 | "last 1 safari version"
44 | ]
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myogeshchavan97/jwt-authentication-security/218853b5fd5865d6534fa640130fc720bea597e6/public/favicon.ico
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myogeshchavan97/jwt-authentication-security/218853b5fd5865d6534fa640130fc720bea597e6/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/myogeshchavan97/jwt-authentication-security/218853b5fd5865d6534fa640130fc720bea597e6/public/logo512.png
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/server/.env:
--------------------------------------------------------------------------------
1 | secret=ThisIsMySecretKey
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/server/db/connect.js:
--------------------------------------------------------------------------------
1 | const { Pool } = require('pg');
2 |
3 | const pool = new Pool({
4 | user: 'postgres',
5 | password: 'root',
6 | host: 'localhost',
7 | port: 5432,
8 | database: 'bank_account'
9 | });
10 |
11 | module.exports = { pool };
12 |
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const cors = require('cors');
3 | const authRoute = require('./routes/auth');
4 | const profileRoute = require('./routes/profile');
5 | require('dotenv').config();
6 |
7 | const app = express();
8 | const PORT = process.env.PORT || 5000;
9 |
10 | app.use(express.json());
11 | app.use(cors());
12 | app.use(authRoute);
13 | app.use(profileRoute);
14 |
15 | app.listen(PORT, () => {
16 | console.log(`server started on port ${PORT}`);
17 | });
18 |
--------------------------------------------------------------------------------
/server/middleware/auth.js:
--------------------------------------------------------------------------------
1 | const jwt = require('jsonwebtoken');
2 | const { pool } = require('../db/connect');
3 |
4 | const authMiddleware = async function (req, res, next) {
5 | try {
6 | const token = req.header('Authorization').split(' ')[1];
7 | const decoded = jwt.verify(token, process.env.secret);
8 | const result = await pool.query(
9 | 'select b.userid,b.first_name,b.last_name,b.email,t.access_token from bank_user b inner join tokens t on b.userid=t.userid where t.access_token=$1 and t.userid=$2',
10 | [token, decoded.userid]
11 | );
12 | const user = result.rows[0];
13 | if (user) {
14 | req.user = user;
15 | req.token = token;
16 | next();
17 | } else {
18 | throw new Error('Error while authentication');
19 | }
20 | } catch (error) {
21 | res.status(400).send({
22 | auth_error: 'Authentication failed.'
23 | });
24 | }
25 | };
26 |
27 | module.exports = authMiddleware;
28 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "license": "MIT",
6 | "scripts": {
7 | "start": "nodemon index.js"
8 | },
9 | "dependencies": {
10 | "axios": "0.19.2",
11 | "bcryptjs": "2.4.3",
12 | "cors": "2.8.5",
13 | "dotenv": "8.2.0",
14 | "express": "^4.17.1",
15 | "jsonwebtoken": "8.5.1",
16 | "nodemon": "^2.0.4",
17 | "pg": "8.0.3"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/server/routes/auth.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const bcrypt = require('bcryptjs');
3 | const { pool } = require('../db/connect');
4 | const {
5 | validateUser,
6 | isInvalidField,
7 | generateAuthToken
8 | } = require('../utils/common');
9 | const authMiddleware = require('../middleware/auth');
10 |
11 | const Router = express.Router();
12 |
13 | Router.post('/signup', async (req, res) => {
14 | try {
15 | const { first_name, last_name, email, password } = req.body;
16 | const validFieldsToUpdate = [
17 | 'first_name',
18 | 'last_name',
19 | 'email',
20 | 'password'
21 | ];
22 | const receivedFields = Object.keys(req.body);
23 |
24 | const isInvalidFieldProvided = isInvalidField(
25 | receivedFields,
26 | validFieldsToUpdate
27 | );
28 |
29 | if (isInvalidFieldProvided) {
30 | return res.status(400).send({
31 | signup_error: 'Invalid field.'
32 | });
33 | }
34 |
35 | const result = await pool.query(
36 | 'select count(*) as count from bank_user where email=$1',
37 | [email]
38 | );
39 | const count = result.rows[0].count;
40 | if (count > 0) {
41 | return res.status(400).send({
42 | signup_error: 'User with this email address already exists.'
43 | });
44 | }
45 |
46 | const hashedPassword = await bcrypt.hash(password, 8);
47 | await pool.query(
48 | 'insert into bank_user(first_name, last_name, email, password) values($1,$2,$3,$4)',
49 | [first_name, last_name, email, hashedPassword]
50 | );
51 | res.status(201).send();
52 | } catch (error) {
53 | console.log('err', error);
54 | res.status(400).send({
55 | signup_error: 'Error while signing up..Try again later.'
56 | });
57 | }
58 | });
59 |
60 | Router.post('/signin', async (req, res) => {
61 | try {
62 | const { email, password } = req.body;
63 | const user = await validateUser(email, password);
64 | if (!user) {
65 | res.status(400).send({
66 | sigin_error: 'Email/password does not match.'
67 | });
68 | }
69 | const token = await generateAuthToken(user);
70 | const result = await pool.query(
71 | 'insert into tokens(access_token, userid) values($1,$2) returning *',
72 | [token, user.userid]
73 | );
74 | if (!result.rows[0]) {
75 | return res.status(400).send({
76 | signin_error: 'Error while signing in..Try again later.'
77 | });
78 | }
79 | user.token = result.rows[0].access_token;
80 | res.send(user);
81 | } catch (error) {
82 | res.status(400).send({
83 | signin_error: 'Email/password does not match.'
84 | });
85 | }
86 | });
87 |
88 | Router.post('/logout', authMiddleware, async (req, res) => {
89 | try {
90 | const { userid, access_token } = req.user;
91 | await pool.query('delete from tokens where userid=$1 and access_token=$2', [
92 | userid,
93 | access_token
94 | ]);
95 | res.send();
96 | } catch (error) {
97 | res.status(400).send({
98 | logout_error: 'Error while logging out..Try again later.'
99 | });
100 | }
101 | });
102 |
103 | module.exports = Router;
104 |
--------------------------------------------------------------------------------
/server/routes/profile.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const authMiddleware = require('../middleware/auth');
3 | const { pool } = require('../db/connect');
4 | const { isInvalidField } = require('../utils/common');
5 | const Router = express.Router();
6 |
7 | Router.post('/profile', authMiddleware, async (req, res) => {
8 | try {
9 | const { first_name, last_name } = req.body;
10 |
11 | const validFieldsToUpdate = ['first_name', 'last_name'];
12 | const receivedFields = Object.keys(req.body);
13 |
14 | const isInvalidFieldProvided = isInvalidField(
15 | receivedFields,
16 | validFieldsToUpdate
17 | );
18 | if (isInvalidFieldProvided) {
19 | return res.status(400).send({
20 | update_error: 'Invalid field.'
21 | });
22 | }
23 | const result = await pool.query(
24 | 'update bank_user set first_name=$1,last_name=$2 where userid=$3 returning userid,first_name,last_name,email',
25 | [first_name, last_name, req.user.userid]
26 | );
27 | res.send(result.rows[0]);
28 | } catch (error) {
29 | res.status(400).send({
30 | update_error: 'Error while updating profile..Try again later.'
31 | });
32 | }
33 | });
34 |
35 | Router.get('/profile', authMiddleware, async (req, res) => {
36 | try {
37 | res.send(req.user);
38 | } catch (error) {
39 | res.status(400).send({
40 | update_error: 'Error while getting profile data..Try again later.'
41 | });
42 | }
43 | });
44 |
45 | module.exports = Router;
46 |
--------------------------------------------------------------------------------
/server/scripts.sql:
--------------------------------------------------------------------------------
1 | CREATE DATABASE bank_account;
2 |
3 | \c bank_account;
4 |
5 | CREATE TABLE bank_user(
6 | userid BIGSERIAL PRIMARY KEY NOT NULL,
7 | first_name VARCHAR(32) NOT NULL,
8 | last_name VARCHAR(32) NOT NULL,
9 | email VARCHAR(32) NOT NULL,
10 | password VARCHAR(255) NOT NULL,
11 | unique(email)
12 | );
13 |
14 | CREATE TABLE TOKENS(
15 | id BIGSERIAL PRIMARY KEY NOT NULL,
16 | access_token VARCHAR(500) NOT NULL,
17 | userid BIGSERIAL NOT NULL,
18 | FOREIGN KEY(userid) REFERENCES bank_user(userid)
19 | );
--------------------------------------------------------------------------------
/server/utils/common.js:
--------------------------------------------------------------------------------
1 | const bcrypt = require('bcryptjs');
2 | const jwt = require('jsonwebtoken');
3 | const { pool } = require('../db/connect');
4 |
5 | const isInvalidField = (receivedFields, validFieldsToUpdate) => {
6 | return receivedFields.some(
7 | (field) => validFieldsToUpdate.indexOf(field) === -1
8 | );
9 | };
10 |
11 | const validateUser = async (email, password) => {
12 | const result = await pool.query(
13 | 'select userid, email, password from bank_user where email = $1',
14 | [email]
15 | );
16 | const user = result.rows[0];
17 | if (user) {
18 | const isMatch = await bcrypt.compare(password, user.password);
19 | if (isMatch) {
20 | delete user.password;
21 | return user;
22 | } else {
23 | throw new Error();
24 | }
25 | } else {
26 | throw new Error();
27 | }
28 | };
29 |
30 | const generateAuthToken = async (user) => {
31 | const { userid, email } = user;
32 | const secret = process.env.secret;
33 | const token = await jwt.sign({ userid, email }, secret);
34 | return token;
35 | };
36 |
37 | module.exports = {
38 | isInvalidField,
39 | validateUser,
40 | generateAuthToken
41 | };
42 |
--------------------------------------------------------------------------------
/server/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@sindresorhus/is@^0.14.0":
6 | version "0.14.0"
7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
8 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
9 |
10 | "@szmarczak/http-timer@^1.1.2":
11 | version "1.1.2"
12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
13 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
14 | dependencies:
15 | defer-to-connect "^1.0.1"
16 |
17 | "@types/color-name@^1.1.1":
18 | version "1.1.1"
19 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
20 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
21 |
22 | abbrev@1:
23 | version "1.1.1"
24 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
25 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
26 |
27 | accepts@~1.3.7:
28 | version "1.3.7"
29 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
30 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
31 | dependencies:
32 | mime-types "~2.1.24"
33 | negotiator "0.6.2"
34 |
35 | ansi-align@^3.0.0:
36 | version "3.0.0"
37 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
38 | integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
39 | dependencies:
40 | string-width "^3.0.0"
41 |
42 | ansi-regex@^4.1.0:
43 | version "4.1.0"
44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
45 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
46 |
47 | ansi-regex@^5.0.0:
48 | version "5.0.0"
49 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
50 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
51 |
52 | ansi-styles@^4.1.0:
53 | version "4.2.1"
54 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
55 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
56 | dependencies:
57 | "@types/color-name" "^1.1.1"
58 | color-convert "^2.0.1"
59 |
60 | anymatch@~3.1.1:
61 | version "3.1.1"
62 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
63 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
64 | dependencies:
65 | normalize-path "^3.0.0"
66 | picomatch "^2.0.4"
67 |
68 | array-flatten@1.1.1:
69 | version "1.1.1"
70 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
71 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
72 |
73 | axios@0.19.2:
74 | version "0.19.2"
75 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
76 | integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
77 | dependencies:
78 | follow-redirects "1.5.10"
79 |
80 | balanced-match@^1.0.0:
81 | version "1.0.0"
82 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
83 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
84 |
85 | bcryptjs@2.4.3:
86 | version "2.4.3"
87 | resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
88 | integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
89 |
90 | binary-extensions@^2.0.0:
91 | version "2.0.0"
92 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
93 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
94 |
95 | body-parser@1.19.0:
96 | version "1.19.0"
97 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
98 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
99 | dependencies:
100 | bytes "3.1.0"
101 | content-type "~1.0.4"
102 | debug "2.6.9"
103 | depd "~1.1.2"
104 | http-errors "1.7.2"
105 | iconv-lite "0.4.24"
106 | on-finished "~2.3.0"
107 | qs "6.7.0"
108 | raw-body "2.4.0"
109 | type-is "~1.6.17"
110 |
111 | boxen@^4.2.0:
112 | version "4.2.0"
113 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
114 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
115 | dependencies:
116 | ansi-align "^3.0.0"
117 | camelcase "^5.3.1"
118 | chalk "^3.0.0"
119 | cli-boxes "^2.2.0"
120 | string-width "^4.1.0"
121 | term-size "^2.1.0"
122 | type-fest "^0.8.1"
123 | widest-line "^3.1.0"
124 |
125 | brace-expansion@^1.1.7:
126 | version "1.1.11"
127 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
128 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
129 | dependencies:
130 | balanced-match "^1.0.0"
131 | concat-map "0.0.1"
132 |
133 | braces@~3.0.2:
134 | version "3.0.2"
135 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
136 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
137 | dependencies:
138 | fill-range "^7.0.1"
139 |
140 | buffer-equal-constant-time@1.0.1:
141 | version "1.0.1"
142 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
143 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
144 |
145 | buffer-writer@2.0.0:
146 | version "2.0.0"
147 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
148 | integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==
149 |
150 | bytes@3.1.0:
151 | version "3.1.0"
152 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
153 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
154 |
155 | cacheable-request@^6.0.0:
156 | version "6.1.0"
157 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
158 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
159 | dependencies:
160 | clone-response "^1.0.2"
161 | get-stream "^5.1.0"
162 | http-cache-semantics "^4.0.0"
163 | keyv "^3.0.0"
164 | lowercase-keys "^2.0.0"
165 | normalize-url "^4.1.0"
166 | responselike "^1.0.2"
167 |
168 | camelcase@^5.3.1:
169 | version "5.3.1"
170 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
171 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
172 |
173 | chalk@^3.0.0:
174 | version "3.0.0"
175 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
176 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
177 | dependencies:
178 | ansi-styles "^4.1.0"
179 | supports-color "^7.1.0"
180 |
181 | chokidar@^3.2.2:
182 | version "3.4.0"
183 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8"
184 | integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==
185 | dependencies:
186 | anymatch "~3.1.1"
187 | braces "~3.0.2"
188 | glob-parent "~5.1.0"
189 | is-binary-path "~2.1.0"
190 | is-glob "~4.0.1"
191 | normalize-path "~3.0.0"
192 | readdirp "~3.4.0"
193 | optionalDependencies:
194 | fsevents "~2.1.2"
195 |
196 | ci-info@^2.0.0:
197 | version "2.0.0"
198 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
199 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
200 |
201 | cli-boxes@^2.2.0:
202 | version "2.2.0"
203 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
204 | integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
205 |
206 | clone-response@^1.0.2:
207 | version "1.0.2"
208 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
209 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
210 | dependencies:
211 | mimic-response "^1.0.0"
212 |
213 | color-convert@^2.0.1:
214 | version "2.0.1"
215 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
216 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
217 | dependencies:
218 | color-name "~1.1.4"
219 |
220 | color-name@~1.1.4:
221 | version "1.1.4"
222 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
223 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
224 |
225 | concat-map@0.0.1:
226 | version "0.0.1"
227 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
228 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
229 |
230 | configstore@^5.0.1:
231 | version "5.0.1"
232 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
233 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
234 | dependencies:
235 | dot-prop "^5.2.0"
236 | graceful-fs "^4.1.2"
237 | make-dir "^3.0.0"
238 | unique-string "^2.0.0"
239 | write-file-atomic "^3.0.0"
240 | xdg-basedir "^4.0.0"
241 |
242 | content-disposition@0.5.3:
243 | version "0.5.3"
244 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
245 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
246 | dependencies:
247 | safe-buffer "5.1.2"
248 |
249 | content-type@~1.0.4:
250 | version "1.0.4"
251 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
252 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
253 |
254 | cookie-signature@1.0.6:
255 | version "1.0.6"
256 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
257 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
258 |
259 | cookie@0.4.0:
260 | version "0.4.0"
261 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
262 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
263 |
264 | cors@2.8.5:
265 | version "2.8.5"
266 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
267 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
268 | dependencies:
269 | object-assign "^4"
270 | vary "^1"
271 |
272 | crypto-random-string@^2.0.0:
273 | version "2.0.0"
274 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
275 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
276 |
277 | debug@2.6.9, debug@^2.2.0:
278 | version "2.6.9"
279 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
280 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
281 | dependencies:
282 | ms "2.0.0"
283 |
284 | debug@=3.1.0:
285 | version "3.1.0"
286 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
287 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
288 | dependencies:
289 | ms "2.0.0"
290 |
291 | debug@^3.2.6:
292 | version "3.2.6"
293 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
294 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
295 | dependencies:
296 | ms "^2.1.1"
297 |
298 | decompress-response@^3.3.0:
299 | version "3.3.0"
300 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
301 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
302 | dependencies:
303 | mimic-response "^1.0.0"
304 |
305 | deep-extend@^0.6.0:
306 | version "0.6.0"
307 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
308 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
309 |
310 | defer-to-connect@^1.0.1:
311 | version "1.1.3"
312 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
313 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
314 |
315 | depd@~1.1.2:
316 | version "1.1.2"
317 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
318 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
319 |
320 | destroy@~1.0.4:
321 | version "1.0.4"
322 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
323 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
324 |
325 | dot-prop@^5.2.0:
326 | version "5.2.0"
327 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
328 | integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
329 | dependencies:
330 | is-obj "^2.0.0"
331 |
332 | dotenv@8.2.0:
333 | version "8.2.0"
334 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
335 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
336 |
337 | duplexer3@^0.1.4:
338 | version "0.1.4"
339 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
340 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
341 |
342 | ecdsa-sig-formatter@1.0.11:
343 | version "1.0.11"
344 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
345 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
346 | dependencies:
347 | safe-buffer "^5.0.1"
348 |
349 | ee-first@1.1.1:
350 | version "1.1.1"
351 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
352 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
353 |
354 | emoji-regex@^7.0.1:
355 | version "7.0.3"
356 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
357 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
358 |
359 | emoji-regex@^8.0.0:
360 | version "8.0.0"
361 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
362 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
363 |
364 | encodeurl@~1.0.2:
365 | version "1.0.2"
366 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
367 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
368 |
369 | end-of-stream@^1.1.0:
370 | version "1.4.4"
371 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
372 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
373 | dependencies:
374 | once "^1.4.0"
375 |
376 | escape-goat@^2.0.0:
377 | version "2.1.1"
378 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
379 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
380 |
381 | escape-html@~1.0.3:
382 | version "1.0.3"
383 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
384 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
385 |
386 | etag@~1.8.1:
387 | version "1.8.1"
388 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
389 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
390 |
391 | express@^4.17.1:
392 | version "4.17.1"
393 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
394 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
395 | dependencies:
396 | accepts "~1.3.7"
397 | array-flatten "1.1.1"
398 | body-parser "1.19.0"
399 | content-disposition "0.5.3"
400 | content-type "~1.0.4"
401 | cookie "0.4.0"
402 | cookie-signature "1.0.6"
403 | debug "2.6.9"
404 | depd "~1.1.2"
405 | encodeurl "~1.0.2"
406 | escape-html "~1.0.3"
407 | etag "~1.8.1"
408 | finalhandler "~1.1.2"
409 | fresh "0.5.2"
410 | merge-descriptors "1.0.1"
411 | methods "~1.1.2"
412 | on-finished "~2.3.0"
413 | parseurl "~1.3.3"
414 | path-to-regexp "0.1.7"
415 | proxy-addr "~2.0.5"
416 | qs "6.7.0"
417 | range-parser "~1.2.1"
418 | safe-buffer "5.1.2"
419 | send "0.17.1"
420 | serve-static "1.14.1"
421 | setprototypeof "1.1.1"
422 | statuses "~1.5.0"
423 | type-is "~1.6.18"
424 | utils-merge "1.0.1"
425 | vary "~1.1.2"
426 |
427 | fill-range@^7.0.1:
428 | version "7.0.1"
429 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
430 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
431 | dependencies:
432 | to-regex-range "^5.0.1"
433 |
434 | finalhandler@~1.1.2:
435 | version "1.1.2"
436 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
437 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
438 | dependencies:
439 | debug "2.6.9"
440 | encodeurl "~1.0.2"
441 | escape-html "~1.0.3"
442 | on-finished "~2.3.0"
443 | parseurl "~1.3.3"
444 | statuses "~1.5.0"
445 | unpipe "~1.0.0"
446 |
447 | follow-redirects@1.5.10:
448 | version "1.5.10"
449 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
450 | integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
451 | dependencies:
452 | debug "=3.1.0"
453 |
454 | forwarded@~0.1.2:
455 | version "0.1.2"
456 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
457 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
458 |
459 | fresh@0.5.2:
460 | version "0.5.2"
461 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
462 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
463 |
464 | fsevents@~2.1.2:
465 | version "2.1.3"
466 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
467 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
468 |
469 | get-stream@^4.1.0:
470 | version "4.1.0"
471 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
472 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
473 | dependencies:
474 | pump "^3.0.0"
475 |
476 | get-stream@^5.1.0:
477 | version "5.1.0"
478 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
479 | integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
480 | dependencies:
481 | pump "^3.0.0"
482 |
483 | glob-parent@~5.1.0:
484 | version "5.1.1"
485 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
486 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
487 | dependencies:
488 | is-glob "^4.0.1"
489 |
490 | global-dirs@^2.0.1:
491 | version "2.0.1"
492 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
493 | integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==
494 | dependencies:
495 | ini "^1.3.5"
496 |
497 | got@^9.6.0:
498 | version "9.6.0"
499 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
500 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
501 | dependencies:
502 | "@sindresorhus/is" "^0.14.0"
503 | "@szmarczak/http-timer" "^1.1.2"
504 | cacheable-request "^6.0.0"
505 | decompress-response "^3.3.0"
506 | duplexer3 "^0.1.4"
507 | get-stream "^4.1.0"
508 | lowercase-keys "^1.0.1"
509 | mimic-response "^1.0.1"
510 | p-cancelable "^1.0.0"
511 | to-readable-stream "^1.0.0"
512 | url-parse-lax "^3.0.0"
513 |
514 | graceful-fs@^4.1.2:
515 | version "4.2.4"
516 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
517 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
518 |
519 | has-flag@^3.0.0:
520 | version "3.0.0"
521 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
522 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
523 |
524 | has-flag@^4.0.0:
525 | version "4.0.0"
526 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
527 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
528 |
529 | has-yarn@^2.1.0:
530 | version "2.1.0"
531 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
532 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
533 |
534 | http-cache-semantics@^4.0.0:
535 | version "4.1.0"
536 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
537 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
538 |
539 | http-errors@1.7.2:
540 | version "1.7.2"
541 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
542 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
543 | dependencies:
544 | depd "~1.1.2"
545 | inherits "2.0.3"
546 | setprototypeof "1.1.1"
547 | statuses ">= 1.5.0 < 2"
548 | toidentifier "1.0.0"
549 |
550 | http-errors@~1.7.2:
551 | version "1.7.3"
552 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
553 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
554 | dependencies:
555 | depd "~1.1.2"
556 | inherits "2.0.4"
557 | setprototypeof "1.1.1"
558 | statuses ">= 1.5.0 < 2"
559 | toidentifier "1.0.0"
560 |
561 | iconv-lite@0.4.24:
562 | version "0.4.24"
563 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
564 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
565 | dependencies:
566 | safer-buffer ">= 2.1.2 < 3"
567 |
568 | ignore-by-default@^1.0.1:
569 | version "1.0.1"
570 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
571 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
572 |
573 | import-lazy@^2.1.0:
574 | version "2.1.0"
575 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
576 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
577 |
578 | imurmurhash@^0.1.4:
579 | version "0.1.4"
580 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
581 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
582 |
583 | inherits@2.0.3:
584 | version "2.0.3"
585 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
586 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
587 |
588 | inherits@2.0.4:
589 | version "2.0.4"
590 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
591 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
592 |
593 | ini@^1.3.5, ini@~1.3.0:
594 | version "1.3.5"
595 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
596 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
597 |
598 | ipaddr.js@1.9.1:
599 | version "1.9.1"
600 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
601 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
602 |
603 | is-binary-path@~2.1.0:
604 | version "2.1.0"
605 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
606 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
607 | dependencies:
608 | binary-extensions "^2.0.0"
609 |
610 | is-ci@^2.0.0:
611 | version "2.0.0"
612 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
613 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
614 | dependencies:
615 | ci-info "^2.0.0"
616 |
617 | is-extglob@^2.1.1:
618 | version "2.1.1"
619 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
620 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
621 |
622 | is-fullwidth-code-point@^2.0.0:
623 | version "2.0.0"
624 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
625 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
626 |
627 | is-fullwidth-code-point@^3.0.0:
628 | version "3.0.0"
629 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
630 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
631 |
632 | is-glob@^4.0.1, is-glob@~4.0.1:
633 | version "4.0.1"
634 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
635 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
636 | dependencies:
637 | is-extglob "^2.1.1"
638 |
639 | is-installed-globally@^0.3.1:
640 | version "0.3.2"
641 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
642 | integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
643 | dependencies:
644 | global-dirs "^2.0.1"
645 | is-path-inside "^3.0.1"
646 |
647 | is-npm@^4.0.0:
648 | version "4.0.0"
649 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
650 | integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
651 |
652 | is-number@^7.0.0:
653 | version "7.0.0"
654 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
655 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
656 |
657 | is-obj@^2.0.0:
658 | version "2.0.0"
659 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
660 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
661 |
662 | is-path-inside@^3.0.1:
663 | version "3.0.2"
664 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
665 | integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
666 |
667 | is-typedarray@^1.0.0:
668 | version "1.0.0"
669 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
670 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
671 |
672 | is-yarn-global@^0.3.0:
673 | version "0.3.0"
674 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
675 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
676 |
677 | json-buffer@3.0.0:
678 | version "3.0.0"
679 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
680 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
681 |
682 | jsonwebtoken@8.5.1:
683 | version "8.5.1"
684 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
685 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
686 | dependencies:
687 | jws "^3.2.2"
688 | lodash.includes "^4.3.0"
689 | lodash.isboolean "^3.0.3"
690 | lodash.isinteger "^4.0.4"
691 | lodash.isnumber "^3.0.3"
692 | lodash.isplainobject "^4.0.6"
693 | lodash.isstring "^4.0.1"
694 | lodash.once "^4.0.0"
695 | ms "^2.1.1"
696 | semver "^5.6.0"
697 |
698 | jwa@^1.4.1:
699 | version "1.4.1"
700 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
701 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
702 | dependencies:
703 | buffer-equal-constant-time "1.0.1"
704 | ecdsa-sig-formatter "1.0.11"
705 | safe-buffer "^5.0.1"
706 |
707 | jws@^3.2.2:
708 | version "3.2.2"
709 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
710 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
711 | dependencies:
712 | jwa "^1.4.1"
713 | safe-buffer "^5.0.1"
714 |
715 | keyv@^3.0.0:
716 | version "3.1.0"
717 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
718 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
719 | dependencies:
720 | json-buffer "3.0.0"
721 |
722 | latest-version@^5.0.0:
723 | version "5.1.0"
724 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
725 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
726 | dependencies:
727 | package-json "^6.3.0"
728 |
729 | lodash.includes@^4.3.0:
730 | version "4.3.0"
731 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
732 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
733 |
734 | lodash.isboolean@^3.0.3:
735 | version "3.0.3"
736 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
737 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
738 |
739 | lodash.isinteger@^4.0.4:
740 | version "4.0.4"
741 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
742 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
743 |
744 | lodash.isnumber@^3.0.3:
745 | version "3.0.3"
746 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
747 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
748 |
749 | lodash.isplainobject@^4.0.6:
750 | version "4.0.6"
751 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
752 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
753 |
754 | lodash.isstring@^4.0.1:
755 | version "4.0.1"
756 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
757 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
758 |
759 | lodash.once@^4.0.0:
760 | version "4.1.1"
761 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
762 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
763 |
764 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
765 | version "1.0.1"
766 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
767 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
768 |
769 | lowercase-keys@^2.0.0:
770 | version "2.0.0"
771 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
772 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
773 |
774 | make-dir@^3.0.0:
775 | version "3.1.0"
776 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
777 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
778 | dependencies:
779 | semver "^6.0.0"
780 |
781 | media-typer@0.3.0:
782 | version "0.3.0"
783 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
784 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
785 |
786 | merge-descriptors@1.0.1:
787 | version "1.0.1"
788 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
789 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
790 |
791 | methods@~1.1.2:
792 | version "1.1.2"
793 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
794 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
795 |
796 | mime-db@1.44.0:
797 | version "1.44.0"
798 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
799 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
800 |
801 | mime-types@~2.1.24:
802 | version "2.1.27"
803 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
804 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
805 | dependencies:
806 | mime-db "1.44.0"
807 |
808 | mime@1.6.0:
809 | version "1.6.0"
810 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
811 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
812 |
813 | mimic-response@^1.0.0, mimic-response@^1.0.1:
814 | version "1.0.1"
815 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
816 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
817 |
818 | minimatch@^3.0.4:
819 | version "3.0.4"
820 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
821 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
822 | dependencies:
823 | brace-expansion "^1.1.7"
824 |
825 | minimist@^1.2.0:
826 | version "1.2.5"
827 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
828 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
829 |
830 | ms@2.0.0:
831 | version "2.0.0"
832 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
833 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
834 |
835 | ms@2.1.1:
836 | version "2.1.1"
837 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
838 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
839 |
840 | ms@^2.1.1:
841 | version "2.1.2"
842 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
843 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
844 |
845 | negotiator@0.6.2:
846 | version "0.6.2"
847 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
848 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
849 |
850 | nodemon@^2.0.4:
851 | version "2.0.4"
852 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416"
853 | integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==
854 | dependencies:
855 | chokidar "^3.2.2"
856 | debug "^3.2.6"
857 | ignore-by-default "^1.0.1"
858 | minimatch "^3.0.4"
859 | pstree.remy "^1.1.7"
860 | semver "^5.7.1"
861 | supports-color "^5.5.0"
862 | touch "^3.1.0"
863 | undefsafe "^2.0.2"
864 | update-notifier "^4.0.0"
865 |
866 | nopt@~1.0.10:
867 | version "1.0.10"
868 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
869 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
870 | dependencies:
871 | abbrev "1"
872 |
873 | normalize-path@^3.0.0, normalize-path@~3.0.0:
874 | version "3.0.0"
875 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
876 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
877 |
878 | normalize-url@^4.1.0:
879 | version "4.5.0"
880 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
881 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
882 |
883 | object-assign@^4:
884 | version "4.1.1"
885 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
886 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
887 |
888 | on-finished@~2.3.0:
889 | version "2.3.0"
890 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
891 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
892 | dependencies:
893 | ee-first "1.1.1"
894 |
895 | once@^1.3.1, once@^1.4.0:
896 | version "1.4.0"
897 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
898 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
899 | dependencies:
900 | wrappy "1"
901 |
902 | p-cancelable@^1.0.0:
903 | version "1.1.0"
904 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
905 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
906 |
907 | package-json@^6.3.0:
908 | version "6.5.0"
909 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
910 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
911 | dependencies:
912 | got "^9.6.0"
913 | registry-auth-token "^4.0.0"
914 | registry-url "^5.0.0"
915 | semver "^6.2.0"
916 |
917 | packet-reader@1.0.0:
918 | version "1.0.0"
919 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74"
920 | integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==
921 |
922 | parseurl@~1.3.3:
923 | version "1.3.3"
924 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
925 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
926 |
927 | path-to-regexp@0.1.7:
928 | version "0.1.7"
929 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
930 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
931 |
932 | pg-connection-string@0.1.3:
933 | version "0.1.3"
934 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7"
935 | integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=
936 |
937 | pg-int8@1.0.1:
938 | version "1.0.1"
939 | resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
940 | integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
941 |
942 | pg-pool@^3.1.1:
943 | version "3.2.1"
944 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.2.1.tgz#5f4afc0f58063659aeefa952d36af49fa28b30e0"
945 | integrity sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA==
946 |
947 | pg-protocol@^1.2.2:
948 | version "1.2.4"
949 | resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.2.4.tgz#3139cac0e51347f1e21e03954b1bb9fe2c20962e"
950 | integrity sha512-/8L/G+vW/VhWjTGXpGh8XVkXOFx1ZDY+Yuz//Ab8CfjInzFkreI+fDG3WjCeSra7fIZwAFxzbGptNbm8xSXenw==
951 |
952 | pg-types@^2.1.0:
953 | version "2.2.0"
954 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
955 | integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
956 | dependencies:
957 | pg-int8 "1.0.1"
958 | postgres-array "~2.0.0"
959 | postgres-bytea "~1.0.0"
960 | postgres-date "~1.0.4"
961 | postgres-interval "^1.1.0"
962 |
963 | pg@8.0.3:
964 | version "8.0.3"
965 | resolved "https://registry.yarnpkg.com/pg/-/pg-8.0.3.tgz#b220ee468a1819e1c7e9ca9878f8ae50ba8e1952"
966 | integrity sha512-fvcNXn4o/iq4jKq15Ix/e58q3jPSmzOp6/8C3CaHoSR/bsxdg+1FXfDRePdtE/zBb3++TytvOrS1hNef3WC/Kg==
967 | dependencies:
968 | buffer-writer "2.0.0"
969 | packet-reader "1.0.0"
970 | pg-connection-string "0.1.3"
971 | pg-pool "^3.1.1"
972 | pg-protocol "^1.2.2"
973 | pg-types "^2.1.0"
974 | pgpass "1.x"
975 | semver "4.3.2"
976 |
977 | pgpass@1.x:
978 | version "1.0.2"
979 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306"
980 | integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=
981 | dependencies:
982 | split "^1.0.0"
983 |
984 | picomatch@^2.0.4, picomatch@^2.2.1:
985 | version "2.2.2"
986 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
987 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
988 |
989 | postgres-array@~2.0.0:
990 | version "2.0.0"
991 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
992 | integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
993 |
994 | postgres-bytea@~1.0.0:
995 | version "1.0.0"
996 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
997 | integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
998 |
999 | postgres-date@~1.0.4:
1000 | version "1.0.5"
1001 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.5.tgz#710b27de5f27d550f6e80b5d34f7ba189213c2ee"
1002 | integrity sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==
1003 |
1004 | postgres-interval@^1.1.0:
1005 | version "1.2.0"
1006 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
1007 | integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
1008 | dependencies:
1009 | xtend "^4.0.0"
1010 |
1011 | prepend-http@^2.0.0:
1012 | version "2.0.0"
1013 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
1014 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
1015 |
1016 | proxy-addr@~2.0.5:
1017 | version "2.0.6"
1018 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
1019 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
1020 | dependencies:
1021 | forwarded "~0.1.2"
1022 | ipaddr.js "1.9.1"
1023 |
1024 | pstree.remy@^1.1.7:
1025 | version "1.1.8"
1026 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
1027 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
1028 |
1029 | pump@^3.0.0:
1030 | version "3.0.0"
1031 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
1032 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
1033 | dependencies:
1034 | end-of-stream "^1.1.0"
1035 | once "^1.3.1"
1036 |
1037 | pupa@^2.0.1:
1038 | version "2.0.1"
1039 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726"
1040 | integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==
1041 | dependencies:
1042 | escape-goat "^2.0.0"
1043 |
1044 | qs@6.7.0:
1045 | version "6.7.0"
1046 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
1047 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
1048 |
1049 | range-parser@~1.2.1:
1050 | version "1.2.1"
1051 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
1052 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
1053 |
1054 | raw-body@2.4.0:
1055 | version "2.4.0"
1056 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
1057 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
1058 | dependencies:
1059 | bytes "3.1.0"
1060 | http-errors "1.7.2"
1061 | iconv-lite "0.4.24"
1062 | unpipe "1.0.0"
1063 |
1064 | rc@^1.2.8:
1065 | version "1.2.8"
1066 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
1067 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
1068 | dependencies:
1069 | deep-extend "^0.6.0"
1070 | ini "~1.3.0"
1071 | minimist "^1.2.0"
1072 | strip-json-comments "~2.0.1"
1073 |
1074 | readdirp@~3.4.0:
1075 | version "3.4.0"
1076 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
1077 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
1078 | dependencies:
1079 | picomatch "^2.2.1"
1080 |
1081 | registry-auth-token@^4.0.0:
1082 | version "4.1.1"
1083 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479"
1084 | integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==
1085 | dependencies:
1086 | rc "^1.2.8"
1087 |
1088 | registry-url@^5.0.0:
1089 | version "5.1.0"
1090 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
1091 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
1092 | dependencies:
1093 | rc "^1.2.8"
1094 |
1095 | responselike@^1.0.2:
1096 | version "1.0.2"
1097 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
1098 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
1099 | dependencies:
1100 | lowercase-keys "^1.0.0"
1101 |
1102 | safe-buffer@5.1.2:
1103 | version "5.1.2"
1104 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1105 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1106 |
1107 | safe-buffer@^5.0.1:
1108 | version "5.2.1"
1109 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1110 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1111 |
1112 | "safer-buffer@>= 2.1.2 < 3":
1113 | version "2.1.2"
1114 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1115 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1116 |
1117 | semver-diff@^3.1.1:
1118 | version "3.1.1"
1119 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
1120 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
1121 | dependencies:
1122 | semver "^6.3.0"
1123 |
1124 | semver@4.3.2:
1125 | version "4.3.2"
1126 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
1127 | integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
1128 |
1129 | semver@^5.6.0, semver@^5.7.1:
1130 | version "5.7.1"
1131 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1132 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1133 |
1134 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
1135 | version "6.3.0"
1136 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1137 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1138 |
1139 | send@0.17.1:
1140 | version "0.17.1"
1141 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
1142 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
1143 | dependencies:
1144 | debug "2.6.9"
1145 | depd "~1.1.2"
1146 | destroy "~1.0.4"
1147 | encodeurl "~1.0.2"
1148 | escape-html "~1.0.3"
1149 | etag "~1.8.1"
1150 | fresh "0.5.2"
1151 | http-errors "~1.7.2"
1152 | mime "1.6.0"
1153 | ms "2.1.1"
1154 | on-finished "~2.3.0"
1155 | range-parser "~1.2.1"
1156 | statuses "~1.5.0"
1157 |
1158 | serve-static@1.14.1:
1159 | version "1.14.1"
1160 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
1161 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
1162 | dependencies:
1163 | encodeurl "~1.0.2"
1164 | escape-html "~1.0.3"
1165 | parseurl "~1.3.3"
1166 | send "0.17.1"
1167 |
1168 | setprototypeof@1.1.1:
1169 | version "1.1.1"
1170 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
1171 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
1172 |
1173 | signal-exit@^3.0.2:
1174 | version "3.0.3"
1175 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
1176 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
1177 |
1178 | split@^1.0.0:
1179 | version "1.0.1"
1180 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
1181 | integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==
1182 | dependencies:
1183 | through "2"
1184 |
1185 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
1186 | version "1.5.0"
1187 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
1188 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
1189 |
1190 | string-width@^3.0.0:
1191 | version "3.1.0"
1192 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
1193 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
1194 | dependencies:
1195 | emoji-regex "^7.0.1"
1196 | is-fullwidth-code-point "^2.0.0"
1197 | strip-ansi "^5.1.0"
1198 |
1199 | string-width@^4.0.0, string-width@^4.1.0:
1200 | version "4.2.0"
1201 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
1202 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
1203 | dependencies:
1204 | emoji-regex "^8.0.0"
1205 | is-fullwidth-code-point "^3.0.0"
1206 | strip-ansi "^6.0.0"
1207 |
1208 | strip-ansi@^5.1.0:
1209 | version "5.2.0"
1210 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
1211 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
1212 | dependencies:
1213 | ansi-regex "^4.1.0"
1214 |
1215 | strip-ansi@^6.0.0:
1216 | version "6.0.0"
1217 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
1218 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
1219 | dependencies:
1220 | ansi-regex "^5.0.0"
1221 |
1222 | strip-json-comments@~2.0.1:
1223 | version "2.0.1"
1224 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1225 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1226 |
1227 | supports-color@^5.5.0:
1228 | version "5.5.0"
1229 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1230 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1231 | dependencies:
1232 | has-flag "^3.0.0"
1233 |
1234 | supports-color@^7.1.0:
1235 | version "7.1.0"
1236 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
1237 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
1238 | dependencies:
1239 | has-flag "^4.0.0"
1240 |
1241 | term-size@^2.1.0:
1242 | version "2.2.0"
1243 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
1244 | integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
1245 |
1246 | through@2:
1247 | version "2.3.8"
1248 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
1249 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
1250 |
1251 | to-readable-stream@^1.0.0:
1252 | version "1.0.0"
1253 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
1254 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
1255 |
1256 | to-regex-range@^5.0.1:
1257 | version "5.0.1"
1258 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1259 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1260 | dependencies:
1261 | is-number "^7.0.0"
1262 |
1263 | toidentifier@1.0.0:
1264 | version "1.0.0"
1265 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
1266 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
1267 |
1268 | touch@^3.1.0:
1269 | version "3.1.0"
1270 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
1271 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
1272 | dependencies:
1273 | nopt "~1.0.10"
1274 |
1275 | type-fest@^0.8.1:
1276 | version "0.8.1"
1277 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
1278 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
1279 |
1280 | type-is@~1.6.17, type-is@~1.6.18:
1281 | version "1.6.18"
1282 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
1283 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1284 | dependencies:
1285 | media-typer "0.3.0"
1286 | mime-types "~2.1.24"
1287 |
1288 | typedarray-to-buffer@^3.1.5:
1289 | version "3.1.5"
1290 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
1291 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
1292 | dependencies:
1293 | is-typedarray "^1.0.0"
1294 |
1295 | undefsafe@^2.0.2:
1296 | version "2.0.3"
1297 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
1298 | integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
1299 | dependencies:
1300 | debug "^2.2.0"
1301 |
1302 | unique-string@^2.0.0:
1303 | version "2.0.0"
1304 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
1305 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
1306 | dependencies:
1307 | crypto-random-string "^2.0.0"
1308 |
1309 | unpipe@1.0.0, unpipe@~1.0.0:
1310 | version "1.0.0"
1311 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1312 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
1313 |
1314 | update-notifier@^4.0.0:
1315 | version "4.1.0"
1316 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3"
1317 | integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==
1318 | dependencies:
1319 | boxen "^4.2.0"
1320 | chalk "^3.0.0"
1321 | configstore "^5.0.1"
1322 | has-yarn "^2.1.0"
1323 | import-lazy "^2.1.0"
1324 | is-ci "^2.0.0"
1325 | is-installed-globally "^0.3.1"
1326 | is-npm "^4.0.0"
1327 | is-yarn-global "^0.3.0"
1328 | latest-version "^5.0.0"
1329 | pupa "^2.0.1"
1330 | semver-diff "^3.1.1"
1331 | xdg-basedir "^4.0.0"
1332 |
1333 | url-parse-lax@^3.0.0:
1334 | version "3.0.0"
1335 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
1336 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
1337 | dependencies:
1338 | prepend-http "^2.0.0"
1339 |
1340 | utils-merge@1.0.1:
1341 | version "1.0.1"
1342 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1343 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
1344 |
1345 | vary@^1, vary@~1.1.2:
1346 | version "1.1.2"
1347 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1348 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
1349 |
1350 | widest-line@^3.1.0:
1351 | version "3.1.0"
1352 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
1353 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
1354 | dependencies:
1355 | string-width "^4.0.0"
1356 |
1357 | wrappy@1:
1358 | version "1.0.2"
1359 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1360 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1361 |
1362 | write-file-atomic@^3.0.0:
1363 | version "3.0.3"
1364 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
1365 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
1366 | dependencies:
1367 | imurmurhash "^0.1.4"
1368 | is-typedarray "^1.0.0"
1369 | signal-exit "^3.0.2"
1370 | typedarray-to-buffer "^3.1.5"
1371 |
1372 | xdg-basedir@^4.0.0:
1373 | version "4.0.0"
1374 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
1375 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
1376 |
1377 | xtend@^4.0.0:
1378 | version "4.0.2"
1379 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
1380 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
1381 |
--------------------------------------------------------------------------------
/src/actions/auth.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { SIGN_IN, SIGN_OUT, BASE_API_URL } from '../utils/constants';
3 | import { initiateGetProfile } from './profile';
4 | import { history } from '../router/AppRouter';
5 | import { getErrors } from './errors';
6 | import { post } from '../utils/api';
7 |
8 | export const signIn = (user) => ({
9 | type: SIGN_IN,
10 | user
11 | });
12 |
13 | export const initiateLogin = (email, password) => {
14 | return async (dispatch) => {
15 | try {
16 | const result = await axios.post(`${BASE_API_URL}/signin`, {
17 | email,
18 | password
19 | });
20 | const user = result.data;
21 | localStorage.setItem('user_token', user.token);
22 | dispatch(signIn(user));
23 | dispatch(initiateGetProfile(user.email));
24 | history.push('/profile');
25 | } catch (error) {
26 | console.log('error', error);
27 | error.response && dispatch(getErrors(error.response.data));
28 | }
29 | };
30 | };
31 |
32 | export const registerNewUser = (data) => {
33 | return async (dispatch) => {
34 | try {
35 | await axios.post(`${BASE_API_URL}/signup`, data);
36 | return { success: true };
37 | } catch (error) {
38 | console.log('error', error);
39 | error.response && dispatch(getErrors(error.response.data));
40 | return { success: false };
41 | }
42 | };
43 | };
44 |
45 | export const signOut = () => ({
46 | type: SIGN_OUT
47 | });
48 |
49 | export const initiateLogout = () => {
50 | return async (dispatch) => {
51 | try {
52 | await post(`${BASE_API_URL}/logout`, true, true);
53 | localStorage.removeItem('user_token');
54 | return dispatch(signOut());
55 | } catch (error) {
56 | error.response && dispatch(getErrors(error.response.data));
57 | }
58 | };
59 | };
60 |
--------------------------------------------------------------------------------
/src/actions/errors.js:
--------------------------------------------------------------------------------
1 | import { GET_ERRORS, RESET_ERRORS } from '../utils/constants';
2 |
3 | export const getErrors = (errors) => ({
4 | type: GET_ERRORS,
5 | errors
6 | });
7 |
8 | export const resetErrors = () => ({
9 | type: RESET_ERRORS
10 | });
11 |
--------------------------------------------------------------------------------
/src/actions/profile.js:
--------------------------------------------------------------------------------
1 | import { BASE_API_URL } from '../utils/constants';
2 | import { getErrors } from './errors';
3 | import { UPDATE_PROFILE } from '../utils/constants';
4 | import { get, post } from '../utils/api';
5 |
6 | export const updateProfile = (profile) => ({
7 | type: UPDATE_PROFILE,
8 | profile
9 | });
10 |
11 | export const initiateUpdateProfile = (profileData) => {
12 | return async (dispatch) => {
13 | try {
14 | const profile = await post(`${BASE_API_URL}/profile`, profileData);
15 | dispatch(updateProfile(profile.data));
16 | } catch (error) {
17 | error.response && dispatch(getErrors(error.response.data));
18 | }
19 | };
20 | };
21 |
22 | export const initiateGetProfile = () => {
23 | return async (dispatch) => {
24 | try {
25 | const profile = await get(`${BASE_API_URL}/profile`);
26 | dispatch(updateProfile(profile.data));
27 | } catch (error) {
28 | error.response && dispatch(getErrors(error.response.data));
29 | }
30 | };
31 | };
32 |
--------------------------------------------------------------------------------
/src/components/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 |
4 | const Header = () => {
5 | return (
6 |
17 | );
18 | };
19 |
20 | export default Header;
21 |
--------------------------------------------------------------------------------
/src/components/Login.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { connect } from 'react-redux';
3 | import _ from 'lodash';
4 | import { Form, Button } from 'react-bootstrap';
5 | import { initiateLogin } from '../actions/auth';
6 | import { resetErrors } from '../actions/errors';
7 | import { validateFields } from '../utils/common';
8 | import { Link } from 'react-router-dom';
9 |
10 | class Login extends React.Component {
11 | state = {
12 | email: '',
13 | password: '',
14 | errorMsg: ''
15 | };
16 |
17 | componentDidUpdate(prevProps) {
18 | if (!_.isEqual(prevProps.errors, this.props.errors)) {
19 | this.setState({ errorMsg: this.props.errors });
20 | }
21 | }
22 |
23 | componentWillUnmount() {
24 | this.props.dispatch(resetErrors());
25 | }
26 |
27 | handleLogin = (event) => {
28 | event.preventDefault();
29 | const { email, password } = this.state;
30 | const fieldsToValidate = [{ email }, { password }];
31 |
32 | const allFieldsEntered = validateFields(fieldsToValidate);
33 | if (!allFieldsEntered) {
34 | this.setState({
35 | errorMsg: {
36 | signin_error: 'Please enter all the fields.'
37 | }
38 | });
39 | } else {
40 | this.setState({
41 | errorMsg: {
42 | signin_error: ''
43 | }
44 | });
45 | // login successful
46 | this.props.dispatch(initiateLogin(email, password));
47 | }
48 | };
49 |
50 | handleInputChange = (event) => {
51 | const { name, value } = event.target;
52 |
53 | this.setState({
54 | [name]: value
55 | });
56 | };
57 |
58 | render() {
59 | const { errorMsg } = this.state;
60 | return (
61 |
62 |
Banking Application
63 |
64 |
71 | Email address
72 |
78 |
79 |
80 | Password
81 |
87 |
88 |
89 |
92 |
93 | Create account
94 |
95 |
96 |
97 |
98 |
99 | );
100 | }
101 | }
102 |
103 | const mapStateToProps = (state) => ({
104 | errors: state.errors
105 | });
106 |
107 | export default connect(mapStateToProps)(Login);
108 |
--------------------------------------------------------------------------------
/src/components/Logout.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { connect } from 'react-redux';
3 | import { initiateLogout } from '../actions/auth';
4 |
5 | class Logout extends React.Component {
6 | componentDidMount() {
7 | const { history, dispatch } = this.props;
8 | dispatch(initiateLogout()).then(() => history.push('/'));
9 | }
10 |
11 | render() {
12 | return null;
13 | }
14 | }
15 |
16 | export default connect()(Logout);
17 |
--------------------------------------------------------------------------------
/src/components/Profile.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import _ from 'lodash';
3 | import { connect } from 'react-redux';
4 | import { Form, Button } from 'react-bootstrap';
5 | import { initiateUpdateProfile } from '../actions/profile';
6 | import { validateFields } from '../utils/common';
7 | import { resetErrors } from '../actions/errors';
8 |
9 | class Profile extends React.Component {
10 | state = {
11 | first_name: '',
12 | last_name: '',
13 | email: '',
14 | errorMsg: '',
15 | isSubmitted: false
16 | };
17 |
18 | componentDidMount() {
19 | const { profile } = this.props;
20 | if (!_.isEmpty(profile)) {
21 | const { first_name, last_name, email } = profile;
22 | this.setState({
23 | first_name,
24 | last_name,
25 | email
26 | });
27 | }
28 | }
29 |
30 | componentDidUpdate(prevProps) {
31 | if (!_.isEqual(prevProps.errors, this.props.errors)) {
32 | this.setState({
33 | errorMsg: this.props.errors
34 | });
35 | }
36 | if (!_.isEqual(prevProps.profile, this.props.profile)) {
37 | const { first_name, last_name, email } = this.props.profile;
38 | this.setState({ first_name, last_name, email });
39 | }
40 | }
41 |
42 | componentWillUnmount() {
43 | this.props.dispatch(resetErrors());
44 | }
45 |
46 | handleSubmit = (event) => {
47 | event.preventDefault();
48 | const { first_name, last_name } = this.state;
49 | const profileData = {
50 | first_name,
51 | last_name
52 | };
53 |
54 | const fieldsToValidate = [{ first_name }, { last_name }];
55 |
56 | const allFieldsEntered = validateFields(fieldsToValidate);
57 | if (!allFieldsEntered) {
58 | this.setState({
59 | errorMsg: {
60 | update_error: 'Please enter all the fields.'
61 | }
62 | });
63 | } else {
64 | this.setState({ isSubmitted: true, errorMsg: '' });
65 | this.props.dispatch(initiateUpdateProfile(profileData));
66 | }
67 | };
68 |
69 | handleOnChange = (event) => {
70 | const { name, value } = event.target;
71 | this.setState({
72 | [name]: value
73 | });
74 | };
75 |
76 | render() {
77 | const { errorMsg, first_name, last_name, email, isSubmitted } = this.state;
78 | return (
79 |
80 |
91 | Email address:
92 | {email}
93 |
94 |
95 | First name:
96 |
103 |
104 |
105 | Last name:
106 |
113 |
114 |
115 |
118 |
119 |
120 | );
121 | }
122 | }
123 |
124 | const mapStateToProps = (state) => ({
125 | profile: state.profile,
126 | errors: state.errors
127 | });
128 |
129 | export default connect(mapStateToProps)(Profile);
130 |
--------------------------------------------------------------------------------
/src/components/Register.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { connect } from 'react-redux';
3 | import _ from 'lodash';
4 | import { Form, Button } from 'react-bootstrap';
5 | import { registerNewUser } from '../actions/auth';
6 | import { resetErrors } from '../actions/errors';
7 | import { validateFields } from '../utils/common';
8 | import { Link } from 'react-router-dom';
9 |
10 | class Register extends React.Component {
11 | state = {
12 | first_name: '',
13 | last_name: '',
14 | email: '',
15 | password: '',
16 | cpassword: '',
17 | successMsg: '',
18 | errorMsg: '',
19 | isSubmitted: false
20 | };
21 |
22 | componentDidUpdate(prevProps) {
23 | if (!_.isEqual(prevProps.errors, this.props.errors)) {
24 | this.setState({ errorMsg: this.props.errors });
25 | }
26 | }
27 |
28 | componentWillUnmount() {
29 | this.props.dispatch(resetErrors());
30 | }
31 |
32 | registerUser = (event) => {
33 | event.preventDefault();
34 | const { first_name, last_name, email, password, cpassword } = this.state;
35 |
36 | const fieldsToValidate = [
37 | { first_name },
38 | { last_name },
39 | { email },
40 | { password },
41 | { cpassword }
42 | ];
43 |
44 | const allFieldsEntered = validateFields(fieldsToValidate);
45 | if (!allFieldsEntered) {
46 | this.setState({
47 | errorMsg: {
48 | signup_error: 'Please enter all the fields.'
49 | }
50 | });
51 | } else {
52 | if (password !== cpassword) {
53 | this.setState({
54 | errorMsg: {
55 | signup_error: 'Password and confirm password does not match.'
56 | }
57 | });
58 | } else {
59 | this.setState({ isSubmitted: true });
60 | this.props
61 | .dispatch(registerNewUser({ first_name, last_name, email, password }))
62 | .then((response) => {
63 | if (response.success) {
64 | this.setState({
65 | successMsg: 'User registered successfully.',
66 | errorMsg: ''
67 | });
68 | }
69 | });
70 | }
71 | }
72 | };
73 |
74 | handleInputChange = (event) => {
75 | const { name, value } = event.target;
76 | this.setState({
77 | [name]: value
78 | });
79 | };
80 |
81 | render() {
82 | const { errorMsg, successMsg, isSubmitted } = this.state;
83 | return (
84 |
85 |
Register User
86 |
87 |
98 | First name
99 |
105 |
106 |
107 | Last name
108 |
114 |
115 |
116 | Email address
117 |
123 |
124 |
125 | Password
126 |
132 |
133 |
134 | Confirm password
135 |
141 |
142 |
143 |
146 |
147 | Login
148 |
149 |
150 |
151 |
152 |
153 | );
154 | }
155 | }
156 |
157 | const mapStateToProps = (state) => ({
158 | errors: state.errors
159 | });
160 |
161 | export default connect(mapStateToProps)(Register);
162 |
--------------------------------------------------------------------------------
/src/css/main.scss:
--------------------------------------------------------------------------------
1 | $background: #ccc;
2 |
3 | %centered {
4 | display: flex;
5 | min-height: 60vh;
6 | justify-content: center;
7 | align-items: center;
8 | }
9 |
10 | html {
11 | font-size: 62.5%;
12 | }
13 |
14 | body {
15 | font-family: Nunito, Helvetica Neue, Helvetica, sans-serif;
16 | font-size: 20px;
17 | background: #d9c2ac;
18 | color: #454141;
19 | padding: 1rem;
20 | letter-spacing: 1px;
21 | }
22 |
23 | .errorMsg {
24 | color: #f21e08;
25 | padding: 0.5rem;
26 | padding-left: 0;
27 | max-width: 450px;
28 | }
29 |
30 | .successMsg {
31 | color: #00ff00;
32 | background: #077707;
33 | padding: 0.5rem;
34 | }
35 |
36 | h1 {
37 | font-size: 4rem;
38 | }
39 |
40 | h2 {
41 | font-size: 3.2rem;
42 | margin-bottom: 2rem;
43 | }
44 |
45 | h3 {
46 | font-size: 2.8rem;
47 | }
48 |
49 | h5 {
50 | font-size: 2rem;
51 | margin-bottom: 1rem;
52 | }
53 |
54 | header {
55 | text-align: center;
56 | margin-bottom: 3rem;
57 |
58 | .links {
59 | text-transform: uppercase;
60 | text-align: center;
61 | font-size: inherit;
62 | margin-top: 3rem;
63 |
64 | .link:link,
65 | .link:visited {
66 | outline: none;
67 | color: #000;
68 | margin: 1rem;
69 | padding: 0.5rem 0;
70 | text-decoration: none;
71 | text-transform: uppercase;
72 | border-bottom: 2px solid transparent;
73 | transition: all 0.3s;
74 | }
75 |
76 | .link:hover,
77 | .link:active {
78 | border-bottom: 2px solid #fff;
79 | }
80 | }
81 | }
82 |
83 | .action-items {
84 | display: flex;
85 | justify-content: space-between;
86 | }
87 |
88 | .btn {
89 | margin: 1rem 0;
90 | }
91 |
92 | .active {
93 | font-weight: bold;
94 | box-shadow: 0 0 5px #000;
95 | }
96 |
97 | .loading {
98 | @extend %centered;
99 | }
100 |
101 | .error-msg {
102 | color: #f21e08;
103 | background: #fff0f0;
104 | padding: 1rem;
105 | font-size: 1.2rem;
106 | }
107 |
108 | .success-msg {
109 | color: #00ff00;
110 | background: #077707;
111 | padding: 1rem;
112 | font-size: 1.2rem;
113 | }
114 |
115 | .form-group {
116 | margin-bottom: 1rem;
117 | }
118 |
119 | .form-control {
120 | display: unset;
121 | }
122 |
123 | .login-page {
124 | text-align: center;
125 | }
126 |
127 | button,
128 | input[type='button'],
129 | input[type='submit'],
130 | .btn {
131 | font-size: 1.6rem;
132 | }
133 |
134 | .form-control {
135 | font-size: 1.6rem;
136 | }
137 |
138 | .login-form {
139 | width: 50%;
140 | margin: auto;
141 | font-size: 2.5rem;
142 | text-align: left;
143 | @extend %centered;
144 |
145 | .login-btn {
146 | padding: 0.5rem 1rem;
147 | background: #676779;
148 | color: #fff;
149 | border-radius: 5px;
150 | }
151 | }
152 |
153 | .account {
154 | display: flex;
155 | justify-content: center;
156 | margin-bottom: 1rem;
157 |
158 | .account-btn {
159 | margin: 1.6rem;
160 | padding: 6px 12px;
161 | letter-spacing: 1px;
162 | }
163 | }
164 |
165 | .label-value {
166 | margin-left: 1rem;
167 | word-break: break-all;
168 | }
169 |
170 | .profile-form {
171 | .label-value {
172 | display: block;
173 | margin-left: 0;
174 | }
175 | }
176 |
177 | .edit-account {
178 | font-size: 1.6rem;
179 | float: right;
180 | letter-spacing: initial;
181 | text-decoration: underline;
182 | padding-top: 0.5rem;
183 | }
184 |
185 | .summary-form .label {
186 | width: 15rem;
187 | }
188 |
189 | .summary-form,
190 | .account {
191 | width: 80%;
192 | margin: auto;
193 | text-align: center;
194 | }
195 |
196 | .btn-report {
197 | margin: 1rem 0;
198 | }
199 |
200 | .transactions-section {
201 | text-align: left;
202 |
203 | .main-info {
204 | text-align: left;
205 | }
206 | }
207 |
208 | .report-table {
209 | margin-bottom: 3rem;
210 | }
211 |
212 | %pagination {
213 | background-color: #d9c2ac;
214 | }
215 |
216 | %active-pagination {
217 | background-color: inherit;
218 | border-color: inherit;
219 | color: #fff;
220 | outline: none;
221 |
222 | &:focus {
223 | box-shadow: none;
224 | }
225 | }
226 |
227 | .page-item {
228 | @extend %pagination;
229 | &.active {
230 | background-color: #494961;
231 | .page-link {
232 | @extend %active-pagination;
233 | }
234 | }
235 | .page-link {
236 | @extend %active-pagination;
237 | }
238 | }
239 |
240 | .dropdown-toggle {
241 | background-color: #fff;
242 | color: #000;
243 | }
244 |
245 | .dropdown-menu {
246 | min-width: 5rem;
247 | a {
248 | color: #000;
249 | }
250 | }
251 |
252 | @media only screen and (max-width: 600px) {
253 | .action-items {
254 | flex-direction: column;
255 | }
256 |
257 | .login-form {
258 | width: 100%;
259 | }
260 |
261 | header {
262 | .links {
263 | .link:link,
264 | .link:visited {
265 | display: block;
266 | }
267 |
268 | .link:hover,
269 | .link:active {
270 | border-bottom: 2px solid transparent;
271 | }
272 | }
273 | }
274 |
275 | .account {
276 | flex-direction: column;
277 | text-align: left;
278 |
279 | .account-btn {
280 | margin: 1rem;
281 | padding: 3px 8px;
282 | }
283 | }
284 |
285 | .edit-account {
286 | display: block;
287 | float: none;
288 | }
289 |
290 | .account-form {
291 | .label-value {
292 | display: block;
293 | margin-left: 0;
294 | }
295 | }
296 | }
297 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import AppRouter from './router/AppRouter';
4 | import { Provider } from 'react-redux';
5 | import store from './store/store';
6 | import 'bootstrap/dist/css/bootstrap.min.css';
7 | import './css/main.scss';
8 | import { maintainSession } from './utils/common';
9 |
10 | maintainSession();
11 | const rootElement = document.getElementById('root');
12 |
13 | ReactDOM.render(
14 |
15 |
16 | ,
17 | rootElement
18 | );
19 |
--------------------------------------------------------------------------------
/src/reducers/auth.js:
--------------------------------------------------------------------------------
1 | import { SIGN_IN, SIGN_OUT } from '../utils/constants';
2 |
3 | const authReducer = (state = {}, action) => {
4 | switch (action.type) {
5 | case SIGN_IN:
6 | return action.user;
7 | case SIGN_OUT:
8 | return {};
9 | default:
10 | return state;
11 | }
12 | };
13 |
14 | export default authReducer;
15 |
--------------------------------------------------------------------------------
/src/reducers/errors.js:
--------------------------------------------------------------------------------
1 | import { GET_ERRORS, RESET_ERRORS } from '../utils/constants';
2 |
3 | const errorsReducer = (state = {}, action) => {
4 | switch (action.type) {
5 | case GET_ERRORS:
6 | return action.errors;
7 | case RESET_ERRORS:
8 | return {};
9 | default:
10 | return state;
11 | }
12 | };
13 |
14 | export default errorsReducer;
15 |
--------------------------------------------------------------------------------
/src/reducers/profile.js:
--------------------------------------------------------------------------------
1 | import { UPDATE_PROFILE } from '../utils/constants';
2 |
3 | const profileReducer = (state = {}, action) => {
4 | switch (action.type) {
5 | case UPDATE_PROFILE:
6 | return { ...action.profile };
7 | default:
8 | return state;
9 | }
10 | };
11 |
12 | export default profileReducer;
13 |
--------------------------------------------------------------------------------
/src/router/AppRouter.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { connect } from 'react-redux';
3 | import _ from 'lodash';
4 | import { createBrowserHistory } from 'history';
5 | import { Route, Switch, Router } from 'react-router-dom';
6 | import Login from '../components/Login';
7 | import Register from '../components/Register';
8 | import Profile from '../components/Profile';
9 | import Header from '../components/Header';
10 | import Logout from '../components/Logout';
11 |
12 | export const history = createBrowserHistory();
13 |
14 | const AppRouter = ({ auth }) => {
15 | return (
16 |
17 |
18 | {!_.isEmpty(auth.token) &&
}
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | );
30 | };
31 |
32 | const mapStateToProps = (state) => ({
33 | auth: state.auth
34 | });
35 |
36 | export default connect(mapStateToProps)(AppRouter);
37 |
--------------------------------------------------------------------------------
/src/store/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, combineReducers, applyMiddleware, compose } from 'redux';
2 | import thunk from 'redux-thunk';
3 | import authReducer from '../reducers/auth';
4 | import errorsReducer from '../reducers/errors';
5 | import profileReducer from '../reducers/profile';
6 |
7 | const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
8 | const store = createStore(
9 | combineReducers({
10 | auth: authReducer,
11 | errors: errorsReducer,
12 | profile: profileReducer
13 | }),
14 | composeEnhancers(applyMiddleware(thunk))
15 | );
16 |
17 | export default store;
18 |
--------------------------------------------------------------------------------
/src/utils/api.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { setAuthHeader, removeAuthHeader } from './common';
3 |
4 | export const get = async (
5 | url,
6 | params,
7 | shouldSetAuthHeader = true,
8 | shouldRemoveAuthHeader = false
9 | ) => {
10 | if (shouldSetAuthHeader) {
11 | setAuthHeader();
12 | }
13 | const result = await axios.get(url, params);
14 | if (shouldRemoveAuthHeader) {
15 | removeAuthHeader();
16 | }
17 | return result;
18 | };
19 |
20 | export const post = async (
21 | url,
22 | params,
23 | shouldSetAuthHeader = true,
24 | shouldRemoveAuthHeader = false
25 | ) => {
26 | if (shouldSetAuthHeader) {
27 | setAuthHeader();
28 | }
29 | const result = await axios.post(url, params);
30 | if (shouldRemoveAuthHeader) {
31 | removeAuthHeader();
32 | }
33 | return result;
34 | };
35 |
36 | export const patch = async (
37 | url,
38 | params,
39 | shouldSetAuthHeader = true,
40 | shouldRemoveAuthHeader = false
41 | ) => {
42 | if (shouldSetAuthHeader) {
43 | setAuthHeader();
44 | }
45 | const result = await axios.patch(url, params);
46 | if (shouldRemoveAuthHeader) {
47 | removeAuthHeader();
48 | }
49 | return result;
50 | };
51 |
--------------------------------------------------------------------------------
/src/utils/common.js:
--------------------------------------------------------------------------------
1 | import jwt_decode from 'jwt-decode';
2 | import axios from 'axios';
3 | import store from '../store/store';
4 | import { initiateGetProfile } from '../actions/profile';
5 | import { signIn } from '../actions/auth';
6 | import { history } from '../router/AppRouter';
7 |
8 | export const validateFields = (fieldsToValidate) => {
9 | return fieldsToValidate.every((field) => Object.values(field)[0] !== '');
10 | };
11 |
12 | export const maintainSession = () => {
13 | const user_token = localStorage.getItem('user_token');
14 | if (user_token) {
15 | const currentPath = window.location.pathname;
16 | if (currentPath === '/' || currentPath === '/register') {
17 | history.push('/profile');
18 | }
19 | const decoded = jwt_decode(user_token);
20 | updateStore(decoded);
21 | } else {
22 | history.push('/');
23 | }
24 | };
25 |
26 | export const updateStore = (user) => {
27 | const { userid, email } = user;
28 | store.dispatch(
29 | signIn({
30 | userid,
31 | email,
32 | token: localStorage.getItem('user_token')
33 | })
34 | );
35 | store.dispatch(initiateGetProfile(email));
36 | };
37 |
38 | export const setAuthHeader = () => {
39 | const token = localStorage.getItem('user_token');
40 | if (token) {
41 | axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
42 | }
43 | };
44 |
45 | export const removeAuthHeader = () => {
46 | delete axios.defaults.headers.common['Authorization'];
47 | };
48 |
--------------------------------------------------------------------------------
/src/utils/constants.js:
--------------------------------------------------------------------------------
1 | export const BASE_API_URL = 'http://localhost:5000';
2 | export const SIGN_IN = 'SIGN_IN';
3 | export const SIGN_OUT = 'SIGN_OUT';
4 | export const GET_ERRORS = 'GET_ERRORS';
5 | export const RESET_ERRORS = 'RESET_ERRORS';
6 | export const UPDATE_PROFILE = 'UPDATE_PROFILE';
7 |
--------------------------------------------------------------------------------