├── .gitignore
├── LICENSE
├── README.md
├── backend
├── .eslintrc.js
├── .gitignore
├── README.md
├── controllers
│ └── authentication.js
├── models
│ └── User.js
├── package-lock.json
├── package.json
├── router.js
├── server.js
└── services
│ └── passport.js
└── frontend
├── .babelrc
├── .eslintrc
├── .gitignore
├── .prettierignore
├── .prettierrc
├── README.md
├── components
└── Navigation.js
├── next.config.js
├── package-lock.json
├── package.json
├── pages
├── index.js
├── logout.js
└── secured.js
└── utils
└── auth.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .DS_Store
3 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Lauris Kuznecovs
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Next.js and Express JWT authentication
2 |
3 | ## Introduction
4 |
5 | This repo hold both - server and client apps for fully functional example of JWT authentication.
6 |
7 | - [Server](./backend) - based on Express and MongoDB as data storage, but can be replaced to any custom data storage.
8 | - [Client](./frontend) - based on Next.js.
9 |
10 | ## Workflow
11 |
12 | 1. Run MongoDB, Server and Client.
13 |
14 | 1. Register user (described in backend directory).
15 |
16 | 2. Enter enter email/password in client app, press submit.
17 |
18 | 3. App sends request to server for user authentication.
19 |
20 | * SUCCESS - responds with **token** which is stored in cookie.
21 |
22 | * FAILURE - respond with particular HTTP code (no user data specified or wrong auth data provided).
23 |
24 | 4. By navigating between pages client app sends request to server with token to validation.
25 |
--------------------------------------------------------------------------------
/backend/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "env": {
3 | "es6": true,
4 | "node": true
5 | },
6 | "extends": "eslint:recommended",
7 | "rules": {
8 | "indent": [
9 | "error",
10 | 2
11 | ],
12 | "linebreak-style": [
13 | "error",
14 | "unix"
15 | ],
16 | "quotes": [
17 | "error",
18 | "single"
19 | ],
20 | "semi": [
21 | "error",
22 | "always"
23 | ]
24 | }
25 | };
26 |
--------------------------------------------------------------------------------
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .DS_Store
3 | node_modules/
4 | config.js
5 |
--------------------------------------------------------------------------------
/backend/README.md:
--------------------------------------------------------------------------------
1 | # Express Server JWT
2 |
3 | A simple server with JWT authentication with the ability to create new users, and to authenticate the existing ones.
4 |
5 | ## Requirements
6 | - Node.js
7 | - NPM
8 | - Docker or MongoDB locally
9 |
10 | ## Endpoints:
11 |
12 | * /api/register - POST (email, password)
13 | * /api/login - POST (email, password)
14 | * /api/validate - GET (checks for authorization in HEADER which contains token)
15 |
16 | ## Get Started:
17 |
18 | Install all dependencies:
19 | ```
20 | npm install
21 | ```
22 |
23 | Configure the server:
24 | ```
25 | touch config.js
26 |
27 | # configuration should look like this:
28 | module.exports = {
29 | db: 'mongodb://localhost/your-db-name-here',
30 | port: 3001,
31 | secret: 'secret word for JWT'
32 | };
33 | ```
34 |
35 | In case you dont have MongoDB installed locally, you can use docker image.
36 |
37 | Pull image and run it for the first time:
38 | ```
39 | docker run -it -p 27017-27019:27017-27019 --name mongodb mongo:4.0.4
40 | ```
41 |
42 | Stop container:
43 | ```
44 | docker stop mongodb
45 | ```
46 |
47 | Start container:
48 | ```
49 | docker start mongodb
50 | ```
51 |
52 | Configure MongoDB server:
53 |
54 | - Create new database
55 | - Create collection called "users"
56 |
57 | Run App backend:
58 | ```
59 | npm start
60 | ```
61 |
62 | ## Useful things
63 |
64 | If you are not familiar with MongoDB, I suggest to install "MongoDB Compass" to easily manage Mongo Database via GUI.
65 |
--------------------------------------------------------------------------------
/backend/controllers/authentication.js:
--------------------------------------------------------------------------------
1 | const jwt = require('jwt-simple');
2 | const User = require('../models/User');
3 | const { secret } = require('../config');
4 |
5 | function tokenForUser(user) {
6 | const timestamp = new Date().getTime();
7 | return jwt.encode({ sub: user.id, iat: timestamp }, secret);
8 | }
9 |
10 | exports.signin = function (req, res) {
11 | res.send({ token: tokenForUser(req.user) });
12 | };
13 |
14 | exports.signup = function (req, res, next) {
15 | const email = req.body.email;
16 | const password = req.body.password;
17 |
18 | if (!email || !password) {
19 | return res.status(422).send({ error: 'Email and password must be provided' });
20 | }
21 |
22 | User.findOne({ email: email }, function (err, existingUser) {
23 | if (err) {
24 | return next(err);
25 | }
26 |
27 | if (existingUser) {
28 | return res.status(422).send({ error: 'Email is already in use...' });
29 | }
30 |
31 | const user = new User({
32 | email: email,
33 | password: password
34 | });
35 |
36 | user.save(function (err) {
37 | if (err) {
38 | return next(err);
39 | }
40 | res.json({ token: tokenForUser(user) });
41 | });
42 | });
43 | };
44 |
--------------------------------------------------------------------------------
/backend/models/User.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const bcrypt = require('bcrypt-nodejs');
3 |
4 | const { Schema } = mongoose;
5 |
6 |
7 | // creating user schema
8 | const userSchema = new Schema({
9 | email: {
10 | type: String,
11 | unique: true,
12 | lowercase: true
13 | },
14 | password: String
15 | });
16 |
17 | // encrypt password before saving a model
18 | userSchema.pre('save', function (next) {
19 | const user = this;
20 | // generating hashed password
21 | bcrypt.genSalt(10, function (err, salt) {
22 | if (err) {
23 | return next(err);
24 | }
25 | bcrypt.hash(user.password, salt, null, function (err, hash) {
26 | if (err) {
27 | return next(err);
28 | }
29 |
30 | user.password = hash;
31 |
32 | // proceed to saving the model
33 | next();
34 | });
35 | });
36 | });
37 |
38 | // comparing saved hashed password and provided password during signing in
39 | userSchema.methods.comparePasswords = function (password, callback) {
40 | bcrypt.compare(password, this.password, function (err, isMatch) {
41 | if (err) {
42 | return callback(err);
43 | }
44 | callback(null, isMatch);
45 | });
46 | };
47 |
48 | const User = mongoose.model('user', userSchema);
49 |
50 | module.exports = User;
51 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jwt-backend",
3 | "version": "1.0.0",
4 | "description": "Simple server with JWT authentication",
5 | "main": "server.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "nodemon server.js"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "bcrypt-nodejs": "0.0.3",
15 | "body-parser": "^1.19.0",
16 | "cors": "^2.8.5",
17 | "express": "^4.19.2",
18 | "jwt-simple": "^0.5.6",
19 | "mongoose": "^5.13.14",
20 | "morgan": "^1.10.0",
21 | "passport": "^0.4.1",
22 | "passport-jwt": "^4.0.0",
23 | "passport-local": "^1.0.0"
24 | },
25 | "devDependencies": {
26 | "eslint": "^6.8.0",
27 | "nodemon": "^2.0.15"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/backend/router.js:
--------------------------------------------------------------------------------
1 | const Authentication = require('./controllers/authentication');
2 | const passport = require('passport');
3 | require('./services/passport');
4 |
5 | const requireAuth = passport.authenticate('jwt', {
6 | session: false
7 | });
8 | const requireSignIn = passport.authenticate('local', {
9 | session: false
10 | });
11 |
12 | module.exports = function (app) {
13 |
14 | // Hello endpoint
15 | app.get('/api/', function (req, res) {
16 | res.send('Express Server with JWT Authentication');
17 | });
18 |
19 | // Validate user
20 | app.get('/api/validate', requireAuth, function(req, res) {
21 | res.send({
22 | user: req.user.email
23 | });
24 | });
25 |
26 | // Login user
27 | app.post('/api/login', requireSignIn, Authentication.signin);
28 |
29 | // Register user
30 | app.post('/api/register', Authentication.signup);
31 | };
32 |
--------------------------------------------------------------------------------
/backend/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const mongoose = require('mongoose');
3 | const cors = require('cors');
4 | const bodyParser = require('body-parser');
5 | const morgan = require('morgan');
6 | const { port, db } = require('./config');
7 | const router = require('./router');
8 |
9 | const app = express();
10 | mongoose.connect(db, {
11 | useNewUrlParser: true,
12 | useCreateIndex: true,
13 | useUnifiedTopology: true,
14 | });
15 |
16 | app.use(morgan('combined'));
17 | app.use(cors());
18 | app.enable('trust proxy');
19 | app.use(bodyParser.json({type: '*/*'}));
20 |
21 | router(app);
22 |
23 | app.listen(port, () => {
24 | console.log(`Server started on port + ${port}`);
25 | });
26 |
--------------------------------------------------------------------------------
/backend/services/passport.js:
--------------------------------------------------------------------------------
1 | const passport = require('passport');
2 | const User = require('../models/User');
3 | const JwtStrategy = require('passport-jwt').Strategy;
4 | const { ExtractJwt } = require('passport-jwt');
5 | const LocalStrategy = require('passport-local');
6 | const { secret } = require('../config');
7 |
8 |
9 | // setting local strategy:
10 | const localOptions = { usernameField: 'email' };
11 | const localLogin = new LocalStrategy(localOptions, function (email, password, done) {
12 | User.findOne({ email: email }, function (err, user) {
13 | if (err) {
14 | return done(err);
15 | }
16 |
17 | if (!user) {
18 | return done(null, false);
19 | }
20 |
21 | user.comparePasswords(password, function (err, isMatch) {
22 | if (err) {
23 | return done(err);
24 | }
25 |
26 | if (!isMatch) {
27 | return done(null, false);
28 | }
29 |
30 | return done(null, user);
31 | });
32 | });
33 | });
34 |
35 |
36 |
37 | // setting the jwt strategy
38 | const jwtOptions = {
39 | jwtFromRequest: ExtractJwt.fromHeader('authorization'),
40 | secretOrKey: secret
41 | };
42 |
43 | const jwtLogin = new JwtStrategy(jwtOptions, function (payload, done) {
44 | User.findById(payload.sub)
45 | .then((user) => {
46 | if (user) {
47 | done(null, user);
48 | } else {
49 | done(null, false);
50 | }
51 | })
52 | .catch((err) => done(err, false));
53 | });
54 |
55 |
56 | // tell passport to use defined strategies:
57 | passport.use(jwtLogin);
58 | passport.use(localLogin);
--------------------------------------------------------------------------------
/frontend/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | [
4 | "next/babel"
5 | ]
6 | ]
7 | }
8 |
--------------------------------------------------------------------------------
/frontend/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "parser": "@babel/eslint-parser",
3 | "extends": ["airbnb/base", "prettier", "plugin:prettier/recommended"],
4 | "plugins": ["prettier", "react", "jsx-a11y"],
5 | "env": {
6 | "jest": true,
7 | "browser": true,
8 | "node": true,
9 | "es6": true
10 | },
11 | "parserOptions": {
12 | "ecmaVersion": 2020,
13 | "sourceType": "module",
14 | "ecmaFeatures": {
15 | "jsx": true,
16 | "modules": true
17 | },
18 | "requireConfigFile": false
19 | },
20 | "rules": {
21 | "arrow-body-style": ["error", "as-needed"],
22 | "class-methods-use-this": "off",
23 | "comma-dangle": ["error", "always-multiline"],
24 | "import/imports-first": "off",
25 | "import/newline-after-import": "off",
26 | "import/no-dynamic-require": "off",
27 | "import/no-extraneous-dependencies": "off",
28 | "import/no-named-as-default": "off",
29 | "import/no-unresolved": "error",
30 | "import/no-cycle": "off",
31 | "no-underscore-dangle": "off",
32 | "import/no-webpack-loader-syntax": "off",
33 | "import/prefer-default-export": "off",
34 | "jsx-a11y/anchor-is-valid": ["error", {
35 | "components": ["Link"],
36 | "specialLink": ["hrefLeft", "hrefRight"],
37 | "aspects": ["invalidHref", "preferButton"]
38 | }],
39 | "jsx-a11y/aria-props": "error",
40 | "jsx-a11y/heading-has-content": "off",
41 | "jsx-a11y/label-has-associated-control": [
42 | "error",
43 | {
44 | // NOTE: If this error triggers, either disable it or add
45 | // your custom components, labels and attributes via these options
46 | // See https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/label-has-associated-control.md
47 | "controlComponents": ["Input"]
48 | }
49 | ],
50 | "jsx-a11y/label-has-for": "off",
51 | "jsx-a11y/html-has-lang": "off",
52 | "jsx-a11y/mouse-events-have-key-events": "error",
53 | "jsx-a11y/role-has-required-aria-props": "error",
54 | "jsx-a11y/role-supports-aria-props": "error",
55 | "jsx-quotes": ["error", "prefer-double"],
56 | "max-len": "off",
57 | "newline-per-chained-call": "off",
58 | "no-confusing-arrow": "off",
59 | "no-console": "warn",
60 | "no-unused-vars": "warn",
61 | "no-use-before-define": "off",
62 | "no-nested-ternary": "off",
63 | "prefer-template": "error",
64 | "react/destructuring-assignment": "off",
65 | "react/jsx-closing-tag-location": "off",
66 | "react/forbid-prop-types": "off",
67 | "react/jsx-first-prop-new-line": ["error", "multiline"],
68 | "react/jsx-filename-extension": "off",
69 | "react/jsx-no-target-blank": "off",
70 | "react/jsx-uses-vars": "error",
71 | "react/jsx-props-no-spreading": "off",
72 | "react/require-default-props": "off",
73 | "react/require-extension": "off",
74 | "react/self-closing-comp": "off",
75 | "react/sort-comp": "off",
76 | "require-yield": "off",
77 | "eol-last": "warn",
78 | "semi": ["error", "never"]
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .next
3 | .idea
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/frontend/.prettierignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .next/
3 | package-lock.json
4 | package.json
5 |
--------------------------------------------------------------------------------
/frontend/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 80,
3 | "tabWidth": 2,
4 | "useTabs": false,
5 | "semi": false,
6 | "singleQuote": true,
7 | "trailingComma": "all"
8 | }
9 |
--------------------------------------------------------------------------------
/frontend/README.md:
--------------------------------------------------------------------------------
1 | # Next.js authentication with JWT
2 |
3 | A simple JWT authentication for Next.js with the ability to authenticate existing users.
4 |
5 | This project uses cookies for storing JWT token, for best security practices use httpOnly cookies.
6 |
7 | ## Requirements
8 | - Node.js
9 | - NPM
10 | - **JWT server** - see [backend](../backend) directory for instructions
11 |
12 | ## Endpoints:
13 |
14 | * `/` - Home page
15 | * `/secured` - Secured page (accessible ONLY when user is authenticated)
16 | * `/logout` - Log out user by removing token from cookie
17 |
18 | ## Get Started:
19 |
20 | Install all dependencies:
21 | ```
22 | npm install
23 | ```
24 |
25 | Configure the server:
26 |
27 | By default app send requests to auth server on localhost:3001
28 | But it can be changed with environment variable - **API_URL**
29 | For more info see next.config.js
30 |
31 | Run the server:
32 | ```
33 | npm start
34 | ```
35 |
--------------------------------------------------------------------------------
/frontend/components/Navigation.js:
--------------------------------------------------------------------------------
1 | import Link from 'next/link'
2 |
3 | const Navigation = () => (
4 | <>
5 |
Pages:
6 |
23 | >
24 | )
25 |
26 | export default Navigation
27 |
--------------------------------------------------------------------------------
/frontend/next.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | API_URL: process.env.API_URL || 'http://localhost:3001',
4 | },
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-js-jwt",
3 | "version": "1.0.2",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@ampproject/remapping": {
8 | "version": "2.1.2",
9 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
10 | "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
11 | "dev": true,
12 | "requires": {
13 | "@jridgewell/trace-mapping": "^0.3.0"
14 | }
15 | },
16 | "@babel/code-frame": {
17 | "version": "7.16.7",
18 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
19 | "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
20 | "dev": true,
21 | "requires": {
22 | "@babel/highlight": "^7.16.7"
23 | }
24 | },
25 | "@babel/compat-data": {
26 | "version": "7.17.7",
27 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz",
28 | "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==",
29 | "dev": true
30 | },
31 | "@babel/core": {
32 | "version": "7.17.9",
33 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz",
34 | "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==",
35 | "dev": true,
36 | "requires": {
37 | "@ampproject/remapping": "^2.1.0",
38 | "@babel/code-frame": "^7.16.7",
39 | "@babel/generator": "^7.17.9",
40 | "@babel/helper-compilation-targets": "^7.17.7",
41 | "@babel/helper-module-transforms": "^7.17.7",
42 | "@babel/helpers": "^7.17.9",
43 | "@babel/parser": "^7.17.9",
44 | "@babel/template": "^7.16.7",
45 | "@babel/traverse": "^7.17.9",
46 | "@babel/types": "^7.17.0",
47 | "convert-source-map": "^1.7.0",
48 | "debug": "^4.1.0",
49 | "gensync": "^1.0.0-beta.2",
50 | "json5": "^2.2.1",
51 | "semver": "^6.3.0"
52 | },
53 | "dependencies": {
54 | "json5": {
55 | "version": "2.2.1",
56 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
57 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
58 | "dev": true
59 | }
60 | }
61 | },
62 | "@babel/eslint-parser": {
63 | "version": "7.17.0",
64 | "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz",
65 | "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==",
66 | "dev": true,
67 | "requires": {
68 | "eslint-scope": "^5.1.1",
69 | "eslint-visitor-keys": "^2.1.0",
70 | "semver": "^6.3.0"
71 | },
72 | "dependencies": {
73 | "eslint-visitor-keys": {
74 | "version": "2.1.0",
75 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
76 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
77 | "dev": true
78 | },
79 | "semver": {
80 | "version": "6.3.0",
81 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
82 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
83 | "dev": true
84 | }
85 | }
86 | },
87 | "@babel/generator": {
88 | "version": "7.17.9",
89 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz",
90 | "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==",
91 | "dev": true,
92 | "requires": {
93 | "@babel/types": "^7.17.0",
94 | "jsesc": "^2.5.1",
95 | "source-map": "^0.5.0"
96 | }
97 | },
98 | "@babel/helper-compilation-targets": {
99 | "version": "7.17.7",
100 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz",
101 | "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==",
102 | "dev": true,
103 | "requires": {
104 | "@babel/compat-data": "^7.17.7",
105 | "@babel/helper-validator-option": "^7.16.7",
106 | "browserslist": "^4.17.5",
107 | "semver": "^6.3.0"
108 | }
109 | },
110 | "@babel/helper-environment-visitor": {
111 | "version": "7.16.7",
112 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
113 | "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
114 | "dev": true,
115 | "requires": {
116 | "@babel/types": "^7.16.7"
117 | }
118 | },
119 | "@babel/helper-function-name": {
120 | "version": "7.17.9",
121 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
122 | "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
123 | "dev": true,
124 | "requires": {
125 | "@babel/template": "^7.16.7",
126 | "@babel/types": "^7.17.0"
127 | }
128 | },
129 | "@babel/helper-hoist-variables": {
130 | "version": "7.16.7",
131 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz",
132 | "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==",
133 | "dev": true,
134 | "requires": {
135 | "@babel/types": "^7.16.7"
136 | }
137 | },
138 | "@babel/helper-module-imports": {
139 | "version": "7.16.7",
140 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
141 | "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
142 | "dev": true,
143 | "requires": {
144 | "@babel/types": "^7.16.7"
145 | }
146 | },
147 | "@babel/helper-module-transforms": {
148 | "version": "7.17.7",
149 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz",
150 | "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==",
151 | "dev": true,
152 | "requires": {
153 | "@babel/helper-environment-visitor": "^7.16.7",
154 | "@babel/helper-module-imports": "^7.16.7",
155 | "@babel/helper-simple-access": "^7.17.7",
156 | "@babel/helper-split-export-declaration": "^7.16.7",
157 | "@babel/helper-validator-identifier": "^7.16.7",
158 | "@babel/template": "^7.16.7",
159 | "@babel/traverse": "^7.17.3",
160 | "@babel/types": "^7.17.0"
161 | }
162 | },
163 | "@babel/helper-simple-access": {
164 | "version": "7.17.7",
165 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz",
166 | "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==",
167 | "dev": true,
168 | "requires": {
169 | "@babel/types": "^7.17.0"
170 | }
171 | },
172 | "@babel/helper-split-export-declaration": {
173 | "version": "7.16.7",
174 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz",
175 | "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==",
176 | "dev": true,
177 | "requires": {
178 | "@babel/types": "^7.16.7"
179 | }
180 | },
181 | "@babel/helper-validator-identifier": {
182 | "version": "7.16.7",
183 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
184 | "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
185 | "dev": true
186 | },
187 | "@babel/helper-validator-option": {
188 | "version": "7.16.7",
189 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
190 | "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
191 | "dev": true
192 | },
193 | "@babel/helpers": {
194 | "version": "7.17.9",
195 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz",
196 | "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==",
197 | "dev": true,
198 | "requires": {
199 | "@babel/template": "^7.16.7",
200 | "@babel/traverse": "^7.17.9",
201 | "@babel/types": "^7.17.0"
202 | }
203 | },
204 | "@babel/highlight": {
205 | "version": "7.17.9",
206 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz",
207 | "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==",
208 | "dev": true,
209 | "requires": {
210 | "@babel/helper-validator-identifier": "^7.16.7",
211 | "chalk": "^2.0.0",
212 | "js-tokens": "^4.0.0"
213 | },
214 | "dependencies": {
215 | "ansi-styles": {
216 | "version": "3.2.1",
217 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
218 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
219 | "dev": true,
220 | "requires": {
221 | "color-convert": "^1.9.0"
222 | }
223 | },
224 | "chalk": {
225 | "version": "2.4.2",
226 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
227 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
228 | "dev": true,
229 | "requires": {
230 | "ansi-styles": "^3.2.1",
231 | "escape-string-regexp": "^1.0.5",
232 | "supports-color": "^5.3.0"
233 | }
234 | },
235 | "color-convert": {
236 | "version": "1.9.3",
237 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
238 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
239 | "dev": true,
240 | "requires": {
241 | "color-name": "1.1.3"
242 | }
243 | },
244 | "color-name": {
245 | "version": "1.1.3",
246 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
247 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
248 | "dev": true
249 | },
250 | "escape-string-regexp": {
251 | "version": "1.0.5",
252 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
253 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
254 | "dev": true
255 | },
256 | "has-flag": {
257 | "version": "3.0.0",
258 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
259 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
260 | "dev": true
261 | },
262 | "supports-color": {
263 | "version": "5.5.0",
264 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
265 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
266 | "dev": true,
267 | "requires": {
268 | "has-flag": "^3.0.0"
269 | }
270 | }
271 | }
272 | },
273 | "@babel/parser": {
274 | "version": "7.17.9",
275 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
276 | "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==",
277 | "dev": true
278 | },
279 | "@babel/runtime": {
280 | "version": "7.17.9",
281 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz",
282 | "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==",
283 | "dev": true,
284 | "requires": {
285 | "regenerator-runtime": "^0.13.4"
286 | }
287 | },
288 | "@babel/runtime-corejs3": {
289 | "version": "7.17.9",
290 | "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.9.tgz",
291 | "integrity": "sha512-WxYHHUWF2uZ7Hp1K+D1xQgbgkGUfA+5UPOegEXGt2Y5SMog/rYCVaifLZDbw8UkNXozEqqrZTy6bglL7xTaCOw==",
292 | "dev": true,
293 | "requires": {
294 | "core-js-pure": "^3.20.2",
295 | "regenerator-runtime": "^0.13.4"
296 | }
297 | },
298 | "@babel/template": {
299 | "version": "7.16.7",
300 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz",
301 | "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==",
302 | "dev": true,
303 | "requires": {
304 | "@babel/code-frame": "^7.16.7",
305 | "@babel/parser": "^7.16.7",
306 | "@babel/types": "^7.16.7"
307 | }
308 | },
309 | "@babel/traverse": {
310 | "version": "7.17.9",
311 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz",
312 | "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==",
313 | "dev": true,
314 | "requires": {
315 | "@babel/code-frame": "^7.16.7",
316 | "@babel/generator": "^7.17.9",
317 | "@babel/helper-environment-visitor": "^7.16.7",
318 | "@babel/helper-function-name": "^7.17.9",
319 | "@babel/helper-hoist-variables": "^7.16.7",
320 | "@babel/helper-split-export-declaration": "^7.16.7",
321 | "@babel/parser": "^7.17.9",
322 | "@babel/types": "^7.17.0",
323 | "debug": "^4.1.0",
324 | "globals": "^11.1.0"
325 | },
326 | "dependencies": {
327 | "globals": {
328 | "version": "11.12.0",
329 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
330 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
331 | "dev": true
332 | }
333 | }
334 | },
335 | "@babel/types": {
336 | "version": "7.17.0",
337 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
338 | "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
339 | "dev": true,
340 | "requires": {
341 | "@babel/helper-validator-identifier": "^7.16.7",
342 | "to-fast-properties": "^2.0.0"
343 | }
344 | },
345 | "@eslint/eslintrc": {
346 | "version": "1.2.1",
347 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz",
348 | "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==",
349 | "dev": true,
350 | "requires": {
351 | "ajv": "^6.12.4",
352 | "debug": "^4.3.2",
353 | "espree": "^9.3.1",
354 | "globals": "^13.9.0",
355 | "ignore": "^5.2.0",
356 | "import-fresh": "^3.2.1",
357 | "js-yaml": "^4.1.0",
358 | "minimatch": "^3.0.4",
359 | "strip-json-comments": "^3.1.1"
360 | }
361 | },
362 | "@humanwhocodes/config-array": {
363 | "version": "0.9.5",
364 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
365 | "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
366 | "dev": true,
367 | "requires": {
368 | "@humanwhocodes/object-schema": "^1.2.1",
369 | "debug": "^4.1.1",
370 | "minimatch": "^3.0.4"
371 | }
372 | },
373 | "@humanwhocodes/object-schema": {
374 | "version": "1.2.1",
375 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
376 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
377 | "dev": true
378 | },
379 | "@jridgewell/resolve-uri": {
380 | "version": "3.0.5",
381 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
382 | "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==",
383 | "dev": true
384 | },
385 | "@jridgewell/sourcemap-codec": {
386 | "version": "1.4.11",
387 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
388 | "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==",
389 | "dev": true
390 | },
391 | "@jridgewell/trace-mapping": {
392 | "version": "0.3.4",
393 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
394 | "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==",
395 | "dev": true,
396 | "requires": {
397 | "@jridgewell/resolve-uri": "^3.0.3",
398 | "@jridgewell/sourcemap-codec": "^1.4.10"
399 | }
400 | },
401 | "@next/env": {
402 | "version": "12.1.4",
403 | "resolved": "https://registry.npmjs.org/@next/env/-/env-12.1.4.tgz",
404 | "integrity": "sha512-7gQwotJDKnfMxxXd8xJ2vsX5AzyDxO3zou0+QOXX8/unypA6icw5+wf6A62yKZ6qQ4UZHHxS68pb6UV+wNneXg=="
405 | },
406 | "@next/swc-android-arm-eabi": {
407 | "version": "12.1.4",
408 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-12.1.4.tgz",
409 | "integrity": "sha512-FJg/6a3s2YrUaqZ+/DJZzeZqfxbbWrynQMT1C5wlIEq9aDLXCFpPM/PiOyJh0ahxc0XPmi6uo38Poq+GJTuKWw==",
410 | "optional": true
411 | },
412 | "@next/swc-android-arm64": {
413 | "version": "12.1.4",
414 | "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-12.1.4.tgz",
415 | "integrity": "sha512-LXraazvQQFBgxIg3Htny6G5V5he9EK7oS4jWtMdTGIikmD/OGByOv8ZjLuVLZLtVm3UIvaAiGtlQSLecxJoJDw==",
416 | "optional": true
417 | },
418 | "@next/swc-darwin-arm64": {
419 | "version": "12.1.4",
420 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-12.1.4.tgz",
421 | "integrity": "sha512-SSST/dBymecllZxcqTCcSTCu5o1NKk9I+xcvhn/O9nH6GWjgvGgGkNqLbCarCa0jJ1ukvlBA138FagyrmZ/4rQ==",
422 | "optional": true
423 | },
424 | "@next/swc-darwin-x64": {
425 | "version": "12.1.4",
426 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-12.1.4.tgz",
427 | "integrity": "sha512-p1lwdX0TVjaoDXQVuAkjtxVBbCL/urgxiMCBwuPDO7TikpXtSRivi+mIzBj5q7ypgICFmIAOW3TyupXeoPRAnA==",
428 | "optional": true
429 | },
430 | "@next/swc-linux-arm-gnueabihf": {
431 | "version": "12.1.4",
432 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-12.1.4.tgz",
433 | "integrity": "sha512-67PZlgkCn3TDxacdVft0xqDCL7Io1/C4xbAs0+oSQ0xzp6OzN2RNpuKjHJrJgKd0DsE1XZ9sCP27Qv0591yfyg==",
434 | "optional": true
435 | },
436 | "@next/swc-linux-arm64-gnu": {
437 | "version": "12.1.4",
438 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-12.1.4.tgz",
439 | "integrity": "sha512-OnOWixhhw7aU22TQdQLYrgpgFq0oA1wGgnjAiHJ+St7MLj82KTDyM9UcymAMbGYy6nG/TFOOHdTmRMtCRNOw0g==",
440 | "optional": true
441 | },
442 | "@next/swc-linux-arm64-musl": {
443 | "version": "12.1.4",
444 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-12.1.4.tgz",
445 | "integrity": "sha512-UoRMzPZnsAavdWtVylYxH8DNC7Uy0i6RrvNwT4PyQVdfANBn2omsUkcH5lgS2O7oaz0nAYLk1vqyZDO7+tJotA==",
446 | "optional": true
447 | },
448 | "@next/swc-linux-x64-gnu": {
449 | "version": "12.1.4",
450 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-12.1.4.tgz",
451 | "integrity": "sha512-nM+MA/frxlTLUKLJKorctdI20/ugfHRjVEEkcLp/58LGG7slNaP1E5d5dRA1yX6ISjPcQAkywas5VlGCg+uTvA==",
452 | "optional": true
453 | },
454 | "@next/swc-linux-x64-musl": {
455 | "version": "12.1.4",
456 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-12.1.4.tgz",
457 | "integrity": "sha512-GoRHxkuW4u4yKw734B9SzxJwVdyEJosaZ62P7ifOwcujTxhgBt3y76V2nNUrsSuopcKI2ZTDjaa+2wd5zyeXbA==",
458 | "optional": true
459 | },
460 | "@next/swc-win32-arm64-msvc": {
461 | "version": "12.1.4",
462 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-12.1.4.tgz",
463 | "integrity": "sha512-6TQkQze0ievXwHJcVUrIULwCYVe3ccX6T0JgZ1SiMeXpHxISN7VJF/O8uSCw1JvXZYZ6ud0CJ7nfC5HXivgfPg==",
464 | "optional": true
465 | },
466 | "@next/swc-win32-ia32-msvc": {
467 | "version": "12.1.4",
468 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-12.1.4.tgz",
469 | "integrity": "sha512-CsbX/IXuZ5VSmWCpSetG2HD6VO5FTsO39WNp2IR2Ut/uom9XtLDJAZqjQEnbUTLGHuwDKFjrIO3LkhtROXLE/g==",
470 | "optional": true
471 | },
472 | "@next/swc-win32-x64-msvc": {
473 | "version": "12.1.4",
474 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-12.1.4.tgz",
475 | "integrity": "sha512-JtYuWzKXKLDMgE/xTcFtCm1MiCIRaAc5XYZfYX3n/ZWSI1SJS/GMm+Su0SAHJgRFavJh6U/p998YwO/iGTIgqQ==",
476 | "optional": true
477 | },
478 | "@types/cookie": {
479 | "version": "0.3.3",
480 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz",
481 | "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow=="
482 | },
483 | "@types/hoist-non-react-statics": {
484 | "version": "3.3.1",
485 | "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
486 | "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
487 | "requires": {
488 | "@types/react": "*",
489 | "hoist-non-react-statics": "^3.3.0"
490 | }
491 | },
492 | "@types/json5": {
493 | "version": "0.0.29",
494 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
495 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
496 | "dev": true
497 | },
498 | "@types/prop-types": {
499 | "version": "15.7.4",
500 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
501 | "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ=="
502 | },
503 | "@types/react": {
504 | "version": "17.0.43",
505 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.43.tgz",
506 | "integrity": "sha512-8Q+LNpdxf057brvPu1lMtC5Vn7J119xrP1aq4qiaefNioQUYANF/CYeK4NsKorSZyUGJ66g0IM+4bbjwx45o2A==",
507 | "requires": {
508 | "@types/prop-types": "*",
509 | "@types/scheduler": "*",
510 | "csstype": "^3.0.2"
511 | }
512 | },
513 | "@types/scheduler": {
514 | "version": "0.16.2",
515 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
516 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
517 | },
518 | "acorn": {
519 | "version": "8.7.0",
520 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
521 | "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
522 | "dev": true
523 | },
524 | "acorn-jsx": {
525 | "version": "5.3.2",
526 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
527 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
528 | "dev": true
529 | },
530 | "ajv": {
531 | "version": "6.12.6",
532 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
533 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
534 | "dev": true,
535 | "requires": {
536 | "fast-deep-equal": "^3.1.1",
537 | "fast-json-stable-stringify": "^2.0.0",
538 | "json-schema-traverse": "^0.4.1",
539 | "uri-js": "^4.2.2"
540 | }
541 | },
542 | "ansi-regex": {
543 | "version": "5.0.1",
544 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
545 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
546 | "dev": true
547 | },
548 | "ansi-styles": {
549 | "version": "4.3.0",
550 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
551 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
552 | "dev": true,
553 | "requires": {
554 | "color-convert": "^2.0.1"
555 | }
556 | },
557 | "argparse": {
558 | "version": "2.0.1",
559 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
560 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
561 | "dev": true
562 | },
563 | "aria-query": {
564 | "version": "4.2.2",
565 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz",
566 | "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==",
567 | "dev": true,
568 | "requires": {
569 | "@babel/runtime": "^7.10.2",
570 | "@babel/runtime-corejs3": "^7.10.2"
571 | }
572 | },
573 | "array-find": {
574 | "version": "1.0.0",
575 | "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz",
576 | "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=",
577 | "dev": true
578 | },
579 | "array-includes": {
580 | "version": "3.1.4",
581 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
582 | "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
583 | "dev": true,
584 | "requires": {
585 | "call-bind": "^1.0.2",
586 | "define-properties": "^1.1.3",
587 | "es-abstract": "^1.19.1",
588 | "get-intrinsic": "^1.1.1",
589 | "is-string": "^1.0.7"
590 | }
591 | },
592 | "array.prototype.flat": {
593 | "version": "1.2.5",
594 | "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
595 | "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
596 | "dev": true,
597 | "requires": {
598 | "call-bind": "^1.0.2",
599 | "define-properties": "^1.1.3",
600 | "es-abstract": "^1.19.0"
601 | }
602 | },
603 | "array.prototype.flatmap": {
604 | "version": "1.2.5",
605 | "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
606 | "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
607 | "dev": true,
608 | "requires": {
609 | "call-bind": "^1.0.0",
610 | "define-properties": "^1.1.3",
611 | "es-abstract": "^1.19.0"
612 | }
613 | },
614 | "ast-types-flow": {
615 | "version": "0.0.7",
616 | "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
617 | "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
618 | "dev": true
619 | },
620 | "axe-core": {
621 | "version": "4.4.1",
622 | "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz",
623 | "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==",
624 | "dev": true
625 | },
626 | "axios": {
627 | "version": "0.26.1",
628 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
629 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
630 | "requires": {
631 | "follow-redirects": "^1.14.8"
632 | }
633 | },
634 | "axobject-query": {
635 | "version": "2.2.0",
636 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz",
637 | "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
638 | "dev": true
639 | },
640 | "balanced-match": {
641 | "version": "1.0.2",
642 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
643 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
644 | "dev": true
645 | },
646 | "brace-expansion": {
647 | "version": "1.1.11",
648 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
649 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
650 | "dev": true,
651 | "requires": {
652 | "balanced-match": "^1.0.0",
653 | "concat-map": "0.0.1"
654 | }
655 | },
656 | "browserslist": {
657 | "version": "4.20.2",
658 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
659 | "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
660 | "dev": true,
661 | "requires": {
662 | "caniuse-lite": "^1.0.30001317",
663 | "electron-to-chromium": "^1.4.84",
664 | "escalade": "^3.1.1",
665 | "node-releases": "^2.0.2",
666 | "picocolors": "^1.0.0"
667 | }
668 | },
669 | "call-bind": {
670 | "version": "1.0.2",
671 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
672 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
673 | "dev": true,
674 | "requires": {
675 | "function-bind": "^1.1.1",
676 | "get-intrinsic": "^1.0.2"
677 | }
678 | },
679 | "callsites": {
680 | "version": "3.1.0",
681 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
682 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
683 | "dev": true
684 | },
685 | "caniuse-lite": {
686 | "version": "1.0.30001325",
687 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz",
688 | "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ=="
689 | },
690 | "chalk": {
691 | "version": "4.1.2",
692 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
693 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
694 | "dev": true,
695 | "requires": {
696 | "ansi-styles": "^4.1.0",
697 | "supports-color": "^7.1.0"
698 | }
699 | },
700 | "color-convert": {
701 | "version": "2.0.1",
702 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
703 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
704 | "dev": true,
705 | "requires": {
706 | "color-name": "~1.1.4"
707 | }
708 | },
709 | "color-name": {
710 | "version": "1.1.4",
711 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
712 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
713 | "dev": true
714 | },
715 | "concat-map": {
716 | "version": "0.0.1",
717 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
718 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
719 | "dev": true
720 | },
721 | "confusing-browser-globals": {
722 | "version": "1.0.11",
723 | "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
724 | "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
725 | "dev": true
726 | },
727 | "convert-source-map": {
728 | "version": "1.8.0",
729 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
730 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==",
731 | "dev": true,
732 | "requires": {
733 | "safe-buffer": "~5.1.1"
734 | }
735 | },
736 | "cookie": {
737 | "version": "0.4.2",
738 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
739 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
740 | },
741 | "core-js-pure": {
742 | "version": "3.21.1",
743 | "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz",
744 | "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==",
745 | "dev": true
746 | },
747 | "cross-spawn": {
748 | "version": "7.0.3",
749 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
750 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
751 | "dev": true,
752 | "requires": {
753 | "path-key": "^3.1.0",
754 | "shebang-command": "^2.0.0",
755 | "which": "^2.0.1"
756 | }
757 | },
758 | "csstype": {
759 | "version": "3.0.11",
760 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
761 | "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
762 | },
763 | "damerau-levenshtein": {
764 | "version": "1.0.8",
765 | "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
766 | "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
767 | "dev": true
768 | },
769 | "debug": {
770 | "version": "4.3.4",
771 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
772 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
773 | "dev": true,
774 | "requires": {
775 | "ms": "2.1.2"
776 | }
777 | },
778 | "deep-is": {
779 | "version": "0.1.4",
780 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
781 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
782 | "dev": true
783 | },
784 | "define-properties": {
785 | "version": "1.1.3",
786 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
787 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
788 | "dev": true,
789 | "requires": {
790 | "object-keys": "^1.0.12"
791 | }
792 | },
793 | "doctrine": {
794 | "version": "3.0.0",
795 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
796 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
797 | "dev": true,
798 | "requires": {
799 | "esutils": "^2.0.2"
800 | }
801 | },
802 | "electron-to-chromium": {
803 | "version": "1.4.106",
804 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz",
805 | "integrity": "sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==",
806 | "dev": true
807 | },
808 | "emoji-regex": {
809 | "version": "9.2.2",
810 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
811 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
812 | "dev": true
813 | },
814 | "enhanced-resolve": {
815 | "version": "0.9.1",
816 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
817 | "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
818 | "dev": true,
819 | "requires": {
820 | "graceful-fs": "^4.1.2",
821 | "memory-fs": "^0.2.0",
822 | "tapable": "^0.1.8"
823 | }
824 | },
825 | "es-abstract": {
826 | "version": "1.19.2",
827 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz",
828 | "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==",
829 | "dev": true,
830 | "requires": {
831 | "call-bind": "^1.0.2",
832 | "es-to-primitive": "^1.2.1",
833 | "function-bind": "^1.1.1",
834 | "get-intrinsic": "^1.1.1",
835 | "get-symbol-description": "^1.0.0",
836 | "has": "^1.0.3",
837 | "has-symbols": "^1.0.3",
838 | "internal-slot": "^1.0.3",
839 | "is-callable": "^1.2.4",
840 | "is-negative-zero": "^2.0.2",
841 | "is-regex": "^1.1.4",
842 | "is-shared-array-buffer": "^1.0.1",
843 | "is-string": "^1.0.7",
844 | "is-weakref": "^1.0.2",
845 | "object-inspect": "^1.12.0",
846 | "object-keys": "^1.1.1",
847 | "object.assign": "^4.1.2",
848 | "string.prototype.trimend": "^1.0.4",
849 | "string.prototype.trimstart": "^1.0.4",
850 | "unbox-primitive": "^1.0.1"
851 | }
852 | },
853 | "es-to-primitive": {
854 | "version": "1.2.1",
855 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
856 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
857 | "dev": true,
858 | "requires": {
859 | "is-callable": "^1.1.4",
860 | "is-date-object": "^1.0.1",
861 | "is-symbol": "^1.0.2"
862 | }
863 | },
864 | "escalade": {
865 | "version": "3.1.1",
866 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
867 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
868 | "dev": true
869 | },
870 | "escape-string-regexp": {
871 | "version": "4.0.0",
872 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
873 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
874 | "dev": true
875 | },
876 | "eslint": {
877 | "version": "8.12.0",
878 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.12.0.tgz",
879 | "integrity": "sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q==",
880 | "dev": true,
881 | "requires": {
882 | "@eslint/eslintrc": "^1.2.1",
883 | "@humanwhocodes/config-array": "^0.9.2",
884 | "ajv": "^6.10.0",
885 | "chalk": "^4.0.0",
886 | "cross-spawn": "^7.0.2",
887 | "debug": "^4.3.2",
888 | "doctrine": "^3.0.0",
889 | "escape-string-regexp": "^4.0.0",
890 | "eslint-scope": "^7.1.1",
891 | "eslint-utils": "^3.0.0",
892 | "eslint-visitor-keys": "^3.3.0",
893 | "espree": "^9.3.1",
894 | "esquery": "^1.4.0",
895 | "esutils": "^2.0.2",
896 | "fast-deep-equal": "^3.1.3",
897 | "file-entry-cache": "^6.0.1",
898 | "functional-red-black-tree": "^1.0.1",
899 | "glob-parent": "^6.0.1",
900 | "globals": "^13.6.0",
901 | "ignore": "^5.2.0",
902 | "import-fresh": "^3.0.0",
903 | "imurmurhash": "^0.1.4",
904 | "is-glob": "^4.0.0",
905 | "js-yaml": "^4.1.0",
906 | "json-stable-stringify-without-jsonify": "^1.0.1",
907 | "levn": "^0.4.1",
908 | "lodash.merge": "^4.6.2",
909 | "minimatch": "^3.0.4",
910 | "natural-compare": "^1.4.0",
911 | "optionator": "^0.9.1",
912 | "regexpp": "^3.2.0",
913 | "strip-ansi": "^6.0.1",
914 | "strip-json-comments": "^3.1.0",
915 | "text-table": "^0.2.0",
916 | "v8-compile-cache": "^2.0.3"
917 | },
918 | "dependencies": {
919 | "eslint-scope": {
920 | "version": "7.1.1",
921 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
922 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
923 | "dev": true,
924 | "requires": {
925 | "esrecurse": "^4.3.0",
926 | "estraverse": "^5.2.0"
927 | }
928 | },
929 | "estraverse": {
930 | "version": "5.3.0",
931 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
932 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
933 | "dev": true
934 | }
935 | }
936 | },
937 | "eslint-config-airbnb": {
938 | "version": "19.0.4",
939 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
940 | "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
941 | "dev": true,
942 | "requires": {
943 | "eslint-config-airbnb-base": "^15.0.0",
944 | "object.assign": "^4.1.2",
945 | "object.entries": "^1.1.5"
946 | }
947 | },
948 | "eslint-config-airbnb-base": {
949 | "version": "15.0.0",
950 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
951 | "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
952 | "dev": true,
953 | "requires": {
954 | "confusing-browser-globals": "^1.0.10",
955 | "object.assign": "^4.1.2",
956 | "object.entries": "^1.1.5",
957 | "semver": "^6.3.0"
958 | }
959 | },
960 | "eslint-config-prettier": {
961 | "version": "8.5.0",
962 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
963 | "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
964 | "dev": true
965 | },
966 | "eslint-import-resolver-node": {
967 | "version": "0.3.6",
968 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
969 | "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
970 | "dev": true,
971 | "requires": {
972 | "debug": "^3.2.7",
973 | "resolve": "^1.20.0"
974 | },
975 | "dependencies": {
976 | "debug": {
977 | "version": "3.2.7",
978 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
979 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
980 | "dev": true,
981 | "requires": {
982 | "ms": "^2.1.1"
983 | }
984 | }
985 | }
986 | },
987 | "eslint-import-resolver-webpack": {
988 | "version": "0.13.2",
989 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.2.tgz",
990 | "integrity": "sha512-XodIPyg1OgE2h5BDErz3WJoK7lawxKTJNhgPNafRST6csC/MZC+L5P6kKqsZGRInpbgc02s/WZMrb4uGJzcuRg==",
991 | "dev": true,
992 | "requires": {
993 | "array-find": "^1.0.0",
994 | "debug": "^3.2.7",
995 | "enhanced-resolve": "^0.9.1",
996 | "find-root": "^1.1.0",
997 | "has": "^1.0.3",
998 | "interpret": "^1.4.0",
999 | "is-core-module": "^2.7.0",
1000 | "is-regex": "^1.1.4",
1001 | "lodash": "^4.17.21",
1002 | "resolve": "^1.20.0",
1003 | "semver": "^5.7.1"
1004 | },
1005 | "dependencies": {
1006 | "debug": {
1007 | "version": "3.2.7",
1008 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1009 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1010 | "dev": true,
1011 | "requires": {
1012 | "ms": "^2.1.1"
1013 | }
1014 | },
1015 | "semver": {
1016 | "version": "5.7.1",
1017 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1018 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1019 | "dev": true
1020 | }
1021 | }
1022 | },
1023 | "eslint-module-utils": {
1024 | "version": "2.7.3",
1025 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz",
1026 | "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==",
1027 | "dev": true,
1028 | "requires": {
1029 | "debug": "^3.2.7",
1030 | "find-up": "^2.1.0"
1031 | },
1032 | "dependencies": {
1033 | "debug": {
1034 | "version": "3.2.7",
1035 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1036 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1037 | "dev": true,
1038 | "requires": {
1039 | "ms": "^2.1.1"
1040 | }
1041 | }
1042 | }
1043 | },
1044 | "eslint-plugin-import": {
1045 | "version": "2.26.0",
1046 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
1047 | "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
1048 | "dev": true,
1049 | "requires": {
1050 | "array-includes": "^3.1.4",
1051 | "array.prototype.flat": "^1.2.5",
1052 | "debug": "^2.6.9",
1053 | "doctrine": "^2.1.0",
1054 | "eslint-import-resolver-node": "^0.3.6",
1055 | "eslint-module-utils": "^2.7.3",
1056 | "has": "^1.0.3",
1057 | "is-core-module": "^2.8.1",
1058 | "is-glob": "^4.0.3",
1059 | "minimatch": "^3.1.2",
1060 | "object.values": "^1.1.5",
1061 | "resolve": "^1.22.0",
1062 | "tsconfig-paths": "^3.14.1"
1063 | },
1064 | "dependencies": {
1065 | "debug": {
1066 | "version": "2.6.9",
1067 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1068 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1069 | "dev": true,
1070 | "requires": {
1071 | "ms": "2.0.0"
1072 | }
1073 | },
1074 | "doctrine": {
1075 | "version": "2.1.0",
1076 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
1077 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
1078 | "dev": true,
1079 | "requires": {
1080 | "esutils": "^2.0.2"
1081 | }
1082 | },
1083 | "ms": {
1084 | "version": "2.0.0",
1085 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1086 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1087 | "dev": true
1088 | }
1089 | }
1090 | },
1091 | "eslint-plugin-jsx-a11y": {
1092 | "version": "6.5.1",
1093 | "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz",
1094 | "integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==",
1095 | "dev": true,
1096 | "requires": {
1097 | "@babel/runtime": "^7.16.3",
1098 | "aria-query": "^4.2.2",
1099 | "array-includes": "^3.1.4",
1100 | "ast-types-flow": "^0.0.7",
1101 | "axe-core": "^4.3.5",
1102 | "axobject-query": "^2.2.0",
1103 | "damerau-levenshtein": "^1.0.7",
1104 | "emoji-regex": "^9.2.2",
1105 | "has": "^1.0.3",
1106 | "jsx-ast-utils": "^3.2.1",
1107 | "language-tags": "^1.0.5",
1108 | "minimatch": "^3.0.4"
1109 | }
1110 | },
1111 | "eslint-plugin-prettier": {
1112 | "version": "4.0.0",
1113 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
1114 | "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
1115 | "dev": true,
1116 | "requires": {
1117 | "prettier-linter-helpers": "^1.0.0"
1118 | }
1119 | },
1120 | "eslint-plugin-react": {
1121 | "version": "7.29.4",
1122 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
1123 | "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==",
1124 | "dev": true,
1125 | "requires": {
1126 | "array-includes": "^3.1.4",
1127 | "array.prototype.flatmap": "^1.2.5",
1128 | "doctrine": "^2.1.0",
1129 | "estraverse": "^5.3.0",
1130 | "jsx-ast-utils": "^2.4.1 || ^3.0.0",
1131 | "minimatch": "^3.1.2",
1132 | "object.entries": "^1.1.5",
1133 | "object.fromentries": "^2.0.5",
1134 | "object.hasown": "^1.1.0",
1135 | "object.values": "^1.1.5",
1136 | "prop-types": "^15.8.1",
1137 | "resolve": "^2.0.0-next.3",
1138 | "semver": "^6.3.0",
1139 | "string.prototype.matchall": "^4.0.6"
1140 | },
1141 | "dependencies": {
1142 | "doctrine": {
1143 | "version": "2.1.0",
1144 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
1145 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
1146 | "dev": true,
1147 | "requires": {
1148 | "esutils": "^2.0.2"
1149 | }
1150 | },
1151 | "estraverse": {
1152 | "version": "5.3.0",
1153 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1154 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1155 | "dev": true
1156 | },
1157 | "resolve": {
1158 | "version": "2.0.0-next.3",
1159 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
1160 | "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==",
1161 | "dev": true,
1162 | "requires": {
1163 | "is-core-module": "^2.2.0",
1164 | "path-parse": "^1.0.6"
1165 | }
1166 | }
1167 | }
1168 | },
1169 | "eslint-plugin-react-hooks": {
1170 | "version": "4.4.0",
1171 | "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz",
1172 | "integrity": "sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ==",
1173 | "dev": true
1174 | },
1175 | "eslint-scope": {
1176 | "version": "5.1.1",
1177 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
1178 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
1179 | "dev": true,
1180 | "requires": {
1181 | "esrecurse": "^4.3.0",
1182 | "estraverse": "^4.1.1"
1183 | },
1184 | "dependencies": {
1185 | "esrecurse": {
1186 | "version": "4.3.0",
1187 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1188 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1189 | "dev": true,
1190 | "requires": {
1191 | "estraverse": "^5.2.0"
1192 | },
1193 | "dependencies": {
1194 | "estraverse": {
1195 | "version": "5.3.0",
1196 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1197 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1198 | "dev": true
1199 | }
1200 | }
1201 | }
1202 | }
1203 | },
1204 | "eslint-utils": {
1205 | "version": "3.0.0",
1206 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
1207 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
1208 | "dev": true,
1209 | "requires": {
1210 | "eslint-visitor-keys": "^2.0.0"
1211 | },
1212 | "dependencies": {
1213 | "eslint-visitor-keys": {
1214 | "version": "2.1.0",
1215 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
1216 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
1217 | "dev": true
1218 | }
1219 | }
1220 | },
1221 | "eslint-visitor-keys": {
1222 | "version": "3.3.0",
1223 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
1224 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
1225 | "dev": true
1226 | },
1227 | "espree": {
1228 | "version": "9.3.1",
1229 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
1230 | "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
1231 | "dev": true,
1232 | "requires": {
1233 | "acorn": "^8.7.0",
1234 | "acorn-jsx": "^5.3.1",
1235 | "eslint-visitor-keys": "^3.3.0"
1236 | }
1237 | },
1238 | "esquery": {
1239 | "version": "1.4.0",
1240 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
1241 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
1242 | "dev": true,
1243 | "requires": {
1244 | "estraverse": "^5.1.0"
1245 | },
1246 | "dependencies": {
1247 | "estraverse": {
1248 | "version": "5.3.0",
1249 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1250 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1251 | "dev": true
1252 | }
1253 | }
1254 | },
1255 | "esrecurse": {
1256 | "version": "4.3.0",
1257 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1258 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1259 | "dev": true,
1260 | "requires": {
1261 | "estraverse": "^5.2.0"
1262 | },
1263 | "dependencies": {
1264 | "estraverse": {
1265 | "version": "5.3.0",
1266 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1267 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1268 | "dev": true
1269 | }
1270 | }
1271 | },
1272 | "estraverse": {
1273 | "version": "4.3.0",
1274 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1275 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
1276 | "dev": true
1277 | },
1278 | "esutils": {
1279 | "version": "2.0.3",
1280 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1281 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1282 | "dev": true
1283 | },
1284 | "fast-deep-equal": {
1285 | "version": "3.1.3",
1286 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1287 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1288 | "dev": true
1289 | },
1290 | "fast-diff": {
1291 | "version": "1.2.0",
1292 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
1293 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
1294 | "dev": true
1295 | },
1296 | "fast-json-stable-stringify": {
1297 | "version": "2.1.0",
1298 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1299 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1300 | "dev": true
1301 | },
1302 | "fast-levenshtein": {
1303 | "version": "2.0.6",
1304 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1305 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1306 | "dev": true
1307 | },
1308 | "file-entry-cache": {
1309 | "version": "6.0.1",
1310 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
1311 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
1312 | "dev": true,
1313 | "requires": {
1314 | "flat-cache": "^3.0.4"
1315 | }
1316 | },
1317 | "find-root": {
1318 | "version": "1.1.0",
1319 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
1320 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
1321 | "dev": true
1322 | },
1323 | "find-up": {
1324 | "version": "2.1.0",
1325 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
1326 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
1327 | "dev": true,
1328 | "requires": {
1329 | "locate-path": "^2.0.0"
1330 | }
1331 | },
1332 | "flat-cache": {
1333 | "version": "3.0.4",
1334 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
1335 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
1336 | "dev": true,
1337 | "requires": {
1338 | "flatted": "^3.1.0",
1339 | "rimraf": "^3.0.2"
1340 | }
1341 | },
1342 | "flatted": {
1343 | "version": "3.2.5",
1344 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
1345 | "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
1346 | "dev": true
1347 | },
1348 | "follow-redirects": {
1349 | "version": "1.14.9",
1350 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
1351 | "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
1352 | },
1353 | "fs.realpath": {
1354 | "version": "1.0.0",
1355 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1356 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1357 | "dev": true
1358 | },
1359 | "function-bind": {
1360 | "version": "1.1.1",
1361 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1362 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1363 | "dev": true
1364 | },
1365 | "functional-red-black-tree": {
1366 | "version": "1.0.1",
1367 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1368 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1369 | "dev": true
1370 | },
1371 | "gensync": {
1372 | "version": "1.0.0-beta.2",
1373 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1374 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1375 | "dev": true
1376 | },
1377 | "get-intrinsic": {
1378 | "version": "1.1.1",
1379 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
1380 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
1381 | "dev": true,
1382 | "requires": {
1383 | "function-bind": "^1.1.1",
1384 | "has": "^1.0.3",
1385 | "has-symbols": "^1.0.1"
1386 | }
1387 | },
1388 | "get-symbol-description": {
1389 | "version": "1.0.0",
1390 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
1391 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
1392 | "dev": true,
1393 | "requires": {
1394 | "call-bind": "^1.0.2",
1395 | "get-intrinsic": "^1.1.1"
1396 | }
1397 | },
1398 | "glob": {
1399 | "version": "7.2.0",
1400 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
1401 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
1402 | "dev": true,
1403 | "requires": {
1404 | "fs.realpath": "^1.0.0",
1405 | "inflight": "^1.0.4",
1406 | "inherits": "2",
1407 | "minimatch": "^3.0.4",
1408 | "once": "^1.3.0",
1409 | "path-is-absolute": "^1.0.0"
1410 | }
1411 | },
1412 | "glob-parent": {
1413 | "version": "6.0.2",
1414 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1415 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1416 | "dev": true,
1417 | "requires": {
1418 | "is-glob": "^4.0.3"
1419 | }
1420 | },
1421 | "globals": {
1422 | "version": "13.13.0",
1423 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
1424 | "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
1425 | "dev": true,
1426 | "requires": {
1427 | "type-fest": "^0.20.2"
1428 | }
1429 | },
1430 | "graceful-fs": {
1431 | "version": "4.2.10",
1432 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
1433 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
1434 | "dev": true
1435 | },
1436 | "has": {
1437 | "version": "1.0.3",
1438 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1439 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1440 | "dev": true,
1441 | "requires": {
1442 | "function-bind": "^1.1.1"
1443 | }
1444 | },
1445 | "has-bigints": {
1446 | "version": "1.0.1",
1447 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
1448 | "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
1449 | "dev": true
1450 | },
1451 | "has-flag": {
1452 | "version": "4.0.0",
1453 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1454 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1455 | "dev": true
1456 | },
1457 | "has-symbols": {
1458 | "version": "1.0.3",
1459 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1460 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
1461 | "dev": true
1462 | },
1463 | "has-tostringtag": {
1464 | "version": "1.0.0",
1465 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
1466 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
1467 | "dev": true,
1468 | "requires": {
1469 | "has-symbols": "^1.0.2"
1470 | }
1471 | },
1472 | "hoist-non-react-statics": {
1473 | "version": "3.3.2",
1474 | "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
1475 | "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
1476 | "requires": {
1477 | "react-is": "^16.7.0"
1478 | }
1479 | },
1480 | "ignore": {
1481 | "version": "5.2.0",
1482 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
1483 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
1484 | "dev": true
1485 | },
1486 | "import-fresh": {
1487 | "version": "3.3.0",
1488 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1489 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1490 | "dev": true,
1491 | "requires": {
1492 | "parent-module": "^1.0.0",
1493 | "resolve-from": "^4.0.0"
1494 | }
1495 | },
1496 | "imurmurhash": {
1497 | "version": "0.1.4",
1498 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1499 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1500 | "dev": true
1501 | },
1502 | "inflight": {
1503 | "version": "1.0.6",
1504 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1505 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1506 | "dev": true,
1507 | "requires": {
1508 | "once": "^1.3.0",
1509 | "wrappy": "1"
1510 | }
1511 | },
1512 | "inherits": {
1513 | "version": "2.0.4",
1514 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1515 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1516 | "dev": true
1517 | },
1518 | "internal-slot": {
1519 | "version": "1.0.3",
1520 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
1521 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
1522 | "dev": true,
1523 | "requires": {
1524 | "get-intrinsic": "^1.1.0",
1525 | "has": "^1.0.3",
1526 | "side-channel": "^1.0.4"
1527 | }
1528 | },
1529 | "interpret": {
1530 | "version": "1.4.0",
1531 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
1532 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
1533 | "dev": true
1534 | },
1535 | "is-bigint": {
1536 | "version": "1.0.4",
1537 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
1538 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
1539 | "dev": true,
1540 | "requires": {
1541 | "has-bigints": "^1.0.1"
1542 | }
1543 | },
1544 | "is-boolean-object": {
1545 | "version": "1.1.2",
1546 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
1547 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
1548 | "dev": true,
1549 | "requires": {
1550 | "call-bind": "^1.0.2",
1551 | "has-tostringtag": "^1.0.0"
1552 | }
1553 | },
1554 | "is-callable": {
1555 | "version": "1.2.4",
1556 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
1557 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
1558 | "dev": true
1559 | },
1560 | "is-core-module": {
1561 | "version": "2.8.1",
1562 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
1563 | "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
1564 | "dev": true,
1565 | "requires": {
1566 | "has": "^1.0.3"
1567 | }
1568 | },
1569 | "is-date-object": {
1570 | "version": "1.0.5",
1571 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
1572 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
1573 | "dev": true,
1574 | "requires": {
1575 | "has-tostringtag": "^1.0.0"
1576 | }
1577 | },
1578 | "is-extglob": {
1579 | "version": "2.1.1",
1580 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1581 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1582 | "dev": true
1583 | },
1584 | "is-glob": {
1585 | "version": "4.0.3",
1586 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1587 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1588 | "dev": true,
1589 | "requires": {
1590 | "is-extglob": "^2.1.1"
1591 | }
1592 | },
1593 | "is-negative-zero": {
1594 | "version": "2.0.2",
1595 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
1596 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
1597 | "dev": true
1598 | },
1599 | "is-number-object": {
1600 | "version": "1.0.7",
1601 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
1602 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
1603 | "dev": true,
1604 | "requires": {
1605 | "has-tostringtag": "^1.0.0"
1606 | }
1607 | },
1608 | "is-regex": {
1609 | "version": "1.1.4",
1610 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
1611 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
1612 | "dev": true,
1613 | "requires": {
1614 | "call-bind": "^1.0.2",
1615 | "has-tostringtag": "^1.0.0"
1616 | }
1617 | },
1618 | "is-shared-array-buffer": {
1619 | "version": "1.0.2",
1620 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
1621 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
1622 | "dev": true,
1623 | "requires": {
1624 | "call-bind": "^1.0.2"
1625 | }
1626 | },
1627 | "is-string": {
1628 | "version": "1.0.7",
1629 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
1630 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
1631 | "dev": true,
1632 | "requires": {
1633 | "has-tostringtag": "^1.0.0"
1634 | }
1635 | },
1636 | "is-symbol": {
1637 | "version": "1.0.4",
1638 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
1639 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
1640 | "dev": true,
1641 | "requires": {
1642 | "has-symbols": "^1.0.2"
1643 | }
1644 | },
1645 | "is-weakref": {
1646 | "version": "1.0.2",
1647 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
1648 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
1649 | "dev": true,
1650 | "requires": {
1651 | "call-bind": "^1.0.2"
1652 | }
1653 | },
1654 | "isexe": {
1655 | "version": "2.0.0",
1656 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1657 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1658 | "dev": true
1659 | },
1660 | "js-tokens": {
1661 | "version": "4.0.0",
1662 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1663 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
1664 | },
1665 | "js-yaml": {
1666 | "version": "4.1.0",
1667 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1668 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1669 | "dev": true,
1670 | "requires": {
1671 | "argparse": "^2.0.1"
1672 | }
1673 | },
1674 | "jsesc": {
1675 | "version": "2.5.2",
1676 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
1677 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
1678 | "dev": true
1679 | },
1680 | "json-schema-traverse": {
1681 | "version": "0.4.1",
1682 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1683 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1684 | "dev": true
1685 | },
1686 | "json-stable-stringify-without-jsonify": {
1687 | "version": "1.0.1",
1688 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1689 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1690 | "dev": true
1691 | },
1692 | "json5": {
1693 | "version": "1.0.1",
1694 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
1695 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
1696 | "dev": true,
1697 | "requires": {
1698 | "minimist": "^1.2.0"
1699 | }
1700 | },
1701 | "jsx-ast-utils": {
1702 | "version": "3.2.2",
1703 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.2.tgz",
1704 | "integrity": "sha512-HDAyJ4MNQBboGpUnHAVUNJs6X0lh058s6FuixsFGP7MgJYpD6Vasd6nzSG5iIfXu1zAYlHJ/zsOKNlrenTUBnw==",
1705 | "dev": true,
1706 | "requires": {
1707 | "array-includes": "^3.1.4",
1708 | "object.assign": "^4.1.2"
1709 | }
1710 | },
1711 | "language-subtag-registry": {
1712 | "version": "0.3.21",
1713 | "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz",
1714 | "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==",
1715 | "dev": true
1716 | },
1717 | "language-tags": {
1718 | "version": "1.0.5",
1719 | "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
1720 | "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
1721 | "dev": true,
1722 | "requires": {
1723 | "language-subtag-registry": "~0.3.2"
1724 | }
1725 | },
1726 | "levn": {
1727 | "version": "0.4.1",
1728 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1729 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1730 | "dev": true,
1731 | "requires": {
1732 | "prelude-ls": "^1.2.1",
1733 | "type-check": "~0.4.0"
1734 | }
1735 | },
1736 | "locate-path": {
1737 | "version": "2.0.0",
1738 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
1739 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
1740 | "dev": true,
1741 | "requires": {
1742 | "p-locate": "^2.0.0",
1743 | "path-exists": "^3.0.0"
1744 | }
1745 | },
1746 | "lodash": {
1747 | "version": "4.17.21",
1748 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1749 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
1750 | "dev": true
1751 | },
1752 | "lodash.merge": {
1753 | "version": "4.6.2",
1754 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
1755 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
1756 | "dev": true
1757 | },
1758 | "loose-envify": {
1759 | "version": "1.4.0",
1760 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1761 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1762 | "requires": {
1763 | "js-tokens": "^3.0.0 || ^4.0.0"
1764 | }
1765 | },
1766 | "memory-fs": {
1767 | "version": "0.2.0",
1768 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
1769 | "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=",
1770 | "dev": true
1771 | },
1772 | "minimatch": {
1773 | "version": "3.1.2",
1774 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1775 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1776 | "dev": true,
1777 | "requires": {
1778 | "brace-expansion": "^1.1.7"
1779 | }
1780 | },
1781 | "minimist": {
1782 | "version": "1.2.6",
1783 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
1784 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
1785 | "dev": true
1786 | },
1787 | "ms": {
1788 | "version": "2.1.2",
1789 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1790 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1791 | "dev": true
1792 | },
1793 | "nanoid": {
1794 | "version": "3.3.2",
1795 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
1796 | "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA=="
1797 | },
1798 | "natural-compare": {
1799 | "version": "1.4.0",
1800 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1801 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1802 | "dev": true
1803 | },
1804 | "next": {
1805 | "version": "12.1.4",
1806 | "resolved": "https://registry.npmjs.org/next/-/next-12.1.4.tgz",
1807 | "integrity": "sha512-DA4g97BM4Z0nKtDvCTm58RxdvoQyYzeg0AeVbh0N4Y/D8ELrNu47lQeEgRGF8hV4eQ+Sal90zxrJQQG/mPQ8CQ==",
1808 | "requires": {
1809 | "@next/env": "12.1.4",
1810 | "@next/swc-android-arm-eabi": "12.1.4",
1811 | "@next/swc-android-arm64": "12.1.4",
1812 | "@next/swc-darwin-arm64": "12.1.4",
1813 | "@next/swc-darwin-x64": "12.1.4",
1814 | "@next/swc-linux-arm-gnueabihf": "12.1.4",
1815 | "@next/swc-linux-arm64-gnu": "12.1.4",
1816 | "@next/swc-linux-arm64-musl": "12.1.4",
1817 | "@next/swc-linux-x64-gnu": "12.1.4",
1818 | "@next/swc-linux-x64-musl": "12.1.4",
1819 | "@next/swc-win32-arm64-msvc": "12.1.4",
1820 | "@next/swc-win32-ia32-msvc": "12.1.4",
1821 | "@next/swc-win32-x64-msvc": "12.1.4",
1822 | "caniuse-lite": "^1.0.30001283",
1823 | "postcss": "8.4.5",
1824 | "styled-jsx": "5.0.1"
1825 | }
1826 | },
1827 | "next-cookies": {
1828 | "version": "2.0.3",
1829 | "resolved": "https://registry.npmjs.org/next-cookies/-/next-cookies-2.0.3.tgz",
1830 | "integrity": "sha512-YVCQzwZx+sz+KqLO4y9niHH9jjz6jajlEQbAKfsYVT6DOfngb/0k5l6vFK4rmpExVug96pGag8OBsdSRL9FZhQ==",
1831 | "requires": {
1832 | "universal-cookie": "^4.0.2"
1833 | }
1834 | },
1835 | "node-releases": {
1836 | "version": "2.0.2",
1837 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
1838 | "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
1839 | "dev": true
1840 | },
1841 | "object-assign": {
1842 | "version": "4.1.1",
1843 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1844 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1845 | "dev": true
1846 | },
1847 | "object-inspect": {
1848 | "version": "1.12.0",
1849 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
1850 | "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
1851 | "dev": true
1852 | },
1853 | "object-keys": {
1854 | "version": "1.1.1",
1855 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1856 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1857 | "dev": true
1858 | },
1859 | "object.assign": {
1860 | "version": "4.1.2",
1861 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
1862 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
1863 | "dev": true,
1864 | "requires": {
1865 | "call-bind": "^1.0.0",
1866 | "define-properties": "^1.1.3",
1867 | "has-symbols": "^1.0.1",
1868 | "object-keys": "^1.1.1"
1869 | }
1870 | },
1871 | "object.entries": {
1872 | "version": "1.1.5",
1873 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
1874 | "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
1875 | "dev": true,
1876 | "requires": {
1877 | "call-bind": "^1.0.2",
1878 | "define-properties": "^1.1.3",
1879 | "es-abstract": "^1.19.1"
1880 | }
1881 | },
1882 | "object.fromentries": {
1883 | "version": "2.0.5",
1884 | "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
1885 | "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
1886 | "dev": true,
1887 | "requires": {
1888 | "call-bind": "^1.0.2",
1889 | "define-properties": "^1.1.3",
1890 | "es-abstract": "^1.19.1"
1891 | }
1892 | },
1893 | "object.hasown": {
1894 | "version": "1.1.0",
1895 | "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
1896 | "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
1897 | "dev": true,
1898 | "requires": {
1899 | "define-properties": "^1.1.3",
1900 | "es-abstract": "^1.19.1"
1901 | }
1902 | },
1903 | "object.values": {
1904 | "version": "1.1.5",
1905 | "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
1906 | "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
1907 | "dev": true,
1908 | "requires": {
1909 | "call-bind": "^1.0.2",
1910 | "define-properties": "^1.1.3",
1911 | "es-abstract": "^1.19.1"
1912 | }
1913 | },
1914 | "once": {
1915 | "version": "1.4.0",
1916 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1917 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1918 | "dev": true,
1919 | "requires": {
1920 | "wrappy": "1"
1921 | }
1922 | },
1923 | "optionator": {
1924 | "version": "0.9.1",
1925 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
1926 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
1927 | "dev": true,
1928 | "requires": {
1929 | "deep-is": "^0.1.3",
1930 | "fast-levenshtein": "^2.0.6",
1931 | "levn": "^0.4.1",
1932 | "prelude-ls": "^1.2.1",
1933 | "type-check": "^0.4.0",
1934 | "word-wrap": "^1.2.3"
1935 | }
1936 | },
1937 | "p-limit": {
1938 | "version": "1.3.0",
1939 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
1940 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
1941 | "dev": true,
1942 | "requires": {
1943 | "p-try": "^1.0.0"
1944 | }
1945 | },
1946 | "p-locate": {
1947 | "version": "2.0.0",
1948 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
1949 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
1950 | "dev": true,
1951 | "requires": {
1952 | "p-limit": "^1.1.0"
1953 | }
1954 | },
1955 | "p-try": {
1956 | "version": "1.0.0",
1957 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
1958 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
1959 | "dev": true
1960 | },
1961 | "parent-module": {
1962 | "version": "1.0.1",
1963 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1964 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1965 | "dev": true,
1966 | "requires": {
1967 | "callsites": "^3.0.0"
1968 | }
1969 | },
1970 | "path-exists": {
1971 | "version": "3.0.0",
1972 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1973 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1974 | "dev": true
1975 | },
1976 | "path-is-absolute": {
1977 | "version": "1.0.1",
1978 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1979 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1980 | "dev": true
1981 | },
1982 | "path-key": {
1983 | "version": "3.1.1",
1984 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1985 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1986 | "dev": true
1987 | },
1988 | "path-parse": {
1989 | "version": "1.0.7",
1990 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1991 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1992 | "dev": true
1993 | },
1994 | "picocolors": {
1995 | "version": "1.0.0",
1996 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1997 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
1998 | },
1999 | "postcss": {
2000 | "version": "8.4.5",
2001 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
2002 | "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
2003 | "requires": {
2004 | "nanoid": "^3.1.30",
2005 | "picocolors": "^1.0.0",
2006 | "source-map-js": "^1.0.1"
2007 | }
2008 | },
2009 | "prelude-ls": {
2010 | "version": "1.2.1",
2011 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2012 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2013 | "dev": true
2014 | },
2015 | "prettier": {
2016 | "version": "2.6.2",
2017 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
2018 | "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
2019 | "dev": true
2020 | },
2021 | "prettier-linter-helpers": {
2022 | "version": "1.0.0",
2023 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
2024 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
2025 | "dev": true,
2026 | "requires": {
2027 | "fast-diff": "^1.1.2"
2028 | }
2029 | },
2030 | "prop-types": {
2031 | "version": "15.8.1",
2032 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
2033 | "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
2034 | "dev": true,
2035 | "requires": {
2036 | "loose-envify": "^1.4.0",
2037 | "object-assign": "^4.1.1",
2038 | "react-is": "^16.13.1"
2039 | }
2040 | },
2041 | "punycode": {
2042 | "version": "2.1.1",
2043 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2044 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2045 | "dev": true
2046 | },
2047 | "react": {
2048 | "version": "18.0.0",
2049 | "resolved": "https://registry.npmjs.org/react/-/react-18.0.0.tgz",
2050 | "integrity": "sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==",
2051 | "requires": {
2052 | "loose-envify": "^1.1.0"
2053 | }
2054 | },
2055 | "react-cookie": {
2056 | "version": "4.1.1",
2057 | "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.1.1.tgz",
2058 | "integrity": "sha512-ffn7Y7G4bXiFbnE+dKhHhbP+b8I34mH9jqnm8Llhj89zF4nPxPutxHT1suUqMeCEhLDBI7InYwf1tpaSoK5w8A==",
2059 | "requires": {
2060 | "@types/hoist-non-react-statics": "^3.0.1",
2061 | "hoist-non-react-statics": "^3.0.0",
2062 | "universal-cookie": "^4.0.0"
2063 | }
2064 | },
2065 | "react-dom": {
2066 | "version": "18.0.0",
2067 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.0.0.tgz",
2068 | "integrity": "sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw==",
2069 | "requires": {
2070 | "loose-envify": "^1.1.0",
2071 | "scheduler": "^0.21.0"
2072 | }
2073 | },
2074 | "react-is": {
2075 | "version": "16.13.1",
2076 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
2077 | "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
2078 | },
2079 | "regenerator-runtime": {
2080 | "version": "0.13.9",
2081 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
2082 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
2083 | "dev": true
2084 | },
2085 | "regexp.prototype.flags": {
2086 | "version": "1.4.1",
2087 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
2088 | "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
2089 | "dev": true,
2090 | "requires": {
2091 | "call-bind": "^1.0.2",
2092 | "define-properties": "^1.1.3"
2093 | }
2094 | },
2095 | "regexpp": {
2096 | "version": "3.2.0",
2097 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
2098 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
2099 | "dev": true
2100 | },
2101 | "resolve": {
2102 | "version": "1.22.0",
2103 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
2104 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
2105 | "dev": true,
2106 | "requires": {
2107 | "is-core-module": "^2.8.1",
2108 | "path-parse": "^1.0.7",
2109 | "supports-preserve-symlinks-flag": "^1.0.0"
2110 | }
2111 | },
2112 | "resolve-from": {
2113 | "version": "4.0.0",
2114 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2115 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2116 | "dev": true
2117 | },
2118 | "rimraf": {
2119 | "version": "3.0.2",
2120 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
2121 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
2122 | "dev": true,
2123 | "requires": {
2124 | "glob": "^7.1.3"
2125 | }
2126 | },
2127 | "safe-buffer": {
2128 | "version": "5.1.2",
2129 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2130 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2131 | "dev": true
2132 | },
2133 | "scheduler": {
2134 | "version": "0.21.0",
2135 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz",
2136 | "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==",
2137 | "requires": {
2138 | "loose-envify": "^1.1.0"
2139 | }
2140 | },
2141 | "semver": {
2142 | "version": "6.3.0",
2143 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
2144 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
2145 | "dev": true
2146 | },
2147 | "shebang-command": {
2148 | "version": "2.0.0",
2149 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2150 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2151 | "dev": true,
2152 | "requires": {
2153 | "shebang-regex": "^3.0.0"
2154 | }
2155 | },
2156 | "shebang-regex": {
2157 | "version": "3.0.0",
2158 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2159 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2160 | "dev": true
2161 | },
2162 | "side-channel": {
2163 | "version": "1.0.4",
2164 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
2165 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
2166 | "dev": true,
2167 | "requires": {
2168 | "call-bind": "^1.0.0",
2169 | "get-intrinsic": "^1.0.2",
2170 | "object-inspect": "^1.9.0"
2171 | }
2172 | },
2173 | "source-map": {
2174 | "version": "0.5.7",
2175 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2176 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2177 | "dev": true
2178 | },
2179 | "source-map-js": {
2180 | "version": "1.0.2",
2181 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
2182 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
2183 | },
2184 | "string.prototype.matchall": {
2185 | "version": "4.0.7",
2186 | "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz",
2187 | "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==",
2188 | "dev": true,
2189 | "requires": {
2190 | "call-bind": "^1.0.2",
2191 | "define-properties": "^1.1.3",
2192 | "es-abstract": "^1.19.1",
2193 | "get-intrinsic": "^1.1.1",
2194 | "has-symbols": "^1.0.3",
2195 | "internal-slot": "^1.0.3",
2196 | "regexp.prototype.flags": "^1.4.1",
2197 | "side-channel": "^1.0.4"
2198 | }
2199 | },
2200 | "string.prototype.trimend": {
2201 | "version": "1.0.4",
2202 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
2203 | "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
2204 | "dev": true,
2205 | "requires": {
2206 | "call-bind": "^1.0.2",
2207 | "define-properties": "^1.1.3"
2208 | }
2209 | },
2210 | "string.prototype.trimstart": {
2211 | "version": "1.0.4",
2212 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
2213 | "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
2214 | "dev": true,
2215 | "requires": {
2216 | "call-bind": "^1.0.2",
2217 | "define-properties": "^1.1.3"
2218 | }
2219 | },
2220 | "strip-ansi": {
2221 | "version": "6.0.1",
2222 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2223 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2224 | "dev": true,
2225 | "requires": {
2226 | "ansi-regex": "^5.0.1"
2227 | }
2228 | },
2229 | "strip-bom": {
2230 | "version": "3.0.0",
2231 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
2232 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
2233 | "dev": true
2234 | },
2235 | "strip-json-comments": {
2236 | "version": "3.1.1",
2237 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2238 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2239 | "dev": true
2240 | },
2241 | "styled-jsx": {
2242 | "version": "5.0.1",
2243 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.0.1.tgz",
2244 | "integrity": "sha512-+PIZ/6Uk40mphiQJJI1202b+/dYeTVd9ZnMPR80pgiWbjIwvN2zIp4r9et0BgqBuShh48I0gttPlAXA7WVvBxw=="
2245 | },
2246 | "supports-color": {
2247 | "version": "7.2.0",
2248 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2249 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2250 | "dev": true,
2251 | "requires": {
2252 | "has-flag": "^4.0.0"
2253 | }
2254 | },
2255 | "supports-preserve-symlinks-flag": {
2256 | "version": "1.0.0",
2257 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2258 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2259 | "dev": true
2260 | },
2261 | "tapable": {
2262 | "version": "0.1.10",
2263 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz",
2264 | "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=",
2265 | "dev": true
2266 | },
2267 | "text-table": {
2268 | "version": "0.2.0",
2269 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2270 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2271 | "dev": true
2272 | },
2273 | "to-fast-properties": {
2274 | "version": "2.0.0",
2275 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
2276 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
2277 | "dev": true
2278 | },
2279 | "tsconfig-paths": {
2280 | "version": "3.14.1",
2281 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
2282 | "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
2283 | "dev": true,
2284 | "requires": {
2285 | "@types/json5": "^0.0.29",
2286 | "json5": "^1.0.1",
2287 | "minimist": "^1.2.6",
2288 | "strip-bom": "^3.0.0"
2289 | }
2290 | },
2291 | "type-check": {
2292 | "version": "0.4.0",
2293 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2294 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2295 | "dev": true,
2296 | "requires": {
2297 | "prelude-ls": "^1.2.1"
2298 | }
2299 | },
2300 | "type-fest": {
2301 | "version": "0.20.2",
2302 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
2303 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
2304 | "dev": true
2305 | },
2306 | "unbox-primitive": {
2307 | "version": "1.0.1",
2308 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
2309 | "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
2310 | "dev": true,
2311 | "requires": {
2312 | "function-bind": "^1.1.1",
2313 | "has-bigints": "^1.0.1",
2314 | "has-symbols": "^1.0.2",
2315 | "which-boxed-primitive": "^1.0.2"
2316 | }
2317 | },
2318 | "universal-cookie": {
2319 | "version": "4.0.4",
2320 | "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz",
2321 | "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==",
2322 | "requires": {
2323 | "@types/cookie": "^0.3.3",
2324 | "cookie": "^0.4.0"
2325 | }
2326 | },
2327 | "uri-js": {
2328 | "version": "4.4.1",
2329 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2330 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2331 | "dev": true,
2332 | "requires": {
2333 | "punycode": "^2.1.0"
2334 | }
2335 | },
2336 | "v8-compile-cache": {
2337 | "version": "2.3.0",
2338 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
2339 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
2340 | "dev": true
2341 | },
2342 | "which": {
2343 | "version": "2.0.2",
2344 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2345 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2346 | "dev": true,
2347 | "requires": {
2348 | "isexe": "^2.0.0"
2349 | }
2350 | },
2351 | "which-boxed-primitive": {
2352 | "version": "1.0.2",
2353 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
2354 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
2355 | "dev": true,
2356 | "requires": {
2357 | "is-bigint": "^1.0.1",
2358 | "is-boolean-object": "^1.1.0",
2359 | "is-number-object": "^1.0.4",
2360 | "is-string": "^1.0.5",
2361 | "is-symbol": "^1.0.3"
2362 | }
2363 | },
2364 | "word-wrap": {
2365 | "version": "1.2.3",
2366 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
2367 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
2368 | "dev": true
2369 | },
2370 | "wrappy": {
2371 | "version": "1.0.2",
2372 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2373 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2374 | "dev": true
2375 | }
2376 | }
2377 | }
2378 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-js-jwt",
3 | "version": "1.0.2",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "dev": "next",
8 | "build": "next build",
9 | "start": "next start",
10 | "test": "echo \"Error: no test specified\" && exit 1",
11 | "lint": "./node_modules/.bin/eslint ./"
12 | },
13 | "repository": {
14 | "type": "git",
15 | "url": "git+https://github.com/lauriskuznecovs/next-js-jwt.git"
16 | },
17 | "keywords": [],
18 | "author": "",
19 | "license": "ISC",
20 | "bugs": {
21 | "url": "https://github.com/lauriskuznecovs/next-js-jwt/issues"
22 | },
23 | "homepage": "https://github.com/lauriskuznecovs/next-js-jwt#readme",
24 | "dependencies": {
25 | "axios": "^0.26.1",
26 | "next": "^12.1.4",
27 | "next-cookies": "^2.0.3",
28 | "react": "^18.0.0",
29 | "react-cookie": "^4.1.1",
30 | "react-dom": "^18.0.0"
31 | },
32 | "devDependencies": {
33 | "@babel/core": "^7.17.9",
34 | "@babel/eslint-parser": "^7.17.0",
35 | "eslint": "^8.12.0",
36 | "eslint-config-airbnb": "^19.0.4",
37 | "eslint-config-airbnb-base": "^15.0.0",
38 | "eslint-config-prettier": "^8.5.0",
39 | "eslint-import-resolver-webpack": "^0.13.2",
40 | "eslint-plugin-import": "^2.26.0",
41 | "eslint-plugin-jsx-a11y": "^6.5.1",
42 | "eslint-plugin-prettier": "^4.0.0",
43 | "eslint-plugin-react": "^7.29.4",
44 | "eslint-plugin-react-hooks": "^4.4.0",
45 | "prettier": "^2.6.2"
46 | },
47 | "standard": {
48 | "parser": "@babel/eslint-parser"
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/frontend/pages/index.js:
--------------------------------------------------------------------------------
1 | import { Component } from 'react'
2 | import { Cookies } from 'react-cookie'
3 | import axios from 'axios'
4 |
5 | import Navigation from '../components/Navigation'
6 | import { login } from '../utils/auth'
7 |
8 | // set up cookies
9 | const cookies = new Cookies()
10 |
11 | export default class Index extends Component {
12 | constructor(props) {
13 | super(props)
14 | this.state = {
15 | token: cookies.get('token') || null,
16 | error: '',
17 | email: null,
18 | password: null,
19 | }
20 | }
21 |
22 | onInputChange = (e) => {
23 | this.setState({ [e.target.name]: e.target.value })
24 | }
25 |
26 | onLoginClick = async (e) => {
27 | /* eslint-disable no-console */
28 | e.preventDefault()
29 | try {
30 | const { email, password } = this.state
31 | const url = `${process.env.API_URL}/api/login`
32 | const response = await axios.post(url, {
33 | email,
34 | password,
35 | })
36 | const { token } = response.data
37 | await login({ token })
38 | this.setState({
39 | token,
40 | error: null,
41 | })
42 | } catch (error) {
43 | console.error(
44 | 'You have an error in your code or there are Network issues.',
45 | error,
46 | )
47 | this.setState({ error: error.message })
48 | }
49 | }
50 |
51 | render() {
52 | return (
53 |
54 |
Main page
55 | {!this.state.token && (
56 |
76 | )}
77 | {this.state.token &&
Token: {this.state.token}
}
78 |
79 |
80 | )
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/frontend/pages/logout.js:
--------------------------------------------------------------------------------
1 | import { Component } from 'react'
2 |
3 | import Navigation from '../components/Navigation'
4 | import { logout } from '../utils/auth'
5 |
6 | export default class Logout extends Component {
7 | static async getInitialProps() {
8 | await logout()
9 | return {}
10 | }
11 |
12 | render() {
13 | return (
14 |
15 |
You are logged out
16 |
Go to main page to log in again or try secured page
17 |
18 |
19 | )
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/frontend/pages/secured.js:
--------------------------------------------------------------------------------
1 | import { Component } from 'react'
2 |
3 | import Navigation from '../components/Navigation'
4 | import { handleAuthSSR } from '../utils/auth'
5 |
6 | export default class Secured extends Component {
7 | static async getInitialProps(ctx) {
8 | // Must validate JWT
9 | // If the JWT is invalid it must redirect back to the main page.
10 | // You can do that with Router from 'next/router
11 | await handleAuthSSR(ctx)
12 | return {}
13 | }
14 |
15 | render() {
16 | return (
17 |
18 |
Secret page
19 |
Only accessible via a valid JWT
20 |
21 |
22 | )
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/frontend/utils/auth.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios'
2 | import Router from 'next/router'
3 | import { Cookies } from 'react-cookie'
4 | import nextCookie from 'next-cookies'
5 |
6 | // set up cookies
7 | const cookies = new Cookies()
8 |
9 | export const handleAuthSSR = async (ctx) => {
10 | const { token } = nextCookie(ctx)
11 | const url = `${process.env.API_URL}/api/validate`
12 |
13 | const redirectOnError = () => {
14 | /* eslint-disable no-console */
15 | console.log('Redirecting back to main page')
16 | if (typeof window !== 'undefined') {
17 | Router.push('/')
18 | } else {
19 | ctx.res.writeHead(302, { Location: '/' })
20 | ctx.res.end()
21 | }
22 | }
23 |
24 | try {
25 | if (!token) {
26 | return redirectOnError()
27 | }
28 | const response = await axios.get(url, {
29 | headers: { Authorization: token },
30 | })
31 |
32 | if (!response.data.user) {
33 | return redirectOnError()
34 | }
35 | } catch (error) {
36 | /* eslint-disable no-console */
37 | console.log('Error: ', error)
38 | // Implementation or Network error
39 | return redirectOnError()
40 | }
41 | return {}
42 | }
43 |
44 | export const login = async ({ token }) => {
45 | // Cookie will expire after 24h
46 | cookies.set('token', token, { maxAge: 60 * 60 * 24 })
47 | }
48 |
49 | export const logout = () => {
50 | cookies.remove('token')
51 | }
52 |
--------------------------------------------------------------------------------