diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d637855..0d35ecb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,7 +33,7 @@ jobs: - name: Configurar Node.js uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 22.1.0 - name: Instalar dependências do Monorepo run: yarn @@ -47,7 +47,8 @@ jobs: - name: Iniciar backend run: | cd backend - nohup yarn api & + yarn build + nohup yarn start & env: DATABASE_URL: ${{ secrets.DATABASE_URL }} JWT_SECRET: ${{ secrets.JWT_SECRET }} @@ -102,7 +103,7 @@ jobs: - name: Configurar Node.js uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 22.1.0 - name: Instalar dependências do Monorepo run: yarn @@ -116,7 +117,8 @@ jobs: - name: Iniciar backend run: | cd backend - nohup yarn api & + yarn build + nohup yarn start & env: DATABASE_URL: ${{ secrets.DATABASE_URL }} JWT_SECRET: ${{ secrets.JWT_SECRET }} @@ -177,7 +179,7 @@ jobs: - name: Configurar Node.js uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 22.1.0 - name: Configurar Python uses: actions/setup-python@v5.3.0 @@ -197,7 +199,8 @@ jobs: - name: Iniciar backend run: | cd backend - nohup yarn api & + yarn build + nohup yarn start & env: DATABASE_URL: ${{ secrets.DATABASE_URL }} JWT_SECRET: ${{ secrets.JWT_SECRET }} diff --git a/.husky/commit-msg b/.husky/commit-msg index 34eed8b..9254615 100644 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1 +1 @@ -npx --no -- commitlint --edit $1 \ No newline at end of file +yarn commitlint --edit "$1" \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index 644d542..cada750 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -yarn format:all \ No newline at end of file +yarn linter:all \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 249010c..99f88fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # qa-solar +## 2.4.2 + +### Patch Changes + +- 8f35ad9: chore: ajusta o workflow para o novo modelo do backend +- 9cda398: chore: ajust a configuracao do commitlint com husky +- abe1ffc: chore: instala pacotes para o projeto backend + ## 2.4.1 ### Patch Changes diff --git a/backend/.gitignore b/backend/.gitignore index 11ddd8d..3987d18 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,3 +1,6 @@ +# Folders node_modules -# Keep environment variables out of version control +dist + +# Environment Variables .env diff --git a/backend/CHANGELOG.md b/backend/CHANGELOG.md index 778a9e5..e1bee5d 100644 --- a/backend/CHANGELOG.md +++ b/backend/CHANGELOG.md @@ -1,5 +1,40 @@ # backend +## 2.0.0 + +### Major Changes + +- abe1ffc: feat: migra o projeto de JavaScript para TypeScript + + BREAKING CHANGE: + + ### O que mudou: + + - Todo o código do backend foi reescrito de JavaScript para TypeScript. + - Foram adicionados tipos para garantir maior segurança e previsibilidade no código. + - Algumas estruturas e middlewares foram refatorados para aderir às melhores práticas do TypeScript. + + ### Por que a mudança foi feita: + + - Para melhorar a qualidade do código e reduzir erros em tempo de execução. + - Para facilitar a manutenção do projeto e a escalabilidade futura. + - Para alinhar o projeto com padrões modernos de desenvolvimento. + + ### Como atualizar seu código: + + 1. Certifique-se de ter o TypeScript instalado no seu ambiente de desenvolvimento. + 2. Atualize os comandos de execução do projeto para usar `ts-node` ou compile os arquivos com `tsc`. + 3. Verifique suas integrações externas para ajustar chamadas e tipos, se necessário. + 4. Revise os exemplos no `README.md` (se aplicável) para garantir compatibilidade com o novo código. + +### Minor Changes + +- 8f35ad9: feat: finaliza a configuração do eslint no projeto backend + +### Patch Changes + +- 9cda398: chore: correcao de codigo e configuracao + ## 1.4.0 ### Minor Changes diff --git a/backend/eslint.config.js b/backend/eslint.config.js new file mode 100644 index 0000000..543e7ff --- /dev/null +++ b/backend/eslint.config.js @@ -0,0 +1,38 @@ +import tsPlugin from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import globals from 'globals'; + +/** @type {import('eslint').Linter.FlatConfig[]} */ +export default [ + { + files: ['**/*.{js,mjs,cjs,ts}'], + languageOptions: { + parser: tsParser, + ecmaVersion: 2020, + sourceType: 'module', + globals: { + ...globals.node, + }, + }, + rules: { + 'no-console': 'warn', // Alerta para `console.log` + 'no-unused-vars': 'off', // Substituído pela regra do TypeScript + }, + }, + { + files: ['**/*.ts'], + plugins: { + '@typescript-eslint': tsPlugin, + }, + rules: { + ...tsPlugin.configs.recommended.rules, // Adicionar regras recomendadas do TypeScript + '@typescript-eslint/no-explicit-any': 'off', // Permitir `any` explícito + '@typescript-eslint/no-inferrable-types': 'warn', // Alerta para tipos desnecessários + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_' }, // Ignorar variáveis prefixadas com '_' + ], + '@typescript-eslint/explicit-module-boundary-types': 'off', // Não exigir tipos explícitos + }, + }, +]; diff --git a/backend/package.json b/backend/package.json index 0e48839..a0489b9 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,31 +1,43 @@ { "name": "backend", - "version": "1.4.0", + "version": "2.0.0", "description": "backend for QA Solar Project", "author": "Leonardo Paixao ", "license": "MIT", "type": "module", "private": false, "scripts": { - "api": "ts-node src/server.js", - "format": "prettier --write src/", - "prisma:seed": "ts-node prisma/seeders/*.js" + "build": "rimraf disc && tsc", + "start": "node dist/server.js", + "dev": "yarn build && yarn start", + "format": "prettier --write src/*{.ts,.json}", + "lint": "eslint 'src/'" }, "dependencies": { "@faker-js/faker": "^9.2.0", "@prisma/client": "^5.22.0", "bcryptjs": "^2.4.3", "body-parser": "^1.20.3", - "chalk": "^5.3.0", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.21.1", "jsonwebtoken": "^9.0.2", - "prettier": "^3.3.3", - "prisma": "^5.22.0" + "prisma": "^5.22.0", + "winston": "^3.17.0" }, "devDependencies": { - "@tsconfig/node22": "^22.0.0", + "@eslint/js": "^9.16.0", + "@types/bcryptjs": "^2.4.6", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^22.10.1", + "@typescript-eslint/eslint-plugin": "^8.16.0", + "@typescript-eslint/parser": "^8.16.0", + "eslint": "^9.16.0", + "globals": "^15.12.0", + "prettier": "^3.4.1", + "rimraf": "^6.0.1", "ts-node": "^10.9.2", "typescript": "^5.7.2" } diff --git a/backend/prisma/seeders/genericUser.js b/backend/prisma/seeders/genericUser.js index ac68605..2ff5387 100644 --- a/backend/prisma/seeders/genericUser.js +++ b/backend/prisma/seeders/genericUser.js @@ -27,9 +27,8 @@ async function main() { main() .catch((error) => { - console.error('Erro ao executar o seeder:', error.message); + throw new Error('Não foi possivel criar o usuário genérico', + error.message) }) .finally(async () => { - console.log('Desconectando o Prisma...'); await prisma.$disconnect(); }); diff --git a/backend/src/app.js b/backend/src/app.ts similarity index 83% rename from backend/src/app.js rename to backend/src/app.ts index 110de59..1ae67d7 100644 --- a/backend/src/app.js +++ b/backend/src/app.ts @@ -1,7 +1,7 @@ import bodyParser from 'body-parser'; import cors from 'cors'; import express from 'express'; -import router from './routes/routes.js'; +import router from './routes/routes.ts'; const app = express(); diff --git a/backend/src/config/env.ts b/backend/src/config/env.ts new file mode 100644 index 0000000..14ed11e --- /dev/null +++ b/backend/src/config/env.ts @@ -0,0 +1,9 @@ +import dotenv from 'dotenv'; + +dotenv.config(); + +if (!process.env.JWT_SECRET) { + throw new Error('JWT_SECRET não definido no arquivo .env'); +} + +export const JWT_SECRET = process.env.JWT_SECRET; diff --git a/backend/src/constants/messages.js b/backend/src/constants/messages.ts similarity index 100% rename from backend/src/constants/messages.js rename to backend/src/constants/messages.ts diff --git a/backend/src/controllers/deleteUser.js b/backend/src/controllers/deleteUser.js deleted file mode 100644 index faa9735..0000000 --- a/backend/src/controllers/deleteUser.js +++ /dev/null @@ -1,28 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -export async function deleteUser(req, res) { - const { ids } = req.body; - - if (Array.isArray(ids) === req.userId) { - return res.status(400).json({ message: 'Você não pode excluir o usuário logado.' }); - } - - try { - const deletedUsers = await prisma.user.deleteMany({ - where: { - id: { in: ids }, - }, - }); - - if (deletedUsers.count === 0) { - return res.status(404).json({ message: 'Nenhum usuário encontrado para excluir.' }); - } - - return res.status(200).json({ message: `${deletedUsers.count} usuário(s) excluído(s) com sucesso!` }); - } catch (error) { - console.error(error); - return res.status(500).json({ message: 'Erro ao excluir o usuário.' }); - } -} diff --git a/backend/src/controllers/deleteUser.ts b/backend/src/controllers/deleteUser.ts new file mode 100644 index 0000000..e5ca659 --- /dev/null +++ b/backend/src/controllers/deleteUser.ts @@ -0,0 +1,26 @@ +import { PrismaClient } from '@prisma/client'; +import { Request, Response } from 'express'; + +const prisma = new PrismaClient(); + +export async function deleteUser(req: Request, res: Response): Promise { + const { ids } = req.body; + + if (ids.includes(req.userId)) { + res.status(400).json({ message: 'Você não pode excluir o usuário logado.' }); + return + } + + const deletedUsers = await prisma.user.deleteMany({ + where: { + id: { in: ids }, + }, + }); + + if (deletedUsers.count === 0) { + res.status(404).json({ message: 'Nenhum usuário encontrado para excluir.' }); + return + } + + res.status(200).json({ message: `${deletedUsers.count} usuário(s) excluído(s) com sucesso!` }); +} diff --git a/backend/src/controllers/getAllUsers.js b/backend/src/controllers/getAllUsers.js deleted file mode 100644 index 3bcf64a..0000000 --- a/backend/src/controllers/getAllUsers.js +++ /dev/null @@ -1,33 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import { formatDateTime } from '../utils/formatDate.js'; - -const prisma = new PrismaClient(); - -export async function getAllUsers(req, res) { - try { - const users = await prisma.user.findMany({ - select: { - id: true, - full_name: true, - social_name: true, - email: true, - phone: true, - document: true, - created_at: true, - }, - }); - - if (users.length === 0) { - return res.status(404).json({ message: 'Nenhum usuário encontrado.' }); - } - - const formattedUsers = users.map((user) => ({ - ...user, - created_at: formatDateTime(user.created_at), - })); - - res.status(200).json(formattedUsers); - } catch (error) { - return res.status(500).json({ message: 'Erro ao buscar usuários.' }); - } -} diff --git a/backend/src/controllers/getAllUsers.ts b/backend/src/controllers/getAllUsers.ts new file mode 100644 index 0000000..1f5dee3 --- /dev/null +++ b/backend/src/controllers/getAllUsers.ts @@ -0,0 +1,31 @@ +import { PrismaClient } from '@prisma/client'; +import { Request, Response } from 'express'; +import { formatDateTime } from '../utils/formatDate.js'; + +const prisma = new PrismaClient(); + +export async function getAllUsers(req: Request, res: Response): Promise { + const users = await prisma.user.findMany({ + select: { + id: true, + full_name: true, + social_name: true, + email: true, + phone: true, + document: true, + created_at: true, + }, + }); + + if (users.length === 0) { + res.status(404).json({ message: 'Nenhum usuário encontrado.' }); + return + } + + const formattedUsers = users.map((user) => ({ + ...user, + created_at: formatDateTime(user.created_at), + })); + + res.status(200).json(formattedUsers); +} diff --git a/backend/src/controllers/getEmailUser.js b/backend/src/controllers/getEmailUser.js deleted file mode 100644 index 58c4c00..0000000 --- a/backend/src/controllers/getEmailUser.js +++ /dev/null @@ -1,22 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -export async function getEmailUser(req, res) { - const email = req.validatedEmail; - - try { - const user = await prisma.user.findUnique({ - where: { email }, - }); - - if (!user) { - return res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' }); - } - - res.status(200).json({ message: 'Um e-mail foi enviado com instruções para recuperar a senha.' }); - } catch (error) { - console.error(error); - res.status(500).json({ message: 'Erro interno no servidor.' }); - } -} diff --git a/backend/src/controllers/getEmailUser.ts b/backend/src/controllers/getEmailUser.ts new file mode 100644 index 0000000..0de734d --- /dev/null +++ b/backend/src/controllers/getEmailUser.ts @@ -0,0 +1,19 @@ +import { PrismaClient } from '@prisma/client'; +import { Request, Response } from 'express'; + +const prisma = new PrismaClient(); + +export async function getEmailUser(req: Request, res: Response): Promise { + const email = req.validatedEmail; + + const user = await prisma.user.findUnique({ + where: { email }, + }); + + if (!user) { + res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' }); + return + } + + res.status(200).json({ message: 'Um e-mail foi enviado com instruções para recuperar a senha.' }); +} diff --git a/backend/src/controllers/getUser.js b/backend/src/controllers/getUser.js deleted file mode 100644 index ea62dcd..0000000 --- a/backend/src/controllers/getUser.js +++ /dev/null @@ -1,29 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -export async function getUser(req, res) { - const email = req.validatedEmail; - - try { - const user = await prisma.user.findUnique({ - where: { email: email }, - select: { - id: true, - full_name: true, - social_name: true, - document: true, - email: true, - phone: true, - }, - }); - - if (!user) { - return res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' }); - } - - res.status(200).json(user); - } catch (error) { - return res.status(500).json({ message: 'Erro ao buscar usuário.' }); - } -} diff --git a/backend/src/controllers/getUser.ts b/backend/src/controllers/getUser.ts new file mode 100644 index 0000000..3346b30 --- /dev/null +++ b/backend/src/controllers/getUser.ts @@ -0,0 +1,27 @@ +import { PrismaClient } from '@prisma/client'; +import { Request, Response } from 'express'; + +const prisma = new PrismaClient(); + +export async function getUser(req: Request, res: Response): Promise { + const email = req.validatedEmail; + + const user = await prisma.user.findUnique({ + where: { email: email }, + select: { + id: true, + full_name: true, + social_name: true, + document: true, + email: true, + phone: true, + }, + }); + + if (!user) { + res.status(404).json({ message: 'Este email não esta cadastrado no banco de dados.' }); + return + } + + res.status(200).json(user); +} diff --git a/backend/src/controllers/loginUser.js b/backend/src/controllers/loginUser.js deleted file mode 100644 index d590991..0000000 --- a/backend/src/controllers/loginUser.js +++ /dev/null @@ -1,36 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import bcrypt from 'bcryptjs'; -import jwt from 'jsonwebtoken'; - -const prisma = new PrismaClient(); - -export async function loginUser(req, res) { - const { email, password } = req.body; - - try { - const user = await prisma.user.findUnique({ - where: { email }, - }); - - if (!user) { - return res.status(400).json({ message: 'Não foi possivel realizar login com este usuário.' }); - } - - const isPasswordValid = await bcrypt.compare(password, user.password); - - if (!isPasswordValid) { - return res.status(400).json({ message: 'A senha não confere.' }); - } - - const token = jwt.sign({ userId: user.id, email: user.email }, process.env.JWT_SECRET, { - expiresIn: '4h', - }); - - res.status(200).json({ - message: 'Login realizado com sucesso!', - token, - }); - } catch (error) { - res.status(500).json({ message: 'Erro ao tentar realizar o login.' }); - } -} diff --git a/backend/src/controllers/loginUser.ts b/backend/src/controllers/loginUser.ts new file mode 100644 index 0000000..02378a2 --- /dev/null +++ b/backend/src/controllers/loginUser.ts @@ -0,0 +1,33 @@ +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcryptjs'; +import { Request, Response } from 'express'; +import jwt from 'jsonwebtoken'; +import { JWT_SECRET } from '../config/env.ts'; + +const prisma = new PrismaClient(); + +export async function loginUser(req: Request, res: Response): Promise { + const { email, password } = req.body; + + const user = await prisma.user.findUnique({ + where: { email }, + }); + + if (!user) { + res.status(400).json({ message: 'Não foi possivel realizar login com este usuário.' }); + return + } + + const isPasswordValid = await bcrypt.compare(password, user.password); + + if (!isPasswordValid) { + res.status(400).json({ message: 'A senha não confere.' }); + return + } + + const token = jwt.sign({ userId: user.id, email: user.email }, JWT_SECRET, { + expiresIn: '4h', + }); + + res.status(200).json({ message: 'Login realizado com sucesso!', token }); +} diff --git a/backend/src/controllers/logoutUser.js b/backend/src/controllers/logoutUser.js deleted file mode 100644 index df7d56d..0000000 --- a/backend/src/controllers/logoutUser.js +++ /dev/null @@ -1,9 +0,0 @@ -export async function logoutUser(req, res) { - try { - const userId = req.userId; - - res.status(200).json({ message: `Logout realizado com sucesso do usuário com o ID: ${userId}` }); - } catch (error) { - res.status(500).json({ message: `Erro ao processar o logout do usuário com o ID: ${userId}` }); - } -} diff --git a/backend/src/controllers/logoutUser.ts b/backend/src/controllers/logoutUser.ts new file mode 100644 index 0000000..7f01475 --- /dev/null +++ b/backend/src/controllers/logoutUser.ts @@ -0,0 +1,7 @@ +import { Request, Response } from 'express'; + +export async function logoutUser(req: Request, res: Response): Promise { + const userId = req.userId; + + res.status(200).json({ message: `Logout realizado com sucesso do usuário com o ID: ${userId}` }); +} diff --git a/backend/src/controllers/registerUser.js b/backend/src/controllers/registerUser.ts similarity index 71% rename from backend/src/controllers/registerUser.js rename to backend/src/controllers/registerUser.ts index 2f24a22..2d79fd6 100644 --- a/backend/src/controllers/registerUser.js +++ b/backend/src/controllers/registerUser.ts @@ -1,9 +1,10 @@ import { PrismaClient } from '@prisma/client'; import bcrypt from 'bcryptjs'; +import { Request, Response } from 'express'; const prisma = new PrismaClient(); -export const registerUser = async (req, res) => { +export const registerUser = async (req: Request, res: Response): Promise => { const { fullName, socialName, document, docType, phone, email, password } = req.body; try { @@ -22,13 +23,15 @@ export const registerUser = async (req, res) => { }); res.status(201).json({ message: 'Usuário cadastrado com sucesso!' }); - } catch (error) { + } catch (error: any) { if (error.code === 'P2002') { if (error.meta?.target?.includes('email')) { - return res.status(400).json({ message: 'E-mail já está em uso.' }); + res.status(400).json({ message: 'E-mail já está em uso.' }); + return } if (error.meta?.target?.includes('document')) { - return res.status(400).json({ message: 'CPF ou CNPJ já está em uso.' }); + res.status(400).json({ message: 'CPF ou CNPJ já está em uso.' }); + return } } diff --git a/backend/src/controllers/updateUser.js b/backend/src/controllers/updateUser.js deleted file mode 100644 index 2fe78a4..0000000 --- a/backend/src/controllers/updateUser.js +++ /dev/null @@ -1,23 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -export async function updateUser(req, res) { - const userId = req.userId; - const { fullName, socialName, phone } = req.body; - - try { - await prisma.user.update({ - where: { id: userId }, - data: { - full_name: fullName, - social_name: socialName || null, - phone: phone || null, - }, - }); - - res.status(200).json({ message: 'Usuário alterado com sucesso.' }); - } catch (error) { - res.status(500).json({ message: 'Erro ao atualizar o perfil do usuário.' }); - } -} diff --git a/backend/src/controllers/updateUser.ts b/backend/src/controllers/updateUser.ts new file mode 100644 index 0000000..24f3074 --- /dev/null +++ b/backend/src/controllers/updateUser.ts @@ -0,0 +1,20 @@ +import { PrismaClient } from '@prisma/client'; +import { Request, Response } from 'express'; + +const prisma = new PrismaClient(); + +export async function updateUser(req: Request, res: Response) { + const userId = req.userId; + const { fullName, socialName, phone } = req.body; + + await prisma.user.update({ + where: { id: userId }, + data: { + full_name: fullName, + social_name: socialName || null, + phone: phone || null, + }, + }); + + res.status(200).json({ message: 'Usuário alterado com sucesso.' }); +} diff --git a/backend/src/middleware/auth.js b/backend/src/middleware/auth.js deleted file mode 100644 index bcb6bf1..0000000 --- a/backend/src/middleware/auth.js +++ /dev/null @@ -1,39 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import jwt from 'jsonwebtoken'; - -const prisma = new PrismaClient(); - -export function authenticate(req, res, next) { - const token = req.headers.authorization?.split(' ')[1]; - - if (!token) { - return res.status(401).json({ message: 'Token não fornecido.' }); - } - - try { - const decoded = jwt.verify(token, process.env.JWT_SECRET); - - if (!decoded.userId || typeof decoded.userId !== 'number') { - return res.status(400).json({ message: 'Token inválido: ID do usuário ausente ou inválido.' }); - } - - req.userId = decoded.userId; - - prisma.user - .findUnique({ where: { id: req.userId } }) - .then((user) => { - if (!user) { - return res.status(404).json({ message: `Usuário com o ID: ${req.userId} não encontrado.` }); - } - next(); - }) - .catch(() => { - res.status(500).json({ message: 'Erro interno no servidor.' }); - }); - } catch (error) { - if (error.name === 'TokenExpiredError') { - return res.status(401).json({ message: 'Token expirado.' }); - } - return res.status(403).json({ message: 'Token inválido.' }); - } -} diff --git a/backend/src/middleware/auth.ts b/backend/src/middleware/auth.ts new file mode 100644 index 0000000..8a30da3 --- /dev/null +++ b/backend/src/middleware/auth.ts @@ -0,0 +1,41 @@ +import { PrismaClient } from '@prisma/client'; +import { NextFunction, Request, Response } from 'express'; +import jwt from 'jsonwebtoken'; +import { JWT_SECRET } from '../config/env.ts'; + +const prisma = new PrismaClient(); + +export async function authenticate(req: Request, res: Response, next: NextFunction): Promise { + const token = req.headers.authorization?.split(' ')[1]; + + if (!token) { + res.status(401).json({ message: 'Token não fornecido.' }); + return; + } + + try { + const decoded = jwt.verify(token, JWT_SECRET) as { userId: number }; + + if (!decoded.userId || typeof decoded.userId !== 'number') { + res.status(400).json({ message: 'Token inválido: ID do usuário ausente ou inválido.' }); + return; + } + + req.userId = decoded.userId; + + const user = await prisma.user.findUnique({ where: { id: req.userId } }); + + if (!user) { + res.status(404).json({ message: `Usuário com o ID: ${req.userId} não encontrado.` }); + return; + } + + next(); + } catch (error: any) { + if (error.name === 'TokenExpiredError') { + res.status(401).json({ message: 'Token expirado.' }); + } else { + res.status(403).json({ message: 'Token inválido.' }); + } + } +} diff --git a/backend/src/middleware/validateEmail.js b/backend/src/middleware/validateEmail.js deleted file mode 100644 index 365caa4..0000000 --- a/backend/src/middleware/validateEmail.js +++ /dev/null @@ -1,27 +0,0 @@ -export function validateEmail(req, res, next) { - const email = req.body.email; - - if (!email) { - return res.status(400).json({ message: 'E-mail é obrigatório.' }); - } - - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - if (!emailRegex.test(email)) { - return res.status(400).json({ message: 'E-mail inválido.' }); - } - - const normalizedEmail = email.trim().toLowerCase(); - - if (normalizedEmail.length > 254) { - return res.status(400).json({ message: 'E-mail excede o limite de tamanho permitido.' }); - } - - const blockedDomains = ['tempmail.com', '10minutemail.com']; - const domain = normalizedEmail.split('@')[1]; - if (blockedDomains.includes(domain)) { - return res.status(400).json({ message: 'Domínio de e-mail não permitido.' }); - } - - req.validatedEmail = normalizedEmail; - next(); -} diff --git a/backend/src/middleware/validateEmail.ts b/backend/src/middleware/validateEmail.ts new file mode 100644 index 0000000..c35048c --- /dev/null +++ b/backend/src/middleware/validateEmail.ts @@ -0,0 +1,14 @@ +import { NextFunction, Request, Response } from 'express'; + +export async function validateEmail(req: Request, res: Response, next: NextFunction): Promise { + const { email } = req.body; + + if (!email || typeof email !== 'string') { + res.status(400).json({ message: 'E-mail inválido ou não fornecido.' }); + return; + } + + req.validatedEmail = email.trim().toLowerCase(); + + next(); +} diff --git a/backend/src/routes/routes.js b/backend/src/routes/routes.js deleted file mode 100644 index 67c0cf8..0000000 --- a/backend/src/routes/routes.js +++ /dev/null @@ -1,24 +0,0 @@ -import { Router } from 'express'; -import { deleteUser } from '../controllers/deleteUser.js'; -import { getAllUsers } from '../controllers/getAllUsers.js'; -import { getEmailUser } from '../controllers/getEmailUser.js'; -import { getUser } from '../controllers/getUser.js'; -import { loginUser } from '../controllers/loginUser.js'; -import { logoutUser } from '../controllers/logoutUser.js'; -import { registerUser } from '../controllers/registerUser.js'; -import { updateUser } from '../controllers/updateUser.js'; -import { authenticate } from '../middleware/auth.js'; -import { validateEmail } from '../middleware/validateEmail.js'; - -const router = Router(); - -router.post('/register', registerUser); -router.post('/login', loginUser); -router.post('/user', validateEmail, getUser); -router.post('/useremail', validateEmail, getEmailUser); -router.post('/logout', authenticate, logoutUser); -router.get('/users', getAllUsers); -router.put('/user/update', authenticate, updateUser); -router.delete('/user/delete', authenticate, deleteUser); - -export default router; diff --git a/backend/src/routes/routes.ts b/backend/src/routes/routes.ts new file mode 100644 index 0000000..da01478 --- /dev/null +++ b/backend/src/routes/routes.ts @@ -0,0 +1,24 @@ +import { Router } from 'express'; +import { deleteUser } from '../controllers/deleteUser.ts'; +import { getAllUsers } from '../controllers/getAllUsers.ts'; +import { getEmailUser } from '../controllers/getEmailUser.ts'; +import { getUser } from '../controllers/getUser.ts'; +import { loginUser } from '../controllers/loginUser.ts'; +import { logoutUser } from '../controllers/logoutUser.ts'; +import { registerUser } from '../controllers/registerUser.ts'; +import { updateUser } from '../controllers/updateUser.ts'; +import { authenticate } from '../middleware/auth.ts'; +import { validateEmail } from '../middleware/validateEmail.ts'; + +const router = Router(); + +router.post('/register', registerUser); +router.post('/login', loginUser); +router.post('/user', validateEmail, getUser); +router.post('/useremail', validateEmail, getEmailUser); +router.post('/logout', authenticate, logoutUser); +router.get('/users', getAllUsers); +router.put('/user/update', authenticate, updateUser); +router.delete('/user/delete', authenticate, deleteUser); + +export default router; diff --git a/backend/src/server.js b/backend/src/server.js deleted file mode 100644 index d1455d4..0000000 --- a/backend/src/server.js +++ /dev/null @@ -1,22 +0,0 @@ -import chalk from 'chalk'; -import dotenv from 'dotenv'; -import app from './app.js'; - -dotenv.config(); - -const PORT = process.env.PORT || 3001; - -const startServer = async () => { - try { - app.listen(PORT, () => { - console.log(chalk.green.bold(`\n🚀 Servidor iniciado com sucesso!`)); - console.log(chalk.blue(`🌍 URL: http://localhost:${PORT}`)); - console.log(chalk.yellow(`📅 Iniciado em: ${new Date().toLocaleString()}`)); - }); - } catch (error) { - console.error(chalk.red.bold(`❌ Erro ao iniciar o servidor:`), error.message); - process.exit(1); - } -}; - -startServer(); diff --git a/backend/src/server.ts b/backend/src/server.ts new file mode 100644 index 0000000..0686103 --- /dev/null +++ b/backend/src/server.ts @@ -0,0 +1,32 @@ +import dotenv from 'dotenv'; +import winston from 'winston'; +import app from './app.ts'; + +dotenv.config(); + +const PORT = process.env.PORT || 3001; + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.combine( + winston.format.colorize(), + winston.format.timestamp(), + winston.format.printf(({ timestamp, level, message }) => `[${timestamp}] ${level}: ${message}`) + ), + transports: [new winston.transports.Console()], +}); + +const startServer = async () => { + try { + app.listen(PORT, () => { + logger.info(`🚀 Servidor iniciado com sucesso!`); + logger.info(`🌍 URL: http://localhost:${PORT}`); + logger.info(`📅 Iniciado em: ${new Date().toLocaleString()}`); + }); + } catch (error: any) { + logger.error(`❌ Erro ao iniciar o servidor: ${error.message}`); + process.exit(1); + } +}; + +startServer(); diff --git a/backend/src/types/express.d.ts b/backend/src/types/express.d.ts new file mode 100644 index 0000000..4814918 --- /dev/null +++ b/backend/src/types/express.d.ts @@ -0,0 +1,10 @@ +import 'express'; + +declare global { + namespace Express { + interface Request { + userId?: number; + validatedEmail?: string; + } + } +} diff --git a/backend/src/utils/formatDate.js b/backend/src/utils/formatDate.ts similarity index 92% rename from backend/src/utils/formatDate.js rename to backend/src/utils/formatDate.ts index 36c9e09..c5ef21f 100644 --- a/backend/src/utils/formatDate.js +++ b/backend/src/utils/formatDate.ts @@ -4,7 +4,7 @@ * @param date - Objeto Date a ser formatado. * @returns String representando a data formatada. */ -export function formatDate(date) { +export function formatDate(date: Date) { if (!(date instanceof Date)) return 'Data inválida'; const day = date.getDate().toString().padStart(2, '0'); const month = (date.getMonth() + 1).toString().padStart(2, '0'); @@ -18,7 +18,7 @@ export function formatDate(date) { * @param date - O objeto de data a ser formatado. * @returns Uma string representando a data e hora formatadas. */ -export function formatDateTime(date) { +export function formatDateTime(date: Date) { if (!(date instanceof Date)) return 'Data inválida'; const day = date.getDate().toString().padStart(2, '0'); const month = (date.getMonth() + 1).toString().padStart(2, '0'); diff --git a/backend/tsconfig.json b/backend/tsconfig.json new file mode 100644 index 0000000..af08ca2 --- /dev/null +++ b/backend/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "nodenext", + "moduleResolution": "nodenext", + "strict": true, + "esModuleInterop": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": "./src" + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/commitlint.config.ts b/commitlint.config.ts index 56fcb55..3ec1a45 100644 --- a/commitlint.config.ts +++ b/commitlint.config.ts @@ -25,12 +25,12 @@ const Configuration = { rules: { 'scope-wrong': ({ scope }) => { if (!scope) { - return [true, '']; // Se não houver escopo, permite o commit + return [true, '']; } if (scope.match(/^[a-z]/)) { - return [true, '']; // Se o escopo começar com letra minúscula, permite o commit + return [true, '']; } - return [false, 'scope must start with a lowercase letter']; // Caso contrário, falha + return [false, 'scope must start with a lowercase letter']; }, 'subject-wrong': ({ subject }) => { const oldPatternCommit = /^\(|\(.+\)|\)$/g; diff --git a/frontend/CHANGELOG.md b/frontend/CHANGELOG.md index 52313a6..4ce36d3 100644 --- a/frontend/CHANGELOG.md +++ b/frontend/CHANGELOG.md @@ -1,5 +1,13 @@ # frontend +## 1.4.1 + +### Patch Changes + +- 8f35ad9: chore: ajustes finos no componente RecoverPasswordTemplate.vue +- 9cda398: chore: correcao de codigo e configuracao +- abe1ffc: feat: ajusta alguns componentes + ## 1.4.0 ### Minor Changes diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index 01b50a8..51838a4 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -20,6 +20,8 @@ export default [ { rules: { 'vue/block-lang': 'off', + '@typescript-eslint/no-empty-object-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', }, }, ]; diff --git a/frontend/package.json b/frontend/package.json index 45dbe40..a49b68d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "1.4.0", + "version": "1.4.1", "description": "frontend for QA Solar Project", "author": "Leonardo Paixao ", "license": "MIT", @@ -12,7 +12,7 @@ "preview": "vite preview", "build-only": "vite build", "type-check": "vue-tsc --build --force", - "lint": "eslint . --fix", + "lint": "eslint 'src/'", "format": "prettier --write src/" }, "dependencies": { diff --git a/frontend/src/hooks/useLogoutUser.js b/frontend/src/hooks/useLogoutUser.js index cc4c109..87f7408 100644 --- a/frontend/src/hooks/useLogoutUser.js +++ b/frontend/src/hooks/useLogoutUser.js @@ -1,4 +1,5 @@ import { useMutation, useQueryClient } from '@tanstack/vue-query'; +import { nextTick } from 'vue'; import { useRouter } from 'vue-router'; import { toast } from 'vue3-toastify'; import 'vue3-toastify/dist/index.css'; @@ -15,18 +16,21 @@ export const useLogout = () => { return useMutation({ mutationFn: logoutUser, - onSuccess: (data) => { + onSuccess: async (data) => { queryClient.resetQueries(); queryClient.invalidateQueries(['user']); - toast.success(data.message, { autoClose: 3000 }); - setTimeout(() => { - localStorage.removeItem('user-email'); - localStorage.removeItem('user-token'); - router.push('/'); - }, 3000); + + localStorage.removeItem('user-email'); + localStorage.removeItem('user-token'); + + await router.push('/'); + + nextTick(() => { + toast.success(data.message, { autoClose: 3000 }); + }); }, onError: (error) => { - console.error('Erro ao fazer logout:', error.message); + toast.error(error.response?.data?.message); }, }); }; diff --git a/frontend/src/modules/auth/components/login/LoginTemplate.vue b/frontend/src/modules/auth/components/login/LoginTemplate.vue index adefcd0..7811aa3 100644 --- a/frontend/src/modules/auth/components/login/LoginTemplate.vue +++ b/frontend/src/modules/auth/components/login/LoginTemplate.vue @@ -79,17 +79,17 @@ const handleLogin = () => { mutation.mutate( { email: email.value, password: password.value }, { - onSuccess: async (response) => { + onSuccess: (response) => { window.localStorage.setItem('user-token', response.token); window.localStorage.setItem('user-email', email.value); - toast.success(response.message, { autoClose: 3000 }); + toast.success(response.message, { autoClose: 1500 }); setTimeout(() => { router.push('/home').then(() => { window.location.reload(); }); - }, 3000); + }, 1500); }, onError: (error) => { const errorMessage = error.response?.data?.message || 'Ocorreu um erro inesperado. Tente novamente mais tarde.'; diff --git a/frontend/src/modules/auth/components/recoverPassword/RecoverPasswordTemplate.vue b/frontend/src/modules/auth/components/recoverPassword/RecoverPasswordTemplate.vue index cc57d58..78ffbb6 100644 --- a/frontend/src/modules/auth/components/recoverPassword/RecoverPasswordTemplate.vue +++ b/frontend/src/modules/auth/components/recoverPassword/RecoverPasswordTemplate.vue @@ -29,7 +29,7 @@ diff --git a/package.json b/package.json index b56d1ea..3f4508d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qa-solar", - "version": "2.4.1", + "version": "2.4.2", "description": "Simple project VUE for UI Testing with Frameworks: Cypress, Robot and Playwright", "repository": "git@github.com:LeohsPaixao/qa-solar.git", "author": "Leonardo Paixao ", @@ -11,11 +11,14 @@ "backend", "frontend", "test/cypress", - "test/playwright" + "test/playwright", + "test/robot" ], "scripts": { + "prepare": "husky", "changeset": "changeset", "version-packages": "changeset version", + "linter:all": "yarn workspace backend lint && yarn workspace frontend lint", "format:all": "yarn workspace backend format && yarn workspace frontend format" }, "keywords": [ diff --git a/test/robot/.cz.toml b/test/robot/.cz.toml deleted file mode 100644 index 6cb0557..0000000 --- a/test/robot/.cz.toml +++ /dev/null @@ -1,15 +0,0 @@ -[tool.commitizen] -name = "cz_conventional_commits" -version = "0.1.0" -tag_format = "v$version" - -[tool.commitizen.customize] -types = [ - { value = "feat", name = "feat: Nova funcionalidade ou ajuste importante nos testes" }, - { value = "test", name = "test: Adição ou modificação de casos de teste" }, - { value = "fix", name = "fix: Correção de bugs nos testes ou suporte" }, - { value = "docs", name = "docs: Atualização da documentação" }, - { value = "refactor", name = "refactor: Refatoração do código ou dos testes" }, - { value = "ci", name = "ci: Alterações no pipeline ou configuração de CI/CD" }, - { value = "chore", name = "chore: Atualizações menores, como dependências ou configurações" } -] \ No newline at end of file diff --git a/test/robot/.pre-commit-config.yaml b/test/robot/.pre-commit-config.yaml deleted file mode 100644 index 25d00d1..0000000 --- a/test/robot/.pre-commit-config.yaml +++ /dev/null @@ -1,8 +0,0 @@ -repos: -- hooks: - - id: commitizen - - id: commitizen-branch - stages: - - push - repo: https://github.com/commitizen-tools/commitizen - rev: v4.0.0 diff --git a/test/robot/CHANGELOG.md b/test/robot/CHANGELOG.md index 10ee0bf..ab13380 100644 --- a/test/robot/CHANGELOG.md +++ b/test/robot/CHANGELOG.md @@ -1,44 +1,7 @@ -## Unreleased +# robot-framework -### Feat +## 1.3.0 -- **v1.2.2**: adiciona arquivos de logs para execução dos testes em paralelo -- **v1.2.2**: muda a biblioteca de testes e os metodos -- **v1.2.2**: instala novos pacotes para aprimorar os testes -- **v1.2.2**: adiciona novos comandos no makefile -- padroniza os botoes de todas as telas -- remove os consoles do endpoint -- adiciona data-testid no componente profile (#45) -- melhora as validacoes dos campos (#10) -- adiciona o changeset (#9) -- cria o modulo de cadastro do usuario -- remove o console.log do script -- adiciona a a logo com o fundo branco -- adiciona a nova rota de cadastro -- esconde o progresso do toas -- adiciona o changeset -- altera o nome do aplicativo -- adiciona o changeset -- testando o husky -- instala e configura o husky no projeto -- adiciona configuracoes de server no vite -- altera do changelog do projeto -- adiciona o changeset -- resolve o problema do nvmrc -- remove componentes desnecessarios e adiciona modulo de login -- adiciona a rota de login e registra os plugins no main.ts -- adiciona o main.css no style do app -- ajusta a configuracao do typescript -- adiciona novos pacotes para toast de feedback -- remove arquivos desnecessario e adiciona css global -- adiciona uma imagem de logo -- adiciona o plugin de toast para feedback -- trata o erro de ter variaveis com any explicito -- altera a versao do projeto principal -- adiciona o changeset -- adiciona changeset no projeto principal -- adiciona o vue -- remove o venv do projeto robot -- adiciona gitignore no robot -- inicializa o projeto -- inicializa o projeto +### Minor Changes + +- 9cda398: test: adiciona o changelogs e commitlint no projeto de testes robot-framework diff --git a/test/robot/package.json b/test/robot/package.json new file mode 100644 index 0000000..ddc20fe --- /dev/null +++ b/test/robot/package.json @@ -0,0 +1,12 @@ +{ + "name": "robot-framework", + "version": "1.3.0", + "description": "Project Tests Robot-Framework", + "main": "index.js", + "author": "Leonardo Paixao ", + "license": "MIT", + "private": false, + "scripts": { + "lint": "make lint" + } +} \ No newline at end of file diff --git a/test/robot/requirements.txt b/test/robot/requirements.txt index c209e91..c404b6d 100644 --- a/test/robot/requirements.txt +++ b/test/robot/requirements.txt @@ -1,28 +1,33 @@ argcomplete==3.5.1 attrs==24.2.0 certifi==2024.8.30 +cfgv==3.4.0 charset-normalizer==3.4.0 click==8.1.7 colorama==0.4.6 -commitizen==4.0.0 decli==0.6.2 +distlib==0.3.9 exceptiongroup==1.2.2 +filelock==3.16.1 greenlet==3.1.1 grpcio==1.68.0 grpcio-tools==1.68.0 h11==0.14.0 +identify==2.6.3 idna==3.10 Jinja2==3.1.4 markdown-it-py==3.0.0 MarkupSafe==3.0.2 mdurl==0.1.2 natsort==8.4.0 +nodeenv==1.9.1 outcome==1.3.0.post0 overrides==7.7.0 packaging==24.2 pathspec==0.12.1 platformdirs==4.3.6 playwright==1.49.0 +pre_commit==4.0.1 prompt-toolkit==3.0.36 protobuf==5.28.3 pyee==12.0.0 @@ -57,6 +62,7 @@ trio==0.27.0 trio-websocket==0.11.1 typing_extensions==4.12.2 urllib3==2.2.3 +virtualenv==20.28.0 wcwidth==0.2.13 websocket-client==1.8.0 wrapt==1.17.0 diff --git a/yarn.lock b/yarn.lock index 44c19cd..6afb7b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -469,6 +469,11 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@commitlint/cli@^19.6.0": version "19.6.0" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.6.0.tgz#98e7fc8501cc38b6eef4b7f61e19b15f3c53700e" @@ -663,6 +668,15 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@esbuild/aix-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" @@ -824,6 +838,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.15.0.tgz#df0e24fe869143b59731942128c19938fdbadfb5" integrity sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg== +"@eslint/js@9.16.0", "@eslint/js@^9.16.0": + version "9.16.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.16.0.tgz#3df2b2dd3b9163056616886c86e4082f45dbf3f4" + integrity sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg== + "@eslint/object-schema@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" @@ -869,6 +888,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jamescoyle/vue-icon@^0.1.2": version "0.1.2" resolved "https://registry.yarnpkg.com/@jamescoyle/vue-icon/-/vue-icon-0.1.2.tgz#b9e254187de6716b81bf9e0e8400ec012231bd05" @@ -1171,6 +1202,26 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node22/-/node22-22.0.0.tgz#0bdaf702f2b7594383d24d7b2b8d557dcfdca1ed" integrity sha512-twLQ77zevtxobBOD4ToAtVmuYrpeYUh3qh+TEp+08IWhpsrIflVHqQ1F1CiPxQGL7doCdBIOOCF+1Tm833faNg== +"@types/bcryptjs@^2.4.6": + version "2.4.6" + resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.6.tgz#2b92e3c2121c66eba3901e64faf8bb922ec291fa" + integrity sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ== + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + "@types/conventional-commits-parser@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#8c9d23e0b415b24b91626d07017303755d542dc8" @@ -1178,11 +1229,43 @@ dependencies: "@types/node" "*" +"@types/cors@^2.8.17": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/express-serve-static-core@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -1193,6 +1276,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jsonwebtoken@^9.0.7": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz#e49b96c2b29356ed462e9708fc73b833014727d2" + integrity sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg== + dependencies: + "@types/node" "*" + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + "@types/node@*": version "22.9.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.1.tgz#bdf91c36e0e7ecfb7257b2d75bf1b206b308ca71" @@ -1205,6 +1300,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@^22.10.1": + version "22.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + dependencies: + undici-types "~6.20.0" + "@types/node@^22.9.0", "@types/node@^22.9.1": version "22.9.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.3.tgz#08f3d64b3bc6d74b162d36f60213e8a6704ef2b4" @@ -1212,6 +1314,33 @@ dependencies: undici-types "~6.19.8" +"@types/qs@*": + version "6.9.17" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -1222,6 +1351,11 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@types/yauzl@^2.9.1": version "2.10.3" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" @@ -1244,6 +1378,21 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" +"@typescript-eslint/eslint-plugin@^8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz#ac56825bcdf3b392fc76a94b1315d4a162f201a6" + integrity sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.16.0" + "@typescript-eslint/type-utils" "8.16.0" + "@typescript-eslint/utils" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/parser@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.15.0.tgz#92610da2b3af702cfbc02a46e2a2daa6260a9045" @@ -1255,6 +1404,17 @@ "@typescript-eslint/visitor-keys" "8.15.0" debug "^4.3.4" +"@typescript-eslint/parser@^8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.16.0.tgz#ee5b2d6241c1ab3e2e53f03fd5a32d8e266d8e06" + integrity sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w== + dependencies: + "@typescript-eslint/scope-manager" "8.16.0" + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/typescript-estree" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + debug "^4.3.4" + "@typescript-eslint/scope-manager@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz#28a1a0f13038f382424f45a988961acaca38f7c6" @@ -1263,6 +1423,14 @@ "@typescript-eslint/types" "8.15.0" "@typescript-eslint/visitor-keys" "8.15.0" +"@typescript-eslint/scope-manager@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz#ebc9a3b399a69a6052f3d88174456dd399ef5905" + integrity sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg== + dependencies: + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + "@typescript-eslint/type-utils@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz#a6da0f93aef879a68cc66c73fe42256cb7426c72" @@ -1273,11 +1441,26 @@ debug "^4.3.4" ts-api-utils "^1.3.0" +"@typescript-eslint/type-utils@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz#585388735f7ac390f07c885845c3d185d1b64740" + integrity sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg== + dependencies: + "@typescript-eslint/typescript-estree" "8.16.0" + "@typescript-eslint/utils" "8.16.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.15.0.tgz#4958edf3d83e97f77005f794452e595aaf6430fc" integrity sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ== +"@typescript-eslint/types@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.16.0.tgz#49c92ae1b57942458ab83d9ec7ccab3005e64737" + integrity sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ== + "@typescript-eslint/typescript-estree@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz#915c94e387892b114a2a2cc0df2d7f19412c8ba7" @@ -1292,6 +1475,20 @@ semver "^7.6.0" ts-api-utils "^1.3.0" +"@typescript-eslint/typescript-estree@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz#9d741e56e5b13469b5190e763432ce5551a9300c" + integrity sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw== + dependencies: + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/visitor-keys" "8.16.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + "@typescript-eslint/utils@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.15.0.tgz#ac04679ad19252776b38b81954b8e5a65567cef6" @@ -1302,6 +1499,16 @@ "@typescript-eslint/types" "8.15.0" "@typescript-eslint/typescript-estree" "8.15.0" +"@typescript-eslint/utils@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.16.0.tgz#c71264c437157feaa97842809836254a6fc833c3" + integrity sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.16.0" + "@typescript-eslint/types" "8.16.0" + "@typescript-eslint/typescript-estree" "8.16.0" + "@typescript-eslint/visitor-keys@8.15.0": version "8.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz#9ea5a85eb25401d2aa74ec8a478af4e97899ea12" @@ -1310,6 +1517,14 @@ "@typescript-eslint/types" "8.15.0" eslint-visitor-keys "^4.2.0" +"@typescript-eslint/visitor-keys@8.16.0": + version "8.16.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz#d5086afc060b01ff7a4ecab8d49d13d5a7b07705" + integrity sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ== + dependencies: + "@typescript-eslint/types" "8.16.0" + eslint-visitor-keys "^4.2.0" + "@vitejs/plugin-vue@^5.1.4": version "5.2.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz#994f3b4f12d3590c5a6895df4cbd270d9a6d5e17" @@ -1620,6 +1835,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + 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" @@ -1627,7 +1847,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.2.1: +ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -1752,7 +1972,7 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async@^3.2.0: +async@^3.2.0, async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -2024,6 +2244,13 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -2031,16 +2258,45 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, 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== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^2.0.16: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2404,6 +2660,11 @@ dotenv@16.4.5, dotenv@^16.4.5: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -2434,6 +2695,16 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2777,6 +3048,46 @@ eslint@9.15.0, eslint@^9.14.0: natural-compare "^1.4.0" optionator "^0.9.3" +eslint@^9.16.0: + version "9.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.16.0.tgz#66832e66258922ac0a626f803a9273e37747f2a6" + integrity sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.9.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.16.0" + "@eslint/plugin-kit" "^0.2.3" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.5" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + espree@^10.0.1, espree@^10.3.0: version "10.3.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" @@ -3003,6 +3314,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3075,6 +3391,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" @@ -3087,6 +3408,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -3257,6 +3586,18 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" + integrity sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^4.0.1" + minimatch "^10.0.0" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^2.0.0" + global-directory@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" @@ -3288,7 +3629,7 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.11.0: +globals@^15.11.0, globals@^15.12.0: version "15.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-15.12.0.tgz#1811872883ad8f41055b61457a130221297de5b5" integrity sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ== @@ -3466,7 +3807,7 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -inherits@2.0.4: +inherits@2.0.4, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3508,6 +3849,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -3771,6 +4117,13 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +jackspeak@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.2.tgz#11f9468a3730c6ff6f56823a820d7e3be9bef015" + integrity sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw== + dependencies: + "@isaacs/cliui" "^8.0.2" + jiti@^1.21.6: version "1.21.6" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" @@ -3934,6 +4287,11 @@ kolorist@^1.8.0: resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -4085,6 +4443,23 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +lru-cache@^11.0.0: + version "11.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" + integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4174,6 +4549,13 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4193,6 +4575,11 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mitt@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" @@ -4359,6 +4746,13 @@ once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -4476,6 +4870,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + package-manager-detector@^0.2.0: version "0.2.4" resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-0.2.4.tgz#c541c3d45b0f5008135b0ee7dc0e5839f6d19439" @@ -4533,6 +4932,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580" + integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + path-to-regexp@0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" @@ -4651,6 +5058,11 @@ prettier@^3.3.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== +prettier@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.1.tgz#e211d451d6452db0a291672ca9154bc8c2579f7b" + integrity sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg== + pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -4746,6 +5158,15 @@ read-yaml-file@^1.1.0: pify "^4.0.1" strip-bom "^3.0.0" +readable-stream@^3.4.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + reflect.getprototypeof@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz#04311b33a1b713ca5eb7b5aed9950a86481858e5" @@ -4833,6 +5254,14 @@ rfdc@^1.3.0, rfdc@^1.4.1: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== +rimraf@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.0.1.tgz#ffb8ad8844dd60332ab15f52bc104bc3ed71ea4e" + integrity sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A== + dependencies: + glob "^11.0.0" + package-json-from-dist "^1.0.0" + rollup@^4.20.0: version "4.27.4" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.27.4.tgz#b23e4ef4fe4d0d87f5237dacf63f95a499503897" @@ -4889,7 +5318,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4903,6 +5332,11 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -5011,6 +5445,13 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sirv@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.0.tgz#f8d90fc528f65dff04cb597a88609d4e8a4361ce" @@ -5086,11 +5527,25 @@ sshpk@^1.18.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"string-width-cjs@npm:string-width@^4.2.0": + 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" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -5100,6 +5555,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -5128,6 +5592,20 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +"strip-ansi-cjs@npm: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-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" @@ -5135,6 +5613,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5204,6 +5689,11 @@ text-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + throttleit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" @@ -5272,6 +5762,11 @@ tree-kill@1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-api-utils@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" @@ -5432,6 +5927,11 @@ undici-types@~6.19.8: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + unicorn-magic@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" @@ -5472,7 +5972,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -5692,11 +6192,46 @@ which@^5.0.0: dependencies: isexe "^3.1.1" +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.9.0" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== +"wrap-ansi-cjs@npm: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" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -5715,6 +6250,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"