From 005df2e4540dc376474e81825a637a859cca57f4 Mon Sep 17 00:00:00 2001 From: Arno Kaimbacher Date: Mon, 8 Jul 2024 13:52:20 +0200 Subject: [PATCH] - added backup codes for 2 factor authentication - npm updates - coverage validation: elevation ust be positive, depth must be negative - vinejs-provider.js: get enabled extensions from database, not via validOptions.extnames - vue components for backup codes: e.g.: PersonalSettings.vue - validate spaital coverage in leaflet map: draw.component.vue, map.component.vue - add backup code authentication into Login.vue - preset to use no preferred reviewer: Release.vue - 2 new vinejs validation rules: file_scan.ts and file-length.ts --- Dockerfile | 3 +- adonisrc.ts | 3 +- app/Controllers/Http/Api/UserController.ts | 46 +- app/Controllers/Http/Auth/AuthController.ts | 66 +- app/Controllers/Http/Auth/UserController.ts | 6 + .../Http/Submitter/DatasetController.ts | 12 +- app/models/backup_code.ts | 51 ++ app/models/user.ts | 16 +- app/services/TwoFactorAuthProvider.ts | 7 +- app/services/backup_code_storage.ts | 136 +++ app/validators/dataset.ts | 92 +- commands/index_datasets.ts | 2 +- database/migrations/test.ts | 32 + package-lock.json | 841 ++++++++++-------- package.json | 5 +- providers/vinejs_provider.ts | 19 +- public/assets/manifest.json | 20 +- .../js/Components/Map/draw.component.vue | 41 +- resources/js/Components/Map/map.component.vue | 153 +++- .../js/Components/Map/zoom.component.vue | 4 +- resources/js/Components/PersonalSettings.vue | 152 ++++ .../js/Components/PersonalTotpSettings.vue | 8 + resources/js/Pages/Auth/AccountInfo.vue | 12 +- resources/js/Pages/Auth/Login.vue | 49 +- .../js/Pages/Submitter/Dataset/Create.vue | 4 +- .../js/Pages/Submitter/Dataset/Release.vue | 2 +- resources/js/Stores/main.ts | 34 +- resources/js/app.ts | 2 + resources/js/i18n/index.ts | 17 + start/routes/api.ts | 1 + start/rules/file_length.ts | 2 +- start/rules/file_scan.ts | 104 +++ 32 files changed, 1416 insertions(+), 526 deletions(-) create mode 100644 app/models/backup_code.ts create mode 100644 app/services/backup_code_storage.ts create mode 100644 database/migrations/test.ts create mode 100644 resources/js/Components/PersonalSettings.vue create mode 100644 resources/js/i18n/index.ts create mode 100644 start/rules/file_scan.ts diff --git a/Dockerfile b/Dockerfile index 3378a5c..218332c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -67,7 +67,8 @@ COPY --chown=node:node . . # In this stage, we will start building dependencies FROM dependencies AS build # We run "node ace build" to build the app (dist folder) for production -RUN node ace build # --production +RUN node ace build --ignore-ts-errors +# RUN node ace build --production # RUN node ace build --ignore-ts-errors diff --git a/adonisrc.ts b/adonisrc.ts index 139ceb0..853efbf 100644 --- a/adonisrc.ts +++ b/adonisrc.ts @@ -29,7 +29,8 @@ export default defineConfig({ () => import('#start/rules/unique'), () => import('#start/rules/translated_language'), () => import('#start/rules/unique_person'), - () => import('#start/rules/file_length') + () => import('#start/rules/file_length'), + () => import('#start/rules/file_scan') ], /* |-------------------------------------------------------------------------- diff --git a/app/Controllers/Http/Api/UserController.ts b/app/Controllers/Http/Api/UserController.ts index 69f1a03..975e5e2 100644 --- a/app/Controllers/Http/Api/UserController.ts +++ b/app/Controllers/Http/Api/UserController.ts @@ -1,11 +1,11 @@ import type { HttpContext } from '@adonisjs/core/http'; -// import TotpSecret from 'App/Models/TotpSecret'; import User from '#models/user'; import TwoFactorAuthProvider from '#app/services/TwoFactorAuthProvider'; import { StatusCodes } from 'http-status-codes'; import { InvalidArgumentException } from 'node-exceptions'; import { TotpState } from '#contracts/enums'; - +import BackupCodeStorage, { SecureRandom } from '#services/backup_code_storage'; +import BackupCode from '#models/backup_code'; // Here we are generating secret and recovery codes for the user that’s enabling 2FA and storing them to our database. export default class UserController { @@ -28,15 +28,20 @@ export default class UserController { case TotpState.STATE_DISABLED: // user.twoFactorSecret = null; // user.twoFactorRecoveryCodes = null; - user.twoFactorSecret = ""; - user.twoFactorRecoveryCodes = [""]; + await BackupCode.deleteCodes(user); + user.twoFactorSecret = ''; + // user.twoFactorRecoveryCodes = ['']; await user.save(); - + user.state = TotpState.STATE_DISABLED; await user.save(); + let storage = new BackupCodeStorage(new SecureRandom()); + let backupState = await storage.getBackupCodesState(user); + return response.status(StatusCodes.OK).json({ state: TotpState.STATE_DISABLED, + backupState: backupState, }); case TotpState.STATE_CREATED: user.twoFactorSecret = TwoFactorAuthProvider.generateSecret(user); @@ -56,8 +61,8 @@ export default class UserController { if (!code) { throw new InvalidArgumentException('code is missing'); } - const success = await TwoFactorAuthProvider.enable(user, code) - + const success = await TwoFactorAuthProvider.enable(user, code); + return response.status(StatusCodes.OK).json({ state: success ? TotpState.STATE_ENABLED : TotpState.STATE_CREATED, }); @@ -79,4 +84,31 @@ export default class UserController { // recoveryCodes: user.twoFactorRecoveryCodes, // }); // } + + /** + * @NoAdminRequired + * @PasswordConfirmationRequired + * + * @return JSONResponse + */ + public async createCodes({ auth, response }: HttpContext) { + // $user = $this->userSession->getUser(); + const user = (await User.find(auth.user?.id)) as User; + + // let codes = TwoFactorAuthProvider.generateRecoveryCodes(); + let storage = new BackupCodeStorage(new SecureRandom()); + // $codes = $this->storage->createCodes($user); + const codes = await storage.createCodes(user); + + let backupState = await storage.getBackupCodesState(user); + // return new JSONResponse([ + // 'codes' => $codes, + // 'state' => $this->storage->getBackupCodesState($user), + // ]); + return response.status(StatusCodes.OK).json({ + codes: codes, + // state: success ? TotpState.STATE_ENABLED : TotpState.STATE_CREATED, + backupState: backupState, //storage.getBackupCodesState(user), + }); + } } diff --git a/app/Controllers/Http/Auth/AuthController.ts b/app/Controllers/Http/Auth/AuthController.ts index 16153b5..71256f2 100644 --- a/app/Controllers/Http/Auth/AuthController.ts +++ b/app/Controllers/Http/Auth/AuthController.ts @@ -1,8 +1,10 @@ import type { HttpContext } from '@adonisjs/core/http'; import User from '#models/user'; +import BackupCode from '#models/backup_code'; // import Hash from '@ioc:Adonis/Core/Hash'; // import InvalidCredentialException from 'App/Exceptions/InvalidCredentialException'; import { authValidator } from '#validators/auth'; +import hash from '@adonisjs/core/services/hash'; import TwoFactorAuthProvider from '#app/services/TwoFactorAuthProvider'; // import { Authenticator } from '@adonisjs/auth'; @@ -31,22 +33,22 @@ export default class AuthController { // await auth.use('web').attempt(email, plainPassword); // const user = await auth.use('web').verifyCredentials(email, password); - const user = await User.verifyCredentials(email, password) - + const user = await User.verifyCredentials(email, password); + if (user.isTwoFactorEnabled) { // session.put("login.id", user.id); // return view.render("pages/two-factor-challenge"); session.flash('user_id', user.id); return response.redirect().back(); - + // let state = LoginState.STATE_VALIDATED; // return response.status(StatusCodes.OK).json({ // state: state, // new_user_id: user.id, // }); - } - + } + await auth.use('web').login(user); } catch (error) { // if login fails, return vague form message and redirect back @@ -59,10 +61,9 @@ export default class AuthController { } public async twoFactorChallenge({ request, session, auth, response }: HttpContext) { - const { code, recoveryCode, login_id } = request.only(['code', 'recoveryCode', 'login_id']); - // const user = await User.query().where('id', session.get('login.id')).firstOrFail(); + const { code, backup_code, login_id } = request.only(['code', 'backup_code', 'login_id']); const user = await User.query().where('id', login_id).firstOrFail(); - + if (code) { const isValid = await TwoFactorAuthProvider.validate(user, code); if (isValid) { @@ -70,17 +71,46 @@ export default class AuthController { await auth.use('web').login(user); response.redirect('/apps/dashboard'); } else { - session.flash('message', 'Your tow factor code is incorrect'); + session.flash('message', 'Your two-factor code is incorrect'); + return response.redirect().back(); + } + } else if (backup_code) { + const codes: BackupCode[] = await user.getBackupCodes(); + + // const verifiedBackupCodes = await Promise.all( + // codes.map(async (backupCode) => { + // let isVerified = await hash.verify(backupCode.code, backup_code); + // if (isVerified) { + // return backupCode; + // } + // }), + // ); + // const backupCodeToDelete = verifiedBackupCodes.find(Boolean); + + let backupCodeToDelete = null; + for (const backupCode of codes) { + const isVerified = await hash.verify(backupCode.code, backup_code); + if (isVerified) { + backupCodeToDelete = backupCode; + break; + } + } + + if (backupCodeToDelete) { + if (backupCodeToDelete.used === false) { + backupCodeToDelete.used = true; + await backupCodeToDelete.save(); + console.log(`BackupCode with id ${backupCodeToDelete.id} has been marked as used.`); + await auth.use('web').login(user); + response.redirect('/apps/dashboard'); + } else { + session.flash('message', 'BackupCode already used'); + return response.redirect().back(); + } + } else { + session.flash('message', 'BackupCode not found'); return response.redirect().back(); - } - } else if (recoveryCode) { - const codes = user?.twoFactorRecoveryCodes ?? []; - if (codes.includes(recoveryCode)) { - user.twoFactorRecoveryCodes = codes.filter((c) => c !== recoveryCode); - await user.save(); - await auth.use('web').login(user); - response.redirect('/apps/dashboard'); - } + } } } diff --git a/app/Controllers/Http/Auth/UserController.ts b/app/Controllers/Http/Auth/UserController.ts index 1029bcb..442aaca 100644 --- a/app/Controllers/Http/Auth/UserController.ts +++ b/app/Controllers/Http/Auth/UserController.ts @@ -5,6 +5,7 @@ import TwoFactorAuthProvider from '#app/services/TwoFactorAuthProvider'; import hash from '@adonisjs/core/services/hash'; // import { schema, rules } from '@adonisjs/validator'; import vine from '@vinejs/vine'; +import BackupCodeStorage, { SecureRandom } from '#services/backup_code_storage'; // Here we are generating secret and recovery codes for the user that’s enabling 2FA and storing them to our database. export default class UserController { @@ -19,10 +20,15 @@ export default class UserController { // const id = request.param('id'); // const user = await User.query().where('id', id).firstOrFail(); + let storage = new BackupCodeStorage(new SecureRandom()); + // const codes= user.isTwoFactorEnabled? (await user.getBackupCodes()).map((role) => role.code) : []; + let backupState = await storage.getBackupCodesState(user); + return inertia.render('Auth/AccountInfo', { user: user, twoFactorEnabled: user.isTwoFactorEnabled, // code: await TwoFactorAuthProvider.generateQrCode(user), + backupState: backupState, }); } diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index 0b306b5..0c8db31 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -327,13 +327,13 @@ export default class DatasetController { x_max: vine.number(), y_min: vine.number(), y_max: vine.number(), - elevation_absolut: vine.number().optional(), - elevation_min: vine.number().optional().requiredIfExists('elevation_max'), - elevation_max: vine.number().optional().requiredIfExists('elevation_min'), + elevation_absolut: vine.number().positive().optional(), + elevation_min: vine.number().positive().optional().requiredIfExists('elevation_max'), + elevation_max: vine.number().positive().optional().requiredIfExists('elevation_min'), // type: vine.enum(Object.values(DescriptionTypes)), - depth_absolut: vine.number().optional(), - depth_min: vine.number().optional().requiredIfExists('depth_max'), - depth_max: vine.number().optional().requiredIfExists('depth_min'), + depth_absolut: vine.number().negative().optional(), + depth_min: vine.number().negative().optional().requiredIfExists('depth_max'), + depth_max: vine.number().negative().optional().requiredIfExists('depth_min'), }), references: vine .array( diff --git a/app/models/backup_code.ts b/app/models/backup_code.ts new file mode 100644 index 0000000..20c77b0 --- /dev/null +++ b/app/models/backup_code.ts @@ -0,0 +1,51 @@ +import BaseModel from './base_model.js'; +import { column, SnakeCaseNamingStrategy, belongsTo } from '@adonisjs/lucid/orm'; +import User from './user.js'; +import type { BelongsTo } from '@adonisjs/lucid/types/relations'; +import db from '@adonisjs/lucid/services/db'; +import hash from '@adonisjs/core/services/hash'; + +export default class BackupCode extends BaseModel { + public static table = 'backupcodes'; + public static namingStrategy = new SnakeCaseNamingStrategy(); + + @column({ + isPrimary: true, + }) + public id: number; + + @column({}) + public user_id: number; + + @column({ + // serializeAs: null, + // consume: (value: string) => (value ? JSON.parse(encryption.decrypt(value) ?? '{}') : null), + // prepare: (value: string) => encryption.encrypt(JSON.stringify(value)), + }) + public code: string; + + @column({}) + public used: boolean; + + @belongsTo(() => User, { + foreignKey: 'user_id', + }) + public user: BelongsTo; + + // public static async getBackupCodes(user: User): Promise { + // return await db.from(this.table).select('id', 'user_id', 'code', 'used').where('user_id', user.id); + // } + + public static async deleteCodes(user: User): Promise { + await db.from(this.table).where('user_id', user.id).delete(); + } + + public static async deleteCodesByUserId(uid: string): Promise { + await db.from(this.table).where('user_id', uid).delete(); + } + + // Method to verify password + public async verifyCode(plainCode: string) { + return await hash.verify(this.code, plainCode); + } +} diff --git a/app/models/user.ts b/app/models/user.ts index cfb1d7d..29d1c06 100644 --- a/app/models/user.ts +++ b/app/models/user.ts @@ -1,5 +1,5 @@ import { DateTime } from 'luxon'; -import { withAuthFinder } from '@adonisjs/auth/mixins/lucid' +import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'; import { column, manyToMany, hasMany } from '@adonisjs/lucid/orm'; import hash from '@adonisjs/core/services/hash'; import Role from './role.js'; @@ -13,6 +13,7 @@ import { TotpState } from '#contracts/enums'; import type { ManyToMany } from '@adonisjs/lucid/types/relations'; import type { HasMany } from '@adonisjs/lucid/types/relations'; import { compose } from '@adonisjs/core/helpers'; +import BackupCode from './backup_code.js'; const AuthFinder = withAuthFinder(() => hash.use('laravel'), { uids: ['email'], @@ -107,6 +108,19 @@ export default class User extends compose(BaseModel, AuthFinder) { }) public datasets: HasMany; + @hasMany(() => BackupCode, { + foreignKey: 'user_id', + }) + public backupcodes: HasMany; + + + + public async getBackupCodes(this: User): Promise { + const test = await this.related('backupcodes').query(); + // return test.map((role) => role.code); + return test; + } + // https://github.com/adonisjs/core/discussions/1872#discussioncomment-132289 public async getRoles(this: User): Promise { const test = await this.related('roles').query(); diff --git a/app/services/TwoFactorAuthProvider.ts b/app/services/TwoFactorAuthProvider.ts index 7719509..7061c05 100644 --- a/app/services/TwoFactorAuthProvider.ts +++ b/app/services/TwoFactorAuthProvider.ts @@ -1,5 +1,6 @@ // import Config from '@ioc:Adonis/Core/Config'; -import config from '@adonisjs/core/services/config' +// import config from '@adonisjs/core/services/config' +import env from '#start/env'; import User from '#models/user'; import { generateSecret, verifyToken } from 'node-2fa/dist/index.js'; // import cryptoRandomString from 'crypto-random-string'; @@ -14,7 +15,7 @@ import { TotpState } from '#contracts/enums'; // npm i --save-dev @types/qrcode class TwoFactorAuthProvider { - private issuer: string = config.get('twoFactorAuthConfig.app.name') || 'TethysCloud'; + private issuer: string = env.get('APP_NAME') || 'TethysCloud'; /** * generateSecret will generate a user-specific 32-character secret. @@ -41,7 +42,7 @@ class TwoFactorAuthProvider { * Return recovery codes * @return {string[]} */ - public generateRecoveryCodes() { + public generateRecoveryCodes(): string[] { const recoveryCodeLimit: number = 8; const codes: string[] = []; for (let i = 0; i < recoveryCodeLimit; i++) { diff --git a/app/services/backup_code_storage.ts b/app/services/backup_code_storage.ts new file mode 100644 index 0000000..4529055 --- /dev/null +++ b/app/services/backup_code_storage.ts @@ -0,0 +1,136 @@ +import User from '#models/user'; +import BackupCode from '#models/backup_code'; +import hash from '@adonisjs/core/services/hash'; + +export interface ISecureRandom { + CHAR_UPPER: string; + CHAR_LOWER: string; + CHAR_DIGITS: string; + CHAR_SYMBOLS: string; + CHAR_ALPHANUMERIC: string; + CHAR_HUMAN_READABLE: string; + + /** + * Generate a random string of specified length. + * @param int $length The length of the generated string + * @param string $characters An optional list of characters to use if no character list is + * specified all valid base64 characters are used. + * @return string + * @since 8.0.0 + */ + generate(length: number, characters?: string): string; +} + +export class SecureRandom implements ISecureRandom { + CHAR_UPPER: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + CHAR_LOWER: string = 'abcdefghijklmnopqrstuvwxyz'; + CHAR_DIGITS: string = '0123456789'; + CHAR_SYMBOLS: string = '!"#$%&\\\'()*+,-./:;<=>?@[]^_`{|}~'; + CHAR_ALPHANUMERIC: string = this.CHAR_UPPER + this.CHAR_LOWER + this.CHAR_DIGITS; + CHAR_HUMAN_READABLE: string = 'abcdefgijkmnopqrstwxyzABCDEFGHJKLMNPQRSTWXYZ23456789'; + + public generate(length: number, characters: string = this.CHAR_ALPHANUMERIC): string { + if (length <= 0) { + throw new Error('Invalid length specified: ' + length + ' must be bigger than 0'); + } + const maxCharIndex: number = characters.length - 1; + let randomString: string = ''; + while (length > 0) { + const randomNumber: number = Math.floor(Math.random() * (maxCharIndex + 1)); + randomString += characters[randomNumber]; + length--; + } + return randomString; + } +} + +class BackupCodeStorage { + private static CODE_LENGTH: number = 16; + // private mapper: BackupCodeMapper; + // private hasher: IHasher; + private random: ISecureRandom; + // private eventDispatcher: IEventDispatcher; + + // constructor(mapper: BackupCodeMapper, random: ISecureRandom, hasher: IHasher, eventDispatcher: IEventDispatcher) { + // this.mapper = mapper; + // this.hasher = hasher; + // this.random = random; + // this.eventDispatcher = eventDispatcher; + // } + constructor(random: ISecureRandom) { + // this.mapper = mapper; + // this.hasher = hasher; + this.random = random; + // this.eventDispatcher = eventDispatcher; + } + + public async createCodes(user: User, number: number = 10): Promise { + let results: string[] = []; + // this.mapper.deleteCodes(user); + await BackupCode.deleteCodes(user); + // user.twoFactorRecoveryCodes = [""]; + + // const uid = user.getUID(); + for (let i = 1; i <= Math.min(number, 20); i++) { + const code = this.random.generate(BackupCodeStorage.CODE_LENGTH, this.random.CHAR_HUMAN_READABLE); + // const code = crypto + // .randomBytes(Math.ceil(BackupCodeStorage.CODE_LENGTH / 2)) + // .toString('hex') + // .slice(0, BackupCodeStorage.CODE_LENGTH); + const dbCode = new BackupCode(); + // dbCode.setUserId(uid); + + // dbCode.setCode(this.hasher.hash(code)); + dbCode.code = await hash.make(code); + // dbCode.setUsed(0); + dbCode.used = false; + // this.mapper.insert(dbCode); + // await dbCode.save(); + await dbCode.related('user').associate(user); // speichert schon ab + results.push(code); + } + // this.eventDispatcher.dispatchTyped(new CodesGenerated(user)); + return results; + } + + public async hasBackupCodes(user: User): Promise { + const codes = await user.getBackupCodes(); + return codes.length > 0; + } + + public async getBackupCodesState(user: User) { + // const codes = this.mapper.getBackupCodes(user); + // const codes = await user.related('backupcodes').query().exec(); + const codes: BackupCode[] = await user.getBackupCodes(); + const total = codes.length; + let used: number = 0; + codes.forEach((code) => { + if (code.used === true) { + used++; + } + }); + return { + enabled: total > 0, + total: total, + used: used, + }; + } + + // public validateCode(user: User, code: string): boolean { + // const dbCodes = await user.getBackupCodes(); + // for (const dbCode of dbCodes) { + // if (parseInt(dbCode.getUsed()) === 0 && this.hasher.verify(code, dbCode.getCode())) { + // dbCode.setUsed(1); + // this.mapper.update(dbCode); + // return true; + // } + // } + // return false; + // } + + // public deleteCodes(user: User): void { + // this.mapper.deleteCodes(user); + // } +} + +export default BackupCodeStorage; diff --git a/app/validators/dataset.ts b/app/validators/dataset.ts index 4809dca..90040bb 100644 --- a/app/validators/dataset.ts +++ b/app/validators/dataset.ts @@ -4,9 +4,11 @@ import dayjs from 'dayjs'; import MimeType from '#models/mime_type'; const enabledExtensions = await MimeType.query().select('file_extension').where('enabled', true).exec(); -const extensions = enabledExtensions.map((extension)=> { - return extension.file_extension.split('|') -}).flat(); +const extensions = enabledExtensions + .map((extension) => { + return extension.file_extension.split('|'); + }) + .flat(); /** * Validates the dataset's creation action @@ -55,7 +57,13 @@ export const createDatasetValidator = vine.compile( authors: vine .array( vine.object({ - email: vine.string().trim().maxLength(255).email().normalizeEmail().isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), first_name: vine.string().trim().minLength(3).maxLength(255), last_name: vine.string().trim().minLength(3).maxLength(255), }), @@ -65,14 +73,20 @@ export const createDatasetValidator = vine.compile( contributors: vine .array( vine.object({ - email: vine.string().trim().maxLength(255).email().normalizeEmail().isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), first_name: vine.string().trim().minLength(3).maxLength(255), last_name: vine.string().trim().minLength(3).maxLength(255), pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), }), ) .distinct('email') - .optional(), + .optional(), // third step project_id: vine.number().optional(), // embargo_date: schema.date.optional({ format: 'yyyy-MM-dd' }, [rules.after(10, 'days')]), @@ -89,13 +103,13 @@ export const createDatasetValidator = vine.compile( x_max: vine.number(), y_min: vine.number(), y_max: vine.number(), - elevation_absolut: vine.number().optional(), - elevation_min: vine.number().optional().requiredIfExists('elevation_max'), - elevation_max: vine.number().optional().requiredIfExists('elevation_min'), + elevation_absolut: vine.number().positive().optional(), + elevation_min: vine.number().positive().optional().requiredIfExists('elevation_max'), + elevation_max: vine.number().positive().optional().requiredIfExists('elevation_min'), // type: vine.enum(Object.values(DescriptionTypes)), - depth_absolut: vine.number().optional(), - depth_min: vine.number().optional().requiredIfExists('depth_max'), - depth_max: vine.number().optional().requiredIfExists('depth_min'), + depth_absolut: vine.number().negative().optional(), + depth_min: vine.number().negative().optional().requiredIfExists('depth_max'), + depth_max: vine.number().negative().optional().requiredIfExists('depth_min'), }), references: vine .array( @@ -120,10 +134,13 @@ export const createDatasetValidator = vine.compile( // last step files: vine .array( - vine.myfile({ - size: '512mb', - extnames: extensions, - }).filenameLength({ clientNameSizeLimit : 100 }), + vine + .myfile({ + size: '512mb', + extnames: extensions, + }) + .filenameLength({ clientNameSizeLimit: 100 }) + .fileScan({ removeInfected: true }), ) .minLength(1), }), @@ -175,7 +192,13 @@ export const updateDatasetValidator = vine.compile( authors: vine .array( vine.object({ - email: vine.string().trim().maxLength(255).email().normalizeEmail().isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), first_name: vine.string().trim().minLength(3).maxLength(255), last_name: vine.string().trim().minLength(3).maxLength(255), }), @@ -185,7 +208,13 @@ export const updateDatasetValidator = vine.compile( contributors: vine .array( vine.object({ - email: vine.string().trim().maxLength(255).email().normalizeEmail().isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), + email: vine + .string() + .trim() + .maxLength(255) + .email() + .normalizeEmail() + .isUniquePerson({ table: 'persons', column: 'email', idField: 'id' }), first_name: vine.string().trim().minLength(3).maxLength(255), last_name: vine.string().trim().minLength(3).maxLength(255), pivot_contributor_type: vine.enum(Object.keys(ContributorTypes)), @@ -209,13 +238,13 @@ export const updateDatasetValidator = vine.compile( x_max: vine.number(), y_min: vine.number(), y_max: vine.number(), - elevation_absolut: vine.number().optional(), - elevation_min: vine.number().optional().requiredIfExists('elevation_max'), - elevation_max: vine.number().optional().requiredIfExists('elevation_min'), + elevation_absolut: vine.number().positive().optional(), + elevation_min: vine.number().positive().optional().requiredIfExists('elevation_max'), + elevation_max: vine.number().positive().optional().requiredIfExists('elevation_min'), // type: vine.enum(Object.values(DescriptionTypes)), - depth_absolut: vine.number().optional(), - depth_min: vine.number().optional().requiredIfExists('depth_max'), - depth_max: vine.number().optional().requiredIfExists('depth_min'), + depth_absolut: vine.number().negative().optional(), + depth_min: vine.number().negative().optional().requiredIfExists('depth_max'), + depth_max: vine.number().negative().optional().requiredIfExists('depth_min'), }), references: vine .array( @@ -238,14 +267,13 @@ export const updateDatasetValidator = vine.compile( .minLength(3) .distinct('value'), // last step - files: vine - .array( - vine.myfile({ - size: '512mb', - extnames: extensions, - }), - ), - // .minLength(1), + files: vine.array( + vine.myfile({ + size: '512mb', + extnames: extensions, + }), + ), + // .minLength(1), }), ); diff --git a/commands/index_datasets.ts b/commands/index_datasets.ts index 52acd02..5f0d0b7 100644 --- a/commands/index_datasets.ts +++ b/commands/index_datasets.ts @@ -74,7 +74,7 @@ export default class IndexDatasets extends BaseCommand { }); this.logger.info(`dataset with publish_id ${dataset.publish_id} successfully indexed`); } catch (error) { - this.logger.error(`An error occurred while indexing datsaet with publish_id ${dataset.publish_id}.`); + this.logger.error(`An error occurred while indexing dataset with publish_id ${dataset.publish_id}.`); } } diff --git a/database/migrations/test.ts b/database/migrations/test.ts new file mode 100644 index 0000000..5005af2 --- /dev/null +++ b/database/migrations/test.ts @@ -0,0 +1,32 @@ +// CREATE SEQUENCE IF NOT EXISTS gba.backupcodes_id_seq +// INCREMENT 1 +// START 1 +// MINVALUE 1 +// MAXVALUE 2147483647 +// CACHE 1; + + +// ALTER SEQUENCE gba.backupcodes_id_seq +// OWNER TO tethys_admin; + +// GRANT ALL ON SEQUENCE gba.backupcodes_id_seq TO tethys_admin; + +// GRANT USAGE ON SEQUENCE gba.backupcodes_id_seq TO tethys_app; + +// CREATE TABLE IF NOT EXISTS gba.backupcodes +// ( +// id integer NOT NULL DEFAULT nextval('gba.backupcodes_id_seq'::regclass), +// user_id integer, +// code character varying(64) NOT NULL, +// used boolean NOT NULL DEFAULT false, +// CONSTRAINT backupcodes_user_id_foreign FOREIGN KEY (user_id) +// REFERENCES gba.accounts (id) MATCH SIMPLE +// ON UPDATE CASCADE +// ON DELETE CASCADE, +// CONSTRAINT backupcodes_pkey PRIMARY KEY (id) +// ) + + +// CREATE INDEX IF NOT EXISTS backupcodes_uid +// ON gba.backupcodes USING btree +// (user_id ASC); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8810ac3..1fc285a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,8 @@ "@adonisjs/drive": "^2.3.0", "@adonisjs/encore": "^1.0.0", "@adonisjs/inertia": "^1.0.0-7", - "@adonisjs/lucid": "^20.2.0", - "@adonisjs/redis": "^8.0.1", + "@adonisjs/lucid": "^21.1.0", + "@adonisjs/redis": "^9.1.0", "@adonisjs/session": "^7.1.1", "@adonisjs/shield": "^8.1.1", "@adonisjs/static": "^1.1.1", @@ -47,6 +47,7 @@ "reflect-metadata": "^0.2.1", "saxon-js": "^2.5.0", "toastify-js": "^1.12.0", + "vue-i18n": "^9.13.1", "vuedraggable": "^4.1.0", "xmlbuilder2": "^3.1.1" }, @@ -103,9 +104,9 @@ } }, "node_modules/@adonisjs/ace": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-13.0.1.tgz", - "integrity": "sha512-4FKj78JQ6+OmeZ08FQn2pdtsI6e7t4eihUjHM2hUnaMx0gQAVmp2WV7Mg/HyI63MSmVI5+uYD7oJHISCV0ohxA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-13.1.0.tgz", + "integrity": "sha512-TMFtJJYLq2eBNaXOcbrssxKWwto98U6fxeIJ1Yx/McB47tBns7Q1V30U4URwYN6DxAAuOaOQkbDOrGYbCy2B2A==", "dependencies": { "@poppinss/cliui": "^6.3.0", "@poppinss/hooks": "^7.2.2", @@ -218,20 +219,20 @@ } }, "node_modules/@adonisjs/auth": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@adonisjs/auth/-/auth-9.2.1.tgz", - "integrity": "sha512-HS5LtVsc5X494cCcddZ7mNCF8py6PVv+nRtYPoSGkBkxFuQEomSL+t3IxH4OzcpA2+muy3fBMCpLadymDxXpTA==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@adonisjs/auth/-/auth-9.2.3.tgz", + "integrity": "sha512-my/dqQJo1LQRhT3bW0RuK/1BhDTWcY3tVrGZmVMedCRBfYGt91OAreMy0muukJcWr8AkXBtbBsju2D+myaDa4Q==", "dependencies": { - "@adonisjs/presets": "^2.4.0", + "@adonisjs/presets": "^2.5.1", "basic-auth": "^2.0.1" }, "engines": { "node": ">=18.16.0" }, "peerDependencies": { - "@adonisjs/core": "^6.5.0", - "@adonisjs/lucid": "^20.5.1", - "@adonisjs/session": "^7.3.0", + "@adonisjs/core": "^6.11.0", + "@adonisjs/lucid": "^20.0.0 || ^21.0.1", + "@adonisjs/session": "^7.4.1", "@japa/api-client": "^2.0.3", "@japa/browser-client": "^2.0.3", "@japa/plugin-adonisjs": "^3.0.1" @@ -298,11 +299,11 @@ } }, "node_modules/@adonisjs/core": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-6.10.1.tgz", - "integrity": "sha512-kd3XO8zMHwqLYTttHc91tvCkCwpldfpvG5dD0xBleh4Aj0eBMp3+tQzOMsTCRzkrXg0YuKota6h4q4crT3H9sw==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/@adonisjs/core/-/core-6.12.1.tgz", + "integrity": "sha512-SO3RoLw5KWZH2zVOFFAt9IRsbWiis5fycu1LaYCqau6YhiLWu14wgT+TAnWdr/WbsFm7eS1ojrC5kD/muu5S6Q==", "dependencies": { - "@adonisjs/ace": "^13.0.1", + "@adonisjs/ace": "^13.1.0", "@adonisjs/application": "^8.3.1", "@adonisjs/bodyparser": "^10.0.2", "@adonisjs/config": "^5.0.2", @@ -311,7 +312,7 @@ "@adonisjs/events": "^9.0.2", "@adonisjs/fold": "^10.1.2", "@adonisjs/hash": "^9.0.3", - "@adonisjs/health": "^1.0.0", + "@adonisjs/health": "^2.0.0", "@adonisjs/http-server": "^7.2.3", "@adonisjs/logger": "^6.0.3", "@adonisjs/repl": "^4.0.1", @@ -837,9 +838,9 @@ } }, "node_modules/@adonisjs/health": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@adonisjs/health/-/health-1.0.1.tgz", - "integrity": "sha512-apCBGol/x0NoJwaElideZZxPRqtAHkPz3DBGTLktxaoujCA4yq3ez2Sd+lTQUbZxCNut9y1zxjjVY7cJMrQ7dg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@adonisjs/health/-/health-2.0.0.tgz", + "integrity": "sha512-dEAABiAJew1imzwi+OvV/SAnjkMp8TbD5ZIzx1dMRnPynJAlRf37//bHLwZ5Cw44ke5kPzZ/l1n9cx/VeBCicA==", "dependencies": { "@poppinss/utils": "^6.7.3", "check-disk-space": "^3.4.0" @@ -991,11 +992,11 @@ } }, "node_modules/@adonisjs/lucid": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-20.6.0.tgz", - "integrity": "sha512-LTHc3xjGukjEcy0972l4DUkmlnhXuzvlMGt7zqyfbbn4XmRk6b6RczYPhjUEVqUvNzx845L7RnqTJ8mblHHnmQ==", + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-21.1.0.tgz", + "integrity": "sha512-2Wz+S65lmgPJZm81I0uQl9s+FekIfO9o7beyCXZEvNpawlJaY2ebnFfs9fSDy66a2ZUFMtiUHZbTJAZ/AUbPuQ==", "dependencies": { - "@adonisjs/presets": "^2.4.0", + "@adonisjs/presets": "^2.5.1", "@faker-js/faker": "^8.4.1", "@poppinss/hooks": "^7.2.3", "@poppinss/macroable": "^1.0.2", @@ -1004,7 +1005,7 @@ "igniculus": "^1.5.0", "kleur": "^4.1.5", "knex": "^3.1.0", - "knex-dynamic-connection": "^3.1.1", + "knex-dynamic-connection": "^3.2.0", "pretty-hrtime": "^1.0.3", "qs": "^6.12.1", "slash": "^5.1.0", @@ -1014,8 +1015,8 @@ "node": ">=18.16.0" }, "peerDependencies": { - "@adonisjs/assembler": "^7.0.0", - "@adonisjs/core": "^6.2.2", + "@adonisjs/assembler": "^7.7.0", + "@adonisjs/core": "^6.10.1", "luxon": "^3.4.4" }, "peerDependenciesMeta": { @@ -1028,9 +1029,9 @@ } }, "node_modules/@adonisjs/presets": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@adonisjs/presets/-/presets-2.4.1.tgz", - "integrity": "sha512-STJ021TGsvfTGs1oEielf0ww+RxBMFLzNy94Um2hkJZbCLpsBVchKcjJg4IH2nnU7htrlm1DbNXusg/OtiAW3Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@adonisjs/presets/-/presets-2.6.1.tgz", + "integrity": "sha512-OIk5FYrbtymu1tGLv5yyZfirnXQSjrJYNyBstrTKvu7dW/jsAi9Mlm8wpXMpNhrEzo6sHGEkQKmDIz0m7TP9Pw==", "dependencies": { "@poppinss/utils": "^6.7.3" }, @@ -1092,13 +1093,13 @@ } }, "node_modules/@adonisjs/redis": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@adonisjs/redis/-/redis-8.0.1.tgz", - "integrity": "sha512-gXFepAoYvZhmpyAZ8E/XIKmAqMHtlw0zp8yeFr28qBqTchT7mFnse/xY8z+VOis8fwshXKlSGTSGDF3jVSsFdg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@adonisjs/redis/-/redis-9.1.0.tgz", + "integrity": "sha512-cesml/1Libmwm2yjmbbp2xtyGp+LBNkqCe9ehSmPFM+5puRRbJkqNf6ZaHFQfKdjQU1Y7qR9xtyf5uHLU/K0uw==", "dependencies": { - "@poppinss/utils": "^6.7.0", - "emittery": "^1.0.1", - "ioredis": "^5.3.2" + "@poppinss/utils": "^6.7.3", + "emittery": "^1.0.3", + "ioredis": "^5.4.1" }, "engines": { "node": ">=18.16.0" @@ -1120,9 +1121,9 @@ } }, "node_modules/@adonisjs/session": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@adonisjs/session/-/session-7.4.1.tgz", - "integrity": "sha512-PfboIuZo6n0Y7YXkC3JNmWDtwZku88x4YzGqIZF4NSGPO9atT+sVw7Z4BJBmTrG/1RD+ufv+Y1ThxZfl6l+ecA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@adonisjs/session/-/session-7.4.2.tgz", + "integrity": "sha512-Obw0mlPYroEtiZ9zobGq+J4cTQ/iQXhuUCbYRiwpLylA5+OMTNQJW5PEKRozDSGt7skUK72zJLNJTDQDihPLjA==", "dependencies": { "@poppinss/macroable": "^1.0.2", "@poppinss/utils": "^6.7.3" @@ -1132,7 +1133,7 @@ }, "peerDependencies": { "@adonisjs/core": "^6.6.0", - "@adonisjs/redis": "^8.0.1", + "@adonisjs/redis": "^8.0.1 || ^9.0.0", "@japa/api-client": "^2.0.3", "@japa/browser-client": "^2.0.3", "edge.js": "^6.0.2" @@ -3242,9 +3243,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -3258,9 +3259,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -3274,9 +3275,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -3290,9 +3291,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -3306,9 +3307,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -3322,9 +3323,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -3338,9 +3339,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -3354,9 +3355,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -3370,9 +3371,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -3386,9 +3387,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -3402,9 +3403,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -3418,9 +3419,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -3434,9 +3435,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -3450,9 +3451,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -3466,9 +3467,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -3482,9 +3483,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -3498,9 +3499,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -3514,9 +3515,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -3530,9 +3531,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -3546,9 +3547,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -3562,9 +3563,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -3578,9 +3579,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -3594,9 +3595,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -3625,9 +3626,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3731,14 +3732,15 @@ "integrity": "sha512-/S16rZqO2l3mOQO2KFO/na2SxWWnwKLG/yx+8jdTJxVWQsvI1ELvHdsaR7VNx6JvG9KMI0xkJ2GgYMX4gA72Vw==" }, "node_modules/@fontsource/inter": { - "version": "5.0.18", - "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.0.18.tgz", - "integrity": "sha512-YCsoYPTcs713sI7tLtxaPrIhXAXvEetGg5Ry02ivA8qUOb3fQHojbK/X9HLD5OOKvFUNR2Ynkwb1kR1hVKQHpw==" + "version": "5.0.19", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.0.19.tgz", + "integrity": "sha512-tVU77yjKnsoUotrXGYbbYxmL9nbm/MSo3deZietmf8V2FEDlbi9fvkJHMrYbo7ZsOqR1AYBBqRYmemz4pSE5Mg==" }, "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==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", @@ -3766,12 +3768,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@inertiajs/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.1.0.tgz", - "integrity": "sha512-BTf7LWaJQY9LTZ2P1Z6Y+zmR9X2ndWBxD/dOqWw6nMMjfYulSy6eyEw7iEHSKmu5aVdEO+7yX6pUbRGX5Bog6g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.2.0.tgz", + "integrity": "sha512-6U0gqCPbGGGMcLoDm+ckKipc5gptZMmfVFfPGdO7vlO7yipWf1RD+TKkcZGJklFvfgFMKwK2VPw8GAv1OctuQA==", "dependencies": { "axios": "^1.6.0", "deepmerge": "^4.0.0", @@ -3800,11 +3803,11 @@ } }, "node_modules/@inertiajs/vue3": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.1.0.tgz", - "integrity": "sha512-1NmoTqihIdwxbuY/UqIhkQ1vlL6T88lI9nJ5ZU7UATHCVXLHm3Xu0DOr3eW5XnfKkTz/AaWk/n7+oh9+4OZkgg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.2.0.tgz", + "integrity": "sha512-Y6AsvwIK/E1pQKAMp8B7i99CbNApcTYb7j8R+TXM/AFQG6yBlQ1Qb9oFMItb6VimXSnDyfO4+FWe/JPLk9OIVA==", "dependencies": { - "@inertiajs/core": "1.1.0", + "@inertiajs/core": "1.2.0", "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0" }, @@ -3812,6 +3815,47 @@ "vue": "^3.0.0" } }, + "node_modules/@intlify/core-base": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.13.1.tgz", + "integrity": "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w==", + "dependencies": { + "@intlify/message-compiler": "9.13.1", + "@intlify/shared": "9.13.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.13.1.tgz", + "integrity": "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w==", + "dependencies": { + "@intlify/shared": "9.13.1", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.13.1.tgz", + "integrity": "sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, "node_modules/@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", @@ -4395,14 +4439,14 @@ } }, "node_modules/@opensearch-project/opensearch": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.9.0.tgz", - "integrity": "sha512-BXPWSBME1rszZ8OvtBVQ9F6kLiZSENDSFPawbPa1fv0GouuQfWxkKSI9TcnfGLp869fgLTEIfeC5Qexd4RbAYw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opensearch-project/opensearch/-/opensearch-2.10.0.tgz", + "integrity": "sha512-I3Ko09HvA50zyDi92fgEZfFFaNHhpvXcYLImdKTSL6eEwKqQmszqkLF2g5NTgEyb4Jh9uD2RGX8EYr9PO9zenQ==", "dependencies": { "aws4": "^1.11.0", "debug": "^4.3.1", "hpagent": "^1.2.0", - "json11": "^1.0.4", + "json11": "^1.1.2", "ms": "^2.1.3", "secure-json-parse": "^2.4.0" }, @@ -4633,9 +4677,9 @@ } }, "node_modules/@redis/client": { - "version": "1.5.16", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.16.tgz", - "integrity": "sha512-X1a3xQ5kEMvTib5fBrHKh6Y+pXbeKXqziYuxOUo1ojQNECg4M5Etd1qqyhMap+lFUOAh8S7UYevgJHOm4A+NOg==", + "version": "1.5.17", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.17.tgz", + "integrity": "sha512-IPvU9A31qRCZ7lds/x+ksuK/UMndd0EASveAvCvEtFFKIZjZ+m/a4a0L7S28KEWoR5ka8526hlSghDo4Hrc2Hg==", "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -4908,14 +4952,14 @@ } }, "node_modules/@swc/core": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.27.tgz", - "integrity": "sha512-HmSSCBoUSRDFAd8aEB+WILkCofIp1c2OU6ZJWu1aCt6pijwQSkA4y51CTBcdvyy/+zX1W3cic7alfdhmQxxeEQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.13.tgz", + "integrity": "sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==", "dev": true, "hasInstallScript": true, "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.8" + "@swc/types": "^0.1.9" }, "engines": { "node": ">=10" @@ -4925,16 +4969,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.27", - "@swc/core-darwin-x64": "1.5.27", - "@swc/core-linux-arm-gnueabihf": "1.5.27", - "@swc/core-linux-arm64-gnu": "1.5.27", - "@swc/core-linux-arm64-musl": "1.5.27", - "@swc/core-linux-x64-gnu": "1.5.27", - "@swc/core-linux-x64-musl": "1.5.27", - "@swc/core-win32-arm64-msvc": "1.5.27", - "@swc/core-win32-ia32-msvc": "1.5.27", - "@swc/core-win32-x64-msvc": "1.5.27" + "@swc/core-darwin-arm64": "1.6.13", + "@swc/core-darwin-x64": "1.6.13", + "@swc/core-linux-arm-gnueabihf": "1.6.13", + "@swc/core-linux-arm64-gnu": "1.6.13", + "@swc/core-linux-arm64-musl": "1.6.13", + "@swc/core-linux-x64-gnu": "1.6.13", + "@swc/core-linux-x64-musl": "1.6.13", + "@swc/core-win32-arm64-msvc": "1.6.13", + "@swc/core-win32-ia32-msvc": "1.6.13", + "@swc/core-win32-x64-msvc": "1.6.13" }, "peerDependencies": { "@swc/helpers": "*" @@ -4946,9 +4990,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.27.tgz", - "integrity": "sha512-jyoygXBcUcwUya2BI7Uvl0jwcm4kd0RBDGGkWgcFAZmwucSuLT3EsbpWhOwlL3ACT4rpnRlvh+k8nJlq3+w2Aw==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.13.tgz", + "integrity": "sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==", "cpu": [ "arm64" ], @@ -4962,9 +5006,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.27.tgz", - "integrity": "sha512-eOC583D6b3MS9oODCcZUvAV7ajunjENAPVQL7aZaW+piERW+o4koZAiPlzFdMAUMj7UeVg+UN9sBBbTbJgruIA==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.13.tgz", + "integrity": "sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==", "cpu": [ "x64" ], @@ -4978,9 +5022,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.27.tgz", - "integrity": "sha512-bMvX0yF7WYzn1K+s0JWJhvyA3OeZHVrdjka8eZ4LSeuLfC0ggJefo+klyeuN2szn/LYP6/3oByyrWNY8RSHB4w==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.13.tgz", + "integrity": "sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==", "cpu": [ "arm" ], @@ -4994,9 +5038,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.27.tgz", - "integrity": "sha512-KlkOcSPxrCqZTm4XrT/LT1o9gmyM2T6bw/hL6IwTYRBJg+sej4rc9iSfVRFZBfNuG3EVkFQSXxik+0yVOXR93Q==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.13.tgz", + "integrity": "sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==", "cpu": [ "arm64" ], @@ -5010,9 +5054,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.27.tgz", - "integrity": "sha512-EwdTt5qykxFXJu7kS+0X0Mp/IlwO8KJ6LVNak2+N8bt1J1q/nCdg1tRDOYQ1Z/MVa1Tm+lJ664Qs1y2NY2SDTw==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.13.tgz", + "integrity": "sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==", "cpu": [ "arm64" ], @@ -5026,9 +5070,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.27.tgz", - "integrity": "sha512-RsBbxbiSNWLJ2jbAdITtv30J4eZw4O/JJ5zxYgWI54TdY7YrVsqIdzuX+ldximt+CYvO9irHm/mSr/IJY2YXrw==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.13.tgz", + "integrity": "sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==", "cpu": [ "x64" ], @@ -5042,9 +5086,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.27.tgz", - "integrity": "sha512-XpRx0Kpy6JEi1WSMqUfR3k8hXLqNOkVqFcUfzvfQ4QNBX5Ek7ywh7WAxlPhCrFp+wAfNAqqUyRY1xZpLvRU51A==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.13.tgz", + "integrity": "sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==", "cpu": [ "x64" ], @@ -5058,9 +5102,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.27.tgz", - "integrity": "sha512-pwSTUIokyIp+Ha1pur34qdYjxqL1QzhP/HM8anzsFs4yvV2LSI7c3qc4GWPNv2eQ9WiFXyo29uCEIRN6qig7wg==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.13.tgz", + "integrity": "sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==", "cpu": [ "arm64" ], @@ -5074,9 +5118,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.27.tgz", - "integrity": "sha512-S0S6vqFscvmxPolwmpZvTRfTbYR+eGcyc0ge4x/+HcnBCm+m84rcGxmp3bBb1edNFaIV+X47BlGvvh85cJ4rkQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.13.tgz", + "integrity": "sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==", "cpu": [ "ia32" ], @@ -5090,9 +5134,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.27.tgz", - "integrity": "sha512-aem+BcNW42JPbvV6L3Jl3LLj6G80aYADzYenToYisy0Aop0XZAxL/0FbhV+xWORNFtIUKynNtaa1CK7w0UxehQ==", + "version": "1.6.13", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.13.tgz", + "integrity": "sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==", "cpu": [ "x64" ], @@ -5112,9 +5156,9 @@ "dev": true }, "node_modules/@swc/types": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.8.tgz", - "integrity": "sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz", + "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==", "dev": true, "dependencies": { "@swc/counter": "^0.1.3" @@ -5391,9 +5435,9 @@ } }, "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "devOptional": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5560,9 +5604,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -5680,9 +5724,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -5858,9 +5902,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz", - "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==" + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==" }, "node_modules/@types/ws": { "version": "8.5.10", @@ -6172,36 +6216,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.27", + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.31", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", "dependencies": { - "@vue/compiler-core": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", - "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/compiler-core": "3.4.27", - "@vue/compiler-dom": "3.4.27", - "@vue/compiler-ssr": "3.4.27", - "@vue/shared": "3.4.27", + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -6209,63 +6253,63 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", - "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", "dependencies": { - "@vue/compiler-dom": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/devtools-api": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", - "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==", - "dev": true + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" }, "node_modules/@vue/reactivity": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", - "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", "dependencies": { - "@vue/shared": "3.4.27" + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", - "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", "dependencies": { - "@vue/reactivity": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", - "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", "dependencies": { - "@vue/runtime-core": "3.4.27", - "@vue/shared": "3.4.27", + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", - "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", "dependencies": { - "@vue/compiler-ssr": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { - "vue": "3.4.27" + "vue": "3.4.31" } }, "node_modules/@vue/shared": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", @@ -6523,9 +6567,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -6533,10 +6577,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peer": true, "peerDependencies": { @@ -6553,10 +6597,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -7560,9 +7607,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001632", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz", - "integrity": "sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==", + "version": "1.0.30001640", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz", + "integrity": "sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==", "dev": true, "funding": [ { @@ -7775,9 +7822,9 @@ } }, "node_modules/clamscan": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/clamscan/-/clamscan-2.2.1.tgz", - "integrity": "sha512-ureXxucH9MfkhyR4nsJMWPnwq/mKlSYHB5RtkuqWltgSF06kET/C36iAeJuGiGXIWc1bi1FMMoptysHLkIRA/g==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/clamscan/-/clamscan-2.2.2.tgz", + "integrity": "sha512-VImpTl72LBPKVNY8WCzstLv1E+jENPWLokQj7pZdZsoQbNPXYjIqUPF0XHGpUT23dae1wwkyCvQmyNjnwEqBQg==", "engines": { "node": ">=16.0.0" } @@ -9464,9 +9511,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.796", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", - "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==", + "version": "1.4.818", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.818.tgz", + "integrity": "sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==", "dev": true }, "node_modules/emittery": { @@ -9662,9 +9709,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -9710,9 +9757,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "peer": true, "bin": { @@ -9722,29 +9769,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -10611,9 +10658,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -11743,11 +11790,14 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12107,15 +12157,15 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.1.tgz", + "integrity": "sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -12489,9 +12539,9 @@ } }, "node_modules/jiti": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.3.tgz", - "integrity": "sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -12710,12 +12760,12 @@ } }, "node_modules/knex-dynamic-connection": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/knex-dynamic-connection/-/knex-dynamic-connection-3.1.1.tgz", - "integrity": "sha512-Omq2Mw+5LkjJvZX+ESWpLx2FYkH9SB6Qq4Jad7f2LNQOQV1VLq91QQqtEhkgprnQuT3IUvzFooARpSN1uzoMEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/knex-dynamic-connection/-/knex-dynamic-connection-3.2.0.tgz", + "integrity": "sha512-+j6KeUSim0FR8EobOqA1a/TZbN9mahjzHzJgOfQVkv6PUnSqJp70c/5n63M2YVNgNHETyBIUhV8stuQ0T/mG3g==", "dependencies": { - "debug": "^4.3.4", - "knex": "^3.0.1" + "debug": "^4.3.5", + "knex": "^3.1.0" }, "engines": { "node": ">=14.0.0" @@ -12751,9 +12801,9 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -13619,9 +13669,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13886,6 +13939,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -14021,12 +14080,12 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.0.tgz", + "integrity": "sha512-bfJaPTuEiTYBu+ulDaeQ0F+uLmlfFkMgXj4cbwfuMSjgObGMzb55FMMbDvbRU0fAHZ4sLGkz2mKwcMg8Dvm8Ww==", "dev": true, "engines": { - "node": "14 || >=16.14" + "node": ">=18" } }, "node_modules/path-to-regexp": { @@ -14054,9 +14113,9 @@ } }, "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.1.1.tgz", + "integrity": "sha512-4hEOSH7KeEaZpMDF/xfm1W9fS5rT7Ett3BkXWHqAEzRLLwLaHkwOL+GvvpIEh9UrvX9BDhzfkvteslgraoH69w==", "engines": { "node": ">=14.16" }, @@ -14293,9 +14352,9 @@ } }, "node_modules/pino-pretty": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.0.tgz", - "integrity": "sha512-k6VHtZBcfLDB1mB8TWPE19OyLygfNdqOgX/uACqBbVMaUK2JeXHBUTINvJ/QPs5Vazwfq4gWIDpTYDnhkfy7Jw==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.1.tgz", + "integrity": "sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g==", "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", @@ -14509,9 +14568,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "funding": [ { "type": "opencollective", @@ -14528,7 +14587,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -15177,9 +15236,9 @@ } }, "node_modules/prettier": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.1.tgz", - "integrity": "sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -15334,9 +15393,9 @@ } }, "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.2.tgz", + "integrity": "sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==", "dependencies": { "side-channel": "^1.0.6" }, @@ -15507,15 +15566,15 @@ } }, "node_modules/redis": { - "version": "4.6.14", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.14.tgz", - "integrity": "sha512-GrNg/e33HtsQwNXL7kJT+iNFPSwE1IPmd7wzV3j4f2z0EYxZfZE7FVTmUysgAtqQQtg5NXF5SNLR9OdO/UHOfw==", + "version": "4.6.15", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.15.tgz", + "integrity": "sha512-2NtuOpMW3tnYzBw6S8mbXSX7RPzvVFCA2wFJq9oErushO2UeBkxObk+uvo7gv7n0rhWeOj/IzrHO8TjcFlRSOg==", "workspaces": [ "./packages/*" ], "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.5.16", + "@redis/client": "1.5.17", "@redis/graph": "1.1.1", "@redis/json": "1.0.6", "@redis/search": "1.1.6", @@ -16564,9 +16623,9 @@ } }, "node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -16745,12 +16804,12 @@ } }, "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.1.0.tgz", + "integrity": "sha512-19dQEwG6Jd+VabjPRyBhymIF069vZiqWSZa2jJBoKJTsqGKnTxowGoQaLnz+yLARfDI041IUQekyPUMWElOgsQ==", "dependencies": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" + "peek-readable": "^5.1.1" }, "engines": { "node": ">=14.16" @@ -16833,31 +16892,32 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.3.tgz", + "integrity": "sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -17804,9 +17864,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -17904,9 +17964,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -18016,13 +18076,13 @@ } }, "node_modules/vite": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.13.tgz", - "integrity": "sha512-SSq1noJfY9pR3I1TUENL3rQYDQCFqgD+lM6fTRAM8Nv6Lsg5hDLaXkjETVeBt+7vZBCMoibD+6IWnT2mJ+Zb/A==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz", + "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==", "peer": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", + "esbuild": "^0.21.3", + "postcss": "^8.4.39", "rollup": "^4.13.0" }, "bin": { @@ -18071,12 +18131,12 @@ } }, "node_modules/vite-plugin-restart": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/vite-plugin-restart/-/vite-plugin-restart-0.4.0.tgz", - "integrity": "sha512-SXeyKQAzRFmEmEyGP2DjaTbx22D1K5MapyNiAP7Xa14UyFgNSDjZ86bfjWksA0pqn+bZyxnVLJpCiqDuG+tOcg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-restart/-/vite-plugin-restart-0.4.1.tgz", + "integrity": "sha512-MYhDFaa2HMoSavr/2pShj6toKVFso+zqF6FAdWGC8JSIrsNig+4giy9EzoSySgGRJvsnbwZXKdjAvn8ag8rUkA==", "peer": true, "dependencies": { - "micromatch": "^4.0.5" + "micromatch": "^4.0.7" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -18086,15 +18146,15 @@ } }, "node_modules/vue": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", - "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", "dependencies": { - "@vue/compiler-dom": "3.4.27", - "@vue/compiler-sfc": "3.4.27", - "@vue/runtime-dom": "3.4.27", - "@vue/server-renderer": "3.4.27", - "@vue/shared": "3.4.27" + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { "typescript": "*" @@ -18114,6 +18174,25 @@ "vue": "^3.0.0" } }, + "node_modules/vue-i18n": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.13.1.tgz", + "integrity": "sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==", + "dependencies": { + "@intlify/core-base": "9.13.1", + "@intlify/shared": "9.13.1", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-loader": { "version": "17.4.2", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz", @@ -18245,9 +18324,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dev": true, "peer": true, "dependencies": { @@ -18257,10 +18336,10 @@ "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -18786,9 +18865,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -19008,9 +19087,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "engines": { "node": ">=12.20" }, diff --git a/package.json b/package.json index f5e99eb..3ae612f 100644 --- a/package.json +++ b/package.json @@ -79,8 +79,8 @@ "@adonisjs/drive": "^2.3.0", "@adonisjs/encore": "^1.0.0", "@adonisjs/inertia": "^1.0.0-7", - "@adonisjs/lucid": "^20.2.0", - "@adonisjs/redis": "^8.0.1", + "@adonisjs/lucid": "^21.1.0", + "@adonisjs/redis": "^9.1.0", "@adonisjs/session": "^7.1.1", "@adonisjs/shield": "^8.1.1", "@adonisjs/static": "^1.1.1", @@ -112,6 +112,7 @@ "reflect-metadata": "^0.2.1", "saxon-js": "^2.5.0", "toastify-js": "^1.12.0", + "vue-i18n": "^9.13.1", "vuedraggable": "^4.1.0", "xmlbuilder2": "^3.1.1" }, diff --git a/providers/vinejs_provider.ts b/providers/vinejs_provider.ts index 72347ac..2688fb0 100644 --- a/providers/vinejs_provider.ts +++ b/providers/vinejs_provider.ts @@ -10,6 +10,8 @@ import type { Validation, FieldContext, FieldOptions } from '@vinejs/vine/types' import type { MultipartFile } from '@adonisjs/core/bodyparser'; import type { FileValidationOptions } from '@adonisjs/core/types/bodyparser'; import { Request, RequestValidator } from '@adonisjs/core/http'; +import MimeType from '#models/mime_type'; + /** * Validation options accepted by the "file" rule */ @@ -37,11 +39,21 @@ declare module '@adonisjs/core/http' { export function isBodyParserFile(file: MultipartFile | unknown): boolean { return !!(file && typeof file === 'object' && 'isMultipartFile' in file); } +async function getEnabledExtensions() { + const enabledExtensions = await MimeType.query().select('file_extension').where('enabled', true).exec(); + const extensions = enabledExtensions + .map((extension) => { + return extension.file_extension.split('|'); + }) + .flat(); + + return extensions; +}; /** * VineJS validation rule that validates the file to be an * instance of BodyParser MultipartFile class. */ -const isMultipartFile = vine.createRule((file: MultipartFile | unknown, options: FileRuleValidationOptions, field: FieldContext) => { +const isMultipartFile = vine.createRule(async (file: MultipartFile | unknown, options: FileRuleValidationOptions, field: FieldContext) => { /** * Report error when value is not a field multipart * file object @@ -64,8 +76,11 @@ const isMultipartFile = vine.createRule((file: MultipartFile | unknown, options: * Set extensions when it's defined in the options and missing * on the file instance */ + // if (validatedFile.allowedExtensions === undefined && validationOptions.extnames) { + // validatedFile.allowedExtensions = validationOptions.extnames; + // } if (validatedFile.allowedExtensions === undefined && validationOptions.extnames) { - validatedFile.allowedExtensions = validationOptions.extnames; + validatedFile.allowedExtensions = await getEnabledExtensions(); } /** * wieder löschen diff --git a/public/assets/manifest.json b/public/assets/manifest.json index 9625ee4..bf5bc77 100644 --- a/public/assets/manifest.json +++ b/public/assets/manifest.json @@ -17,8 +17,8 @@ "assets/resources_js_Pages_Admin_User_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Index_vue.js", "assets/resources_js_Pages_Admin_User_Show_vue.js": "http://localhost:8080/assets/resources_js_Pages_Admin_User_Show_vue.js", "assets/resources_js_Pages_App_vue.js": "http://localhost:8080/assets/resources_js_Pages_App_vue.js", - "assets/resources_js_Pages_Auth_AccountInfo_vue.css": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue.css", - "assets/resources_js_Pages_Auth_AccountInfo_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue.js", + "assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css.css": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css.css", + "assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css.js": "http://localhost:8080/assets/resources_js_Pages_Auth_AccountInfo_vue-resources_js_utils_toast_css.js", "assets/resources_js_Pages_Auth_Login_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_Login_vue.js", "assets/resources_js_Pages_Auth_Register_vue.js": "http://localhost:8080/assets/resources_js_Pages_Auth_Register_vue.js", "assets/resources_js_Pages_Dashboard_vue.js": "http://localhost:8080/assets/resources_js_Pages_Dashboard_vue.js", @@ -36,11 +36,11 @@ "assets/resources_js_Pages_Reviewer_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Index_vue.js", "assets/resources_js_Pages_Reviewer_Dataset_Reject_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Reject_vue.js", "assets/resources_js_Pages_Reviewer_Dataset_Review_vue.js": "http://localhost:8080/assets/resources_js_Pages_Reviewer_Dataset_Review_vue.js", - "assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_Components_FileUpload_vue-resour-910d0c.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_Components_FileUpload_vue-resour-910d0c.css", - "assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_Components_FileUpload_vue-resour-910d0c.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_Components_FileUpload_vue-resour-910d0c.js", + "assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-0c4b04.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-0c4b04.css", + "assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-0c4b04.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Create_vue-resources_js_utils_toast_css-resources_js_Com-0c4b04.js", "assets/resources_js_Pages_Submitter_Dataset_Delete_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Delete_vue.js", - "assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_Components_FileUpload_vue-resource-b447ba.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_Components_FileUpload_vue-resource-b447ba.css", - "assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_Components_FileUpload_vue-resource-b447ba.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_Components_FileUpload_vue-resource-b447ba.js", + "assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-b6a1eb.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-b6a1eb.css", + "assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-b6a1eb.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Edit_vue-resources_js_utils_toast_css-resources_js_Compo-b6a1eb.js", "assets/resources_js_Pages_Submitter_Dataset_Index_vue.css": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Index_vue.css", "assets/resources_js_Pages_Submitter_Dataset_Index_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Index_vue.js", "assets/resources_js_Pages_Submitter_Dataset_Release_vue.js": "http://localhost:8080/assets/resources_js_Pages_Submitter_Dataset_Release_vue.js", @@ -49,11 +49,10 @@ "assets/vendors-node_modules_mdi_js_mdi_js-node_modules_vue-loader_dist_exportHelper_js.js": "http://localhost:8080/assets/vendors-node_modules_mdi_js_mdi_js-node_modules_vue-loader_dist_exportHelper_js.js", "assets/vendors-node_modules_focus-trap_dist_focus-trap_esm_js-node_modules_notiwind_dist_index_esm_js.js": "http://localhost:8080/assets/vendors-node_modules_focus-trap_dist_focus-trap_esm_js-node_modules_notiwind_dist_index_esm_js.js", "assets/vendors-node_modules_vue-facing-decorator_dist_esm_utils_js.js": "http://localhost:8080/assets/vendors-node_modules_vue-facing-decorator_dist_esm_utils_js.js", - "assets/vendors-node_modules_leaflet_src_control_Control_Attribution_js-node_modules_leaflet_src_laye-fbc1b4.js": "http://localhost:8080/assets/vendors-node_modules_leaflet_src_control_Control_Attribution_js-node_modules_leaflet_src_laye-fbc1b4.js", + "assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_control_Control_Att-4ee9a6.js": "http://localhost:8080/assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_control_Control_Att-4ee9a6.js", + "assets/vendors-node_modules_toastify-js_src_toastify_js.js": "http://localhost:8080/assets/vendors-node_modules_toastify-js_src_toastify_js.js", "assets/vendors-node_modules_buffer_index_js-node_modules_leaflet_src_layer_tile_TileLayer_WMS_js-nod-e7bc71.js": "http://localhost:8080/assets/vendors-node_modules_buffer_index_js-node_modules_leaflet_src_layer_tile_TileLayer_WMS_js-nod-e7bc71.js", "assets/vendors-node_modules_numeral_numeral_js-node_modules_chart_js_dist_chart_js.js": "http://localhost:8080/assets/vendors-node_modules_numeral_numeral_js-node_modules_chart_js_dist_chart_js.js", - "assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_layer_LayerGroup_js.js": "http://localhost:8080/assets/vendors-node_modules_leaflet_dist_leaflet-src_js-node_modules_leaflet_src_layer_LayerGroup_js.js", - "assets/vendors-node_modules_toastify-js_src_toastify_js.js": "http://localhost:8080/assets/vendors-node_modules_toastify-js_src_toastify_js.js", "assets/resources_js_Components_BaseButton_vue.js": "http://localhost:8080/assets/resources_js_Components_BaseButton_vue.js", "assets/resources_js_Stores_main_ts-resources_js_Components_BaseDivider_vue-resources_js_Components_C-b45805.js": "http://localhost:8080/assets/resources_js_Stores_main_ts-resources_js_Components_BaseDivider_vue-resources_js_Components_C-b45805.js", "assets/resources_js_Components_SectionMain_vue-resources_js_Layouts_LayoutAuthenticated_vue.css": "http://localhost:8080/assets/resources_js_Components_SectionMain_vue-resources_js_Layouts_LayoutAuthenticated_vue.css", @@ -61,9 +60,10 @@ "assets/resources_js_Components_BaseButtons_vue-resources_js_Components_FormControl_vue-resources_js_-d830d6.js": "http://localhost:8080/assets/resources_js_Components_BaseButtons_vue-resources_js_Components_FormControl_vue-resources_js_-d830d6.js", "assets/resources_js_Components_Admin_Pagination_vue-resources_js_Components_BaseButtons_vue-resource-8134e7.js": "http://localhost:8080/assets/resources_js_Components_Admin_Pagination_vue-resources_js_Components_BaseButtons_vue-resource-8134e7.js", "assets/resources_js_Components_Map_draw_component_vue-resources_js_Components_Map_zoom_component_vue-196747.js": "http://localhost:8080/assets/resources_js_Components_Map_draw_component_vue-resources_js_Components_Map_zoom_component_vue-196747.js", + "assets/resources_js_utils_toast_ts-resources_js_Components_FormValidationErrors_vue-resources_js_Com-a6b99f.js": "http://localhost:8080/assets/resources_js_utils_toast_ts-resources_js_Components_FormValidationErrors_vue-resources_js_Com-a6b99f.js", "assets/resources_js_Components_Admin_Sort_vue-resources_js_Components_SectionTitleLineWithButton_vue.js": "http://localhost:8080/assets/resources_js_Components_Admin_Sort_vue-resources_js_Components_SectionTitleLineWithButton_vue.js", "assets/resources_js_Components_CardBoxModal_vue.js": "http://localhost:8080/assets/resources_js_Components_CardBoxModal_vue.js", - "assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-d5e5fc.js": "http://localhost:8080/assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-d5e5fc.js", + "assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-bdf2f9.js": "http://localhost:8080/assets/resources_js_Components_FileUpload_vue-resources_js_Components_FormCheckRadioGroup_vue-resour-bdf2f9.js", "assets/fonts/inter-latin-ext-400-normal.woff": "http://localhost:8080/assets/fonts/inter-latin-ext-400-normal.40b3b0d5.woff", "assets/fonts/inter-latin-ext-400-normal.woff2": "http://localhost:8080/assets/fonts/inter-latin-ext-400-normal.0f9e8d4e.woff2", "assets/fonts/inter-latin-400-normal.woff": "http://localhost:8080/assets/fonts/inter-latin-400-normal.08a02fd2.woff", diff --git a/resources/js/Components/Map/draw.component.vue b/resources/js/Components/Map/draw.component.vue index 9fdd2de..95a3c56 100644 --- a/resources/js/Components/Map/draw.component.vue +++ b/resources/js/Components/Map/draw.component.vue @@ -4,13 +4,10 @@ --> - @@ -28,6 +25,8 @@ import { Map } from 'leaflet/src/map/index'; import { on, off, preventDefault } from 'leaflet/src/dom/DomEvent'; import { Rectangle } from 'leaflet/src/layer/vector/Rectangle'; import { LatLngBounds } from 'leaflet/src/geo/LatLngBounds'; +import { LatLng } from 'leaflet'; +import { LeafletMouseEvent } from 'leaflet'; @Component({ name: 'draw-control', @@ -58,19 +57,19 @@ export default class DrawControlComponent extends Vue { @Prop() public mapId: string; // @Prop() public map: Map; - @Prop public southWest: LatLngBounds; - @Prop public northEast: LatLngBounds; + @Prop public southWest: LatLng; + @Prop public northEast: LatLng; @Prop({ default: true, }) public preserve: boolean; mapService = MapService(); - public _enabled; + public _enabled: boolean; private _map: Map; private _isDrawing: boolean = false; - private _startLatLng; - private _mapDraggable; + private _startLatLng: LatLng; + private _mapDraggable: boolean; private _shape: Rectangle | undefined; enable() { @@ -80,6 +79,7 @@ export default class DrawControlComponent extends Vue { this._enabled = true; this.addHooks(); + this._map.control = this; return this; } @@ -111,6 +111,7 @@ export default class DrawControlComponent extends Vue { // this._map.domElement.style.cursor = 'crosshair'; this._map._container.style.cursor = 'crosshair'; // this._tooltip.updateContent({text: this._initialLabelText}); + this._map .on('mousedown', this._onMouseDown, this) .on('mousemove', this._onMouseMove, this) @@ -157,7 +158,7 @@ export default class DrawControlComponent extends Vue { this._isDrawing = false; } - private _onMouseDown(e) { + private _onMouseDown(e: LeafletMouseEvent) { this._isDrawing = true; this._startLatLng = e.latlng; @@ -169,7 +170,7 @@ export default class DrawControlComponent extends Vue { preventDefault(e.originalEvent); } - private _onMouseMove(e) { + private _onMouseMove(e: LeafletMouseEvent) { var latlng = e.latlng; // this._tooltip.updatePosition(latlng); @@ -191,13 +192,21 @@ export default class DrawControlComponent extends Vue { } } - private _fireCreatedEvent(shape) { + private _fireCreatedEvent(shape: Rectangle) { var rectangle = new Rectangle(shape.getBounds(), this.options.shapeOptions); // L.Draw.SimpleShape.prototype._fireCreatedEvent.call(this, rectangle); this._map.fire('Draw.Event.CREATED', { layer: rectangle, type: this.TYPE }); } - public drawShape(southWest, northEast) { + public removeShape() { + if (this._shape) { + this._map.removeLayer(this._shape); + // delete this._shape; + this._shape = undefined; + } + } + + public drawShape(southWest: LatLng, northEast: LatLng) { if (!this._shape) { const bounds = new LatLngBounds(southWest, northEast); this._shape = new Rectangle(bounds, this.options.shapeOptions); @@ -210,7 +219,7 @@ export default class DrawControlComponent extends Vue { } // from Draw Rectangle - private _drawShape(latlng) { + private _drawShape(latlng: LatLng) { if (!this._shape) { const bounds = new LatLngBounds(this._startLatLng, latlng); this._shape = new Rectangle(bounds, this.options.shapeOptions); diff --git a/resources/js/Components/Map/map.component.vue b/resources/js/Components/Map/map.component.vue index 397806d..53e2f07 100644 --- a/resources/js/Components/Map/map.component.vue +++ b/resources/js/Components/Map/map.component.vue @@ -7,22 +7,32 @@ +
+ +
+ + diff --git a/resources/js/Components/PersonalTotpSettings.vue b/resources/js/Components/PersonalTotpSettings.vue index 7f9766e..3ddafab 100644 --- a/resources/js/Components/PersonalTotpSettings.vue +++ b/resources/js/Components/PersonalTotpSettings.vue @@ -44,6 +44,8 @@ :loading="loadingConfirmation" v-model:confirmation="confirmationCode" @confirm="enableTOTP" /> + + @@ -56,6 +58,8 @@ import SetupConfirmation from '@/Components/SetupConfirmation.vue'; import Notification from '@/utils/toast'; import { mdiTwoFactorAuthentication } from '@mdi/js'; +import PersonalSettings from '@/Components/PersonalSettings.vue'; +import BaseDivider from './BaseDivider.vue'; const mainService = MainService(); // const emit = defineEmits(['confirm', 'update:confirmation']); @@ -70,6 +74,10 @@ const props = defineProps({ type: Boolean, default: false, }, + backupState: { + type: Object, + default: () => ({}), + }, // // code: { // // type: Object, // // }, diff --git a/resources/js/Pages/Auth/AccountInfo.vue b/resources/js/Pages/Auth/AccountInfo.vue index 9d6beb1..e5021d6 100644 --- a/resources/js/Pages/Auth/AccountInfo.vue +++ b/resources/js/Pages/Auth/AccountInfo.vue @@ -29,6 +29,7 @@ import { computed, Ref } from 'vue'; import { usePage } from '@inertiajs/vue3'; import FormValidationErrors from '@/Components/FormValidationErrors.vue'; import PersonalTotpSettings from '@/Components/PersonalTotpSettings.vue'; +// import PersonalSettings from '@/Components/PersonalSettings.vue'; // import { MainService } from '@/Stores/main'; // const mainService = MainService(); @@ -47,9 +48,9 @@ defineProps({ code: { type: Object, }, - recoveryCodes: { - type: Array, - default: () => [], + backupState: { + type: Object, + default: () => ({}), }, errors: { type: Object, @@ -211,7 +212,10 @@ const flash: Ref = computed(() => { - + + + + - + @@ -47,8 +45,8 @@ - + +
+ + + +
+ + + + + + +