From 2235f3905a734a17b05c545a84354333e677b434 Mon Sep 17 00:00:00 2001 From: Arno Kaimbacher Date: Thu, 26 Sep 2024 13:51:35 +0200 Subject: [PATCH] - improved vies and controllers for rejecting datasets with email for reviewer and editor role - falsh also error via config/inertia.ts - npm updates --- .../Http/Admin/LicenseController.ts | 4 +- .../Http/Editor/DatasetController.ts | 143 +++- .../Http/Reviewer/DatasetController.ts | 68 +- .../Http/Submitter/DatasetController.ts | 2 +- config/inertia.ts | 1 + config/mail.ts | 75 +-- package-lock.json | 635 ++++++++++-------- package.json | 7 +- resources/js/Pages/Editor/Dataset/Index.vue | 8 +- resources/js/Pages/Editor/Dataset/Reject.vue | 25 +- .../js/Pages/Reviewer/Dataset/Reject.vue | 25 +- src/extensions.ts | 4 +- 12 files changed, 627 insertions(+), 370 deletions(-) diff --git a/app/Controllers/Http/Admin/LicenseController.ts b/app/Controllers/Http/Admin/LicenseController.ts index dfa2846..9d15208 100644 --- a/app/Controllers/Http/Admin/LicenseController.ts +++ b/app/Controllers/Http/Admin/LicenseController.ts @@ -21,7 +21,7 @@ export default class LicenseController { await license.save(); // session.flash({ message: 'person has been deactivated!' }); - return response.flash('person has been deactivated!', 'message').toRoute('settings.license.index') + return response.flash('License has been deactivated!', 'message').toRoute('settings.license.index') } public async up({ request, response }: HttpContext) { @@ -31,7 +31,7 @@ export default class LicenseController { await license.save(); // session.flash({ message: 'person has been activated!' }); - return response.flash('person has been activated!', 'message').toRoute('settings.license.index'); + return response.flash('License has been activated!', 'message').toRoute('settings.license.index'); } // public async edit({ request, inertia }: HttpContext) { diff --git a/app/Controllers/Http/Editor/DatasetController.ts b/app/Controllers/Http/Editor/DatasetController.ts index 9f2cf4a..acaf505 100644 --- a/app/Controllers/Http/Editor/DatasetController.ts +++ b/app/Controllers/Http/Editor/DatasetController.ts @@ -15,9 +15,12 @@ import { DoiClient } from '#app/Library/Doi/DoiClient'; import DoiClientException from '#app/exceptions/DoiClientException'; import logger from '@adonisjs/core/services/logger'; import { HttpException } from 'node-exceptions'; -import { ModelQueryBuilderContract } from "@adonisjs/lucid/types/model"; +import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model'; import vine, { SimpleMessagesProvider } from '@vinejs/vine'; - +import mail from '@adonisjs/mail/services/main'; +// import { resolveMx } from 'dns/promises'; +// import * as net from 'net'; +import { validate } from 'deep-email-validator'; // Create a new instance of the client const client = new Client({ node: 'http://localhost:9200' }); // replace with your OpenSearch endpoint @@ -146,7 +149,7 @@ export default class DatasetsController { try { await dataset.related('editor').associate(user); // speichert schon ab // await dataset.save(); - return response.toRoute('editor.dataset.list').flash('message', `You have accepted dataset ${dataset.id}!`); + return response.toRoute('editor.dataset.list').flash(`You have accepted dataset ${dataset.id}!`, 'message'); } catch (error) { // Handle any errors console.error(error); @@ -231,7 +234,7 @@ export default class DatasetsController { // .preload('titles') // .preload('descriptions') .preload('user', (builder) => { - builder.select('id', 'login'); + builder.select('id', 'login', 'email'); }) .firstOrFail(); @@ -252,22 +255,86 @@ export default class DatasetsController { }); } - public async rejectUpdate({ request, response }: HttpContext) { + // private async checkEmailDomain(email: string): Promise { + // const domain = email.split('@')[1]; + + // try { + // // Step 1: Check MX records for the domain + // const mxRecords = await resolveMx(domain); + // if (mxRecords.length === 0) { + // return false; // No MX records, can't send email + // } + + // // Sort MX records by priority + // mxRecords.sort((a, b) => a.priority - b.priority); + + // // Step 2: Attempt SMTP connection to the first available mail server + // const smtpServer = mxRecords[0].exchange; + + // return await this.checkMailboxExists(smtpServer, email); + // } catch (error) { + // console.error('Error during MX lookup or SMTP validation:', error); + // return false; + // } + // } + + //// Helper function to check if the mailbox exists using SMTP + // private async checkMailboxExists(smtpServer: string, email: string): Promise { + // return new Promise((resolve, reject) => { + // const socket = net.createConnection(25, smtpServer); + + // socket.on('connect', () => { + // socket.write(`HELO ${smtpServer}\r\n`); + // socket.write(`MAIL FROM: \r\n`); + // socket.write(`RCPT TO: <${email}>\r\n`); + // }); + + // socket.on('data', (data) => { + // const response = data.toString(); + // if (response.includes('250')) { + // // 250 is an SMTP success code + // socket.end(); + // resolve(true); // Email exists + // } else if (response.includes('550')) { + // // 550 means the mailbox doesn't exist + // socket.end(); + // resolve(false); // Email doesn't exist + // } + // }); + + // socket.on('error', (error) => { + // console.error('SMTP connection error:', error); + // socket.end(); + // resolve(false); + // }); + + // socket.on('end', () => { + // // SMTP connection closed + // }); + + // socket.setTimeout(5000, () => { + // // Timeout after 5 seconds + // socket.end(); + // resolve(false); // Assume email doesn't exist if no response + // }); + // }); + // } + + public async rejectUpdate({ request, response, auth }: HttpContext) { + const authUser = auth.user!; + const id = request.param('id'); const dataset = await Dataset.query() .where('id', id) .preload('user', (builder) => { - builder.select('id', 'login'); + builder.select('id', 'login', 'email'); }) .firstOrFail(); - // const newSchema = schema.create({ - // server_state: schema.string({ trim: true }), - // reject_reviewer_note: schema.string({ trim: true }, [rules.minLength(10), rules.maxLength(500)]), - // }); const newSchema = vine.object({ server_state: vine.string().trim(), reject_editor_note: vine.string().trim().minLength(10).maxLength(500), + send_mail: vine.boolean().optional(), }); try { @@ -285,29 +352,56 @@ export default class DatasetsController { // return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back(); return response .flash( - 'warning', `Invalid server state. Dataset with id ${id} cannot be rejected. Datset has server state ${dataset.server_state}.`, + 'warning' ) .redirect() - .toRoute('reviewer.dataset.list'); + .toRoute('editor.dataset.list'); } - // dataset.server_state = 'reviewed'; dataset.server_state = 'rejected_editor'; const rejectEditorNote = request.input('reject_editor_note', ''); dataset.reject_editor_note = rejectEditorNote; - try { - // await dataset.related('editor').associate(user); // speichert schon ab - await dataset.save(); - return response - .toRoute('editor.dataset.list') - .flash('message', `You have rejected dataset ${dataset.id}! to submitter ${dataset.user.login}`); - } catch (error) { - // Handle any errors - console.error(error); - return response.status(500).json({ error: 'An error occurred while reviewing the data.' }); + // add logic for sending reject message + const sendMail = request.input('send_email', false); + // const validRecipientEmail = await this.checkEmailDomain('arno.kaimbacher@outlook.at'); + const validationResult = await validate({ + email: dataset.user.email, + validateSMTP: false, + }); + const validRecipientEmail: boolean = validationResult.valid; + + let emailStatusMessage = ''; + + if (sendMail == true) { + if (dataset.user.email && validRecipientEmail) { + try { + await mail.send((message) => { + message.to(dataset.user.email).subject('Dataset Rejection Notification').html(` +

Dear ${dataset.user.login},

+

Your dataset with ID ${dataset.id} has been rejected.

+

Reason for rejection: ${rejectEditorNote}

+

Best regards,
Your Tethys editor: ${authUser.login}

+ `); + }); + emailStatusMessage = ` A rejection email was successfully sent to ${dataset.user.email}.`; + } catch (error) { + logger.error(error); + return response.flash('Dataset has not been rejected due to an email error: ' + error.message, 'error').toRoute('editor.dataset.list'); + } + } else { + emailStatusMessage = ` However, the email could not be sent because the submitter's email address (${dataset.user.email}) is not valid.`; + } } + + await dataset.save(); + return response + .flash( + `You have successfully rejected dataset ${dataset.id} submitted by ${dataset.user.login}.${emailStatusMessage}`, + 'message', + ) + .toRoute('editor.dataset.list'); } public async publish({ request, inertia, response }: HttpContext) { @@ -401,10 +495,9 @@ export default class DatasetsController { let prefix = ''; let base_domain = ''; - // const datacite_environment = process.env.DATACITE_ENVIRONMENT || 'debug'; + // const datacite_environment = process.env.DATACITE_ENVIRONMENT || 'debug'; prefix = process.env.DATACITE_PREFIX || ''; base_domain = process.env.BASE_DOMAIN || ''; - // register DOI: const doiValue = prefix + '/tethys.' + dataset.publish_id; //'10.21388/tethys.213' diff --git a/app/Controllers/Http/Reviewer/DatasetController.ts b/app/Controllers/Http/Reviewer/DatasetController.ts index dcadce0..85af28b 100644 --- a/app/Controllers/Http/Reviewer/DatasetController.ts +++ b/app/Controllers/Http/Reviewer/DatasetController.ts @@ -4,14 +4,16 @@ import Dataset from '#models/dataset'; import Field from '#app/Library/Field'; import BaseModel from '#models/base_model'; import { DateTime } from 'luxon'; -import { ModelQueryBuilderContract } from "@adonisjs/lucid/types/model"; +import { ModelQueryBuilderContract } from '@adonisjs/lucid/types/model'; import vine from '@vinejs/vine'; +import mail from '@adonisjs/mail/services/main'; +import logger from '@adonisjs/core/services/logger'; +import { validate } from 'deep-email-validator'; interface Dictionary { [index: string]: string; } - export default class DatasetsController { public async index({ auth, request, inertia }: HttpContext) { const user = (await User.find(auth.user?.id)) as User; @@ -196,8 +198,8 @@ export default class DatasetsController { .where('id', id) // .preload('titles') // .preload('descriptions') - .preload('user', (builder) => { - builder.select('id', 'login'); + .preload('editor', (builder) => { + builder.select('id', 'login', 'email'); }) .firstOrFail(); @@ -218,12 +220,14 @@ export default class DatasetsController { }); } - public async rejectUpdate({ request, response }: HttpContext) { + public async rejectUpdate({ request, response, auth }: HttpContext) { + const authUser = auth.user!; + const id = request.param('id'); const dataset = await Dataset.query() .where('id', id) .preload('editor', (builder) => { - builder.select('id', 'login'); + builder.select('id', 'login', 'email'); }) .firstOrFail(); @@ -234,6 +238,7 @@ export default class DatasetsController { const newSchema = vine.object({ server_state: vine.string().trim(), reject_reviewer_note: vine.string().trim().minLength(10).maxLength(500), + send_mail: vine.boolean().optional(), }); try { @@ -250,9 +255,9 @@ export default class DatasetsController { // throw new Error('Invalid server state!'); // return response.flash('warning', 'Invalid server state. Dataset cannot be released to editor').redirect().back(); return response - .flash( - 'warning', + .flash( `Invalid server state. Dataset with id ${id} cannot be rejected. Datset has server state ${dataset.server_state}.`, + 'warning', ) .redirect() .toRoute('reviewer.dataset.list'); @@ -263,16 +268,43 @@ export default class DatasetsController { const rejectReviewerNote = request.input('reject_reviewer_note', ''); dataset.reject_reviewer_note = rejectReviewerNote; - try { - // await dataset.related('editor').associate(user); // speichert schon ab - await dataset.save(); - return response - .toRoute('reviewer.dataset.list') - .flash('message', `You have rejected dataset ${dataset.id}! to editor ${dataset.editor.login}`); - } catch (error) { - // Handle any errors - console.error(error); - return response.status(500).json({ error: 'An error occurred while reviewing the data.' }); + // add logic for sending reject message + const sendMail = request.input('send_email', false); + // const validRecipientEmail = await this.checkEmailDomain('arno.kaimbacher@outlook.at'); + const validationResult = await validate({ + email: dataset.editor.email, + validateSMTP: false, + }); + const validRecipientEmail: boolean = validationResult.valid; + let emailStatusMessage = ''; + + if (sendMail == true) { + if (dataset.user.email && validRecipientEmail) { + try { + await mail.send((message) => { + message.to(dataset.editor.email).subject('Dataset Rejection Notification').html(` +

Dear editor ${dataset.editor.login},

+

Your approved dataset with ID ${dataset.id} has been rejected.

+

Reason for rejection: ${rejectReviewerNote}

+

Best regards,
Your Tethys reviewer: ${authUser.login}

+ `); + }); + emailStatusMessage = ` A rejection email was successfully sent to ${dataset.editor.email}.`; + } catch (error) { + logger.error(error); + return response + .flash('Dataset has not been rejected due to an email error: ' + error.message, 'error') + .toRoute('reviewer.dataset.list'); + } + } else { + emailStatusMessage = ` However, the email could not be sent because the editor's email address (${dataset.editor.email}) is not valid.`; + } } + + await dataset.save(); + + return response + .toRoute('reviewer.dataset.list') + .flash(`You have rejected dataset ${dataset.id}! to editor ${dataset.editor.login}`, 'message'); } } diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index dfdb108..070cb2b 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -771,7 +771,7 @@ export default class DatasetController { } if (await dataset.merge(input).save()) { - return response.toRoute('dataset.list').flash('message', 'You have released your dataset!'); + return response.toRoute('dataset.list').flash('You have released your dataset!', 'message'); } // throw new GeneralException(trans('exceptions.publish.release.update_error')); } diff --git a/config/inertia.ts b/config/inertia.ts index a31471a..bcbd170 100644 --- a/config/inertia.ts +++ b/config/inertia.ts @@ -24,6 +24,7 @@ export default defineConfig({ return { message: ctx.session?.flashMessages.get('message'), warning: ctx.session?.flashMessages.get('warning'), + error: ctx.session?.flashMessages.get('error'), }; }, diff --git a/config/mail.ts b/config/mail.ts index 0587e2c..909dec2 100644 --- a/config/mail.ts +++ b/config/mail.ts @@ -1,49 +1,48 @@ -import env from '#start/env' -import { defineConfig, transports } from '@adonisjs/mail' +import env from '#start/env'; +import { defineConfig, transports } from '@adonisjs/mail'; const mailConfig = defineConfig({ - default: 'smtp', + default: 'smtp', + from: 'tethys@geosphere.at', + /** + * The mailers object can be used to configure multiple mailers + * each using a different transport or same transport with different + * options. + */ + mailers: { + + smtp: transports.smtp({ + socketTimeout: 5000,// Overall timeout (5 seconds) + host: env.get('SMTP_HOST', ''), + port: env.get('SMTP_PORT'), + secure: false, + // ignoreTLS: true, + requireTLS: false, - /** - * The mailers object can be used to configure multiple mailers - * each using a different transport or same transport with different - * options. - */ - mailers: { - smtp: transports.smtp({ - host: env.get('SMTP_HOST', ''), - port: env.get('SMTP_PORT'), - secure: false, - // ignoreTLS: true, - requireTLS: false, - /** - * Uncomment the auth block if your SMTP - * server needs authentication - */ - /* auth: { + /** + * Uncomment the auth block if your SMTP + * server needs authentication + */ + /* auth: { type: 'login', user: env.get('SMTP_USERNAME'), pass: env.get('SMTP_PASSWORD'), }, */ - }), - - resend: transports.resend({ - key: env.get('RESEND_API_KEY'), - baseUrl: 'https://api.resend.com', - }), - - }, -}) + }), -export default mailConfig + resend: transports.resend({ + key: env.get('RESEND_API_KEY'), + baseUrl: 'https://api.resend.com', + }), + }, +}); + +export default mailConfig; declare module '@adonisjs/mail/types' { - export interface MailersList extends InferMailers {} + export interface MailersList extends InferMailers {} } - - - // const mailConfig = defineConfig({ // default: 'smtp', @@ -52,7 +51,7 @@ declare module '@adonisjs/mail/types' { // * each using a different transport or same transport with different // * options. // */ -// mailers: { +// mailers: { // smtp: transports.smtp({ // host: env.get('SMTP_HOST', ''), // port: env.get('SMTP_PORT'), @@ -66,11 +65,11 @@ declare module '@adonisjs/mail/types' { // pass: env.get('SMTP_PASSWORD'), // }, */ // }), - + // resend: transports.resend({ // key: env.get('RESEND_API_KEY'), // baseUrl: 'https://api.resend.com', // }), - + // }, -// }) \ No newline at end of file +// }) diff --git a/package-lock.json b/package-lock.json index 42e71bf..2350615 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "clamscan": "^2.1.2", "crypto": "^1.0.1", "dayjs": "^1.11.7", + "deep-email-validator": "^0.1.21", "edge.js": "^6.0.1", "escape-html": "^1.0.3", "focus-trap": "^7.5.4", @@ -75,7 +76,7 @@ "@types/escape-html": "^1.0.4", "@types/leaflet": "^1.9.3", "@types/luxon": "^3.4.2", - "@types/node": "^20.1.1", + "@types/node": "^22.5.5", "@types/proxy-addr": "^2.0.0", "@types/qrcode": "^1.5.5", "@types/source-map-support": "^0.5.6", @@ -85,14 +86,14 @@ "babel-preset-typescript-vue3": "^2.0.17", "chart.js": "^4.2.0", "dotenv-webpack": "^8.0.1", - "eslint": "^8.57.0", + "eslint": "^8.57.1", "eslint-config-prettier": "^9.0.0", "eslint-plugin-adonis": "^2.1.1", "eslint-plugin-prettier": "^5.0.0-alpha.2", "numeral": "^2.0.6", "pinia": "^2.0.30", "pino-pretty": "^11.2.2", - "postcss-loader": "^7.3.4", + "postcss-loader": "^8.1.1", "prettier": "^3.0.0", "supertest": "^6.3.3", "tailwindcss": "^3.2.4", @@ -311,9 +312,9 @@ } }, "node_modules/@adonisjs/core": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-6.13.1.tgz", - "integrity": "sha512-7xNevBNysRlv2pOn89RuAktpih+8e9m3y39hrD8CJp6hxaA8X9Epx4ykLGqHMGjHM1qnbdY+QTLWVsSbGYWsSg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-6.14.0.tgz", + "integrity": "sha512-4RuCkFR35PQeIEaZQ2oS6pnZBMWKnzNQt0KH5WFYVXmwZ71C6SUCrXI3pPHtifqYzvC3FL1+rlP0sAl5lMG+GA==", "license": "MIT", "dependencies": { "@adonisjs/ace": "^13.2.0", @@ -324,19 +325,22 @@ "@adonisjs/env": "^6.1.0", "@adonisjs/events": "^9.0.2", "@adonisjs/fold": "^10.1.2", - "@adonisjs/hash": "^9.0.4", + "@adonisjs/hash": "^9.0.5", "@adonisjs/health": "^2.0.0", "@adonisjs/http-server": "^7.2.3", "@adonisjs/logger": "^6.0.3", "@adonisjs/repl": "^4.0.1", "@antfu/install-pkg": "^0.4.1", "@paralleldrive/cuid2": "^2.2.2", - "@poppinss/macroable": "^1.0.2", - "@poppinss/utils": "^6.7.3", - "@sindresorhus/is": "^7.0.0", + "@poppinss/colors": "^4.1.3", + "@poppinss/dumper": "^0.4.1", + "@poppinss/macroable": "^1.0.3", + "@poppinss/utils": "^6.8.3", + "@sindresorhus/is": "^7.0.1", "@types/he": "^1.2.3", + "error-stack-parser-es": "^0.1.5", "he": "^1.2.0", - "parse-imports": "^1.2.0", + "parse-imports": "^2.2.1", "pretty-hrtime": "^1.0.3", "string-width": "^7.2.0", "youch": "^3.3.3", @@ -353,7 +357,7 @@ "@vinejs/vine": "^2.1.0", "argon2": "^0.31.2 || ^0.41.0", "bcrypt": "^5.1.1", - "edge.js": "^6.0.1" + "edge.js": "^6.2.0" }, "peerDependenciesMeta": { "@adonisjs/assembler": { @@ -883,13 +887,13 @@ } }, "node_modules/@adonisjs/hash": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@adonisjs/hash/-/hash-9.0.4.tgz", - "integrity": "sha512-ESK7vJMRBc0brbkGC/VUdho9QG6jDQnjtHYKV0yXWeGmyAHk+ad6gnRnc54ysz+Ltyv20cSPwoKWKa1YVZT6vA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@adonisjs/hash/-/hash-9.0.5.tgz", + "integrity": "sha512-oY8PafBrdGsr5UY8cAzzxPCtehZDW7KsPcI47dZpjydOdL/PQrT4liX+cGujL6mSbi3JEgQLBgBs/+SlPFvCrg==", "license": "MIT", "dependencies": { "@phc/format": "^1.0.0", - "@poppinss/utils": "^6.7.3" + "@poppinss/utils": "^6.8.3" }, "engines": { "node": ">=20.6.0" @@ -991,9 +995,9 @@ } }, "node_modules/@adonisjs/inertia": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@adonisjs/inertia/-/inertia-1.1.0.tgz", - "integrity": "sha512-6DDvx9Bd8QFFbPQC7bNpjBhR5qjWeNMZh1hlSDRG0lbioartSbajyqSa6zpNsit6/tiNoNTkno8Rf43AiS6tNw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@adonisjs/inertia/-/inertia-1.2.1.tgz", + "integrity": "sha512-eNMdITkZr8+n+nZjEmCJguu/Urb23vHxh2abtqfJXJHG0L9Q4RX45x9K0i9nrQPRVlfJ/VPe9b88cx5wgC1IEA==", "license": "MIT", "dependencies": { "@poppinss/utils": "^6.7.3", @@ -3881,9 +3885,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "license": "MIT", "engines": { @@ -3964,9 +3968,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { @@ -4002,14 +4006,14 @@ "license": "OFL-1.1" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -4814,6 +4818,17 @@ "node": ">=18.16.0" } }, + "node_modules/@poppinss/dumper": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.4.2.tgz", + "integrity": "sha512-dZBY7t0lp4fMabTQZM5mXYKoTpl0ZwZIwON0gsMmZDyHyhXzIPZw7btOr8OKqFyOKhKBPN+X4Vfmfjeq5NIC7w==", + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.3", + "@sindresorhus/is": "^7.0.1", + "supports-color": "^9.4.0" + } + }, "node_modules/@poppinss/file-generator": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@poppinss/file-generator/-/file-generator-1.0.2.tgz", @@ -4824,9 +4839,9 @@ } }, "node_modules/@poppinss/hooks": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-7.2.3.tgz", - "integrity": "sha512-+B7YSazGaCMcoUubwEkCTnpAvJ+Fv7tqgtpu7cm9qt1adEjmXDmaiG76loEnmxAkyHrbZJ5xHGNSD0NwMhLcnA==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@poppinss/hooks/-/hooks-7.2.4.tgz", + "integrity": "sha512-AoKSHC8ts199+PPa/R+XFF1A9FFhbiGibizOp0M54kCzvhwErGNLJd8Yk/b5nzodmsvApX7cjWVKPM5+12r2VA==", "license": "MIT", "engines": { "node": ">=18.16.0" @@ -4842,9 +4857,9 @@ } }, "node_modules/@poppinss/macroable": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@poppinss/macroable/-/macroable-1.0.2.tgz", - "integrity": "sha512-xhhEcEvhQC8mP5oOr5hbE4CmUgmw/IPV1jhpGg2xSkzoFrt9i8YVqBQt9744EFesi5F7pBheWozg63RUBM/5JA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@poppinss/macroable/-/macroable-1.0.3.tgz", + "integrity": "sha512-B4iV6QxW//Fn17+qF1EMZRmoThIUJlCtcO85yoRDJnMyHeAthjz4ig9OTkfGGXKtQhcdPX0me75gU5K9J897+w==", "license": "MIT", "engines": { "node": ">=18.16.0" @@ -4866,9 +4881,9 @@ } }, "node_modules/@poppinss/middleware": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@poppinss/middleware/-/middleware-3.2.3.tgz", - "integrity": "sha512-orhgQQ99xB4WS0Ln0X89UTlSkFIVT9zfkyvuWsaCb/9wTa0leDf+2GlFi1nVVT0Xdd2i51CXYYAMQkWM4yAp3Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@poppinss/middleware/-/middleware-3.2.4.tgz", + "integrity": "sha512-Klz8kInSN2hL3C/IRkt2DBFIc/kZ225SZpb4Mj2fS7k+YXRmogUF1sVi6W/xkuHuY523mNWgMkt/Ym5HoOC03A==", "license": "MIT", "engines": { "node": ">=18.16.0" @@ -4920,19 +4935,19 @@ } }, "node_modules/@poppinss/utils": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-6.7.3.tgz", - "integrity": "sha512-zQnhVG4Q+n6+V1vrL/TF1Oy8ZcVVGUs49Sj5OBgoari/q42UiG/rht1DRvoeWd9bT1BBDwxO2vcfxj6C0u/Dgg==", + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-6.8.3.tgz", + "integrity": "sha512-YGeH7pIUm9ExONURNH3xN61dBZ0SXgVuPA9E76t7EHeZHXPNrmR8TlbXQaka6kd5n+cpBNcHG4VsVfYf59bZ7g==", "license": "MIT", "dependencies": { "@lukeed/ms": "^2.0.2", "@types/bytes": "^3.1.4", "@types/pluralize": "^0.0.33", "bytes": "^3.1.2", - "case-anything": "^2.1.13", + "case-anything": "^3.1.0", "flattie": "^1.1.1", "pluralize": "^8.0.0", - "safe-stable-stringify": "^2.4.3", + "safe-stable-stringify": "^2.5.0", "secure-json-parse": "^2.7.0", "slash": "^5.1.0", "slugify": "^1.6.6", @@ -5017,9 +5032,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", - "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -5031,9 +5046,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", - "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -5045,9 +5060,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", - "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -5059,9 +5074,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", - "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -5073,9 +5088,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", - "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -5087,9 +5102,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", - "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -5101,9 +5116,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", - "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -5115,9 +5130,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", - "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -5129,9 +5144,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", - "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -5143,9 +5158,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", - "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -5157,9 +5172,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", - "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -5171,9 +5186,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", - "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -5185,9 +5200,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", - "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -5199,9 +5214,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", - "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -5213,9 +5228,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", - "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -5227,9 +5242,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", - "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -5945,6 +5960,12 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@types/disposable-email-domains": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/disposable-email-domains/-/disposable-email-domains-1.0.6.tgz", + "integrity": "sha512-+jHw0Q4ERuVYIChlUaoSm/VEuuNFeW7JgUU8Rwa9V1ym6q+gkGmBK5sGTDKqlfmsSdI5bFMHKlEatirPFvd8Xw==", + "license": "MIT" + }, "node_modules/@types/escape-html": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.4.tgz", @@ -6115,9 +6136,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", - "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -6134,9 +6155,9 @@ } }, "node_modules/@types/nodemailer": { - "version": "6.4.15", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.15.tgz", - "integrity": "sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ==", + "version": "6.4.16", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.16.tgz", + "integrity": "sha512-uz6hN6Pp0upXMcilM61CoKyjT7sskBoOWpptkjjJp8jIMlTdc3xG01U7proKkXzruMS4hS0zqtHNkNPFB20rKQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -6212,9 +6233,9 @@ } }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "license": "MIT" }, "node_modules/@types/range-parser": { @@ -6323,9 +6344,9 @@ } }, "node_modules/@types/validator": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.1.tgz", - "integrity": "sha512-w0URwf7BQb0rD/EuiG12KP0bailHKHP5YVviJG9zw3ykAokL0TuxU2TUqMB7EwZ59bDHYdeTIvjI5m0S7qHfOA==", + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", "license": "MIT" }, "node_modules/@types/ws": { @@ -6674,53 +6695,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.4.tgz", - "integrity": "sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.8.tgz", + "integrity": "sha512-Uzlxp91EPjfbpeO5KtC0KnXPkuTfGsNDeaKQJxQN718uz+RqDYarEf7UhQJGK+ZYloD2taUbHTI2J4WrUaZQNA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.4", + "@vue/shared": "3.5.8", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.4.tgz", - "integrity": "sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.8.tgz", + "integrity": "sha512-GUNHWvoDSbSa5ZSHT9SnV5WkStWfzJwwTd6NMGzilOE/HM5j+9EB9zGXdtu/fCNEmctBqMs6C9SvVPpVPuk1Eg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.4", - "@vue/shared": "3.5.4" + "@vue/compiler-core": "3.5.8", + "@vue/shared": "3.5.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.4.tgz", - "integrity": "sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.8.tgz", + "integrity": "sha512-taYpngQtSysrvO9GULaOSwcG5q821zCoIQBtQQSx7Uf7DxpR6CIHR90toPr9QfDD2mqHQPCSgoWBvJu0yV9zjg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.4", - "@vue/compiler-dom": "3.5.4", - "@vue/compiler-ssr": "3.5.4", - "@vue/shared": "3.5.4", + "@vue/compiler-core": "3.5.8", + "@vue/compiler-dom": "3.5.8", + "@vue/compiler-ssr": "3.5.8", + "@vue/shared": "3.5.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", - "postcss": "^8.4.44", + "postcss": "^8.4.47", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.4.tgz", - "integrity": "sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.8.tgz", + "integrity": "sha512-W96PtryNsNG9u0ZnN5Q5j27Z/feGrFV6zy9q5tzJVyJaLiwYxvC0ek4IXClZygyhjm+XKM7WD9pdKi/wIRVC/Q==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.4", - "@vue/shared": "3.5.4" + "@vue/compiler-dom": "3.5.8", + "@vue/shared": "3.5.8" } }, "node_modules/@vue/devtools-api": { @@ -6731,53 +6752,53 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.4.tgz", - "integrity": "sha512-HKKbEuP7tYSGCq4e4nK6ZW6l5hyG66OUetefBp4budUyjvAYsnQDf+bgFzg2RAgnH0CInyqXwD9y47jwJEHrQw==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.8.tgz", + "integrity": "sha512-mlgUyFHLCUZcAYkqvzYnlBRCh0t5ZQfLYit7nukn1GR96gc48Bp4B7OIcSfVSvlG1k3BPfD+p22gi1t2n9tsXg==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.4" + "@vue/shared": "3.5.8" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.4.tgz", - "integrity": "sha512-f3ek2sTA0AFu0n+w+kCtz567Euqqa3eHewvo4klwS7mWfSj/A+UmYTwsnUFo35KeyAFY60JgrCGvEBsu1n/3LA==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.8.tgz", + "integrity": "sha512-fJuPelh64agZ8vKkZgp5iCkPaEqFJsYzxLk9vSC0X3G8ppknclNDr61gDc45yBGTaN5Xqc1qZWU3/NoaBMHcjQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.4", - "@vue/shared": "3.5.4" + "@vue/reactivity": "3.5.8", + "@vue/shared": "3.5.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.4.tgz", - "integrity": "sha512-ofyc0w6rbD5KtjhP1i9hGOKdxGpvmuB1jprP7Djlj0X7R5J/oLwuNuE98GJ8WW31Hu2VxQHtk/LYTAlW8xrJdw==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.8.tgz", + "integrity": "sha512-DpAUz+PKjTZPUOB6zJgkxVI3GuYc2iWZiNeeHQUw53kdrparSTG6HeXUrYDjaam8dVsCdvQxDz6ZWxnyjccUjQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.4", - "@vue/runtime-core": "3.5.4", - "@vue/shared": "3.5.4", + "@vue/reactivity": "3.5.8", + "@vue/runtime-core": "3.5.8", + "@vue/shared": "3.5.8", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.4.tgz", - "integrity": "sha512-FbjV6DJLgKRetMYFBA1UXCroCiED/Ckr53/ba9wivyd7D/Xw9fpo0T6zXzCnxQwyvkyrL7y6plgYhWhNjGxY5g==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.8.tgz", + "integrity": "sha512-7AmC9/mEeV9mmXNVyUIm1a1AjUhyeeGNbkLh39J00E7iPeGks8OGRB5blJiMmvqSh8SkaS7jkLWSpXtxUCeagA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.4", - "@vue/shared": "3.5.4" + "@vue/compiler-ssr": "3.5.8", + "@vue/shared": "3.5.8" }, "peerDependencies": { - "vue": "3.5.4" + "vue": "3.5.8" } }, "node_modules/@vue/shared": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.4.tgz", - "integrity": "sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.8.tgz", + "integrity": "sha512-mJleSWbAGySd2RJdX1RBtcrUBX6snyOc0qHpgk3lGi4l9/P/3ny3ELqFWqYdkXIwwNN/kdm8nD9ky8o6l/Lx2A==", "license": "MIT" }, "node_modules/@webassemblyjs/ast": { @@ -7720,9 +7741,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "license": "MIT", "dependencies": { @@ -8187,9 +8208,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001660", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", - "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", + "version": "1.0.30001663", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", + "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", "dev": true, "funding": [ { @@ -8219,12 +8240,12 @@ } }, "node_modules/case-anything": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", - "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.0.tgz", + "integrity": "sha512-rRYnn5Elur8RuNHKoJ2b0tgn+pjYxL7BzWom+JZ7NKKn1lt/yGV/tUNwOovxYa9l9VL5hnXQdMc+mENbhJzosQ==", "license": "MIT", "engines": { - "node": ">=12.13" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/mesqueeb" @@ -8988,16 +9009,16 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", "dependencies": { + "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" @@ -9034,16 +9055,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/cosmiconfig/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cpy": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/cpy/-/cpy-11.1.0.tgz", @@ -9599,6 +9610,27 @@ } } }, + "node_modules/deep-email-validator": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/deep-email-validator/-/deep-email-validator-0.1.21.tgz", + "integrity": "sha512-DBAmMzbr+MAubXQ+TS9tZuPwLcdKscb8YzKZiwoLqF3NmaeEgXvSSHhZ0EXOFeKFE2FNWC4mNXCyiQ/JdFXUwg==", + "license": "MIT", + "dependencies": { + "@types/disposable-email-domains": "^1.0.1", + "axios": "^0.24.0", + "disposable-email-domains": "^1.0.59", + "mailcheck": "^1.1.1" + } + }, + "node_modules/deep-email-validator/node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -10030,6 +10062,12 @@ "node": ">=8" } }, + "node_modules/disposable-email-domains": { + "version": "1.0.62", + "resolved": "https://registry.npmjs.org/disposable-email-domains/-/disposable-email-domains-1.0.62.tgz", + "integrity": "sha512-LBQvhRw7mznQTPoyZbsmYeNOZt1pN5aCsx4BAU/3siVFuiM9f2oyKzUaB8v1jbxFjE3aYqYiMo63kAL4pHgfWQ==", + "license": "MIT" + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -10216,9 +10254,9 @@ } }, "node_modules/edge-lexer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/edge-lexer/-/edge-lexer-6.0.1.tgz", - "integrity": "sha512-iYPlo+EyERGL4cICzqXIYVxMB6sSOXazpAqkqN4YcLtwR7K1i1KcwNkSy36T40BYvP7UjjjjAVnz+fk3NEWH9Q==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/edge-lexer/-/edge-lexer-6.0.2.tgz", + "integrity": "sha512-C30wqcw66JwpepLnsTqTp0P4JqKa2xEbAfNj3dPOvBYq4zybiYuhlpSzExvNUeoAAnbjgozgVTVAQ38HctyV4g==", "license": "MIT", "dependencies": { "edge-error": "^4.0.1" @@ -10228,15 +10266,15 @@ } }, "node_modules/edge-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/edge-parser/-/edge-parser-9.0.2.tgz", - "integrity": "sha512-4lFpBf/tCM7q5v+00+sudIIA956neWR7iJLbtQ3cEwl6GMg+s9ZgqiLur3z04SI5MSTGLqa2xsR6SgU/rR5g5Q==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/edge-parser/-/edge-parser-9.0.3.tgz", + "integrity": "sha512-E9W+9wV8QVGLZCtrgKp6k9kIncsUxmrpa/yG+vwVGPpCMBZZZZaShJXwVDHThyL2mkHkWyYvhBpPhuucgW8kiA==", "license": "MIT", "dependencies": { - "acorn": "^8.11.3", - "astring": "^1.8.6", + "acorn": "^8.12.1", + "astring": "^1.9.0", "edge-error": "^4.0.1", - "edge-lexer": "^6.0.1", + "edge-lexer": "^6.0.2", "js-stringify": "^1.0.2" }, "engines": { @@ -10244,22 +10282,22 @@ } }, "node_modules/edge.js": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/edge.js/-/edge.js-6.0.2.tgz", - "integrity": "sha512-qH226BetmQq2LZYEPnoZzZBQqnTWVy/hdsM9GYReYci0FaqAwnabhqMdDfJyzYJJrbb9p67UtgZFBtt0A0k/KA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/edge.js/-/edge.js-6.2.0.tgz", + "integrity": "sha512-xw82TzdPngccJiFqK6FE/79vO6mUvWVvKe6OEu/VHDOf199SIOW1q022d3UIaKGXcwf60lIXZYPIRqooQuzigA==", "license": "MIT", "dependencies": { "@poppinss/inspect": "^1.0.1", - "@poppinss/macroable": "^1.0.1", - "@poppinss/utils": "^6.7.2", + "@poppinss/macroable": "^1.0.3", + "@poppinss/utils": "^6.8.1", "classnames": "^2.5.1", "edge-error": "^4.0.1", - "edge-lexer": "^6.0.1", - "edge-parser": "^9.0.2", + "edge-lexer": "^6.0.2", + "edge-parser": "^9.0.3", "fs-readdir-recursive": "^1.1.0", "he": "^1.2.0", "js-stringify": "^1.0.2", - "property-information": "^6.4.1", + "property-information": "^6.5.0", "stringify-attributes": "^4.0.0" }, "engines": { @@ -10273,9 +10311,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.22", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.22.tgz", - "integrity": "sha512-tKYm5YHPU1djz0O+CGJ+oJIvimtsCcwR2Z9w7Skh08lUdyzXY5djods3q+z2JkWdb7tCcmM//eVavSRAiaPRNg==", + "version": "1.5.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.27.tgz", + "integrity": "sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw==", "dev": true, "license": "ISC" }, @@ -10365,6 +10403,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.14.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", @@ -10411,6 +10459,15 @@ "stackframe": "^1.3.4" } }, + "node_modules/error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -10625,17 +10682,17 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -11026,9 +11083,9 @@ } }, "node_modules/execa": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.3.1.tgz", - "integrity": "sha512-gdhefCCNy/8tpH/2+ajP9IQc14vXchNdd0weyzSJEFURhRMGncQ+zKFxwjAufIewPEJm9BPOaJnvg2UtlH2gPQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz", + "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11039,7 +11096,7 @@ "human-signals": "^8.0.0", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", - "npm-run-path": "^5.2.0", + "npm-run-path": "^6.0.0", "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", @@ -14331,6 +14388,11 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/mailcheck": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mailcheck/-/mailcheck-1.1.1.tgz", + "integrity": "sha512-3WjL8+ZDouZwKlyJBMp/4LeziLFXgleOdsYu87piGcMLqhBzCsy2QFdbtAwv757TFC/rtqd738fgJw1tFQCSgA==" + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -14909,16 +14971,17 @@ } }, "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "devOptional": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14937,6 +15000,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -15314,16 +15390,16 @@ } }, "node_modules/parse-imports": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-1.2.0.tgz", - "integrity": "sha512-K5aG9cextqjAlyevwuSMjWPbBr+X8xGgfHS4VopbKC1u3jLndRGl2CoUHMTvuD6LIg4di5TzH/Pw9+XZyTjI/w==", - "license": "Apache 2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "license": "Apache-2.0 AND MIT", "dependencies": { - "es-module-lexer": "^1.5.2", + "es-module-lexer": "^1.5.3", "slashes": "^3.0.12" }, "engines": { - "node": ">= 12.17" + "node": ">= 18" } }, "node_modules/parse-json": { @@ -15503,14 +15579,14 @@ } }, "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.0.tgz", + "integrity": "sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -15552,18 +15628,18 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", "license": "MIT" }, "node_modules/pg-types": { @@ -15583,9 +15659,9 @@ } }, "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", "license": "MIT" }, "node_modules/pgpass": { @@ -15901,9 +15977,9 @@ } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -15921,8 +15997,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -16108,26 +16184,35 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, "license": "MIT", "dependencies": { - "cosmiconfig": "^8.3.5", + "cosmiconfig": "^9.0.0", "jiti": "^1.20.0", "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/postcss-merge-longhand": { @@ -17350,9 +17435,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", - "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "license": "MIT", "peer": true, "dependencies": { @@ -17366,22 +17451,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.3", - "@rollup/rollup-android-arm64": "4.21.3", - "@rollup/rollup-darwin-arm64": "4.21.3", - "@rollup/rollup-darwin-x64": "4.21.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", - "@rollup/rollup-linux-arm-musleabihf": "4.21.3", - "@rollup/rollup-linux-arm64-gnu": "4.21.3", - "@rollup/rollup-linux-arm64-musl": "4.21.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", - "@rollup/rollup-linux-riscv64-gnu": "4.21.3", - "@rollup/rollup-linux-s390x-gnu": "4.21.3", - "@rollup/rollup-linux-x64-gnu": "4.21.3", - "@rollup/rollup-linux-x64-musl": "4.21.3", - "@rollup/rollup-win32-arm64-msvc": "4.21.3", - "@rollup/rollup-win32-ia32-msvc": "4.21.3", - "@rollup/rollup-win32-x64-msvc": "4.21.3", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, @@ -18752,9 +18837,9 @@ "license": "MIT" }, "node_modules/tailwindcss": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.11.tgz", - "integrity": "sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", + "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", "dev": true, "license": "MIT", "dependencies": { @@ -18876,9 +18961,9 @@ } }, "node_modules/terser": { - "version": "5.32.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.32.0.tgz", - "integrity": "sha512-v3Gtw3IzpBJ0ugkxEX8U0W6+TnPKRRCWGh1jC/iM/e3Ki5+qvO1L1EAZ56bZasc64aXHwRHNIQEzm6//i5cemQ==", + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { @@ -19747,9 +19832,9 @@ } }, "node_modules/vite": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz", - "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==", + "version": "5.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", + "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", "license": "MIT", "peer": true, "dependencies": { @@ -19823,16 +19908,16 @@ } }, "node_modules/vue": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.4.tgz", - "integrity": "sha512-3yAj2gkmiY+i7+22A1PWM+kjOVXjU74UPINcTiN7grIVPyFFI0lpGwHlV/4xydDmobaBn7/xmi+YG8HeSlCTcg==", + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.8.tgz", + "integrity": "sha512-hvuvuCy51nP/1fSRvrrIqTLSvrSyz2Pq+KQ8S8SXCxTWVE0nMaOnSDnSOxV1eYmGfvK7mqiwvd1C59CEEz7dAQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.4", - "@vue/compiler-sfc": "3.5.4", - "@vue/runtime-dom": "3.5.4", - "@vue/server-renderer": "3.5.4", - "@vue/shared": "3.5.4" + "@vue/compiler-dom": "3.5.8", + "@vue/compiler-sfc": "3.5.8", + "@vue/runtime-dom": "3.5.8", + "@vue/server-renderer": "3.5.8", + "@vue/shared": "3.5.8" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index 7e71ad4..498c8bf 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@types/escape-html": "^1.0.4", "@types/leaflet": "^1.9.3", "@types/luxon": "^3.4.2", - "@types/node": "^20.1.1", + "@types/node": "^22.5.5", "@types/proxy-addr": "^2.0.0", "@types/qrcode": "^1.5.5", "@types/source-map-support": "^0.5.6", @@ -54,14 +54,14 @@ "babel-preset-typescript-vue3": "^2.0.17", "chart.js": "^4.2.0", "dotenv-webpack": "^8.0.1", - "eslint": "^8.57.0", + "eslint": "^8.57.1", "eslint-config-prettier": "^9.0.0", "eslint-plugin-adonis": "^2.1.1", "eslint-plugin-prettier": "^5.0.0-alpha.2", "numeral": "^2.0.6", "pinia": "^2.0.30", "pino-pretty": "^11.2.2", - "postcss-loader": "^7.3.4", + "postcss-loader": "^8.1.1", "prettier": "^3.0.0", "supertest": "^6.3.3", "tailwindcss": "^3.2.4", @@ -99,6 +99,7 @@ "clamscan": "^2.1.2", "crypto": "^1.0.1", "dayjs": "^1.11.7", + "deep-email-validator": "^0.1.21", "edge.js": "^6.0.1", "escape-html": "^1.0.3", "focus-trap": "^7.5.4", diff --git a/resources/js/Pages/Editor/Dataset/Index.vue b/resources/js/Pages/Editor/Dataset/Index.vue index 79b9851..ef6156b 100644 --- a/resources/js/Pages/Editor/Dataset/Index.vue +++ b/resources/js/Pages/Editor/Dataset/Index.vue @@ -94,15 +94,19 @@ const formatServerState = (state: string) => {