From 851ca40d36e2dec2f352ff1e532da86cfffbb86a Mon Sep 17 00:00:00 2001 From: Diego Oliveira Date: Sat, 18 Dec 2021 19:39:27 -0300 Subject: [PATCH 1/6] . --- .env.example | 7 + README.md | 413 +--------- app.js | 17 + controllers/SummonerCtrl.js | 168 ++++ controllers/UserCtrl.js | 52 ++ database/connection.js | 14 + middleware/auth.js | 37 + models/Summoner.js | 45 ++ models/User.js | 27 + package.json | 26 + routers/SummonerRouter.js | 21 + routers/UserRouter.js | 8 + services/export.js | 25 + yarn.lock | 1525 +++++++++++++++++++++++++++++++++++ 14 files changed, 1985 insertions(+), 400 deletions(-) create mode 100644 .env.example create mode 100644 app.js create mode 100644 controllers/SummonerCtrl.js create mode 100644 controllers/UserCtrl.js create mode 100644 database/connection.js create mode 100644 middleware/auth.js create mode 100644 models/Summoner.js create mode 100644 models/User.js create mode 100644 package.json create mode 100644 routers/SummonerRouter.js create mode 100644 routers/UserRouter.js create mode 100644 services/export.js create mode 100644 yarn.lock diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..432692a --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +RIOT_URL=https://br1.api.riotgames.com + +PORT= + +JWT_SECRET=yourjwtsecret + +API_KEY= diff --git a/README.md b/README.md index ed13f28..4a2dfa4 100644 --- a/README.md +++ b/README.md @@ -2,416 +2,29 @@ # Challenge - Developer Backend -O desafio é construir uma API Rest que seja capaz de cadastrar, buscar, atualizar e apagar os jogadores. Ela deverá ser capaz de consultar a Api da Riot Games para trazer os dados dos jogadores que serão cadastrados em uma base de dados. +## Nome: Diego Oliveira -Lista dos jogadores a serem cadastrados: +### Desafio realizado utilizando MySQL e ORM sequelize -- OldWolfKing -- Praymer -- ThrekSor -- AndrewDiass -- BiliBoss -- DartSecond -- Devils Advocate -- Gabrvxo -- theKovac -- zRabelo +### - Coloque sua API_KEY da Riot no seu arquivo .env -
+### - Crie um database e em seguida passe os valores de acesso no arquivo connection.js dentro da pasta database -## API League of Legends +### - Para executar o projeto, dê um yarn ou npm install na linha de comando -
+### - Em seguida execute "yarn start" (caso o nodemon não funcione, instale-o da seguinte maneira: yarn add nodemon --save -D ) -Para consumir a API é necessário criar uma conta na plataforma e ler a documentação. Os endpoints que serão usados nesse projeto requerem autenticação e é possivel gerar um token com tempo de expiração para poder estar consumindo esse serviço. +### - Dentro da pasta models, no arquivo "User.js" descomente a linha "User.sync({force:true})" para criar a tabela de usuários -## Challenge Accepted +### - Caso o passo acima não funcione, pare a aplicação e através da linha de comando navegue até o arquivo User.js e execute: node User.js -Deve ser construido a tabela Summoner no banco de dados com essas colunas +## - Pronto, agora a tabela de usuários foi criada. Por favor, após a criação da tabela comente novamente ou remova a linha "User.sync({force:true"}) para que o nodemon não volte a tentar criar a tabela. -| Id | Nickname | AccountId | SummonerLevel | ProfileIconId | SummonerId | userId | -| --- | ------------- | --------------- | ------------- | ------------- | ------------------ | ------------------ | -| 1 | Old Wolf King | V94KgBnbbsaR4I4 | 100 | 4864 | OtaV_QBRbtzt7DtpZn | 1 | -| 2 | Wolf Old King | bsaR4I4V94KgBnb | 150 | 4684 | FtaZ_QBRbtzt7DtpZn | 2 | -| 3 | King Old Wolf | 4I4V94KgbsaRBnb | 500 | 4648 | GtaT_QBRbtzt7DtpZn | 3 | +### - Repita os passos acima para a tabela de Summoners -
+### - Por fim crie um usuário, faça login e use o token gerado para usar livremente as rotas de summoners(Leia as instruções dentro do arquivo SummonerCtrl.js para criar todos os summoners) -_O ID do pode ser tanto UUID ou numérico incremental_ -* userId => chave estrangeira com o "id" da tabela User -* accountId => unique -* summonerId => unique -* nickname => obrigatorio preencher +### - Optei por não usar migrations para não dificultar a execução do projeto, já que é somente um desafio. -
- -Deve ser construido a tabela User no banco de dados com essas colunas - -| Id | Name | Email | Password | -| --- | ------------- | ---------------------------- | -------------------------------------------- | -| 1 | Gabriel | laurencioX.arkauss@gmail.com | 6RdShg1qV2ZAp9LJJKeIcCDhatpEXiBdKCnK41AX7ws= | - -
- -_O ID do pode ser tanto UUID ou numérico incremental_ -* id => chave estrangeira com o "userId" da tabela Summoner -* email => unique -* name => obrigatorio preencher -* password => obrigatorio preencher - -
- -### **CRIAR USUÁRIO** - -
- -Deve possuir uma rota **POST** para cadastrar um USUÁRIO, deverá receber os seguintes dados no corpo da requisição: - -_Body_ - -```javascript -{ - "name": "gabriel", - "email": "gabriel@gabriel.com", - "password": "1213141516", -} -``` - -
- -### **Response** - -
- -> Status Code 201 - -```javascript -{ - "id": "OtaV_QBRbtzt7DtXXXlXbvRjuDmDRZJ38wjbEQOqXbM", - "name":"gabriel", - "email":"gabriel@gabriel.com", - "password":"6RdShg1qV2ZAp9LJJKeIcCDhatpEXiBdKCnK41AX7ws=", -} -``` - -### **LOGIN** - -
- -Deve possuir uma rota **POST** para retorna um token de acesso que expira em 24h, com esse token deve ser possivel acessar os endpoints a seguir: - -_Body_ - -```javascript -{ - "name": "gabriel", - "email": "gabriel@gabriel.com", - "password": "1213141516", -} -``` - -
- -### **Response** - -
- -> Status Code 200 - -```javascript -{ - "token":"6RdShg1qV2ZApeIcCDhatpEXiBdKCnK41AX79LJJKeIcCDhatpEXiBdKCnK41AX7ws=" -} -``` - -### **CRIAR SUMMONER** - -
- -*Para consumir essa rota é necessario enviar um bearer token valido, e o userId vai ser consumido do token.* - -Deve possuir uma rota **POST** para cadastrar um SUMMONER, deverá receber os seguintes dados no corpo da requisição: - -_Body_ - -```javascript -{ - "summonerName":"OldWolfKing" -} -``` - -A rota deve consumir o **SummonerName** do corpo e usar para consultar no end point abaixo da API riotgames as informações _AccountId_, _SummonerLevel_, _ProfileIconId_ e _Id_. - -
- -```javascript -/lol/summoner/v4/summoners/by-name/{summonerName}?api_key={token} -``` - -### **Response da API da RIOT** - - -```javascript -{ - "id": "OtaV_QBRbtzt7DtXXXlXbvRjuDmDRZJ38wjbEQOqXbM", - "accountId": "V94KgBnbbsaR4I4MXXX4trfyvUay95h_13PCsTz6jo4ByBw", - "puuid": "5LwdLcx1qM2_E-1NNFTBRDgTK6oqvc3XXXmbC4gqNauImdGCIm3WM2RZLBNcIyui-sXc2Q", - "name": "Old Wolf King", - "profileIconId": 4864, - "revisionDate": 1613316510000, - "summonerLevel": 225 -} -``` - -E com esses dados fazer o cadastro do jogador no banco de dados. - -
- -### **LISTAR JOGADORES** - -*Para consumir essa rota é necessario enviar um bearer token valido.* - -
- -Deve possuir uma rota **GET** para listar as informações da tabela **Summoner**, modelo esperado do retorno abaixo: - -### **Response** - -
- -> Status Code 200 - -```javascript -[ - { - id: "1", - nickname: "Old Wolf King", - accountId: "V94KgBnbbsaR4I4", - summonerLevel: "100", - profileIconId: "4864", - summonerId: "V94KgBnbbsaR4I4", - }, - { - id: "2", - nickname: "Old Wolf King", - accountId: "bsaR4I4V94KgBnb", - summonerLevel: "150", - profileIconId: "4684", - summonerId: "V94KgBnbbsaR4I4", - }, - { - id: "3", - nickname: "Old Wolf King", - accountId: "4I4V94KgbsaRBnb", - summonerLevel: "500", - profileIconId: "4648", - summonerId: "V94KgBnbbsaR4I4", - }, -]; -``` - -### **LISTAR INFORMAÇÕES DETALHADAS DOS JOGADORES** - -*Para consumir essa rota é necessario enviar um bearer token valido.* - -
- -Deve possuir uma rota **GET** que ira além de trazer as informações da tabela ira trazer as quantidades de vitorias e derrotas de cada jogador, e deve ser possivel passar alguns campos para filtrar o resultado retornado: - -### **Query** -
-* Nickname -* SummonerLevel -* Vitorias -* Derrotas - -### **Response** - -
- -> Status Code 200 - -```javascript -[ - { - id: "1", - nickname: "Old Wolf King", - accountId: "V94KgBnbbsaR4I4", - summonerLevel: "100", - profileIconId: "4864", - summonerId: "V94KgBnbbsaR4I4", - wins: 2, - losses: 100, - }, - { - id: "2", - nickname: "Old Wolf King", - accountId: "bsaR4I4V94KgBnb", - summonerLevel: "150", - profileIconId: "4684", - summonerId: "V94KgBnbbsaR4I4", - wins: 12, - losses: 3, - }, - { - id: "3", - nickname: "Old Wolf King", - accountId: "4I4V94KgbsaRBnb", - summonerLevel: "500", - profileIconId: "4648", - summonerId: "V94KgBnbbsaR4I4", - wins: 7, - losses: 7, - }, -]; -``` - -Para trazer essas informações, consuma o endpoint da riotgames abaixo, ele retorna um array de objetos com os dados de um jogador com base no **encryptedSummonerId** enviado e cada objeto possui as propriedades _wins_ e _losses_: - -```javascript -/lol/league/v4/entries/by-summoner/{encryptedSummonerId}?api_key={token} -``` - -_response_ - -```javascript -[ - { - leagueId: "469c392c-063c-XXbca8-6c4c7c4d21d4", - queueType: "RANKED_SOLO_5x5", - tier: "SILVER", - rank: "I", - summonerId: "OtaV_QBRbtzt7DtpZnLXXXbvRjuDmDRZJ38wjbEQOqXbM", - summonerName: "Old Wolf King", - leaguePoints: 39, - wins: 12, - losses: 3, - veteran: false, - inactive: false, - freshBlood: false, - hotStreak: false, - }, - { - leagueId: "0f276adb-9984-XXfdc-7d5fc5fc35d5", - queueType: "RANKED_FLEX_SR", - tier: "SILVER", - rank: "I", - summonerId: "OtaV_QBRbtzt7DtpZXXbvRjuDmDRZJ38wjbEQOqXbM", - summonerName: "Old Wolf King", - leaguePoints: 8, - wins: 7, - losses: 6, - veteran: false, - inactive: false, - freshBlood: false, - hotStreak: false, - }, -]; -``` - -Deve ser feito a somatória das vitórias e derrotas de cada objeto do array, lembrando que deve ser executado para cada jogador da tabela. - -### **ATUALIZAR JOGADOR** - -*Para consumir essa rota é necessario enviar um bearer token valido.* - -
- -Deve possuir uma rota *PUT* para atualizar somente o **summonerName** e **summonerLevel** do jogador através do ID: - -_Body_ - -```javascript -{ - "summonerName":"OldWolfKingMaster", - "summonerLevel": 550 -} -``` - -### **Response** - -
- -> Status Code 200 - -```javascript -{ - "id": "OtaV_QBRbtzt7DtXXXlXbvRjuDmDRZJ38wjbEQOqXbM", - "accountId": "V94KgBnbbsaR4I4MXXX4trfyvUay95h_13PCsTz6jo4ByBw", - "puuid": "5LwdLcx1qM2_E-1NNFTBRDgTK6oqvc3XXXmbC4gqNauImdGCIm3WM2RZLBNcIyui-sXc2Q", - "name": "OldWolfKingMaster", - "profileIconId": 4864, - "revisionDate": 1613316510000, - "summonerLevel": 550 -} -``` - -### **APAGAR JOGADOR** - -*Para consumir essa rota é necessario enviar um bearer token valido.* - -
- -Deve possuir uma rota *DELETE* para apagar o jogador através do ID: - -### **Response** - -
- -> Status Code 200 - -```javascript -{ - "message": "successfully deleted" -} -``` - -### **EXPORTAR JOGADORES** - -*Para consumir essa rota é necessario enviar um bearer token valido.* - -
- -Deve possuir uma rota _POST_ que gera uma XLSX com todos os summoners cadastrados no banco de dados, com as quantidades de vitorias e derrotas. - - -## Requisitos - -* API deve ser desenvolvida em NodeJs; -* Deve ser implementado testes que garantam que todas as rotas da API estejam funcionando -* As rotas que manipulam a tabela Summoner deve ser necessario passar um token de autenticação - - -## Avaliação - -Você será avaliado pela usabilidade, por respeitar o design e pela arquitetura da API. - -* Uso do Git -* Arquitetura da API -* Diferencial: NestJS ou Postgres -* A qualidade do código -* As decisões que você fez para resolver o desafio -* Tratamento de erros - -## *Como participar?* - -- Farça um fork deste repositório; -- Clone seu fork na sua máquina; -- Crie um novo branch com o seguinte padrão "challenge/seu-nome"; -- Resolva o desafio; -- Faça uma PR para este repositório com instruções claras de como executar seu código. - -Sua PR será avaliada e lhe daremos um feedback o mais rápido possível. - - -## FAQ - -> ### Posso utilizar frameworks/bibliotecas? -> *Resposta:* Não só pode como será um diferencial - -> ### Quanto tempo tenho ? -> *Resposta:* Esperamos sua resposta em até 7 dias - -> ### Qual banco de dados ? -> *Resposta:* Qualquer um, sendo o Postgres ou Mongodb um diferencial +### - PS: O código está comentado. diff --git a/app.js b/app.js new file mode 100644 index 0000000..2065335 --- /dev/null +++ b/app.js @@ -0,0 +1,17 @@ +const express = require('express'); +const cors = require('cors'); +require('dotenv').config(); + +const app = express(); + +const port = process.env.PORT || 3333 + +app.use(express.json()); +app.use(cors()); + +app.use('/users', require('./routers/UserRouter')); +app.use('/summoners', require('./routers/SummonerRouter')); + +app.listen(port, () => { + console.log(`Server is running on port ${port}`) +}); \ No newline at end of file diff --git a/controllers/SummonerCtrl.js b/controllers/SummonerCtrl.js new file mode 100644 index 0000000..52c0c35 --- /dev/null +++ b/controllers/SummonerCtrl.js @@ -0,0 +1,168 @@ +const Summoner = require('../models/Summoner'); +const fs = require("fs"); +const exportSummonersToExcel = require('../services/export'); +const axios = require('axios'); + +const { API_KEY, RIOT_URL } = process.env; + +// Criando todos summoners requisitados no desafio.. +// Fiz um loop for para criar todos de uma vez +// Quando fizer a requisição, use um espaço para separar os nicks e o loop funcionará, +// por se tratar de vários items e a cada item uma busca na API da RIOT, o retorno da +// mensagem exibindo os items cadastrados demorará cerca de 10 segundos, +// aguarde até que ela apareça e após isso cheque a tabela summoners no DB +exports.createSummoner = async (req, res) => { + try { + // Pegando o ID do usuário logado que está criando o summoner + const userId = req.user.id; + + const { summonerName } = req.body; + + let summonersArray = summonerName; + + // Transformando os nicks digitados em um array de nicks + summonersArray = summonersArray.split(" "); + + // Para cada nick do array, um summoner será criado, caso + // algum summoner colocado no body não exista, o script parará e não criará + // os summoners seguintes + for (let summoner of summonersArray) { + const summonerIdResponse = await axios + .get( + `${RIOT_URL}/lol/summoner/v4/summoners/by-name/${summoner}?api_key=${API_KEY}`) + .catch((err) => { + return res.status(err.response.status).json(err.response.data); + }); + + const { + id, accountId, + name, profileIconId, summonerLevel, + } = summonerIdResponse.data; + + await Summoner.create({ + Nickname: name, + AccountId: accountId, + SummonerLevel: summonerLevel, + ProfileIconId: profileIconId, + SummonerId: id, + userId + }) + } + + const allSummoners = await Summoner.findAll({ + "attributes": ["id", "Nickname", "AccountId", + "SummonerLevel", "ProfileIconId", "SummonerId"] + }); + return res.status(200).json(allSummoners); + + } catch (err) { + return res.status(400).json(err); + } +}; + +// Listando todos os summoners cadastrados na tabela +exports.getSummoners = async (req, res) => { + try { + const summoners = await Summoner.findAll({ + "attributes": ["id", "Nickname", "AccountId", + "SummonerLevel", "ProfileIconId", "SummonerId"] + }); + return res.status(200).json(summoners); + } catch (err) { + return res.status(400).json(err); + } +}; + +// Listando um summoner específico de acordo com o ID +exports.getSummonersDetails = async (req, res) => { + const idSum = req.params.id; + + const encryptedSummonerId = await Summoner.findByPk(idSum); + + if (encryptedSummonerId === null) { + return res.status(400).json({ error: 'Nenhum summoner encontrado.' }) + } + + const { SummonerId } = encryptedSummonerId; + + const riotResponse = await axios + .get(`${RIOT_URL}/lol/league/v4/entries/by-summoner/${SummonerId}?api_key=${API_KEY}`) + .catch((err) => { + return res.status(err.response.status).json(err.response.data); + }); + + const { data } = riotResponse; + + // Somatório das vitórias + const totalWins = riotResponse.data[0].wins + riotResponse.data[1].wins; + + // Somatório das derrotas + const totalLoses = riotResponse.data[0].losses + riotResponse.data[1].losses + + // Bônus: taxa de vitória + const winrate = ((totalWins / (totalWins + totalLoses)) * 100).toFixed(1); + + return res.status(200).json({ data, totalWins, totalLoses, winrate }); +}; + +// Atualizando summoner +exports.updateSummoner = async (req, res) => { + const { Summonername, Summonerlevel } = req.body; + + const summoner = await Summoner.findOne({ + where: { id: req.params.id } + }) + + const updatedSummoner = await summoner.update( + { Nickname: Summonername, SummonerLevel: Summonerlevel }, + ) + return res.status(200).json(updatedSummoner); +}; + +// Deletando summoner +exports.deleteSummoner = async (req, res) => { + await Summoner.destroy({ where: { id: req.params.id } }) + + return res.status(200).json({ message: "Summoner deletado com sucesso!" }) +}; + +// Exportando a tabela de Summoners para um arquivo XLSX +exports.exportSum = async (req, res) => { + try { + const summoners = await Summoner.findAll(); + + const workSheetColumnName = [ + "id", + "Nickname", + "AccountId", + "SummonerLevel", + "ProfileIconId", + "SummonerId", + "userId" + ] + + const workSheetName = 'Summoners'; + + let filePath = `./excelTable/summoners.xlsx`; + // script para não repetir o nome do arquivo + let newName = 0; + + if (fs.existsSync(filePath)) { + newName = Math.round(Math.random() * 550 / 5) * 5 + 5; + filePath = `./excelTable/summoners${newName}.xlsx` + } + + exportSummonersToExcel(summoners, workSheetColumnName, workSheetName, filePath); + + return res.status(200).json({ + message: + `Tabela exportada com sucesso, procure dentro da pasta excelTable!` + }) + } catch (err) { + return res.status(400).json(err); + } +}; + + + + diff --git a/controllers/UserCtrl.js b/controllers/UserCtrl.js new file mode 100644 index 0000000..0a3ff9e --- /dev/null +++ b/controllers/UserCtrl.js @@ -0,0 +1,52 @@ +const User = require('../models/User'); +const bcrypt = require('bcryptjs'); +const { newToken } = require('../middleware/auth'); + +// Criando um novo usuário +exports.createUser = async (req, res) => { + try { + const { name, email, password } = req.body; + + const userExists = await User.findOne({ where: { email } }) + + if (userExists) { + return res.status(400).json({ error: 'Este e-mail já está em uso.' }); + } + + const newUser = await User.create({ + name, email, password: await bcrypt.hash(password, 10) + }); + + const { id } = newUser; + + return res.status(201).json({ id, name, email }); + + } catch (err) { + return res.status(400).json({ error: err }); + } +}; + +// Login de usuário +exports.userLogin = async (req, res) => { + try { + const { email, name, password } = req.body; + + const user = await User.findOne({ where: { email, name } }); + + if (!user) { + return res.status(400).json({ error: 'Dados inválidos.' }); + } + const comparePassw = await bcrypt.compare(password, user.password); + + if (!comparePassw) { + return res.status(400).json({ error: 'Dados inválidos.' }); + } + + return res.json({ + token: newToken(user) + }); + + } catch (err) { + return res.status(400).json({ error: err }) + } +}; \ No newline at end of file diff --git a/database/connection.js b/database/connection.js new file mode 100644 index 0000000..fe12b81 --- /dev/null +++ b/database/connection.js @@ -0,0 +1,14 @@ +const Sequelize = require('sequelize'); + +// Gostaria de ter deixado os valores abaixo a critério do arquivo .env para ficar mais realista, +// mas em algumas ocasiões a conexão falhou e optei por colocar manualmente.. +// apenas troque os valores abaixo para os valores do seu banco MySQL + + const sequelize = new Sequelize("devmagic", "root", "admin", + { + dialect: "mysql", + host: "localhost", + port: 3306 + }); + +module.exports = sequelize; diff --git a/middleware/auth.js b/middleware/auth.js new file mode 100644 index 0000000..986a6c7 --- /dev/null +++ b/middleware/auth.js @@ -0,0 +1,37 @@ +const jwt = require('jsonwebtoken'); + +exports.newToken = (user) => { + return jwt.sign( + { + id: user.id, + name: user.name, + email: user.email, + }, + process.env.JWT_SECRET || 'usd89f6ysd88fsd6f87s', + { + expiresIn: '24h', + } + ); +}; + +exports.isAuth = (req, res, next) => { + const auth = req.headers.authorization; + if (auth) { + const token = auth.slice(7, auth.length); + jwt.verify( + token, + process.env.JWT_SECRET || 'usd89f6ysd88fsd6f87s', + (err, decoded) => { + if (err) { + res.status(401).send({ message: 'Token inválido' }); + } else { + req.user = decoded; + console.log(req.user); + next(); + } + } + ); + } else { + res.status(401).send({ message: 'Token não fornecido' }); + } +}; \ No newline at end of file diff --git a/models/Summoner.js b/models/Summoner.js new file mode 100644 index 0000000..0811389 --- /dev/null +++ b/models/Summoner.js @@ -0,0 +1,45 @@ +const Sequelize = require('sequelize'); +const database = require('../database/connection'); +const User = require('./User'); + +const Summoner = database.define('summoner', { + id: { + type: Sequelize.INTEGER, + autoIncrement: true, + allowNull: false, + primaryKey: true + }, + Nickname: { + type: Sequelize.STRING, + allowNull: false, + }, + AccountId: { + type: Sequelize.STRING, + allowNull: false, + }, + SummonerLevel: { + type: Sequelize.INTEGER, + allowNull: false + }, + ProfileIconId: { + type: Sequelize.INTEGER, + allowNull: false + }, + SummonerId: { + type: Sequelize.STRING, + allowNull: false + }, +}); + +Summoner.belongsTo(User, { + constraint: true, + foreignKey: 'userId' +}) + +User.hasMany(Summoner, { + foreignKey: 'userId' +}) + +// Summoner.sync({ force: true }); + +module.exports = Summoner; \ No newline at end of file diff --git a/models/User.js b/models/User.js new file mode 100644 index 0000000..39cebc6 --- /dev/null +++ b/models/User.js @@ -0,0 +1,27 @@ +const Sequelize = require('sequelize'); +const database = require('../database/connection'); + +const User = database.define('user', { + id: { + type: Sequelize.INTEGER, + autoIncrement: true, + allowNull: false, + primaryKey: true + }, + name: { + type: Sequelize.STRING, + allowNull: false + }, + email: { + type: Sequelize.STRING, + allowNull: false + }, + password: { + type: Sequelize.STRING, + allowNull: false, + }, +}); + +// User.sync({ force: true }); + +module.exports = User; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..fcbd4f6 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "backend-challenge", + "version": "1.0.0", + "main": "index.js", + "repository": "git@github.com:Diego-Linux/backend-challenge.git", + "author": "Diego Oliveira ", + "license": "MIT", + "scripts":{ + "start":"nodemon app.js" + }, + "dependencies": { + "axios": "^0.24.0", + "bcryptjs": "^2.4.3", + "cors": "^2.8.5", + "dotenv": "^10.0.0", + "express": "^4.17.2", + "fs": "^0.0.1-security", + "jsonwebtoken": "^8.5.1", + "mysql2": "^2.3.3", + "sequelize": "^6.12.0-beta.3", + "xlsx": "^0.17.4" + }, + "devDependencies": { + "nodemon": "^2.0.15" + } +} diff --git a/routers/SummonerRouter.js b/routers/SummonerRouter.js new file mode 100644 index 0000000..c51d933 --- /dev/null +++ b/routers/SummonerRouter.js @@ -0,0 +1,21 @@ +const router = require('express').Router(); +const SummonerCtrl = require('../controllers/SummonerCtrl'); + +const { isAuth } = require('../middleware/auth'); + +// Todas as rotas abaixo precisam receber o bearer token + +router.post('/create', isAuth, SummonerCtrl.createSummoner); + +router.get('/', isAuth, SummonerCtrl.getSummoners); + +router.get('/:id', isAuth, SummonerCtrl.getSummonersDetails); + +router.put('/:id', isAuth, SummonerCtrl.updateSummoner); + +router.delete('/:id', isAuth, SummonerCtrl.deleteSummoner); + +router.post('/export', isAuth, SummonerCtrl.exportSum); + + +module.exports = router; \ No newline at end of file diff --git a/routers/UserRouter.js b/routers/UserRouter.js new file mode 100644 index 0000000..feeb648 --- /dev/null +++ b/routers/UserRouter.js @@ -0,0 +1,8 @@ +const router = require('express').Router(); +const UserCtrl = require('../controllers/UserCtrl'); + +router.post('/create', UserCtrl.createUser); + +router.post('/login', UserCtrl.userLogin); + +module.exports = router; \ No newline at end of file diff --git a/services/export.js b/services/export.js new file mode 100644 index 0000000..b8e3a47 --- /dev/null +++ b/services/export.js @@ -0,0 +1,25 @@ +const path = require('path'); +const xlsx = require('xlsx'); + +const exportExcel = (data, workSheetColumnNames, workSheetName, filePath) => { + const workBook = xlsx.utils.book_new(); + const workSheetData = [ + workSheetColumnNames, + ...data + ]; + const workSheet = xlsx.utils.aoa_to_sheet(workSheetData); + xlsx.utils.book_append_sheet(workBook, workSheet, workSheetName); + xlsx.writeFile(workBook, path.resolve(filePath)); +} + +const exportSummonersToExcel = (summoners, workSheetColumnNames, workSheetName, filePath) => { + const data = summoners.map(sum => { + return [ + sum.id, sum.Nickname,sum.AccountId, sum.SummonerLevel + , sum.ProfileIconId, sum.SummonerId, sum.userId + ]; + }); + exportExcel(data, workSheetColumnNames, workSheetName, filePath); +} + +module.exports = exportSummonersToExcel; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..32e331e --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1525 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@types/debug@^4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.0.tgz#62797cee3b8b497f6547503b2312254d4fe3c2bb" + integrity sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +adler-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25" + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +adler-32@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.0.tgz#3cad1b71cdfa69f6c8a91f3e3615d31a4fdedc72" + integrity sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g== + dependencies: + printj "~1.2.2" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +any-promise@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bcryptjs@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" + integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== + dependencies: + bytes "3.1.1" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.8.1" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.9.6" + raw-body "2.4.2" + type-is "~1.6.18" + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +camelcase@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== + +cfb@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.1.tgz#209429e4c68efd30641f6fc74b2d6028bd202402" + integrity sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + printj "~1.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +codepage@~1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab" + integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +crc-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +denque@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a" + integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +dottie@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154" + integrity sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + +express@^4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.4.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.9.6" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.17.2" + serve-static "1.14.2" + setprototypeof "1.2.0" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +follow-redirects@^1.14.4: + version "1.14.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd" + integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs@^0.0.1-security: + version "0.0.1-security" + resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" + integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +generate-function@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== + dependencies: + is-property "^1.0.2" + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflection@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" + integrity sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-property@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^4.1.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +moment-timezone@^0.5.34: + version "0.5.34" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" + integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0", moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mysql2@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0" + integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA== + dependencies: + denque "^2.0.1" + generate-function "^2.3.1" + iconv-lite "^0.6.3" + long "^4.0.0" + lru-cache "^6.0.0" + named-placeholders "^1.1.2" + seq-queue "^0.0.5" + sqlstring "^2.3.2" + +named-placeholders@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8" + integrity sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA== + dependencies: + lru-cache "^4.1.3" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +nodemon@^2.0.15: + version "2.0.15" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" + integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.8" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + update-notifier "^5.1.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +pg-connection-string@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" + integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + +printj@~1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.2.3.tgz#2cfb2b192a1e5385dbbe5b46658ac34aa828508a" + integrity sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA== + +printj@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.0.tgz#9018a918a790e43707f10625d6e10187a367cff6" + integrity sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +qs@6.9.6: + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== + dependencies: + bytes "3.1.1" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +retry-as-promised@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-4.0.0.tgz#e19dc63474860f751e371ccccbfa16f6c1efeaa0" + integrity sha512-zuqltYoBckZPoqLjC0eyvGpmM/psgpcreq0PLYVzBSb0Xq382XJrKNgu+fgHDy9U3R66adgFe5Viyx3D+gRvXA== + dependencies: + any-promise "^1.3.0" + +safe-buffer@5.2.1, safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.2: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +seq-queue@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" + integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4= + +sequelize-pool@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz#210b391af4002762f823188fd6ecfc7413020768" + integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg== + +sequelize@^6.12.0-beta.3: + version "6.12.0" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.12.0.tgz#065993b35370dab443086b2e98e684d690c7a7f4" + integrity sha512-vn1Mq98EnwXM/xtohBcF9dQsIbgeTm7u8elwD40wu4bgnXOGTjKCVqGTekySMjnnihM06rIbDbpcLA4uwNTyCw== + dependencies: + "@types/debug" "^4.1.7" + debug "^4.3.3" + dottie "^2.0.2" + inflection "^1.13.1" + lodash "^4.17.21" + moment "^2.29.1" + moment-timezone "^0.5.34" + pg-connection-string "^2.5.0" + retry-as-promised "^4.0.0" + semver "^7.3.5" + sequelize-pool "^7.1.0" + toposort-class "^1.0.1" + uuid "^8.3.2" + validator "^13.7.0" + wkx "^0.5.0" + +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +signal-exit@^3.0.2: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +sqlstring@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.2.tgz#cdae7169389a1375b18e885f2e60b3e460809514" + integrity sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg== + +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toposort-class@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" + integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wkx@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c" + integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== + dependencies: + "@types/node" "*" + +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xlsx@^0.17.4: + version "0.17.4" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.17.4.tgz#dc3e3a0954c835f4d0fdd643645db6f4ac3f28f2" + integrity sha512-9aKt8g9ZLP0CUdBX8L5xnoMDFwSiLI997eQnDThCaqQMYB9AEBIRzblSSNN/ICMGLYIHUO3VKaItcedZJ3ijIg== + dependencies: + adler-32 "~1.2.0" + cfb "^1.1.4" + codepage "~1.15.0" + crc-32 "~1.2.0" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== From 4d0ee7af289769ad18fbe0fe1ef0217c80be66dc Mon Sep 17 00:00:00 2001 From: Diego Oliveira Date: Sat, 18 Dec 2021 19:49:39 -0300 Subject: [PATCH 2/6] Challenge-Diego-Oliveira --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4a2dfa4..91e470d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ### - Caso o passo acima não funcione, pare a aplicação e através da linha de comando navegue até o arquivo User.js e execute: node User.js -## - Pronto, agora a tabela de usuários foi criada. Por favor, após a criação da tabela comente novamente ou remova a linha "User.sync({force:true"}) para que o nodemon não volte a tentar criar a tabela. +### - Pronto, agora a tabela de usuários foi criada. Por favor, após a criação da tabela comente novamente ou remova a linha "User.sync({force:true"}) para que o nodemon não volte a tentar criar a tabela. ### - Repita os passos acima para a tabela de Summoners From 3c9b48f3a205202af9e3ba6ff7b134ba2736b69c Mon Sep 17 00:00:00 2001 From: Diego Oliveira Date: Sat, 18 Dec 2021 20:06:20 -0300 Subject: [PATCH 3/6] Challenge Diego Oliveira --- README.md | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 91e470d..ec09998 100644 --- a/README.md +++ b/README.md @@ -6,25 +6,37 @@ ### Desafio realizado utilizando MySQL e ORM sequelize -### - Coloque sua API_KEY da Riot no seu arquivo .env -### - Crie um database e em seguida passe os valores de acesso no arquivo connection.js dentro da pasta database -### - Para executar o projeto, dê um yarn ou npm install na linha de comando + - Coloque sua API_KEY da Riot no seu arquivo **.env** -### - Em seguida execute "yarn start" (caso o nodemon não funcione, instale-o da seguinte maneira: yarn add nodemon --save -D ) -### - Dentro da pasta models, no arquivo "User.js" descomente a linha "User.sync({force:true})" para criar a tabela de usuários + - Crie um database e em seguida passe os valores de acesso no arquivo connection.js dentro da pasta database -### - Caso o passo acima não funcione, pare a aplicação e através da linha de comando navegue até o arquivo User.js e execute: node User.js -### - Pronto, agora a tabela de usuários foi criada. Por favor, após a criação da tabela comente novamente ou remova a linha "User.sync({force:true"}) para que o nodemon não volte a tentar criar a tabela. + - Para executar o projeto, dê um ```yarn``` ou ```npm install``` na linha de comando -### - Repita os passos acima para a tabela de Summoners -### - Por fim crie um usuário, faça login e use o token gerado para usar livremente as rotas de summoners(Leia as instruções dentro do arquivo SummonerCtrl.js para criar todos os summoners) + - Em seguida execute ```yarn start``` (caso o nodemon não funcione, instale-o da seguinte forma: ```yarn add nodemon --save -D``` ) -### - Optei por não usar migrations para não dificultar a execução do projeto, já que é somente um desafio. -### - PS: O código está comentado. + - Dentro da pasta models, no arquivo User.js descomente a linha ```User.sync({force:true})``` para criar a tabela de usuários + + + - Caso o passo acima não funcione, pare a aplicação e através da linha de comando navegue até o arquivo User.js e execute: ```node User.js``` + + - Pronto, agora a tabela de usuários foi criada. Por favor, após a criação da tabela comente novamente ou remova a linha ```User.sync({force:true})``` para que o nodemon não volte a tentar criar a tabela. + + + - Repita os passos acima para a tabela de Summoners + + + - Por fim crie um usuário, faça login e use o token gerado para usar livremente as rotas de summoners(Leia as instruções dentro do arquivo SummonerCtrl.js para criar todos os summoners) + + + - Optei por não usar migrations para não dificultar a execução do projeto, já que é somente um desafio. + + + + - PS: O código está comentado. From 3d40a775558bd71182a6d18043a774c770db9f4a Mon Sep 17 00:00:00 2001 From: Diego Oliveira Date: Sun, 19 Dec 2021 19:54:34 -0300 Subject: [PATCH 4/6] Summoner validation --- controllers/SummonerCtrl.js | 14 +++++++++++--- database/connection.js | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/controllers/SummonerCtrl.js b/controllers/SummonerCtrl.js index 52c0c35..ff6c721 100644 --- a/controllers/SummonerCtrl.js +++ b/controllers/SummonerCtrl.js @@ -39,6 +39,14 @@ exports.createSummoner = async (req, res) => { name, profileIconId, summonerLevel, } = summonerIdResponse.data; + const itemExists = await Summoner.findOne({ where: { AccountId: accountId, SummonerId: id } }) + + if (itemExists) { + return res.status(400).json({ + error: ` O Summoner ${itemExists.Nickname} já está cadastrado!` + }) + } + await Summoner.create({ Nickname: name, AccountId: accountId, @@ -75,7 +83,7 @@ exports.getSummoners = async (req, res) => { // Listando um summoner específico de acordo com o ID exports.getSummonersDetails = async (req, res) => { - const idSum = req.params.id; + const idSum = req.params.id; const encryptedSummonerId = await Summoner.findByPk(idSum); @@ -143,13 +151,13 @@ exports.exportSum = async (req, res) => { const workSheetName = 'Summoners'; - let filePath = `./excelTable/summoners.xlsx`; + let filePath = `./ excelTable / summoners.xlsx`; // script para não repetir o nome do arquivo let newName = 0; if (fs.existsSync(filePath)) { newName = Math.round(Math.random() * 550 / 5) * 5 + 5; - filePath = `./excelTable/summoners${newName}.xlsx` + filePath = `./ excelTable / summoners${newName}.xlsx` } exportSummonersToExcel(summoners, workSheetColumnName, workSheetName, filePath); diff --git a/database/connection.js b/database/connection.js index fe12b81..22c667a 100644 --- a/database/connection.js +++ b/database/connection.js @@ -8,7 +8,7 @@ const Sequelize = require('sequelize'); { dialect: "mysql", host: "localhost", - port: 3306 + port: 3307 }); module.exports = sequelize; From ac89417738c8c768362acbc4e3452d23ab80e20e Mon Sep 17 00:00:00 2001 From: Diego Oliveira Date: Mon, 20 Dec 2021 11:09:47 -0300 Subject: [PATCH 5/6] fixed path of excelTable --- README.md | 2 -- controllers/SummonerCtrl.js | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ec09998..711e1c0 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,6 @@ ### Desafio realizado utilizando MySQL e ORM sequelize - - - Coloque sua API_KEY da Riot no seu arquivo **.env** diff --git a/controllers/SummonerCtrl.js b/controllers/SummonerCtrl.js index ff6c721..6d730a5 100644 --- a/controllers/SummonerCtrl.js +++ b/controllers/SummonerCtrl.js @@ -151,13 +151,13 @@ exports.exportSum = async (req, res) => { const workSheetName = 'Summoners'; - let filePath = `./ excelTable / summoners.xlsx`; + let filePath = `./excelTable/summoners.xlsx`; // script para não repetir o nome do arquivo let newName = 0; if (fs.existsSync(filePath)) { newName = Math.round(Math.random() * 550 / 5) * 5 + 5; - filePath = `./ excelTable / summoners${newName}.xlsx` + filePath = `./excelTable/summoners${newName}.xlsx` } exportSummonersToExcel(summoners, workSheetColumnName, workSheetName, filePath); From b48f872818a35cfaca98c431da005584413857c1 Mon Sep 17 00:00:00 2001 From: Diego Oliveira Date: Mon, 20 Dec 2021 11:17:21 -0300 Subject: [PATCH 6/6] fix path excelTables --- excelTable/summoners.xlsx | Bin 0 -> 18113 bytes excelTable/summoners400.xlsx | Bin 0 -> 18113 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 excelTable/summoners.xlsx create mode 100644 excelTable/summoners400.xlsx diff --git a/excelTable/summoners.xlsx b/excelTable/summoners.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..445ab6e6bc308621b57a1a13abaa2cbe012956ac GIT binary patch literal 18113 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 MUjY)6R-xbi6Z|O}-2eap literal 0 HcmV?d00001 diff --git a/excelTable/summoners400.xlsx b/excelTable/summoners400.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8c681914a9e82b0f1d70df3ed028c03087788208 GIT binary patch literal 18113 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 MUjY)6R-xbi6JwPdZ2$lO literal 0 HcmV?d00001