├── .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 |
this.onLoginClick(e)}> 57 | 58 | this.onInputChange(e)} 64 | /> 65 | 66 | this.onInputChange(e)} 72 | /> 73 | 74 |

{this.state.error && `Error: ${this.state.error}`}

75 |
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 | --------------------------------------------------------------------------------