diff --git a/docker-compose.coolify.yaml b/docker-compose.coolify.yaml index d5bebe1..17ebc20 100644 --- a/docker-compose.coolify.yaml +++ b/docker-compose.coolify.yaml @@ -18,11 +18,23 @@ services: - "LOG_LEVEL=${LOG_LEVEL:-info}" - "APP_KEY=${APP_KEY}" - "SESSION_DRIVER=${SESSION_DRIVER:-cookie}" + - "REDIS_HOST=${REDIS_HOST:-valkey}" + - "REDIS_PORT=${REDIS_PORT:-6379}" + - "REDIS_PASSWORD=${REDIS_PASSWORD}" - "FROM_EMAIL=${FROM_EMAIL:-noreply@eneiconf.pt}" - "SMTP_HOST=${SMTP_HOST}" - "SMTP_PORT=${SMTP_PORT}" - "INERTIA_PUBLIC_TZ=${INERTIA_PUBLIC_TZ:-Europe/Lisbon}" - "INERTIA_PUBLIC_EVENT_COUNTDOWN_DATE=${INERTIA_PUBLIC_EVENT_COUNTDOWN_DATE:-2025-04-11}" + valkey: + image: valkey/valkey:8-alpine + command: ["valkey-server", "--save", "60", "1", "--loglevel", "warning"] + volumes: + - valkey-data:/data + environment: + - "VALKEY_EXTRA_FLAGS=${VALKEY_EXTRA_FLAGS}" + volumes: - website-tmp: \ No newline at end of file + website-tmp: + valkey-data: diff --git a/docker-compose.yaml b/docker-compose.yaml index ad65edf..64ae05b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,4 +4,15 @@ services: container_name: enei-mailpit ports: - "1025:1025" - - "8025:8025" \ No newline at end of file + - "8025:8025" + + valkey: + image: valkey/valkey:8-alpine + container_name: enei-valkey + volumes: + - valkey-data:/data + ports: + - "6379:6379" + +volumes: + valkey-data: \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f326000 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "enei", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/website/.env.example b/website/.env.example index 5c8995e..02d2b79 100644 --- a/website/.env.example +++ b/website/.env.example @@ -10,9 +10,17 @@ NODE_ENV=development # Public facing app environment variables APP_KEY= +# Payments +IFTHENPAY_MBWAY_KEY= + # Session SESSION_DRIVER=cookie +# Jobs +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD= + # E-mail FROM_EMAIL=noreply@eneiconf.pt REPLY_TO_EMAIL=geral@eneiconf.pt diff --git a/website/.gitignore b/website/.gitignore index 1c92932..d11cdee 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -24,3 +24,5 @@ yarn-error.log # Platform specific .DS_Store + +dump.rdb diff --git a/website/adonisrc.ts b/website/adonisrc.ts index e065fba..f5f6eb9 100644 --- a/website/adonisrc.ts +++ b/website/adonisrc.ts @@ -15,6 +15,7 @@ export default defineConfig({ () => import('@adonisjs/lucid/commands'), () => import('@adonisjs/mail/commands'), () => import('@tuyau/core/commands'), + () => import('adonisjs-jobs/commands'), ], /* @@ -43,6 +44,7 @@ export default defineConfig({ () => import('@adonisjs/lucid/database_provider'), () => import('@adonisjs/auth/auth_provider'), () => import('@adonisjs/inertia/inertia_provider'), + () => import('adonisjs-jobs/jobs_provider'), () => import('@adonisjs/mail/mail_provider'), () => import('@tuyau/core/tuyau_provider'), () => import('@adonisjs/ally/ally_provider'), diff --git a/website/app/controllers/orders_controller.ts b/website/app/controllers/orders_controller.ts new file mode 100644 index 0000000..7da90d0 --- /dev/null +++ b/website/app/controllers/orders_controller.ts @@ -0,0 +1,180 @@ +import type { HttpContext } from '@adonisjs/core/http' +import env from '#start/env' +import axios from 'axios' +import Order from '#models/order' +import User from '#models/user' +import OrderProduct from '#models/order_product' +import Product from '#models/product' +import ProductGroup from '#models/product_group' +import { createMBWayOrderValidator } from '#validators/order' +import UpdateOrderStatus from '../jobs/update_order_status.js' +export default class OrdersController { + index({ inertia }: HttpContext) { + return inertia.render('payments/index') + } + + public async createMBWay({ request, auth, response }: HttpContext) { + const authUser = auth.user + + try { + // Validate input format + await request.validateUsing(createMBWayOrderValidator) + + const { userId, products, name, nif, address, mobileNumber } = request.all() + + // Validate authentication + + if (!authUser || authUser.id !== userId) { + return response.status(401).json({ message: 'Não autorizado' }) + } + + // Validate user existence + + const user = await User.find(userId) + + if (!user) { + return response.status(404).json({ message: 'Utilizador não encontrado' }) + } + + let totalAmount = 0 + let description = '' + + const productDetails = [] + + for (const productItem of products) { + const { productId, quantity } = productItem + const product = await Product.find(productId) + + if (!product) { + return response + .status(404) + .json({ message: `Produto com id ${productId} não foi encontrado` }) + } + + const successfulOrdersOfGivenProduct = await OrderProduct.query() + .join('orders', 'order_products.order_id', 'orders.id') + .where('orders.user_id', userId) + .where('order_products.product_id', productId) + .where('orders.status', 'Success') + + + + const totalQuantity = successfulOrdersOfGivenProduct.reduce( + (acc, orderProduct) => acc + orderProduct.quantity, + 0 + ) + + if (product.stock < quantity) { + return response + .status(400) + .json({ message: `Não há mais stock do produto ${product.name}` }) + } + + if (quantity + totalQuantity > product.max_order) { + return response.status(400).json({ + message: `Apenas podes comprar ${product.max_order} do produto ${product.name}`, + }) + } + + const productGroup = await ProductGroup.find(product.productGroupId) + if(productGroup){ + + const sucessfulOrdersOfGivenGroup = await OrderProduct.query() + .join('orders', 'order_products.order_id', 'orders.id') + .join('products', 'order_products.product_id', 'products.id') + .where('orders.user_id', userId) + .where('products.product_group_id', product.productGroupId) + .where('orders.status', 'Success') + + + + const totalGroupQuantity = sucessfulOrdersOfGivenGroup.reduce( + (acc, orderProduct) => acc + orderProduct.quantity, + 0 + ) + + if (totalGroupQuantity + quantity > productGroup.maxAmountPerGroup) { + return response.status(400).json({ + message: `Apenas podes comprar ${productGroup?.maxAmountPerGroup} produtos do grupo ${productGroup.name}`, + }) + + } + } + productDetails.push({ product, quantity }) + totalAmount += product.price * quantity + description += `${product.name} x${quantity}, ` + } + + description = `Payment for order: ${description.slice(0, -2)}` + + // Create the order and associated products + const order = await Order.create({ userId, name, nif, address }) + + for (const { product, quantity } of productDetails) { + await OrderProduct.create({ + orderId: order.id, + productId: product.id, + quantity, + }) + } + + // Prepare payment data + + const data = { + mbWayKey: env.get('IFTHENPAY_MBWAY_KEY'), + orderId: order.id, + amount: totalAmount.toFixed(2), + mobileNumber, + description, + } + + // Call payment API + + const apiResponse = await axios.post('https://api.ifthenpay.com/spg/payment/mbway', data) + + if (apiResponse.status === 200) { + const responseData = apiResponse.data + order.requestId = responseData.RequestId + order.status = 'Pending' + order.total = totalAmount + await order.save() + + // Dispatch background job to update order status + + await UpdateOrderStatus.dispatch( + { requestId: order.requestId, email: authUser.email }, + { delay: 10000 } + ).catch((error) => { + console.error('Error dispatching job', error) + }) + + return response.status(200).json({ + order, + message: 'Payment initiated successfully', + }) + } else { + return response.status(500).json({ message: 'Failed to initiate payment' }) + } + } catch (error) { + console.error(error) + return response.status(500).json({ + message: 'An error occurred while initiating the payment', + }) + } + } + + public async show({ inertia, params, auth, response }: HttpContext) { + const authUser = auth.user + if (!authUser) { + return response.status(401).json({ + message: 'Unauthorized', + }) + } + + const order = await Order.find(params.id) + if (!order || (order.userId !== authUser.id)) { + return response.notFound({ message: 'Order not found' }) + } + return inertia.render('payments/show', { order }) + } +} diff --git a/website/app/controllers/tickets_controller.ts b/website/app/controllers/tickets_controller.ts index 1a3a5be..bf10fbb 100644 --- a/website/app/controllers/tickets_controller.ts +++ b/website/app/controllers/tickets_controller.ts @@ -1,10 +1,15 @@ -import Ticket from '#models/ticket' +import Product from '#models/product' import type { HttpContext } from '@adonisjs/core/http' - export default class TicketsController { async index({ inertia }: HttpContext) { - const ticketTypes = await Ticket.all() + const ticketTypes = await Product.all() return inertia.render('tickets', { ticketTypes }) } + + async showPayment({ inertia, auth, params }: HttpContext) { + const ticket = await Product.find(params.id) + + return inertia.render('payments/index', { ticket, user: auth.user }) + } } diff --git a/website/app/jobs/update_order_status.ts b/website/app/jobs/update_order_status.ts new file mode 100644 index 0000000..140a936 --- /dev/null +++ b/website/app/jobs/update_order_status.ts @@ -0,0 +1,74 @@ +import axios from 'axios' +import Order from '#models/order' +import env from '#start/env' +import { Job } from 'adonisjs-jobs' +import ConfirmPaymentNotification from '#mails/confirm_payment_notification' +import mail from '@adonisjs/mail/services/main' +import db from '@adonisjs/lucid/services/db' + +type UpdateOrderStatusPayload = { + requestId: string + email: string +} + +export default class UpdateOrderStatus extends Job { + async handle({ requestId, email }: UpdateOrderStatusPayload) { + try { + + this.logger.info(`Processing status update for requestId: ${requestId}`) + + // Fetch the order based on the requestId + const order = await Order.query().where('request_id', requestId).first() + if (!order) { + this.logger.error(`Order with requestId ${requestId} not found`) + console.error(`Order with requestId ${requestId} not found`) + return + } + + if (order.status !== 'Pending') { + this.logger.info(`Order status is no longer pending: ${order.status}`) + return // Exit if the status is no longer "Pending" + } + const apiResponse = await axios.get( + `https://api.ifthenpay.com/spg/payment/mbway/status?mbWayKey=${env.get('IFTHENPAY_MBWAY_KEY')}&requestId=${requestId}` + ) + + if (apiResponse.status === 200) { + const status = apiResponse.data.Message + if (status) { + if (status === 'Pending') { + await UpdateOrderStatus.dispatch({ requestId, email }, { delay: 10000 }) // Retry after 5 seconds + this.logger.info(`Requeued job for requestId: ${requestId}`) + return + } + order.status = status + await order.save() + this.logger.info(`Order status updated to: ${order.status}`) + if (order.status === 'Success') { + this.logger.info(`Gonna send mail: ${order.status}`) + const products = await db + .from('products') + .join('order_products', 'products.id', 'order_products.product_id') + .where('order_products.order_id', order.id) + .select('products.*', 'order_products.quantity as quantity') + + const total = order.total + const orderId = order.id + await mail.send(new ConfirmPaymentNotification(email, products, total, orderId)) + } + } else { + await UpdateOrderStatus.dispatch({ requestId, email }, { delay: 10000 }) // Retry after 5 seconds + } + } else { + this.logger.error(`Failed to fetch payment status for requestId: ${requestId}`) + console.error(`Failed to fetch payment status for requestId: ${requestId}`) + await UpdateOrderStatus.dispatch({ requestId, email }, { delay: 10000 }) // Retry after 5 seconds + } + } catch (error) { + this.logger.error(`Error updating order status: ${error.message}`) + console.error(`Error updating order status: ${error.message}`) + + await UpdateOrderStatus.dispatch({ requestId, email }, { delay: 10000 }) + } + } +} diff --git a/website/app/mails/confirm_payment_notification.ts b/website/app/mails/confirm_payment_notification.ts new file mode 100644 index 0000000..1fc66f8 --- /dev/null +++ b/website/app/mails/confirm_payment_notification.ts @@ -0,0 +1,36 @@ +import env from '#start/env' +import { ReactNotification } from './base/react_notification.js' +import type { ProductWithQuantity, MailProps } from '#resources/emails/payment/confirm_purchase_email' +import { staticUrl } from '../url.js' + +export default class ConfirmPaymentNotification extends ReactNotification { + private userEmail: string + private products: ProductWithQuantity[] + private total: number + private orderId: number + from = env.get('FROM_EMAIL') + subject = 'Your Payment was completed with Success' + + constructor(userEmail: string, products: ProductWithQuantity[], total: number, orderId: number) { + super() + this.userEmail = userEmail + this.products = products + this.total = total + this.orderId = orderId + } + + get props(): MailProps { + return { + logoUrl: staticUrl('/images/logo-white.png'), + userEmail: this.userEmail, + products: this.products, + total: this.total, + orderId: this.orderId, + } + } + + async prepare() { + this.message.to(this.userEmail) + await this.jsx(() => import('#resources/emails/payment/confirm_purchase_email'), this.props) + } +} diff --git a/website/app/models/order.ts b/website/app/models/order.ts new file mode 100644 index 0000000..fbab305 --- /dev/null +++ b/website/app/models/order.ts @@ -0,0 +1,34 @@ +import { DateTime } from 'luxon' +import { BaseModel, column } from '@adonisjs/lucid/orm' + +export default class Order extends BaseModel { + @column({ isPrimary: true }) + declare id: number + + @column() + declare requestId: string + + @column() + declare userId: number + + @column() + declare name: string + + @column() + declare nif: number + + @column() + declare address: string + + @column() + declare status: string + + @column() + declare total: number + + @column.dateTime({ autoCreate: true }) + declare createdAt: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + declare updatedAt: DateTime +} diff --git a/website/app/models/ticket.ts b/website/app/models/order_product.ts similarity index 60% rename from website/app/models/ticket.ts rename to website/app/models/order_product.ts index 049af34..a07b174 100644 --- a/website/app/models/ticket.ts +++ b/website/app/models/order_product.ts @@ -1,25 +1,22 @@ import { DateTime } from 'luxon' import { BaseModel, column } from '@adonisjs/lucid/orm' -export default class Ticket extends BaseModel { +export default class OrderProduct extends BaseModel { @column({ isPrimary: true }) declare id: number @column() - declare name: string | null + declare orderId: number @column() - declare description: string + declare productId: number @column() - declare price: number - - @column() - declare stock: number + declare quantity: number @column.dateTime({ autoCreate: true }) declare createdAt: DateTime @column.dateTime({ autoCreate: true, autoUpdate: true }) - declare updatedAt: DateTime | null + declare updatedAt: DateTime } diff --git a/website/app/models/product.ts b/website/app/models/product.ts new file mode 100644 index 0000000..2993789 --- /dev/null +++ b/website/app/models/product.ts @@ -0,0 +1,37 @@ +import { DateTime } from 'luxon' +import { BaseModel, column } from '@adonisjs/lucid/orm' + +export default class Product extends BaseModel { + @column({ isPrimary: true }) + declare id: number + + @column() + declare name: string + + @column() + declare description: string + + @column() + declare price: number + + @column() + declare stock: number + + @column() + declare currency: string + + @column() + declare max_order: number + + @column() + declare image: string + + @column() + declare productGroupId: number + + @column.dateTime({ autoCreate: true }) + declare createdAt: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + declare updatedAt: DateTime +} diff --git a/website/app/models/product_group.ts b/website/app/models/product_group.ts new file mode 100644 index 0000000..46c6d97 --- /dev/null +++ b/website/app/models/product_group.ts @@ -0,0 +1,19 @@ +import { DateTime } from 'luxon' +import { BaseModel, column} from '@adonisjs/lucid/orm' + +export default class ProductGroup extends BaseModel { + @column({ isPrimary: true }) + declare id: number + + @column() + declare name: string + + @column() + declare maxAmountPerGroup: number + + @column.dateTime({ autoCreate: true }) + declare createdAt: DateTime + + @column.dateTime({ autoCreate: true, autoUpdate: true }) + declare updatedAt: DateTime +} diff --git a/website/app/validators/order.ts b/website/app/validators/order.ts new file mode 100644 index 0000000..175f7d0 --- /dev/null +++ b/website/app/validators/order.ts @@ -0,0 +1,16 @@ +import vine from '@vinejs/vine' + +export const createMBWayOrderValidator = vine.compile( + vine.object({ + userId: vine.number(), + products: vine.array( + vine.object({ + productId: vine.number(), + quantity: vine.number(), + }) + ), + nif: vine.string().optional(), + address: vine.string().optional(), + mobileNumber: vine.string(), + }) +) diff --git a/website/config/database.ts b/website/config/database.ts index a38e7c9..cc8830c 100644 --- a/website/config/database.ts +++ b/website/config/database.ts @@ -15,7 +15,7 @@ const dbConfig = defineConfig({ migrations: { naturalSort: true, paths: ['database/migrations'], - }, + }, }, }, }) diff --git a/website/config/jobs.ts b/website/config/jobs.ts new file mode 100644 index 0000000..f9b9c1f --- /dev/null +++ b/website/config/jobs.ts @@ -0,0 +1,49 @@ +import env from '#start/env' +import { defineConfig } from 'adonisjs-jobs' + +const jobsConfig = defineConfig({ + connection: { + host: env.get('REDIS_HOST', 'localhost'), + port: env.get('REDIS_PORT', 6379), + password: env.get('REDIS_PASSWORD'), + }, + + queue: env.get('REDIS_QUEUE', 'default'), + + queues: ['default'], + + options: { + /** + * The total number of attempts to try the job until it completes. + */ + attempts: 0, + + /** + * Backoff setting for automatic retries if the job fails + */ + backoff: { + type: 'exponential', + delay: 5000, + }, + + /** + * If true, removes the job when it successfully completes + * When given a number, it specifies the maximum amount of + * jobs to keep, or you can provide an object specifying max + * age and/or count to keep. It overrides whatever setting is used in the worker. + * Default behavior is to keep the job in the completed set. + */ + removeOnComplete: 1000, + + /** + * If true, removes the job when it fails after all attempts. + * When given a number, it specifies the maximum amount of + * jobs to keep, or you can provide an object specifying max + * age and/or count to keep. It overrides whatever setting is used in the worker. + * Default behavior is to keep the job in the failed set. + */ + removeOnFail: 1000, + }, +}) + +export default jobsConfig diff --git a/website/database/migrations/1734776375676_create_products_table.ts b/website/database/migrations/1734776375676_create_products_table.ts new file mode 100644 index 0000000..cfa141c --- /dev/null +++ b/website/database/migrations/1734776375676_create_products_table.ts @@ -0,0 +1,26 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'products' + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments('id') + table.string('name').notNullable() + table.text('description').notNullable() + table.float('price').notNullable() + table.integer('stock').notNullable() + table.integer('max_order').notNullable() + table.string('currency').notNullable() + table.string('image').notNullable + table.integer('product_group_id').unsigned().references('id').inTable('product_groups').onDelete('CASCADE') + + table.timestamp('created_at') + table.timestamp('updated_at') + }) + } + + async down() { + this.schema.dropTable(this.tableName) + } +} diff --git a/website/database/migrations/1734798835308_create_tickets_table.ts b/website/database/migrations/1734776385300_create_orders_table.ts similarity index 57% rename from website/database/migrations/1734798835308_create_tickets_table.ts rename to website/database/migrations/1734776385300_create_orders_table.ts index f6ddda6..ac30c82 100644 --- a/website/database/migrations/1734798835308_create_tickets_table.ts +++ b/website/database/migrations/1734776385300_create_orders_table.ts @@ -1,15 +1,18 @@ import { BaseSchema } from '@adonisjs/lucid/schema' export default class extends BaseSchema { - protected tableName = 'tickets' + protected tableName = 'orders' async up() { this.schema.createTable(this.tableName, (table) => { table.increments('id') - table.string('name').nullable() - table.text('description') - table.float('price').notNullable() - table.integer('stock').notNullable() + table.integer('request_id') + table.string('status') + table.integer('user_id').notNullable() + table.string('name') + table.integer('nif') + table.string('address') + table.float('total') table.timestamp('created_at') table.timestamp('updated_at') }) diff --git a/website/database/migrations/1734977097919_create_order_products_table.ts b/website/database/migrations/1734977097919_create_order_products_table.ts new file mode 100644 index 0000000..d84cb8f --- /dev/null +++ b/website/database/migrations/1734977097919_create_order_products_table.ts @@ -0,0 +1,25 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'order_products' + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments('id') + table.integer('order_id').unsigned().references('id').inTable('orders').onDelete('CASCADE') + table + .integer('product_id') + .unsigned() + .references('id') + .inTable('products') + .onDelete('CASCADE') + table.integer('quantity').notNullable() + table.timestamp('created_at') + table.timestamp('updated_at') + }) + } + + async down() { + this.schema.dropTable(this.tableName) + } +} diff --git a/website/database/migrations/1738369888855_create_create_product_groups_table.ts b/website/database/migrations/1738369888855_create_create_product_groups_table.ts new file mode 100644 index 0000000..281a410 --- /dev/null +++ b/website/database/migrations/1738369888855_create_create_product_groups_table.ts @@ -0,0 +1,19 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'product_groups' + + public async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments('id').primary() + table.string('name').notNullable().unique() + table.integer('max_amount_per_group').notNullable() + table.timestamp('created_at', { useTz: true }).defaultTo(this.now()) + table.timestamp('updated_at', { useTz: true }).defaultTo(this.now()) + }) + } + + public async down() { + this.schema.dropTable(this.tableName) + } +} diff --git a/website/database/seeders/0_product_group_seeder.ts b/website/database/seeders/0_product_group_seeder.ts new file mode 100644 index 0000000..1d43392 --- /dev/null +++ b/website/database/seeders/0_product_group_seeder.ts @@ -0,0 +1,13 @@ + +import { BaseSeeder } from '@adonisjs/lucid/seeders' +import ProductGroup from '#models/product_group' +export default class ProductGroupSeeder extends BaseSeeder { + public async run() { + await ProductGroup.createMany([ + { + name: 'Tickets', + maxAmountPerGroup: 1, + }, + ]) + } +} diff --git a/website/database/seeders/1_product_seeder.ts b/website/database/seeders/1_product_seeder.ts new file mode 100644 index 0000000..eea7255 --- /dev/null +++ b/website/database/seeders/1_product_seeder.ts @@ -0,0 +1,28 @@ +import { BaseSeeder } from '@adonisjs/lucid/seeders' +import Product from '#models/product' +export default class ProductSeeder extends BaseSeeder { + public async run() { + await Product.create({ + name: 'Bilhete - Com Alojamento', + description: + 'Inclui:
• Pequenos-almoços, almoços e jantares durante o período do evento
• Acesso a coffee breaks e sessão de cocktails
• Acesso a workshops, palestras e outros
• Acesso a festas noturnas e outras atividades recreativas (exceto Rally Tascas)
• Alojamento em Pavilhão', + price: 0.01, + stock: 100, + currency: 'EUR', + max_order: 1, + productGroupId: 1, + image: '/favicon.svg', + }) + await Product.create({ + name: 'Bilhete - Sem Alojamento', + description: + 'Inclui:
• Pequenos-almoços, almoços e jantares durante o período do evento
• Acesso a coffee breaks e sessão de cocktails
• Acesso a workshops, palestras e outros
• Acesso a festas noturnas e outras atividades recreativas (exceto Rally Tascas)', + price: 0.01, + stock: 50, + currency: 'EUR', + max_order: 1, + productGroupId: 1, + image: '/favicon.svg', + }) + } +} diff --git a/website/database/seeders/2_order_seeder.ts b/website/database/seeders/2_order_seeder.ts new file mode 100644 index 0000000..9764c7c --- /dev/null +++ b/website/database/seeders/2_order_seeder.ts @@ -0,0 +1,18 @@ +import { BaseSeeder } from '@adonisjs/lucid/seeders' +import Order from '#models/order' +export default class OrderSeeder extends BaseSeeder { + async run() { + await Order.createMany([ + { + requestId: '1', + userId: 2, + nif: 123456789, + name: 'João', + address: 'Rua do Ouro, 1000-001 Lisboa', + status: 'Success', + total: 1, + }, + ]) + + } +} \ No newline at end of file diff --git a/website/database/seeders/3_order_product_seeder.ts b/website/database/seeders/3_order_product_seeder.ts new file mode 100644 index 0000000..72fd42d --- /dev/null +++ b/website/database/seeders/3_order_product_seeder.ts @@ -0,0 +1,15 @@ +import { BaseSeeder } from '@adonisjs/lucid/seeders' +import OrderProduct from '#models/order_product' +export default class OrderProductSeeder extends BaseSeeder { + async run() { + await OrderProduct.createMany([ + { + orderId: 1, + productId: 1, + quantity: 1, + + }, + ]) + + } +} \ No newline at end of file diff --git a/website/database/seeders/ticket_seeder.ts b/website/database/seeders/ticket_seeder.ts deleted file mode 100644 index 6e8e514..0000000 --- a/website/database/seeders/ticket_seeder.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BaseSeeder } from '@adonisjs/lucid/seeders' -import Ticket from '#models/ticket' - -export default class extends BaseSeeder { - async run() { - await Ticket.createMany([ - { - name: 'Bilhete - Com Alojamento', - description: - 'Inclui:\n• Pequenos-almoços, almoços e jantares durante o período do evento\n• Acesso a coffee breaks e sessão de cocktails\n• Acesso a workshops, palestras e outros\n• Acesso a festas noturnas e outras atividades recreativas (exceto Rally Tascas) \n• Alojamento em Pavilhão', - price: 35, - stock: 150, - }, - { - name: 'Bilhete - Sem Alojamento', - description: - 'Inclui:\n• Pequenos-almoços, almoços e jantares durante o período do evento\n• Acesso a coffee breaks e sessão de cocktails\n• Acesso a workshops, palestras e outros\n• Acesso a festas noturnas e outras atividades recreativas (exceto Rally Tascas)', - price: 30, - stock: 50, - }, - ]) - } -} diff --git a/website/ecosystem.config.cjs b/website/ecosystem.config.cjs index 3630640..373d96e 100644 --- a/website/ecosystem.config.cjs +++ b/website/ecosystem.config.cjs @@ -7,5 +7,11 @@ module.exports = { exec_mode: 'cluster', autorestart: true, }, + { + name: 'enei-jobs', + script: './ace.js', + args: 'jobs:listen', + autorestart: true, + }, ], } diff --git a/website/inertia/components/common/navbar.tsx b/website/inertia/components/common/navbar.tsx index 1d6aa8f..95048b7 100644 --- a/website/inertia/components/common/navbar.tsx +++ b/website/inertia/components/common/navbar.tsx @@ -69,11 +69,16 @@ export function Navbar({ className }: { className?: string }) { Logótipo do ENEI Ir para a página inicial +
+ + Tickets + {auth.state === 'authenticated' ? ( ) : ( auth.state === 'unauthenticated' && )} +
diff --git a/website/inertia/components/common/page.tsx b/website/inertia/components/common/page.tsx index 96f882a..687d6df 100644 --- a/website/inertia/components/common/page.tsx +++ b/website/inertia/components/common/page.tsx @@ -2,7 +2,7 @@ import { Head } from '@inertiajs/react' import React from 'react' import { cn } from '~/lib/utils' import { Navbar } from './navbar' - +import {Toaster} from '~/components/ui/toaster' export default function Page({ title, className, @@ -16,6 +16,7 @@ export default function Page({
+ {children}
diff --git a/website/inertia/components/payments/billing_information_form.tsx b/website/inertia/components/payments/billing_information_form.tsx new file mode 100644 index 0000000..bc6c647 --- /dev/null +++ b/website/inertia/components/payments/billing_information_form.tsx @@ -0,0 +1,73 @@ +import { Checkbox } from '~/components/ui/checkbox' +import { Label } from '~/components/ui/label' +import { Input } from '~/components/ui/input' + +interface BillingInformationFormProps { + enableBillingInfo: boolean + setEnableBillingInfo: (checked: boolean) => void + billingInfo: { + name: string + vat: string + address: string + } + onBillingInfoChange: (field: string, value: string) => void +} + +export default function BillingInformationForm({ + enableBillingInfo, + setEnableBillingInfo, + billingInfo, + onBillingInfoChange, +}: BillingInformationFormProps) { + const handleInputChange = (key: string) => (event: React.ChangeEvent) => { + onBillingInfoChange(key, event.target.value) + } + return ( +
+ {/* Checkbox */} +

2. Dados de faturação

+
+ setEnableBillingInfo(checked as boolean)} + /> + +
+ + {/* Billing information form */} +
+
+ + +
+
+ + +
+
+ + +
+
+
+ ) +} diff --git a/website/inertia/components/payments/order_confirmation_modal.tsx b/website/inertia/components/payments/order_confirmation_modal.tsx new file mode 100644 index 0000000..eab5d62 --- /dev/null +++ b/website/inertia/components/payments/order_confirmation_modal.tsx @@ -0,0 +1,36 @@ +import { + Dialog, + DialogContent, + DialogTitle, + DialogHeader, + DialogFooter, + DialogDescription, +} from '~/components/ui/dialog' +import { Button } from '~/components/ui/button' + +interface OrderConfirmationModalProps { + isOpen: boolean + onClose: () => void +} + +function OrderConfirmationModal({ isOpen, onClose }: OrderConfirmationModalProps) { + return ( + + + + Confirmação de Pedido + + + Após realizares o pagamento, irás receber um email de confirmação. + + + + + + + ) +} + +export default OrderConfirmationModal diff --git a/website/inertia/components/payments/payment_method_selector.tsx b/website/inertia/components/payments/payment_method_selector.tsx new file mode 100644 index 0000000..848025b --- /dev/null +++ b/website/inertia/components/payments/payment_method_selector.tsx @@ -0,0 +1,38 @@ +import { RadioGroup, RadioGroupItem } from '~/components/ui/radio-group' +import { Label } from '~/components/ui/label' + +interface PaymentMethodSelectorProps { + paymentMethod: string + setPaymentMethod: (method: string) => void +} + +export default function PaymentMethodSelector({ + paymentMethod, + setPaymentMethod, +}: PaymentMethodSelectorProps) { + return ( +
+

3. Método de pagamento

+ +
+ + +
+ {/* +
+ + +
+ */} +
+
+ ) +} diff --git a/website/inertia/components/payments/phone_modal.tsx b/website/inertia/components/payments/phone_modal.tsx new file mode 100644 index 0000000..ff3a599 --- /dev/null +++ b/website/inertia/components/payments/phone_modal.tsx @@ -0,0 +1,71 @@ +import { + Dialog, + DialogContent, + DialogTitle, + DialogHeader, + DialogFooter, + DialogDescription, +} from '~/components/ui/dialog' +import { Button } from '~/components/ui/button' +import { useState } from 'react' +import { PhoneInput } from '~/components/ui/phone-input' +import { Loader2 } from 'lucide-react' + +interface PhoneNumberModalProps { + isOpen: boolean + isLoading: boolean + onClose: () => void + onSubmit: (phoneNumber: string) => void +} + +function PhoneNumberModal({ isOpen, isLoading, onClose, onSubmit }: PhoneNumberModalProps) { + const [phoneNumber, setPhoneNumber] = useState('') + const [error, setError] = useState('') + + function handleSubmit() { + // TODO improve this validation + if (!phoneNumber || phoneNumber.length < 9 || phoneNumber.length > 16) { + setError('Por favor, insere um número de telemóvel válido') + return + } + setError('') + onSubmit(phoneNumber) + } + + if (!isOpen) { + return null + } + + return ( + + + + Confirmação + + Por favor, insire o teu número de telemóvel: + { + setPhoneNumber(value || '') + setError('') + }} + value={phoneNumber} + placeholder="Número de telemóvel" + /> + {error &&

{error}

} + + + + +
+
+ ) +} + +export default PhoneNumberModal diff --git a/website/inertia/components/payments/purchase_summary.tsx b/website/inertia/components/payments/purchase_summary.tsx new file mode 100644 index 0000000..71a136c --- /dev/null +++ b/website/inertia/components/payments/purchase_summary.tsx @@ -0,0 +1,31 @@ +interface PurchaseSummaryProps { + item: { + name: string + description: string + price: number + image: string + } +} + +export default function PurchaseSummary({ item }: PurchaseSummaryProps) { + return ( +
+

1. Revê a tua compra

+
+ {item.name} +
+

{item.name}

+
+

{item.price.toFixed(2)}€

+
+
+
+ ) +} diff --git a/website/inertia/components/payments/ticket_cart_card.tsx b/website/inertia/components/payments/ticket_cart_card.tsx new file mode 100644 index 0000000..a93a4af --- /dev/null +++ b/website/inertia/components/payments/ticket_cart_card.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import { Card, CardTitle, CardDescription, CardContent } from '~/components/ui/card' + +interface TicketCartCardProps { + title: string + description: string + price: number +} + +export const TicketCartCard: React.FC = ({ title, description, price }) => { + return ( + // for small screens, limit the max width, otherwise, use the full width + + +
+ Item +
+ {title} + {description} +
+ {price}€ +
+
+
+ ) +} diff --git a/website/inertia/pages/payments/index.tsx b/website/inertia/pages/payments/index.tsx new file mode 100644 index 0000000..779e970 --- /dev/null +++ b/website/inertia/pages/payments/index.tsx @@ -0,0 +1,140 @@ +'use client' +import { router } from '@inertiajs/react' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' +import { Button } from '~/components/ui/button' +import { Separator } from '~/components/ui/separator' +import { useState, useEffect } from 'react' +import { InferPageProps } from '@adonisjs/inertia/types' +import TicketsController from '#controllers/tickets_controller' +import PhoneNumberModal from '~/components/payments/phone_modal' +import OrderConfirmationModal from '~/components/payments/order_confirmation_modal' +import PurchaseSummary from '~/components/payments/purchase_summary' +import BillingInformationForm from '~/components/payments/billing_information_form' +import Page from '~/components/common/page' +import axios from 'axios' +import { useToast } from '~/hooks/use_toast' + +interface Ticket { + id: number + name: string + description: string + price: number + image: string +} + +interface User { + id: number +} + +export default function TicketSalePage( + props: InferPageProps & { ticket: Ticket; user: User } +) { + const [enableBillingInfo, setEnableBillingInfo] = useState(false) + const [phoneModalOpen, setPhoneModalOpen] = useState(false) + const [orderConfirmationModalOpen, setOrderConfirmationModalOpen] = useState(false) + const [phoneModalIsLoading, setPhoneModalIsLoading] = useState(false) + const [billingInfo, setBillingInfo] = useState({ + name: '', + vat: '', + address: '', + }) + const item = props.ticket + const { toast } = useToast() + + // Clear billing info when the component mounts (to prevent stale data) + useEffect(() => { + setBillingInfo({ + name: '', + vat: '', + address: '', + }) + }, []) + + // Handles the payment button click. If the payment method is MB Way, it opens the phone modal, otherwise it processes the payment + const handlePaymentClick = () => { + setPhoneModalOpen(true) + } + + // Closes the modal (if open) and processes the payment + const handleModalSubmit = async (number: string) => { + setPhoneModalIsLoading(true) + + if (phoneModalOpen && !number) { + return + } + try { + await axios.post('/payment/mbway', { + userId: props.user.id, + products: [{ productId: item.id, quantity: 1 }], + name: enableBillingInfo ? billingInfo.name : null, + nif: enableBillingInfo ? billingInfo.vat : null, + address: enableBillingInfo ? billingInfo.address : null, + mobileNumber: number, + }) + setPhoneModalIsLoading(false) + setPhoneModalOpen(false) + setOrderConfirmationModalOpen(true) + } catch (error) { + setPhoneModalIsLoading(false) + setPhoneModalOpen(false) + toast({ + title: 'Erro a processar o pagamento', + description: + error.response?.data?.message || + 'Ocorreu um erro ao processar o pagamento. Por favor, tenta novamente.', + duration: 5000, + }) + } + } + + // Updates the billing information when the user types + const handleBillingInfoChange = (key: string, value: string) => { + setBillingInfo({ + ...billingInfo, + [key]: value, + }) + } + + return ( + +
+ + + Completa a tua compra + Revê o teu bilhete e procede para o pagamento + + + {item ? :

Loading ticket details...

} + + + + + + + setPhoneModalOpen(false)} + onSubmit={handleModalSubmit} + /> + + { + router.visit('/tickets') + }} + /> +
+
+
+
+ ) +} diff --git a/website/inertia/pages/payments/show.tsx b/website/inertia/pages/payments/show.tsx new file mode 100644 index 0000000..4c7fcf9 --- /dev/null +++ b/website/inertia/pages/payments/show.tsx @@ -0,0 +1,58 @@ +'use client' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' +import { InferPageProps } from '@adonisjs/inertia/types' +import OrdersController from '#controllers/orders_controller' +import Page from '~/components/common/page' +interface Order { + id: number + requestId: string + userId: number + nif: number + address: string + status: string + total: number + createdAt: string + updatedAt: string +} + +export default function TicketSalePage(props: InferPageProps & { order: Order }) { + const { order } = props + + return ( + +
+ + + Order Details + Information about your order + + +
+
+ Order ID: {order.id} +
+ {order.nif !== null && ( +
+ NIF: {order.nif} +
+ )} + {order.address !== null &&
+ Address: {order.address} +
} + +
+ Status: {order.status} +
+
+ Total: ${order.total.toFixed(2)} +
+
+ Created: {new Date(order.createdAt).toLocaleString()} +
+
+
+
+
+
+ ) +} diff --git a/website/inertia/pages/tickets.tsx b/website/inertia/pages/tickets.tsx index 8879377..fb71c47 100644 --- a/website/inertia/pages/tickets.tsx +++ b/website/inertia/pages/tickets.tsx @@ -1,29 +1,33 @@ 'use client' -import type { InferPageProps } from '@adonisjs/inertia/types' -import { Link } from '@tuyau/inertia/react' +import { InferPageProps } from '@adonisjs/inertia/types' import { Card, CardDescription, CardHeader, CardTitle } from '~/components/ui/card' import TicketsController from '#controllers/tickets_controller' - +import { Link } from '@inertiajs/react' +import Page from '~/components/common/page' export default function SelectTicketsPage(props: InferPageProps) { const imageSrc = `favicon.svg` return ( -
-

Seleciona o teu bilhete

-

+ +

+

Seleciona o teu bilhete

+

Seleciona o teu bilhete e clica em comprar para continuar.

{props.ticketTypes.map((ticket) => ( - +
{ticket.name} - {ticket.description} +

{ticket.price}€

@@ -34,5 +38,6 @@ export default function SelectTicketsPage(props: InferPageProps
+ ) } diff --git a/website/package.json b/website/package.json index 17f5e0c..d3b642e 100644 --- a/website/package.json +++ b/website/package.json @@ -44,6 +44,7 @@ "@japa/assert": "^4.0.1", "@japa/plugin-adonisjs": "^4.0.0", "@japa/runner": "^4.1.0", + "@svgr/core": "^8.1.0", "@swc/core": "1.10.9", "@types/luxon": "^3.4.2", "@types/node": "^22.10.10", @@ -118,15 +119,21 @@ "@tuyau/inertia": "^0.0.9", "@tuyau/utils": "^0.0.6", "@vinejs/vine": "^3.0.0", + "adonisjs-jobs": "^0.0.21", + "axios": "^1.7.9", "better-sqlite3": "^11.8.1", + "bull": "^4.16.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.0.4", "date-fns": "^4.1.0", - "edge.js": "^6.2.1", - "embla-carousel-react": "^8.5.2", - "input-otp": "^1.4.2", - "lucide-react": "^0.473.0", + "edge.js": "^6.2.0", + "embla-carousel-react": "^8.5.1", + "framer-motion": "^11.15.0", + "ifthenpay": "^0.3.4", + "input-otp": "^1.4.1", + "leaflet-geosearch": "^4.0.0", + "lucide-react": "^0.468.0", "luxon": "^3.5.0", "next-themes": "^0.4.4", "pm2": "^5.4.3", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 1802ed2..cd2689b 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 5.0.2(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)) '@adonisjs/auth': specifier: ^9.3.1 - version: 9.3.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/lucid@21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@japa/plugin-adonisjs@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.1.0)) + version: 9.3.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/lucid@21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@japa/plugin-adonisjs@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.2.0)) '@adonisjs/core': specifier: ^6.17.1 version: 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) @@ -25,7 +25,7 @@ importers: version: 2.2.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)) '@adonisjs/inertia': specifier: ^3.0.1 - version: 3.0.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@adonisjs/vite@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)))(edge.js@6.2.1) + version: 3.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@adonisjs/vite@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)))(edge.js@6.2.1) '@adonisjs/limiter': specifier: ^2.3.3 version: 2.3.3(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/lucid@21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))) @@ -34,7 +34,7 @@ importers: version: 21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0) '@adonisjs/mail': specifier: ^9.2.2 - version: 9.2.2(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@aws-sdk/client-ses@3.734.0)(@types/luxon@3.4.2)(@types/node@22.10.10)(dayjs@1.11.13)(edge.js@6.2.1)(luxon@3.5.0) + version: 9.2.2(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@aws-sdk/client-ses@3.734.0)(@types/luxon@3.4.2)(@types/node@22.12.0)(dayjs@1.11.13)(edge.js@6.2.1)(luxon@3.5.0) '@adonisjs/redis': specifier: ^9.1.0 version: 9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)) @@ -49,7 +49,7 @@ importers: version: 1.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)) '@adonisjs/vite': specifier: ^4.0.0 - version: 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)) + version: 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)) '@aws-sdk/client-ses': specifier: ^3.734.0 version: 3.734.0 @@ -164,9 +164,18 @@ importers: '@vinejs/vine': specifier: ^3.0.0 version: 3.0.0 + adonisjs-jobs: + specifier: ^0.0.21 + version: 0.0.21(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)) + axios: + specifier: ^1.7.9 + version: 1.7.9 better-sqlite3: specifier: ^11.8.1 version: 11.8.1 + bull: + specifier: ^4.16.5 + version: 4.16.5 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -180,17 +189,26 @@ importers: specifier: ^4.1.0 version: 4.1.0 edge.js: - specifier: ^6.2.1 + specifier: ^6.2.0 version: 6.2.1 embla-carousel-react: - specifier: ^8.5.2 + specifier: ^8.5.1 version: 8.5.2(react@19.0.0) + framer-motion: + specifier: ^11.15.0 + version: 11.18.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + ifthenpay: + specifier: ^0.3.4 + version: 0.3.4 input-otp: - specifier: ^1.4.2 + specifier: ^1.4.1 version: 1.4.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + leaflet-geosearch: + specifier: ^4.0.0 + version: 4.1.0 lucide-react: - specifier: ^0.473.0 - version: 0.473.0(react@19.0.0) + specifier: ^0.468.0 + version: 0.468.0(react@19.0.0) luxon: specifier: ^3.5.0 version: 3.5.0 @@ -205,7 +223,7 @@ importers: version: 19.0.0 react-day-picker: specifier: ^9.5.0 - version: 9.5.0(react@19.0.0) + version: 9.5.1(react@19.0.0) react-dom: specifier: ^19.0.0 version: 19.0.0(react@19.0.0) @@ -220,13 +238,13 @@ importers: version: 2.1.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) recharts: specifier: ^2.15.0 - version: 2.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.15.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) reflect-metadata: specifier: ^0.2.2 version: 0.2.2 sonner: specifier: ^1.7.2 - version: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) tailwind-merge: specifier: ^2.6.0 version: 2.6.0 @@ -245,7 +263,7 @@ importers: version: 7.8.2(typescript@5.7.3) '@adonisjs/eslint-config': specifier: 2.0.0-beta.7 - version: 2.0.0-beta.7(eslint@9.18.0(jiti@1.21.7))(prettier@3.4.2)(typescript@5.7.3) + version: 2.0.0-beta.7(eslint@9.19.0(jiti@1.21.7))(prettier@3.4.2)(typescript@5.7.3) '@adonisjs/prettier-config': specifier: ^1.4.0 version: 1.4.0 @@ -254,13 +272,16 @@ importers: version: 1.4.0 '@japa/assert': specifier: ^4.0.1 - version: 4.0.1(@japa/runner@4.1.0) + version: 4.0.1(@japa/runner@4.2.0) '@japa/plugin-adonisjs': specifier: ^4.0.0 - version: 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.1.0) + version: 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.2.0) '@japa/runner': specifier: ^4.1.0 - version: 4.1.0 + version: 4.2.0 + '@svgr/core': + specifier: ^8.1.0 + version: 8.1.0(typescript@5.7.3) '@swc/core': specifier: 1.10.9 version: 1.10.9(@swc/helpers@0.5.15) @@ -269,7 +290,7 @@ importers: version: 3.4.2 '@types/node': specifier: ^22.10.10 - version: 22.10.10 + version: 22.12.0 '@types/react': specifier: ^19.0.8 version: 19.0.8 @@ -278,13 +299,13 @@ importers: version: 19.0.3(@types/react@19.0.8) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)) + version: 4.3.4(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.1) eslint: specifier: ^9.18.0 - version: 9.18.0(jiti@1.21.7) + version: 9.19.0(jiti@1.21.7) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 @@ -296,7 +317,7 @@ importers: version: 9.1.7 lint-staged: specifier: ^15.4.2 - version: 15.4.2 + version: 15.4.3 openapi-types: specifier: ^12.1.3 version: 12.1.3 @@ -311,19 +332,19 @@ importers: version: 3.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) shadcn: specifier: ^2.1.8 - version: 2.1.8(typescript@5.7.3) + version: 2.3.0(typescript@5.7.3) tailwindcss: specifier: ^3.4.17 version: 3.4.17 ts-node-maintained: specifier: ^10.9.5 - version: 10.9.5(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.7.3) + version: 10.9.5(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3) typescript: specifier: ~5.7.3 version: 5.7.3 vite: specifier: ^6.0.11 - version: 6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0) + version: 6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0) packages: @@ -467,14 +488,14 @@ packages: '@adonisjs/fold': ^10.0.1 '@adonisjs/logger': ^6.0.1 - '@adonisjs/inertia@3.0.1': - resolution: {integrity: sha512-4yANT28aW3aycejhEgrdsfrXT6fXshO9wrZy4DIUZ7aZ0EI/HyseXP90q46W3m/NxdLN3cI9eWmsWzeM13aeWg==} + '@adonisjs/inertia@3.1.0': + resolution: {integrity: sha512-BbuZyba7pVjN40AiyPNzOd0ArIikFsvPLz80Vs1Z2KUBsRR1qlIpH/tKiCsLgswFsSDeWYQwed97jUpvRG/tjw==} engines: {node: '>=20.6.0'} peerDependencies: '@adonisjs/core': ^6.9.1 '@adonisjs/session': ^7.4.0 '@adonisjs/vite': ^4.0.0 - '@japa/api-client': ^2.0.0 + '@japa/api-client': ^2.0.0 || ^3.0.0 edge.js: ^6.0.0 peerDependenciesMeta: '@japa/api-client': @@ -1208,8 +1229,8 @@ packages: resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + '@eslint/js@9.19.0': + resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.5': @@ -1239,6 +1260,9 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@googlemaps/js-api-loader@1.16.8': + resolution: {integrity: sha512-CROqqwfKotdO6EBjZO/gQGVTbeDps5V7Mt9+8+5Q+jTg5CRMi3Ii/L9PmV3USROrt2uWxtGzJHORmByxyo9pSQ==} + '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} peerDependencies: @@ -1394,8 +1418,8 @@ packages: resolution: {integrity: sha512-+vaqMiPnVaxlKH1sAwRQ80AwzlPysPKivhB8q1I2+BGe35lNrfiHKGMC52fuGAZBNuH5W2nInSCxr4cN/BTEIQ==} engines: {node: '>=18.16.0'} - '@japa/errors-printer@4.1.0': - resolution: {integrity: sha512-PdmNFcVYU//vbVeLR+lEOT8DckVgoVVx/JxuTulM/IHCEzz7zsYBY9BYEjcIxXY34nAMqLAkRSmnjUnL0tiJVA==} + '@japa/errors-printer@4.1.2': + resolution: {integrity: sha512-exl/r07ssJhEEsMdFT2sXgP1sV7Tp3mZvYUEDMXZ8YjWZPHTFLLcA7o9q9FJSSB1ITrEIbx2SWTB+2fFUaZ3NA==} engines: {node: '>=18.16.0'} '@japa/plugin-adonisjs@4.0.0': @@ -1415,8 +1439,8 @@ packages: playwright: optional: true - '@japa/runner@4.1.0': - resolution: {integrity: sha512-tbKp4yuhy+LjOPEWOF9YaB9lhmqVvrcpAkkLysG2q3gKY7FFSaMaUlVc25eufuvZ7KMW+Gx03Sma05/vB4EztQ==} + '@japa/runner@4.2.0': + resolution: {integrity: sha512-e3BFn1rca/OTiagilkmRTrLVhl00iC/LrY5j4Ns/VZDONYHs9BKAbHaImxjD1zoHMEhwQEF+ce7fgMO/BK+lfg==} engines: {node: '>=18.16.0'} '@jest/schemas@29.6.3': @@ -1448,6 +1472,36 @@ packages: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + '@next/env@15.1.2': resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} @@ -1609,6 +1663,9 @@ packages: '@poppinss/validator-lite@2.0.1': resolution: {integrity: sha512-jdmx+7RsQL4iHscjEfC9TE6xGYUVug680VqwF8ICYdasxcTHODgQLv6ukCUTNVRFu/Xz70SLPNqXD0dA6MTMVQ==} + '@queuedash/api@2.1.1': + resolution: {integrity: sha512-NQIy+zadbHwsyJAtxI+T5TwLf9eYD6/Rx2SCumVyeXMXbsrryEFjqkXIFr56MVENJhc045p2GhIcLRPq1RYTYA==} + '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -2341,98 +2398,127 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@rollup/rollup-android-arm-eabi@4.32.0': - resolution: {integrity: sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==} + '@redis/bloom@1.2.0': + resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/client@1.6.0': + resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==} + engines: {node: '>=14'} + + '@redis/graph@1.1.1': + resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/json@1.0.7': + resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/search@1.2.0': + resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@redis/time-series@1.1.0': + resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} + peerDependencies: + '@redis/client': ^1.0.0 + + '@rollup/rollup-android-arm-eabi@4.32.1': + resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.32.0': - resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==} + '@rollup/rollup-android-arm64@4.32.1': + resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.32.0': - resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==} + '@rollup/rollup-darwin-arm64@4.32.1': + resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.32.0': - resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==} + '@rollup/rollup-darwin-x64@4.32.1': + resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.32.0': - resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==} + '@rollup/rollup-freebsd-arm64@4.32.1': + resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.32.0': - resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==} + '@rollup/rollup-freebsd-x64@4.32.1': + resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.32.0': - resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==} + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': + resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.32.0': - resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==} + '@rollup/rollup-linux-arm-musleabihf@4.32.1': + resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.32.0': - resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==} + '@rollup/rollup-linux-arm64-gnu@4.32.1': + resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.32.0': - resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==} + '@rollup/rollup-linux-arm64-musl@4.32.1': + resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.32.0': - resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==} + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': + resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': - resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': + resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.32.0': - resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==} + '@rollup/rollup-linux-riscv64-gnu@4.32.1': + resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.32.0': - resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==} + '@rollup/rollup-linux-s390x-gnu@4.32.1': + resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.32.0': - resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==} + '@rollup/rollup-linux-x64-gnu@4.32.1': + resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.32.0': - resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==} + '@rollup/rollup-linux-x64-musl@4.32.1': + resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.32.0': - resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==} + '@rollup/rollup-win32-arm64-msvc@4.32.1': + resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.32.0': - resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==} + '@rollup/rollup-win32-ia32-msvc@4.32.1': + resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.32.0': - resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==} + '@rollup/rollup-win32-x64-msvc@4.32.1': + resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} cpu: [x64] os: [win32] @@ -2469,8 +2555,8 @@ packages: resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.1.1': - resolution: {integrity: sha512-hhUZlBWYuh9t6ycAcN90XOyG76C1AzwxZZgaCVPMYpWqqk9uMFo7HGG5Zu2cEhCJn7DdOi5krBmlibWWWPgdsw==} + '@smithy/core@3.1.2': + resolution: {integrity: sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.1': @@ -2501,16 +2587,16 @@ packages: resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.0.2': - resolution: {integrity: sha512-Z9m67CXizGpj8CF/AW/7uHqYNh1VXXOn9Ap54fenWsCa0HnT4cJuE61zqG3cBkTZJDCy0wHJphilI41co/PE5g==} + '@smithy/middleware-endpoint@4.0.3': + resolution: {integrity: sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.0.3': - resolution: {integrity: sha512-TiKwwQTwUDeDtwWW8UWURTqu7s6F3wN2pmziLU215u7bqpVT9Mk2oEvURjpRLA+5XeQhM68R5BpAGzVtomsqgA==} + '@smithy/middleware-retry@4.0.4': + resolution: {integrity: sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.1': - resolution: {integrity: sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA==} + '@smithy/middleware-serde@4.0.2': + resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.0.1': @@ -2553,8 +2639,8 @@ packages: resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.1.2': - resolution: {integrity: sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w==} + '@smithy/smithy-client@4.1.3': + resolution: {integrity: sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==} engines: {node: '>=18.0.0'} '@smithy/types@4.1.0': @@ -2589,12 +2675,12 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.3': - resolution: {integrity: sha512-7c5SF1fVK0EOs+2EOf72/qF199zwJflU1d02AevwKbAUPUZyE9RUZiyJxeUmhVxfKDWdUKaaVojNiaDQgnHL9g==} + '@smithy/util-defaults-mode-browser@4.0.4': + resolution: {integrity: sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.3': - resolution: {integrity: sha512-CVnD42qYD3JKgDlImZ9+On+MqJHzq9uJgPbMdeBE8c2x8VJ2kf2R3XO/yVFx+30ts5lD/GlL0eFIShY3x9ROgQ==} + '@smithy/util-defaults-mode-node@4.0.4': + resolution: {integrity: sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.0.1': @@ -2645,6 +2731,64 @@ packages: peerDependencies: eslint: '>=8.40.0' + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + '@swc/core-darwin-arm64@1.10.9': resolution: {integrity: sha512-XTHLtijFervv2B+i1ngM993umhSj9K1IeMomvU/Db84Asjur2XmD4KXt9QPnGDRFgv2kLSjZ+DDL25Qk0f4r+w==} engines: {node: '>=10'} @@ -2733,6 +2877,9 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@trpc/server@10.45.2': + resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + '@ts-morph/common@0.19.0': resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==} @@ -2853,8 +3000,8 @@ packages: '@types/node@18.19.74': resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==} - '@types/node@22.10.10': - resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} + '@types/node@22.12.0': + resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} '@types/nodemailer@6.4.17': resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==} @@ -2879,51 +3026,51 @@ packages: '@types/validator@13.12.2': resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} - '@typescript-eslint/eslint-plugin@8.21.0': - resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} + '@typescript-eslint/eslint-plugin@8.22.0': + resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.21.0': - resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} + '@typescript-eslint/parser@8.22.0': + resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.21.0': - resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} + '@typescript-eslint/scope-manager@8.22.0': + resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.21.0': - resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} + '@typescript-eslint/type-utils@8.22.0': + resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.21.0': - resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} + '@typescript-eslint/types@8.22.0': + resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.21.0': - resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} + '@typescript-eslint/typescript-estree@8.22.0': + resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.21.0': - resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} + '@typescript-eslint/utils@8.22.0': + resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.21.0': - resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} + '@typescript-eslint/visitor-keys@8.22.0': + resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vavite/multibuild@5.1.0': @@ -2966,6 +3113,12 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + adonisjs-jobs@0.0.21: + resolution: {integrity: sha512-9od2Zabeknuclws6gXgOP3IHyf8Gw43QMRFHLLchMBdNzGhHOrfZxB4utXzQEeN8aVZgN+HkGK/AdK/gldTvDg==} + engines: {node: '>=20.6.0'} + peerDependencies: + '@adonisjs/core': ^6.2.0 + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -3150,6 +3303,13 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} + bull@4.16.5: + resolution: {integrity: sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==} + engines: {node: '>=12'} + + bullmq@5.39.0: + resolution: {integrity: sha512-aS+wtZsjW4/9mv2iZRynkSvEXCFS5h3Ko+OgArJco5rEgTE7v/TehDKv6gYEsKVbavOgiNlUNjgEhWhrzDSLBg==} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -3186,12 +3346,16 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001695: - resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + caniuse-lite@1.0.30001696: + resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} case-anything@3.1.0: resolution: {integrity: sha512-rRYnn5Elur8RuNHKoJ2b0tgn+pjYxL7BzWom+JZ7NKKn1lt/yGV/tUNwOovxYa9l9VL5hnXQdMc+mENbhJzosQ==} @@ -3409,6 +3573,10 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + croner@4.1.97: resolution: {integrity: sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==} @@ -3653,6 +3821,9 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} @@ -3686,8 +3857,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.87: - resolution: {integrity: sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==} + electron-to-chromium@1.5.88: + resolution: {integrity: sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==} embla-carousel-react@8.5.2: resolution: {integrity: sha512-Tmx+uY3MqseIGdwp0ScyUuxpBgx5jX1f7od4Cm5mDwg/dptEiTKf9xp6tw0lZN2VA9JbnVMl/aikmbc53c6QFA==} @@ -3702,8 +3873,8 @@ packages: embla-carousel@8.5.2: resolution: {integrity: sha512-xQ9oVLrun/eCG/7ru3R+I5bJ7shsD8fFwLEY7yPe27/+fDHCNj0OT5EoG5ZbFyOxOcG6yTwW8oTz/dWyFnyGpg==} - emittery@1.0.3: - resolution: {integrity: sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==} + emittery@1.1.0: + resolution: {integrity: sha512-rsX7ktqARv/6UQDgMaLfIqUWAEzzbCQiVh7V9rhDXp6c37yoJcks12NVD+XPkgl4AEavmNhVfrhGoqYwIsMYYA==} engines: {node: '>=14.16'} emoji-regex@10.4.0: @@ -3730,8 +3901,8 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - engine.io@6.6.3: - resolution: {integrity: sha512-2hkLItQMBkoYSagneiisupWGvsQlWXqzhSMvsjaM8GYbnfUsX7tzYQq9QARnate5LRedVTX+MbkSZAANAr3NtQ==} + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} engines: {node: '>=10.2.0'} enquirer@2.3.6: @@ -3850,8 +4021,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + eslint@9.19.0: + resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4067,6 +4238,20 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + framer-motion@11.18.2: + resolution: {integrity: sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -4089,6 +4274,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -4113,6 +4302,10 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + get-port@7.1.0: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} @@ -4327,6 +4520,9 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ifthenpay@0.3.4: + resolution: {integrity: sha512-CKafqjnTZpLrtqlPp4JVfUBK0zXLS4Da5U2pv8Dm3g1CCZfb1zCvttB0k8MUu0XtajPyBYtWLcDyqRhLqhQIPw==} + igniculus@1.5.0: resolution: {integrity: sha512-vhj2J/cSzNg2G5tcK4Z1KZdeYmQa5keoxFULUYAxctK/zHJb1oraO7noCqnJxKe1b2eZdiiaSL1IHPOFAI8UYQ==} engines: {node: '>=4.0.0'} @@ -4339,6 +4535,9 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4615,6 +4814,12 @@ packages: leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + leaflet-geosearch@4.1.0: + resolution: {integrity: sha512-HyqmRWInm5/B28PpAscruOFnYztamJji4OTsueNluvaHg/hYVMWpaReyWvfVUQGVn8U42+Mm01gBpOcRsqh60g==} + + leaflet@1.9.4: + resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4629,8 +4834,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@15.4.2: - resolution: {integrity: sha512-gCqzB/Li281uZJgReNci+oXXqUEdrFAQAzTE/LwoxxiEuP41vozNe4BATS+4ehdqkWn+Z6bGc3EDcBja3npBVw==} + lint-staged@15.4.3: + resolution: {integrity: sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==} engines: {node: '>=18.12.0'} hasBin: true @@ -4653,9 +4858,6 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -4669,13 +4871,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} - deprecated: This package is deprecated. Use https://socket.dev/npm/package/eta instead. - - lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -4695,8 +4890,11 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} @@ -4716,10 +4914,10 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@0.473.0: - resolution: {integrity: sha512-KW6u5AKeIjkvrxXZ6WuCu9zHE/gEYSXCay+Gre2ZoInD0Je/e3RBtP4OHpJVJ40nDklSvjVKjgH7VU8/e2dzRw==} + lucide-react@0.468.0: + resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==} peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc luxon@3.5.0: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} @@ -4841,6 +5039,12 @@ packages: module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + motion-dom@11.18.1: + resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} + + motion-utils@11.18.1: + resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -4850,6 +5054,13 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.2: + resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -4911,10 +5122,16 @@ packages: sass: optional: true + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-abi@3.73.0: resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} engines: {node: '>=10'} + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -4923,6 +5140,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -5076,6 +5297,9 @@ packages: package-manager-detector@0.2.8: resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + pad-start@1.0.2: + resolution: {integrity: sha512-EBN8Ez1SVRcZT1XsIE4WkdnZ5coLoaChkIgAET6gIlaLhXqCz9upVk0DQWFtOYkrpTVvbEppRUnqhTiJrBdkfw==} + pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -5147,8 +5371,8 @@ packages: peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - peek-readable@5.3.1: - resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + peek-readable@5.4.1: + resolution: {integrity: sha512-SJBMUmpY1Dplha/cZckswot1Gv/8bHYBpqdsU5vwvyhihHrTnsWA1L1YXpkXyPHGo99ERdaJ3hEJim4Nylce+A==} engines: {node: '>=14.16'} pg-connection-string@2.6.2: @@ -5383,8 +5607,8 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-day-picker@9.5.0: - resolution: {integrity: sha512-WmJnPFVLnKh5Qscm7wavMNg86rqPverSWjx+zgK8/ZmGRSQ8c8OoqW10RI+AzAfT2atIxImpCUU2R9Z7Xb2SUA==} + react-day-picker@9.5.1: + resolution: {integrity: sha512-PxuK8inYLlYgM2zZUVBPsaBM5jI40suPeG+naKyx7kpyF032RRlEAUEjkpW9/poTASh/vyWAOVqjGuGw+47isw==} engines: {node: '>=18'} peerDependencies: react: '>=16.8.0' @@ -5522,8 +5746,8 @@ packages: recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} - recharts@2.15.0: - resolution: {integrity: sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==} + recharts@2.15.1: + resolution: {integrity: sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==} engines: {node: '>=14'} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5537,10 +5761,16 @@ packages: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} + redis-info@3.1.0: + resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==} + redis-parser@3.0.0: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} + redis@4.7.0: + resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -5605,8 +5835,8 @@ packages: rndm@1.2.0: resolution: {integrity: sha512-fJhQQI5tLrQvYIYFpOnFinzv9dwmR7hRnUz1XqP3OJ1jIweTNOd6aTO4jwQSgcBSFUB+/KHJxuGneime+FdzOw==} - rollup@4.32.0: - resolution: {integrity: sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==} + rollup@4.32.1: + resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -5677,8 +5907,8 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@2.1.8: - resolution: {integrity: sha512-UxNK1O/3otO5joqc113+tVZuSFHvVNaDjVakqCjhW89RpRSObRMBaSaaC6jvG70DhR8dJ35l907w1keUrGmWAw==} + shadcn@2.3.0: + resolution: {integrity: sha512-Q/ra8/r2wb5W0DX0LKuPpsT6/0vtgwW/DR9uunJ6/3lXMOBo2UyUeCQ2m9/XAlALHhyGnzHngf8s8NrW1kcg5Q==} hasBin: true sharp@0.33.5: @@ -5754,6 +5984,9 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + socket.io-adapter@2.5.5: resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} @@ -5776,8 +6009,8 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.2: - resolution: {integrity: sha512-zMbseqjrOzQD1a93lxahm+qMGxWovdMxBlkTbbnZdNqVLt4j+amF9PQxUCL32WfztOFt9t9ADYkejAL3jF9iNA==} + sonner@1.7.3: + resolution: {integrity: sha512-KXLWQfyR6AHpYZuQk8eO8fCbZSJY3JOpgsu/tbGc++jgPjj8JsR1ZpO8vFhqR/OxvWMQCSAmnSShY0gr4FPqHg==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -6098,8 +6331,8 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typescript-eslint@8.21.0: - resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} + typescript-eslint@8.22.0: + resolution: {integrity: sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6185,6 +6418,10 @@ packages: uuid-random@1.3.2: resolution: {integrity: sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -6421,7 +6658,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@adonisjs/auth@9.3.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/lucid@21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@japa/plugin-adonisjs@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.1.0))': + '@adonisjs/auth@9.3.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/lucid@21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@japa/plugin-adonisjs@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.2.0))': dependencies: '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) '@adonisjs/presets': 2.6.4(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)) @@ -6430,7 +6667,7 @@ snapshots: optionalDependencies: '@adonisjs/lucid': 21.6.0(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@vinejs/vine@3.0.0)(better-sqlite3@11.8.1)(luxon@3.5.0) '@adonisjs/session': 7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1) - '@japa/plugin-adonisjs': 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.1.0) + '@japa/plugin-adonisjs': 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.2.0) transitivePeerDependencies: - '@adonisjs/assembler' @@ -6503,25 +6740,25 @@ snapshots: dotenv: 16.4.7 split-lines: 3.0.0 - '@adonisjs/eslint-config@2.0.0-beta.7(eslint@9.18.0(jiti@1.21.7))(prettier@3.4.2)(typescript@5.7.3)': + '@adonisjs/eslint-config@2.0.0-beta.7(eslint@9.19.0(jiti@1.21.7))(prettier@3.4.2)(typescript@5.7.3)': dependencies: - '@adonisjs/eslint-plugin': 2.0.0-beta.5(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@stylistic/eslint-plugin-ts': 2.13.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) - eslint-config-prettier: 9.1.0(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-prettier: 5.2.3(eslint-config-prettier@9.1.0(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))(prettier@3.4.2) - eslint-plugin-unicorn: 55.0.0(eslint@9.18.0(jiti@1.21.7)) + '@adonisjs/eslint-plugin': 2.0.0-beta.5(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@stylistic/eslint-plugin-ts': 2.13.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.19.0(jiti@1.21.7) + eslint-config-prettier: 9.1.0(eslint@9.19.0(jiti@1.21.7)) + eslint-plugin-prettier: 5.2.3(eslint-config-prettier@9.1.0(eslint@9.19.0(jiti@1.21.7)))(eslint@9.19.0(jiti@1.21.7))(prettier@3.4.2) + eslint-plugin-unicorn: 55.0.0(eslint@9.19.0(jiti@1.21.7)) prettier: 3.4.2 - typescript-eslint: 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + typescript-eslint: 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) transitivePeerDependencies: - '@types/eslint' - supports-color - typescript - '@adonisjs/eslint-plugin@2.0.0-beta.5(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@adonisjs/eslint-plugin@2.0.0-beta.5(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.19.0(jiti@1.21.7) transitivePeerDependencies: - supports-color - typescript @@ -6532,7 +6769,7 @@ snapshots: '@adonisjs/fold': 10.1.3 '@poppinss/utils': 6.9.2 '@sindresorhus/is': 6.3.1 - emittery: 1.0.3 + emittery: 1.1.0 '@adonisjs/fold@10.1.3': dependencies: @@ -6577,11 +6814,11 @@ snapshots: vary: 1.1.2 youch: 3.3.4 - '@adonisjs/inertia@3.0.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@adonisjs/vite@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)))(edge.js@6.2.1)': + '@adonisjs/inertia@3.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(@adonisjs/vite@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)))(edge.js@6.2.1)': dependencies: '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) '@adonisjs/session': 7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1) - '@adonisjs/vite': 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)) + '@adonisjs/vite': 4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)) '@poppinss/utils': 6.9.2 '@tuyau/utils': 0.0.6 edge-error: 4.0.2 @@ -6635,7 +6872,7 @@ snapshots: - supports-color - tedious - '@adonisjs/mail@9.2.2(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@aws-sdk/client-ses@3.734.0)(@types/luxon@3.4.2)(@types/node@22.10.10)(dayjs@1.11.13)(edge.js@6.2.1)(luxon@3.5.0)': + '@adonisjs/mail@9.2.2(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@aws-sdk/client-ses@3.734.0)(@types/luxon@3.4.2)(@types/node@22.12.0)(dayjs@1.11.13)(edge.js@6.2.1)(luxon@3.5.0)': dependencies: '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) '@poppinss/colors': 4.1.4 @@ -6646,7 +6883,7 @@ snapshots: fastq: 1.18.0 formdata-node: 6.0.3 got: 14.4.5 - ical-generator: 7.2.0(@types/luxon@3.4.2)(@types/node@22.10.10)(dayjs@1.11.13)(luxon@3.5.0) + ical-generator: 7.2.0(@types/luxon@3.4.2)(@types/node@22.12.0)(dayjs@1.11.13)(luxon@3.5.0) nodemailer: 6.10.0 optionalDependencies: '@aws-sdk/client-ses': 3.734.0 @@ -6676,7 +6913,7 @@ snapshots: dependencies: '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) '@poppinss/utils': 6.9.2 - emittery: 1.0.3 + emittery: 1.1.0 ioredis: 5.4.2 transitivePeerDependencies: - supports-color @@ -6714,14 +6951,14 @@ snapshots: '@adonisjs/tsconfig@1.4.0': {} - '@adonisjs/vite@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0))': + '@adonisjs/vite@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/shield@8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1))(edge.js@6.2.1)(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0))': dependencies: '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) '@poppinss/utils': 6.9.2 - '@vavite/multibuild': 5.1.0(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)) + '@vavite/multibuild': 5.1.0(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)) edge-error: 4.0.2 - vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0) - vite-plugin-restart: 0.4.2(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)) + vite: 6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0) + vite-plugin-restart: 0.4.2(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)) optionalDependencies: '@adonisjs/shield': 8.1.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/session@7.5.1(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@adonisjs/redis@9.1.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)))(edge.js@6.2.1))(edge.js@6.2.1) edge.js: 6.2.1 @@ -6789,26 +7026,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.734.0 '@aws-sdk/util-user-agent-node': 3.734.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.2 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.3 + '@smithy/middleware-retry': 4.0.4 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.4 + '@smithy/util-defaults-mode-node': 4.0.4 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -6833,26 +7070,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.734.0 '@aws-sdk/util-user-agent-node': 3.734.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.2 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.3 + '@smithy/middleware-retry': 4.0.4 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.4 + '@smithy/util-defaults-mode-node': 4.0.4 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -6864,12 +7101,12 @@ snapshots: '@aws-sdk/core@3.734.0': dependencies: '@aws-sdk/types': 3.734.0 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.2 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 @@ -6891,7 +7128,7 @@ snapshots: '@smithy/node-http-handler': 4.0.2 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 '@smithy/util-stream': 4.0.2 tslib: 2.8.1 @@ -6989,7 +7226,7 @@ snapshots: '@aws-sdk/core': 3.734.0 '@aws-sdk/types': 3.734.0 '@aws-sdk/util-endpoints': 3.734.0 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.2 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7009,26 +7246,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.734.0 '@aws-sdk/util-user-agent-node': 3.734.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.2 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.3 + '@smithy/middleware-retry': 4.0.4 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.4 + '@smithy/util-defaults-mode-node': 4.0.4 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7470,9 +7707,9 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0(jiti@1.21.7))': dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.19.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -7503,7 +7740,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.19.0': {} '@eslint/object-schema@2.1.5': {} @@ -7531,6 +7768,9 @@ snapshots: '@floating-ui/utils@0.2.9': {} + '@googlemaps/js-api-loader@1.16.8': + optional: true + '@hookform/resolvers@3.10.0(react-hook-form@7.54.2(react@19.0.0))': dependencies: react-hook-form: 7.54.2(react@19.0.0) @@ -7650,9 +7890,9 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@japa/assert@4.0.1(@japa/runner@4.1.0)': + '@japa/assert@4.0.1(@japa/runner@4.2.0)': dependencies: - '@japa/runner': 4.1.0 + '@japa/runner': 4.2.0 '@poppinss/macroable': 1.0.4 '@types/chai': 5.0.1 assertion-error: 2.0.1 @@ -7664,26 +7904,26 @@ snapshots: '@poppinss/macroable': 1.0.4 '@poppinss/string': 1.2.0 async-retry: 1.3.3 - emittery: 1.0.3 + emittery: 1.1.0 string-width: 7.2.0 time-span: 5.1.0 - '@japa/errors-printer@4.1.0': + '@japa/errors-printer@4.1.2': dependencies: '@poppinss/colors': 4.1.4 jest-diff: 29.7.0 supports-color: 10.0.0 youch: 4.1.0-beta.5 - '@japa/plugin-adonisjs@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.1.0)': + '@japa/plugin-adonisjs@4.0.0(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1))(@japa/runner@4.2.0)': dependencies: '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) - '@japa/runner': 4.1.0 + '@japa/runner': 4.2.0 - '@japa/runner@4.1.0': + '@japa/runner@4.2.0': dependencies: '@japa/core': 10.3.0 - '@japa/errors-printer': 4.1.0 + '@japa/errors-printer': 4.1.2 '@poppinss/colors': 4.1.4 '@poppinss/hooks': 7.2.5 fast-glob: 3.3.3 @@ -7722,6 +7962,24 @@ snapshots: '@lukeed/ms@2.0.2': {} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + '@next/env@15.1.2': {} '@next/swc-darwin-arm64@15.1.2': @@ -7827,7 +8085,7 @@ snapshots: '@poppinss/chokidar-ts@4.1.5(typescript@5.7.3)': dependencies: chokidar: 4.0.3 - emittery: 1.0.3 + emittery: 1.1.0 memoize: 10.0.0 picomatch: 4.0.2 slash: 5.1.0 @@ -7912,6 +8170,13 @@ snapshots: '@poppinss/validator-lite@2.0.1': {} + '@queuedash/api@2.1.1': + dependencies: + '@trpc/server': 10.45.2 + redis: 4.7.0 + redis-info: 3.1.0 + zod: 3.24.1 + '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.1': {} @@ -8681,61 +8946,87 @@ snapshots: dependencies: react: 19.0.0 - '@rollup/rollup-android-arm-eabi@4.32.0': + '@redis/bloom@1.2.0(@redis/client@1.6.0)': + dependencies: + '@redis/client': 1.6.0 + + '@redis/client@1.6.0': + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + + '@redis/graph@1.1.1(@redis/client@1.6.0)': + dependencies: + '@redis/client': 1.6.0 + + '@redis/json@1.0.7(@redis/client@1.6.0)': + dependencies: + '@redis/client': 1.6.0 + + '@redis/search@1.2.0(@redis/client@1.6.0)': + dependencies: + '@redis/client': 1.6.0 + + '@redis/time-series@1.1.0(@redis/client@1.6.0)': + dependencies: + '@redis/client': 1.6.0 + + '@rollup/rollup-android-arm-eabi@4.32.1': optional: true - '@rollup/rollup-android-arm64@4.32.0': + '@rollup/rollup-android-arm64@4.32.1': optional: true - '@rollup/rollup-darwin-arm64@4.32.0': + '@rollup/rollup-darwin-arm64@4.32.1': optional: true - '@rollup/rollup-darwin-x64@4.32.0': + '@rollup/rollup-darwin-x64@4.32.1': optional: true - '@rollup/rollup-freebsd-arm64@4.32.0': + '@rollup/rollup-freebsd-arm64@4.32.1': optional: true - '@rollup/rollup-freebsd-x64@4.32.0': + '@rollup/rollup-freebsd-x64@4.32.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.32.0': + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.32.0': + '@rollup/rollup-linux-arm-musleabihf@4.32.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.32.0': + '@rollup/rollup-linux-arm64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.32.0': + '@rollup/rollup-linux-arm64-musl@4.32.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.32.0': + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.32.0': + '@rollup/rollup-linux-riscv64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.32.0': + '@rollup/rollup-linux-s390x-gnu@4.32.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.32.0': + '@rollup/rollup-linux-x64-gnu@4.32.1': optional: true - '@rollup/rollup-linux-x64-musl@4.32.0': + '@rollup/rollup-linux-x64-musl@4.32.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.32.0': + '@rollup/rollup-win32-arm64-msvc@4.32.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.32.0': + '@rollup/rollup-win32-ia32-msvc@4.32.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.32.0': + '@rollup/rollup-win32-x64-msvc@4.32.1': optional: true '@sec-ant/readable-stream@0.4.1': {} @@ -8768,9 +9059,9 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@3.1.1': + '@smithy/core@3.1.2': dependencies: - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-serde': 4.0.2 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-body-length-browser': 4.0.0 @@ -8821,10 +9112,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.0.2': + '@smithy/middleware-endpoint@4.0.3': dependencies: - '@smithy/core': 3.1.1 - '@smithy/middleware-serde': 4.0.1 + '@smithy/core': 3.1.2 + '@smithy/middleware-serde': 4.0.2 '@smithy/node-config-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -8832,19 +9123,19 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.0.3': + '@smithy/middleware-retry@4.0.4': dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/service-error-classification': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.1': + '@smithy/middleware-serde@4.0.2': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -8910,10 +9201,10 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.1.2': + '@smithy/smithy-client@4.1.3': dependencies: - '@smithy/core': 3.1.1 - '@smithy/middleware-endpoint': 4.0.2 + '@smithy/core': 3.1.2 + '@smithy/middleware-endpoint': 4.0.3 '@smithy/middleware-stack': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 @@ -8958,21 +9249,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.3': + '@smithy/util-defaults-mode-browser@4.0.4': dependencies: '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.3': + '@smithy/util-defaults-mode-node@4.0.4': dependencies: '@smithy/config-resolver': 4.0.1 '@smithy/credential-provider-imds': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.3 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -9032,16 +9323,71 @@ snapshots: '@speed-highlight/core@1.2.7': {} - '@stylistic/eslint-plugin-ts@2.13.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@stylistic/eslint-plugin-ts@2.13.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.19.0(jiti@1.21.7) eslint-visitor-keys: 4.2.0 espree: 10.3.0 transitivePeerDependencies: - supports-color - typescript + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + + '@svgr/babel-preset@8.1.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.7) + + '@svgr/core@8.1.0(typescript@5.7.3)': + dependencies: + '@babel/core': 7.26.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.26.7) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@5.7.3) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + '@swc/core-darwin-arm64@1.10.9': optional: true @@ -9107,6 +9453,8 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} + '@trpc/server@10.45.2': {} + '@ts-morph/common@0.19.0': dependencies: fast-glob: 3.3.3 @@ -9186,7 +9534,7 @@ snapshots: '@types/cors@2.8.17': dependencies: - '@types/node': 22.10.10 + '@types/node': 22.12.0 '@types/d3-array@3.2.1': {} @@ -9228,13 +9576,13 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.10.10': + '@types/node@22.12.0': dependencies: undici-types: 6.20.0 '@types/nodemailer@6.4.17': dependencies: - '@types/node': 22.10.10 + '@types/node': 22.12.0 '@types/normalize-package-data@2.4.4': {} @@ -9252,15 +9600,15 @@ snapshots: '@types/validator@13.12.2': {} - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.22.0 + '@typescript-eslint/type-utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.22.0 + eslint: 9.19.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9269,40 +9617,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/scope-manager': 8.22.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.22.0 debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.19.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.21.0': + '@typescript-eslint/scope-manager@8.22.0': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/visitor-keys': 8.22.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.19.0(jiti@1.21.7) ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.21.0': {} + '@typescript-eslint/types@8.22.0': {} - '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.22.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/visitor-keys': 8.22.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -9313,28 +9661,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/utils@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.22.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) + eslint: 9.19.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.21.0': + '@typescript-eslint/visitor-keys@8.22.0': dependencies: - '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/types': 8.22.0 eslint-visitor-keys: 4.2.0 - '@vavite/multibuild@5.1.0(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0))': + '@vavite/multibuild@5.1.0(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0))': dependencies: '@types/node': 18.19.74 cac: 6.7.14 picocolors: 1.1.1 - vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0) '@vinejs/compiler@3.0.0': {} @@ -9349,14 +9697,14 @@ snapshots: normalize-url: 8.0.1 validator: 13.12.0 - '@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0))': + '@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0))': dependencies: '@babel/core': 7.26.7 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.7) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -9377,6 +9725,17 @@ snapshots: acorn@8.14.0: {} + adonisjs-jobs@0.0.21(@adonisjs/core@6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1)): + dependencies: + '@adonisjs/core': 6.17.1(@adonisjs/assembler@7.8.2(typescript@5.7.3))(@vinejs/vine@3.0.0)(edge.js@6.2.1) + '@poppinss/utils': 6.9.2 + '@queuedash/api': 2.1.1 + '@trpc/server': 10.45.2 + bullmq: 5.39.0 + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - supports-color + agent-base@7.1.3: {} ajv@6.12.6: @@ -9462,7 +9821,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 + caniuse-lite: 1.0.30001696 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -9533,8 +9892,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001695 - electron-to-chromium: 1.5.87 + caniuse-lite: 1.0.30001696 + electron-to-chromium: 1.5.88 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -9552,6 +9911,30 @@ snapshots: builtin-modules@3.3.0: {} + bull@4.16.5: + dependencies: + cron-parser: 4.9.0 + get-port: 5.1.1 + ioredis: 5.4.2 + lodash: 4.17.21 + msgpackr: 1.11.2 + semver: 7.6.3 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + bullmq@5.39.0: + dependencies: + cron-parser: 4.9.0 + ioredis: 5.4.2 + msgpackr: 1.11.2 + node-abort-controller: 3.1.1 + semver: 7.6.3 + tslib: 2.8.1 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -9586,9 +9969,11 @@ snapshots: camelcase-css@2.0.1: {} + camelcase@6.3.0: {} + camelcase@8.0.0: {} - caniuse-lite@1.0.30001695: {} + caniuse-lite@1.0.30001696: {} case-anything@3.1.0: {} @@ -9597,7 +9982,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 + loupe: 3.1.3 pathval: 2.0.0 chalk@3.0.0: @@ -9800,6 +10185,10 @@ snapshots: create-require@1.1.1: {} + cron-parser@4.9.0: + dependencies: + luxon: 3.5.0 + croner@4.1.97: {} cross-spawn@7.0.6: @@ -9977,6 +10366,11 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + dotenv@16.4.7: {} dunder-proto@1.0.1: @@ -10022,7 +10416,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.87: {} + electron-to-chromium@1.5.88: {} embla-carousel-react@8.5.2(react@19.0.0): dependencies: @@ -10036,7 +10430,7 @@ snapshots: embla-carousel@8.5.2: {} - emittery@1.0.3: {} + emittery@1.1.0: {} emoji-regex@10.4.0: {} @@ -10054,13 +10448,13 @@ snapshots: engine.io-parser@5.2.3: {} - engine.io@6.6.3: + engine.io@6.6.4: dependencies: '@types/cors': 2.8.17 - '@types/node': 22.10.10 + '@types/node': 22.12.0 accepts: 1.3.8 base64id: 2.0.0 - cookie: 1.0.2 + cookie: 0.7.2 cors: 2.8.5 debug: 4.3.7 engine.io-parser: 5.2.3 @@ -10173,29 +10567,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@9.1.0(eslint@9.18.0(jiti@1.21.7)): + eslint-config-prettier@9.1.0(eslint@9.19.0(jiti@1.21.7)): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.19.0(jiti@1.21.7) eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@9.18.0(jiti@1.21.7)))(eslint@9.18.0(jiti@1.21.7))(prettier@3.4.2): + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@9.19.0(jiti@1.21.7)))(eslint@9.19.0(jiti@1.21.7))(prettier@3.4.2): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.19.0(jiti@1.21.7) prettier: 3.4.2 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@9.18.0(jiti@1.21.7)) + eslint-config-prettier: 9.1.0(eslint@9.19.0(jiti@1.21.7)) - eslint-plugin-unicorn@55.0.0(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-unicorn@55.0.0(eslint@9.19.0(jiti@1.21.7)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) ci-info: 4.1.0 clean-regexp: 1.0.0 core-js-compat: 3.40.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.19.0(jiti@1.21.7) esquery: 1.6.0 globals: 15.14.0 indent-string: 4.0.0 @@ -10217,14 +10611,14 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0(jiti@1.21.7): + eslint@9.19.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 + '@eslint/js': 9.19.0 '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -10463,6 +10857,15 @@ snapshots: fraction.js@4.3.7: {} + framer-motion@11.18.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + motion-dom: 11.18.1 + motion-utils: 11.18.1 + tslib: 2.8.1 + optionalDependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + fresh@0.5.2: {} fs-constants@1.0.0: {} @@ -10480,6 +10883,8 @@ snapshots: function-bind@1.1.2: {} + generic-pool@3.9.0: {} + gensync@1.0.0-beta.2: {} get-east-asian-width@1.3.0: {} @@ -10503,6 +10908,8 @@ snapshots: get-package-type@0.1.0: {} + get-port@5.1.1: {} + get-port@7.1.0: {} get-proto@1.0.1: @@ -10691,12 +11098,12 @@ snapshots: husky@9.1.7: {} - ical-generator@7.2.0(@types/luxon@3.4.2)(@types/node@22.10.10)(dayjs@1.11.13)(luxon@3.5.0): + ical-generator@7.2.0(@types/luxon@3.4.2)(@types/node@22.12.0)(dayjs@1.11.13)(luxon@3.5.0): dependencies: uuid-random: 1.3.2 optionalDependencies: '@types/luxon': 3.4.2 - '@types/node': 22.10.10 + '@types/node': 22.12.0 dayjs: 1.11.13 luxon: 3.5.0 @@ -10706,6 +11113,10 @@ snapshots: ieee754@1.2.1: {} + ifthenpay@0.3.4: + dependencies: + pad-start: 1.0.2 + igniculus@1.5.0: {} ignore@5.3.2: {} @@ -10715,6 +11126,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -10937,6 +11350,14 @@ snapshots: leac@0.6.0: {} + leaflet-geosearch@4.1.0: + optionalDependencies: + '@googlemaps/js-api-loader': 1.16.8 + leaflet: 1.9.4 + + leaflet@1.9.4: + optional: true + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -10948,7 +11369,7 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@15.4.2: + lint-staged@15.4.3: dependencies: chalk: 5.4.1 commander: 13.1.0 @@ -10986,8 +11407,6 @@ snapshots: lodash-es@4.17.21: {} - lodash._reinterpolate@3.0.0: {} - lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} @@ -10996,15 +11415,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.template@4.5.0: - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - lodash.templatesettings@4.2.0: - dependencies: - lodash._reinterpolate: 3.0.0 - lodash@4.17.21: {} log-symbols@4.1.0: @@ -11029,7 +11439,11 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.2: {} + loupe@3.1.3: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 lowercase-keys@3.0.0: {} @@ -11045,7 +11459,7 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@0.473.0(react@19.0.0): + lucide-react@0.468.0(react@19.0.0): dependencies: react: 19.0.0 @@ -11125,12 +11539,34 @@ snapshots: module-details-from-path@1.0.3: {} + motion-dom@11.18.1: + dependencies: + motion-utils: 11.18.1 + + motion-utils@11.18.1: {} + ms@2.0.0: {} ms@2.1.2: {} ms@2.1.3: {} + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.2: + optionalDependencies: + msgpackr-extract: 3.0.3 + mustache@4.2.0: {} mute-stream@0.0.8: {} @@ -11170,7 +11606,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001695 + caniuse-lite: 1.0.30001696 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -11189,10 +11625,17 @@ snapshots: - '@babel/core' - babel-plugin-macros + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + node-abi@3.73.0: dependencies: semver: 7.6.3 + node-abort-controller@3.1.1: {} + node-domexception@1.0.0: {} node-fetch@3.3.2: @@ -11201,6 +11644,11 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.3 + optional: true + node-releases@2.0.19: {} nodemailer@6.10.0: {} @@ -11365,6 +11813,8 @@ snapshots: package-manager-detector@0.2.8: {} + pad-start@1.0.2: {} + pako@0.2.9: {} parent-module@1.0.1: @@ -11423,7 +11873,7 @@ snapshots: peberminta@0.9.0: {} - peek-readable@5.3.1: {} + peek-readable@5.4.1: {} pg-connection-string@2.6.2: {} @@ -11728,7 +12178,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-day-picker@9.5.0(react@19.0.0): + react-day-picker@9.5.1(react@19.0.0): dependencies: '@date-fns/tz': 1.2.0 date-fns: 4.1.0 @@ -11904,7 +12354,7 @@ snapshots: dependencies: decimal.js-light: 2.5.1 - recharts@2.15.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + recharts@2.15.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 @@ -11923,10 +12373,23 @@ snapshots: redis-errors@1.2.0: {} + redis-info@3.1.0: + dependencies: + lodash: 4.17.21 + redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 + redis@4.7.0: + dependencies: + '@redis/bloom': 1.2.0(@redis/client@1.6.0) + '@redis/client': 1.6.0 + '@redis/graph': 1.1.1(@redis/client@1.6.0) + '@redis/json': 1.0.7(@redis/client@1.6.0) + '@redis/search': 1.2.0(@redis/client@1.6.0) + '@redis/time-series': 1.1.0(@redis/client@1.6.0) + reflect-metadata@0.2.2: {} regenerator-runtime@0.14.1: {} @@ -11984,29 +12447,29 @@ snapshots: rndm@1.2.0: {} - rollup@4.32.0: + rollup@4.32.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.32.0 - '@rollup/rollup-android-arm64': 4.32.0 - '@rollup/rollup-darwin-arm64': 4.32.0 - '@rollup/rollup-darwin-x64': 4.32.0 - '@rollup/rollup-freebsd-arm64': 4.32.0 - '@rollup/rollup-freebsd-x64': 4.32.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.32.0 - '@rollup/rollup-linux-arm-musleabihf': 4.32.0 - '@rollup/rollup-linux-arm64-gnu': 4.32.0 - '@rollup/rollup-linux-arm64-musl': 4.32.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.32.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.32.0 - '@rollup/rollup-linux-riscv64-gnu': 4.32.0 - '@rollup/rollup-linux-s390x-gnu': 4.32.0 - '@rollup/rollup-linux-x64-gnu': 4.32.0 - '@rollup/rollup-linux-x64-musl': 4.32.0 - '@rollup/rollup-win32-arm64-msvc': 4.32.0 - '@rollup/rollup-win32-ia32-msvc': 4.32.0 - '@rollup/rollup-win32-x64-msvc': 4.32.0 + '@rollup/rollup-android-arm-eabi': 4.32.1 + '@rollup/rollup-android-arm64': 4.32.1 + '@rollup/rollup-darwin-arm64': 4.32.1 + '@rollup/rollup-darwin-x64': 4.32.1 + '@rollup/rollup-freebsd-arm64': 4.32.1 + '@rollup/rollup-freebsd-x64': 4.32.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 + '@rollup/rollup-linux-arm-musleabihf': 4.32.1 + '@rollup/rollup-linux-arm64-gnu': 4.32.1 + '@rollup/rollup-linux-arm64-musl': 4.32.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 + '@rollup/rollup-linux-riscv64-gnu': 4.32.1 + '@rollup/rollup-linux-s390x-gnu': 4.32.1 + '@rollup/rollup-linux-x64-gnu': 4.32.1 + '@rollup/rollup-linux-x64-musl': 4.32.1 + '@rollup/rollup-win32-arm64-msvc': 4.32.1 + '@rollup/rollup-win32-ia32-msvc': 4.32.1 + '@rollup/rollup-win32-x64-msvc': 4.32.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -12078,7 +12541,7 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@2.1.8(typescript@5.7.3): + shadcn@2.3.0(typescript@5.7.3): dependencies: '@antfu/ni': 0.21.12 '@babel/core': 7.26.7 @@ -12093,7 +12556,6 @@ snapshots: fs-extra: 11.3.0 https-proxy-agent: 6.2.1 kleur: 4.1.5 - lodash.template: 4.5.0 node-fetch: 3.3.2 ora: 6.3.1 postcss: 8.5.1 @@ -12207,6 +12669,11 @@ snapshots: smart-buffer@4.2.0: {} + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + socket.io-adapter@2.5.5: dependencies: debug: 4.3.7 @@ -12229,7 +12696,7 @@ snapshots: base64id: 2.0.0 cors: 2.8.5 debug: 4.3.7 - engine.io: 6.6.3 + engine.io: 6.6.4 socket.io-adapter: 2.5.5 socket.io-parser: 4.2.4 transitivePeerDependencies: @@ -12254,7 +12721,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -12371,7 +12838,7 @@ snapshots: strtok3@8.0.1: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.1 styled-jsx@5.1.6(@babel/core@7.24.5)(react@19.0.0): dependencies: @@ -12518,14 +12985,14 @@ snapshots: '@ts-morph/common': 0.26.0 code-block-writer: 13.0.3 - ts-node-maintained@10.9.5(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@22.10.10)(typescript@5.7.3): + ts-node-maintained@10.9.5(@swc/core@1.10.9(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.10.10 + '@types/node': 22.12.0 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -12576,12 +13043,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3): + typescript-eslint@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.19.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -12641,6 +13108,8 @@ snapshots: uuid-random@1.3.2: {} + uuid@8.3.2: {} + uuid@9.0.1: {} v8-compile-cache-lib@3.0.1: {} @@ -12680,18 +13149,18 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-plugin-restart@0.4.2(vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0)): + vite-plugin-restart@0.4.2(vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0)): dependencies: micromatch: 4.0.8 - vite: 6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0) - vite@6.0.11(@types/node@22.10.10)(jiti@1.21.7)(yaml@2.7.0): + vite@6.0.11(@types/node@22.12.0)(jiti@1.21.7)(yaml@2.7.0): dependencies: esbuild: 0.24.2 postcss: 8.5.1 - rollup: 4.32.0 + rollup: 4.32.1 optionalDependencies: - '@types/node': 22.10.10 + '@types/node': 22.12.0 fsevents: 2.3.3 jiti: 1.21.7 yaml: 2.7.0 diff --git a/website/public/images/mbway_black.svg b/website/public/images/mbway_black.svg new file mode 100644 index 0000000..4c0fdff --- /dev/null +++ b/website/public/images/mbway_black.svg @@ -0,0 +1 @@ +Logo_MBWay diff --git a/website/public/images/mbway_white.svg b/website/public/images/mbway_white.svg new file mode 100644 index 0000000..732c88a --- /dev/null +++ b/website/public/images/mbway_white.svg @@ -0,0 +1 @@ +Logo_MBWay diff --git a/website/public/images/multibanco.svg b/website/public/images/multibanco.svg new file mode 100644 index 0000000..726ecc4 --- /dev/null +++ b/website/public/images/multibanco.svg @@ -0,0 +1 @@ +Logo_Multibanco diff --git a/website/resources/emails/payment/confirm_purchase_email.tsx b/website/resources/emails/payment/confirm_purchase_email.tsx new file mode 100644 index 0000000..50bc315 --- /dev/null +++ b/website/resources/emails/payment/confirm_purchase_email.tsx @@ -0,0 +1,49 @@ +import { Container, Heading, Text, Img, Body, Section} from '@react-email/components' +import { BaseLayout } from '../common/layouts/base.js' +export type ProductWithQuantity = { + id: number + name: string + price: number + quantity: number + } + +export type MailProps = { + logoUrl: string + userEmail: string + products: ProductWithQuantity[] + total: number + orderId: number + } + +const ConfirmPurchaseEmail = ({ logoUrl, orderId, products, total, userEmail }: MailProps) => { + return ( + + + +
+ Logótipo do ENEI 2025 + Obrigado pela tua compra! + A tua inscrição no ENEI 2025 foi confirmada com sucesso! + + Resumo da Compra + {products.map((product) => ( + + {product.name} - €{product.price} x {product.quantity} + + ))} + Total: €{total} + + ID da Ordem: {orderId} +
+ +
+ + Este e-mail foi enviado para: {userEmail} + +
+
+ +
+ ) +} +export default ConfirmPurchaseEmail \ No newline at end of file diff --git a/website/start/env.ts b/website/start/env.ts index 8a070b1..7a0a611 100644 --- a/website/start/env.ts +++ b/website/start/env.ts @@ -25,6 +25,13 @@ const env = await defineEnv(new URL('../', import.meta.url), 'INERTIA_PUBLIC_', */ SESSION_DRIVER: vine.enum(['cookie', 'memory'] as const), + /* + |---------------------------------------------------------- + | Variables for configuring the payments system + |---------------------------------------------------------- + */ + IFTHENPAY_MBWAY_KEY: vine.string().optional(), + /* |---------------------------------------------------------- | Variables for configuring the mail package @@ -42,23 +49,24 @@ const env = await defineEnv(new URL('../', import.meta.url), 'INERTIA_PUBLIC_', //MAILGUN_DOMAIN: vine.string(), //SPARKPOST_API_KEY: vine.string(), //RESEND_API_KEY: vine.string(), - //BREVO_API_KEY: vine.string() + //BREVO_API_KEY: vine.string(), /* |---------------------------------------------------------- - | Variables for configuring the limiter package + | Variables for configuring the jobs package |---------------------------------------------------------- */ - LIMITER_STORE: vine.enum(['redis', 'memory'] as const), + REDIS_HOST: vine.string(), + REDIS_PORT: vine.number(), + REDIS_PASSWORD: vine.string().optional(), + REDIS_QUEUE: vine.string().optional(), /* |---------------------------------------------------------- - | Variables for configuring the redis package + | Variables for configuring the limiter package |---------------------------------------------------------- */ - REDIS_HOST: vine.string(), - REDIS_PORT: vine.string(), - REDIS_PASSWORD: vine.string().optional(), + LIMITER_STORE: vine.enum(['redis', 'memory'] as const), /* |---------------------------------------------------------- diff --git a/website/start/routes.ts b/website/start/routes.ts index 89d6798..5205312 100644 --- a/website/start/routes.ts +++ b/website/start/routes.ts @@ -11,11 +11,10 @@ import { middleware } from '#start/kernel' import { emailVerificationThrottle, sendForgotPasswordThrottle } from '#start/limiter' const AuthenticationController = () => import('#controllers/authentication_controller') +const OrdersController = () => import('#controllers/orders_controller') const TicketsController = () => import('#controllers/tickets_controller') router.on('/').renderInertia('home').as('pages:home') -router.get('/tickets', [TicketsController, 'index']) -router.on('/tickets/:id/checkout').renderInertia('payments').as('checkout') router .group(() => { @@ -132,3 +131,18 @@ router }) .middleware(middleware.requireAuthenticationEnabled()) .prefix('/auth') + +router.get('/tickets', [TicketsController, 'index']).as('pages:tickets') +router + .get('/tickets/:id/checkout', [TicketsController, 'showPayment']).use(middleware.auth()) + .as('checkout') + .middleware(middleware.requireAuthenticationEnabled()) + +router + .group(() => { + //router.get('/', [OrdersController, 'index']) acho que isto já nao e usado + router.post('/mbway', [OrdersController, 'createMBWay']).use(middleware.auth()) + router.get('/:id', [OrdersController, 'show']).as('payment.show').use(middleware.auth()) + }) + .middleware(middleware.requireAuthenticationEnabled()) + .prefix('payment')