diff --git a/app/Controllers/Http/Api/FileController.ts b/app/Controllers/Http/Api/FileController.ts new file mode 100644 index 0000000..dd9ca60 --- /dev/null +++ b/app/Controllers/Http/Api/FileController.ts @@ -0,0 +1,54 @@ +import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; +import File from 'App/Models/File'; +import { StatusCodes } from 'http-status-codes'; +import * as fs from 'fs'; +import * as path from 'path'; + +// node ace make:controller Author +export default class FileController { + // @Get("download/:id") + public async findOne({ response, params }: HttpContextContract) { + const id = params.id; + const file = await File.findOrFail(id); + // const file = await File.findOne({ + // where: { id: id }, + // }); + if (file) { + const filePath = '/storage/app/public/' + file.pathName; + const ext = path.extname(filePath); + const fileName = file.label + ext; + try { + fs.accessSync(filePath, fs.constants.R_OK); //| fs.constants.W_OK); + // console.log("can read/write:", path); + + response + .header('Cache-Control', 'no-cache private') + .header('Content-Description', 'File Transfer') + .header('Content-Type', file.mimeType) + .header('Content-Disposition', 'inline; filename=' + fileName) + .header('Content-Transfer-Encoding', 'binary') + .header('Access-Control-Allow-Origin', '*') + .header('Access-Control-Allow-Methods', 'GET,POST'); + + response.status(StatusCodes.OK).download(filePath); + } catch (err) { + // console.log("no access:", path); + response.status(StatusCodes.NOT_FOUND).send({ + message: `File with id ${id} doesn't exist on file server`, + }); + } + + // res.status(StatusCodes.OK).sendFile(filePath, (err) => { + // // res.setHeader("Content-Type", "application/json"); + // // res.removeHeader("Content-Disposition"); + // res.status(StatusCodes.NOT_FOUND).send({ + // message: `File with id ${id} doesn't exist on file server`, + // }); + // }); + } else { + response.status(StatusCodes.NOT_FOUND).send({ + message: `Cannot find File with id=${id}.`, + }); + } + } +} diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index 043fb18..b2cfbaf 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -15,6 +15,7 @@ import Database from '@ioc:Adonis/Lucid/Database'; import { TransactionClientContract } from '@ioc:Adonis/Lucid/Database'; import Subject from 'App/Models/Subject'; import CreateDatasetValidator from 'App/Validators/CreateDatasetValidator'; +import UpdateDatasetValidator from 'App/Validators/UpdateDatasetValidator'; import { TitleTypes, DescriptionTypes, @@ -33,8 +34,6 @@ import ClamScan from 'clamscan'; import { ValidationException } from '@ioc:Adonis/Core/Validator'; import Drive from '@ioc:Adonis/Core/Drive'; import { Exception } from '@adonisjs/core/build/standalone'; -// import XmlModel from 'App/Library/XmlModel'; -// import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; export default class DatasetController { public async index({ auth, request, inertia }: HttpContextContract) { @@ -355,7 +354,7 @@ export default class DatasetController { //store licenses: const licenses: number[] = request.input('licenses', []); - dataset.useTransaction(trx).related('licenses').sync(licenses); + await dataset.useTransaction(trx).related('licenses').sync(licenses); // save authors and contributors await this.savePersons(dataset, request.input('authors', []), 'author', trx); @@ -456,7 +455,7 @@ export default class DatasetController { newFile.visibleInOai = true; // let path = coverImage.filePath; await dataset.useTransaction(trx).related('files').save(newFile); - // await newFile.createHashValues(); + await newFile.createHashValues(trx); } } @@ -682,29 +681,39 @@ export default class DatasetController { // throw new GeneralException(trans('exceptions.publish.release.update_error')); } - public async edit({ params, inertia }) { - const datasetQuery = Dataset.query().where('id', params.id); - datasetQuery.preload('titles').preload('descriptions').preload('coverage'); - const dataset = await datasetQuery.firstOrFail(); + public async edit({ request, inertia, response }) { + const id = request.param('id'); + const datasetQuery = Dataset.query().where('id', id); + datasetQuery + .preload('titles', (query) => query.orderBy('id', 'asc')) + .preload('descriptions', (query) => query.orderBy('id', 'asc')) + .preload('coverage') + .preload('licenses') + .preload('authors') + .preload('contributors') + .preload('subjects') + .preload('references') + .preload('files'); - // await dataset.loadMany([ - // 'licenses', - // 'authors', - // 'contributors', - // 'titles', - // 'abstracts', - // 'files', - // 'coverage', - // 'subjects', - // 'references', - // ]); + const dataset = await datasetQuery.firstOrFail(); + const validStates = ['inprogress', 'rejected_editor']; + if (!validStates.includes(dataset.server_state)) { + // session.flash('errors', 'Invalid server state!'); + return response + .flash( + 'warning', + `Invalid server state. Dataset with id ${id} cannot be edited. Datset has server state ${dataset.server_state}.`, + ) + .redirect() + .toRoute('dataset.list'); + } const titleTypes = Object.entries(TitleTypes) - // .filter(([value]) => value !== 'Main') + .filter(([value]) => value !== 'Main') .map(([key, value]) => ({ value: key, label: value })); const descriptionTypes = Object.entries(DescriptionTypes) - // .filter(([value]) => value !== 'Abstract') + .filter(([value]) => value !== 'Abstract') .map(([key, value]) => ({ value: key, label: value })); const languages = await Language.query().where('active', true).pluck('part1', 'part1'); @@ -724,33 +733,11 @@ export default class DatasetController { const currentYear = currentDate.getFullYear(); const years = Array.from({ length: currentYear - 1990 + 1 }, (_, index) => 1990 + index); - // const licenses = await License.query() - // .select('id', 'name_long', 'link_licence') - // .orderBy('sort_order') - // .fetch(); - const licenses = await License.query().select('id', 'name_long', 'link_licence').orderBy('sort_order'); - + const licenses = await License.query().select('id', 'name_long').where('active', 'true').pluck('name_long', 'id'); + // const userHasRoles = user.roles; + // const datasetHasLicenses = await dataset.related('licenses').query().pluck('id'); // const checkeds = dataset.licenses.first().id; - const keywordTypes = { - uncontrolled: 'uncontrolled', - swd: 'swd', - }; - - const referenceTypes = ['DOI', 'Handle', 'ISBN', 'ISSN', 'URL', 'URN']; - - const relationTypes = [ - 'IsSupplementTo', - 'IsSupplementedBy', - 'IsContinuedBy', - 'Continues', - 'IsNewVersionOf', - 'IsPartOf', - 'HasPart', - 'Compiles', - 'IsVariantFormOf', - ]; - const doctypes = { analysisdata: { label: 'Analysis', value: 'analysisdata' }, measurementdata: { label: 'Measurements', value: 'measurementdata' }, @@ -771,16 +758,164 @@ export default class DatasetController { // messages, projects, licenses, + // datasetHasLicenses: Object.keys(datasetHasLicenses).map((key) => datasetHasLicenses[key]), //convert object to array with license ids // checkeds, years, // languages, - keywordTypes, - referenceTypes, - relationTypes, + subjectTypes: SubjectTypes, + referenceIdentifierTypes: Object.entries(ReferenceIdentifierTypes).map(([key, value]) => ({ value: key, label: value })), + relationTypes: Object.entries(RelationTypes).map(([key, value]) => ({ value: key, label: value })), doctypes, }); } + public async update({ request, response, session }: HttpContextContract) { + try { + // await request.validate({ schema: newDatasetSchema, messages: this.messages }); + await request.validate(UpdateDatasetValidator); + } catch (error) { + // - Handle errors + // return response.badRequest(error.messages); + throw error; + // return response.badRequest(error.messages); + } + const id = request.param('id'); + + let trx: TransactionClientContract | null = null; + try { + trx = await Database.transaction(); + // const user = (await User.find(auth.user?.id)) as User; + // await this.createDatasetAndAssociations(user, request, trx); + const dataset = await Dataset.findOrFail(id); + + // save the licenses + const licenses: number[] = request.input('licenses', []); + // await dataset.useTransaction(trx).related('licenses').sync(licenses); + await dataset.useTransaction(trx).related('licenses').sync(licenses); + + // save authors and contributors + await dataset.useTransaction(trx).related('authors').sync([]); + await dataset.useTransaction(trx).related('contributors').sync([]); + await this.savePersons(dataset, request.input('authors', []), 'author', trx); + await this.savePersons(dataset, request.input('contributors', []), 'contributor', trx); + + //save the titles: + const titles = request.input('titles', []); + // const savedTitles:Array = []; + for (const titleData of titles) { + if (titleData.id) { + const title = await Title.findOrFail(titleData.id); + title.value = titleData.value; + title.language = titleData.language; + title.type = titleData.type; + if (title.$isDirty) { + await title.useTransaction(trx).save(); + // await dataset.useTransaction(trx).related('titles').save(title); + // savedTitles.push(title); + } + } else { + const title = new Title(); + title.fill(titleData); + // savedTitles.push(title); + await dataset.useTransaction(trx).related('titles').save(title); + } + } + + // save the abstracts + const descriptions = request.input('descriptions', []); + // const savedTitles:Array<Title> = []; + for (const descriptionData of descriptions) { + if (descriptionData.id) { + const description = await Description.findOrFail(descriptionData.id); + description.value = descriptionData.value; + description.language = descriptionData.language; + description.type = descriptionData.type; + if (description.$isDirty) { + await description.useTransaction(trx).save(); + // await dataset.useTransaction(trx).related('titles').save(title); + // savedTitles.push(title); + } + } else { + const description = new Description(); + description.fill(descriptionData); + // savedTitles.push(title); + await dataset.useTransaction(trx).related('descriptions').save(description); + } + } + + // Save already existing files + const files = request.input('fileInputs', []); + for (const fileData of files) { + if (fileData.id) { + const file = await File.findOrFail(fileData.id); + file.label = fileData.label; + file.sortOrder = fileData.sort_order; + if (file.$isDirty) { + await file.useTransaction(trx).save(); + } + } + } + + // handle new uploaded files: + const uploadedFiles = request.files('files'); + if (Array.isArray(uploadedFiles) && uploadedFiles.length > 0) { + // let index = 1; + // for (const key in files) { + // const formFile = files[key] + // for (const fileData of files) { + for (const [index, fileData] of uploadedFiles.entries()) { + // const uploads = request.file('uploads'); + // const fileIndex = formFile.file; + // const file = uploads[fileIndex]; + + const fileName = `file-${cuid()}.${fileData.extname}`; + const mimeType = fileData.headers['content-type'] || 'application/octet-stream'; // Fallback to a default MIME type + const datasetFolder = `files/${dataset.id}`; + await fileData.moveToDisk( + datasetFolder, + { + name: fileName, + overwrite: true, // overwrite in case of conflict + }, + 'local', + ); + // save file metadata into db + const newFile = new File(); + newFile.pathName = `${datasetFolder}/${fileName}`; + newFile.fileSize = fileData.size; + newFile.mimeType = mimeType; + newFile.label = fileData.clientName; + newFile.sortOrder = index; + newFile.visibleInFrontdoor = true; + newFile.visibleInOai = true; + // let path = coverImage.filePath; + await dataset.useTransaction(trx).related('files').save(newFile); + await newFile.createHashValues(); + } + } + + const input = request.only(['project_id', 'embargo_date', 'language', 'type', 'creating_corporation']); + // dataset.type = request.input('type'); + dataset.merge(input); + // let test: boolean = dataset.$isDirty; + await dataset.useTransaction(trx).save(); + + await trx.commit(); + console.log('Dataset and related models created successfully'); + } catch (error) { + if (trx !== null) { + await trx.rollback(); + } + console.error('Failed to create dataset and related models:', error); + // throw new ValidationException(true, { 'upload error': `failed to create dataset and related models. ${error}` }); + throw error; + } + + session.flash('message', 'Dataset has been created successfully'); + // return response.redirect().toRoute('user.index'); + return response.redirect().back(); + } + public async delete({ request, inertia, response, session }) { const id = request.param('id'); try { diff --git a/app/Models/Description.ts b/app/Models/Description.ts index a5d53b6..055e811 100644 --- a/app/Models/Description.ts +++ b/app/Models/Description.ts @@ -9,6 +9,11 @@ export default class Description extends BaseModel { public static timestamps = false; public static fillable: string[] = ['value', 'type', 'language']; + @column({ + isPrimary: true, + }) + public id: number; + @column({}) public document_id: number; diff --git a/app/Models/File.ts b/app/Models/File.ts index 45104c2..ab62f54 100644 --- a/app/Models/File.ts +++ b/app/Models/File.ts @@ -1,19 +1,18 @@ import { DateTime } from 'luxon'; -import { - column, - hasMany, - HasMany, - belongsTo, - BelongsTo, - // manyToMany, - // ManyToMany, - SnakeCaseNamingStrategy, -} from '@ioc:Adonis/Lucid/Orm'; +import { column, hasMany, HasMany, belongsTo, BelongsTo, SnakeCaseNamingStrategy, computed } from '@ioc:Adonis/Lucid/Orm'; import HashValue from './HashValue'; import Dataset from './Dataset'; import BaseModel from './BaseModel'; +// import { Buffer } from 'buffer'; +import * as fs from 'fs'; +import crypto from 'crypto'; +import { TransactionClientContract } from '@ioc:Adonis/Lucid/Database'; export default class File extends BaseModel { + // private readonly _data: Uint8Array; + // private readonly _type: string; + // private readonly _size: number; + public static namingStrategy = new SnakeCaseNamingStrategy(); public static primaryKey = 'id'; public static table = 'document_files'; @@ -73,4 +72,93 @@ export default class File extends BaseModel { foreignKey: 'file_id', }) public hashvalues: HasMany<typeof HashValue>; + + @computed({ + serializeAs: 'filePath', + }) + public get filePath() { + return `/storage/app/public/${this.pathName}`; + // const mainTitle = this.titles?.find((title) => title.type === 'Main'); + // return mainTitle ? mainTitle.value : null; + } + + @computed({ + serializeAs: 'size', + }) + public get size() { + return this.fileSize; + } + + @computed({ + serializeAs: 'type', + }) + public get type() { + return this.mimeType; + } + + @computed({ + serializeAs: 'name', + }) + get name(): string { + return this.label; + } + + @computed({ + serializeAs: 'lastModified', + }) + get lastModified(): number { + return this.updatedAt.toUnixInteger(); //.toFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + } + + readonly webkitRelativePath: string = ''; + + @computed({ + serializeAs: 'fileData', + }) + public get fileData(): string { + // return this.fileData; + // const fileData = fs.readFileSync(path.resolve(__dirname, this.filePath)); + // const fileData = fs.readFileSync(this.filePath); + const fileContent: Buffer = fs.readFileSync(this.filePath); + // Create a Blob from the file content + // const blob = new Blob([fileContent], { type: this.type }); // Adjust + // let fileSrc = URL.createObjectURL(blob); + // return fileSrc; + + // return Buffer.from(fileContent); + // get the buffer from somewhere + // const buff = fs.readFileSync('./test.bin'); + // create a JSON string that contains the data in the property "blob" + const json = JSON.stringify({ blob: fileContent.toString('base64') }); + return json; + } + + public async createHashValues(trx?: TransactionClientContract) { + const hashtypes: string[] = ['md5', 'sha512']; + + for (const type of hashtypes) { + const hash = new HashValue(); + hash.type = type; + const hashString = await this.checksumFile(this.filePath, type); // Assuming getRealHash is a method in the same model + hash.value = hashString; + + // https://github.com/adonisjs/core/discussions/1872#discussioncomment-132289 + const file: File = this; + if (trx) { + await file.useTransaction(trx).related('hashvalues').save(hash); // Save the hash value to the database + } else { + await file.related('hashvalues').save(hash); // Save the hash value to the database + } + } + } + + private async checksumFile(path, hashName = 'md5'): Promise<string> { + return new Promise((resolve, reject) => { + const hash = crypto.createHash(hashName); + const stream = fs.createReadStream(path); + stream.on('error', (err) => reject(err)); + stream.on('data', (chunk) => hash.update(chunk)); + stream.on('end', () => resolve(hash.digest('hex'))); + }); + } } diff --git a/app/Models/HashValue.ts b/app/Models/HashValue.ts index 7d86acb..d878cd7 100644 --- a/app/Models/HashValue.ts +++ b/app/Models/HashValue.ts @@ -3,7 +3,7 @@ import File from './File'; export default class HashValue extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); - public static primaryKey = 'file_id, type'; + // public static primaryKey = 'file_id,type'; public static table = 'file_hashvalues'; // static get primaryKey () { @@ -20,10 +20,10 @@ export default class HashValue extends BaseModel { // public id: number; // Foreign key is still on the same model - @column({}) + @column({ isPrimary: true }) public file_id: number; - @column({}) + @column({ isPrimary: true }) public type: string; @column() diff --git a/app/Models/Title.ts b/app/Models/Title.ts index 2eaa2d6..8801d20 100644 --- a/app/Models/Title.ts +++ b/app/Models/Title.ts @@ -10,6 +10,11 @@ export default class Title extends BaseModel { public static timestamps = false; public static fillable: string[] = ['value', 'type', 'language']; + @column({ + isPrimary: true, + }) + public id: number; + @column({}) public document_id: number; diff --git a/app/Validators/CreateDatasetValidator.ts b/app/Validators/CreateDatasetValidator.ts index bdaaa9b..b9a0ea0 100644 --- a/app/Validators/CreateDatasetValidator.ts +++ b/app/Validators/CreateDatasetValidator.ts @@ -136,7 +136,7 @@ export default class CreateDatasetValidator { 'unique': '{{ field }} must be unique, and this value is already taken', // 'confirmed': '{{ field }} is not correct', 'licenses.minLength': 'at least {{ options.minLength }} permission must be defined', - 'licenses.*.number': 'Define roles as valid numbers', + 'licenses.*.number': 'Define licences as valid numbers', 'rights.equalTo': 'you must agree to continue', 'titles.0.value.minLength': 'Main Title must be at least {{ options.minLength }} characters long', diff --git a/app/Validators/UpdateDatasetValidator.ts b/app/Validators/UpdateDatasetValidator.ts new file mode 100644 index 0000000..57d75a5 --- /dev/null +++ b/app/Validators/UpdateDatasetValidator.ts @@ -0,0 +1,179 @@ +import { schema, CustomMessages, rules } from '@ioc:Adonis/Core/Validator'; +import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; +import dayjs from 'dayjs'; +import { TitleTypes, DescriptionTypes, RelationTypes, ReferenceIdentifierTypes, ContributorTypes } from 'Contracts/enums'; + +export default class UpdateDatasetValidator { + constructor(protected ctx: HttpContextContract) {} + + /* + * Define schema to validate the "shape", "type", "formatting" and "integrity" of data. + * + * For example: + * 1. The username must be of data type string. But then also, it should + * not contain special characters or numbers. + * ``` + * schema.string({}, [ rules.alpha() ]) + * ``` + * + * 2. The email must be of data type string, formatted as a valid + * email. But also, not used by any other user. + * ``` + * schema.string({}, [ + * rules.email(), + * rules.unique({ table: 'users', column: 'email' }), + * ]) + * ``` + */ + public schema = schema.create({ + // first step + language: schema.string({ trim: true }, [ + rules.regex(/^[a-zA-Z0-9-_]+$/), //Must be alphanumeric with hyphens or underscores + ]), + licenses: schema.array([rules.minLength(1)]).members(schema.number()), // define at least one license for the new dataset + rights: schema.string([rules.equalTo('true')]), + // second step + type: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), + creating_corporation: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), + titles: schema.array([rules.minLength(1)]).members( + schema.object().members({ + value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), + type: schema.enum(Object.values(TitleTypes)), + language: schema.string({ trim: true }, [ + rules.minLength(2), + rules.maxLength(255), + rules.translatedLanguage('/language', 'type'), + ]), + }), + ), + descriptions: schema.array([rules.minLength(1)]).members( + schema.object().members({ + value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), + type: schema.enum(Object.values(DescriptionTypes)), + language: schema.string({ trim: true }, [ + rules.minLength(2), + rules.maxLength(255), + rules.translatedLanguage('/language', 'type'), + ]), + }), + ), + authors: schema.array([rules.minLength(1)]).members(schema.object().members({ email: schema.string({ trim: true }) })), + contributors: schema.array.optional().members( + schema.object().members({ + email: schema.string({ trim: true }), + pivot_contributor_type: schema.enum(Object.keys(ContributorTypes)), + }), + ), + // third step + project_id: schema.number.optional(), + embargo_date: schema.date.optional({ format: 'yyyy-MM-dd' }, [rules.after(10, 'days')]), + coverage: schema.object().members({ + x_min: schema.number(), + x_max: schema.number(), + y_min: schema.number(), + y_max: schema.number(), + elevation_absolut: schema.number.optional(), + elevation_min: schema.number.optional([rules.requiredIfExists('elevation_max')]), + elevation_max: schema.number.optional([rules.requiredIfExists('elevation_min')]), + depth_absolut: schema.number.optional(), + depth_min: schema.number.optional([rules.requiredIfExists('depth_max')]), + depth_max: schema.number.optional([rules.requiredIfExists('depth_min')]), + }), + references: schema.array.optional([rules.uniqueArray('value')]).members( + schema.object().members({ + value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), + type: schema.enum(Object.values(ReferenceIdentifierTypes)), + relation: schema.enum(Object.values(RelationTypes)), + label: schema.string({ trim: true }, [rules.minLength(2), rules.maxLength(255)]), + }), + ), + subjects: schema.array([rules.minLength(3), rules.uniqueArray('value')]).members( + schema.object().members({ + value: schema.string({ trim: true }, [ + rules.minLength(3), + rules.maxLength(255), + // rules.unique({ table: 'dataset_subjects', column: 'value' }), + ]), + // type: schema.enum(Object.values(TitleTypes)), + language: schema.string({ trim: true }, [rules.minLength(2), rules.maxLength(255)]), + }), + ), + // file: schema.file({ + // size: '100mb', + // extnames: ['jpg', 'gif', 'png'], + // }), + files: schema.array.optional().members( + schema.file({ + size: '100mb', + extnames: ['jpg', 'gif', 'png', 'tif', 'pdf'], + }), + ) + + // upload: schema.object().members({ + // label: schema.string({ trim: true }, [rules.maxLength(255)]), + + // // label: schema.string({ trim: true }, [ + // // // rules.minLength(3), + // // // rules.maxLength(255), + // // ]), + // }), + }); + + /** + * Custom messages for validation failures. You can make use of dot notation `(.)` + * for targeting nested fields and array expressions `(*)` for targeting all + * children of an array. For example: + * + * { + * 'profile.username.required': 'Username is required', + * 'scores.*.number': 'Define scores as valid numbers' + * } + * + */ + public messages: CustomMessages = { + 'minLength': '{{ field }} must be at least {{ options.minLength }} characters long', + 'maxLength': '{{ field }} must be less then {{ options.maxLength }} characters long', + 'required': '{{ field }} is required', + 'unique': '{{ field }} must be unique, and this value is already taken', + // 'confirmed': '{{ field }} is not correct', + 'licenses.minLength': 'at least {{ options.minLength }} permission must be defined', + 'licenses.*.number': 'Define licences as valid numbers', + 'rights.equalTo': 'you must agree to continue', + + 'titles.0.value.minLength': 'Main Title must be at least {{ options.minLength }} characters long', + 'titles.0.value.required': 'Main Title is required', + 'titles.*.value.required': 'Additional title is required, if defined', + 'titles.*.type.required': 'Additional title type is required', + 'titles.*.language.required': 'Additional title language is required', + 'titles.*.language.translatedLanguage': 'The language of the translated title must be different from the language of the dataset', + + 'descriptions.0.value.minLength': 'Main Abstract must be at least {{ options.minLength }} characters long', + 'descriptions.0.value.required': 'Main Abstract is required', + 'descriptions.*.value.required': 'Additional description is required, if defined', + 'descriptions.*.type.required': 'Additional description type is required', + 'descriptions.*.language.required': 'Additional description language is required', + 'descriptions.*.language.translatedLanguage': + 'The language of the translated description must be different from the language of the dataset', + + 'authors.minLength': 'at least {{ options.minLength }} author must be defined', + 'contributors.*.pivot_contributor_type.required': 'contributor type is required, if defined', + + 'after': `{{ field }} must be older than ${dayjs().add(10, 'day')}`, + + 'subjects.minLength': 'at least {{ options.minLength }} keywords must be defined', + 'subjects.uniqueArray': 'The {{ options.array }} array must have unique values based on the {{ options.field }} attribute.', + 'subjects.*.value.required': 'keyword value is required', + 'subjects.*.value.minLength': 'keyword value must be at least {{ options.minLength }} characters long', + 'subjects.*.type.required': 'keyword type is required', + 'subjects.*.language.required': 'language of keyword is required', + + 'references.*.value.required': 'Additional reference value is required, if defined', + 'references.*.type.required': 'Additional reference identifier type is required', + 'references.*.relation.required': 'Additional reference relation type is required', + 'references.*.label.required': 'Additional reference label is required', + + 'files.minLength': 'At least {{ options.minLength }} file upload is required.', + 'files.*.size': 'file size is to big', + 'files.extnames': 'file extension is not supported', + }; +} diff --git a/package-lock.json b/package-lock.json index 13745e7..a12c562 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,6 +62,7 @@ "autoprefixer": "^10.4.13", "babel-preset-typescript-vue3": "^2.0.17", "chart.js": "^4.2.0", + "dotenv-webpack": "^8.0.1", "eslint": "^8.32.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-adonis": "^2.1.1", @@ -660,9 +661,9 @@ } }, "node_modules/@adonisjs/validator": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/@adonisjs/validator/-/validator-12.5.0.tgz", - "integrity": "sha512-88Lu+8OyS92A4mg0hE8AEjr8q9KmgZeR5obPGoAnCxBrptrsHHtKTQq242c+DbzuAWZzw5ZEX2dvv34PW/FmFw==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@adonisjs/validator/-/validator-12.6.0.tgz", + "integrity": "sha512-0mS7msmgQpcWnxAs1hORQFOt2jWfPqEXNeq8NdCYqTUxgQObLgDlyfrMG98238EvXUhCS1kZdXM4w/EMwoiAuA==", "dependencies": { "@poppinss/utils": "^5.0.0", "@types/luxon": "^3.3.1", @@ -770,12 +771,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -783,30 +784,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", + "@babel/parser": "^7.23.3", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -831,12 +832,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -1027,9 +1028,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1137,9 +1138,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1178,23 +1179,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.4.tgz", + "integrity": "sha512-HfcMizYz10cr3h29VqyfGL6ZWIjTwWfvYBMsBVGwpcbhNGe3wQ1ZXZRPzZoAHhd9OqHadHqjQ89iVKINXnbzuw==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.23.4", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -1206,9 +1207,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1217,9 +1218,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1232,14 +1233,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1248,6 +1249,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -1266,16 +1283,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", - "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.3.tgz", + "integrity": "sha512-u8SwzOcP0DYSsa++nHd/9exlHb0NAlHCb890qtZZbSwPX2bFv8LBEztxwN7Xg/dS8oAFFidhrI9PBcLBJSkGRQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.10" + "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1336,9 +1353,9 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", - "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1375,9 +1392,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1390,9 +1407,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1429,9 +1446,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1546,9 +1563,9 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1577,9 +1594,9 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1592,9 +1609,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1610,14 +1627,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1627,9 +1644,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1642,9 +1659,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1657,12 +1674,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1673,12 +1690,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1690,18 +1707,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz", + "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -1713,13 +1730,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1729,9 +1746,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1744,12 +1761,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1760,9 +1777,9 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1775,9 +1792,9 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1791,12 +1808,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1807,9 +1824,9 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1823,9 +1840,9 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz", + "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1838,13 +1855,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1855,9 +1872,9 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1871,9 +1888,9 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1886,9 +1903,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -1902,9 +1919,9 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1917,12 +1934,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1933,12 +1950,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1950,13 +1967,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" }, @@ -1968,12 +1985,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2000,9 +2017,9 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2015,9 +2032,9 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2031,9 +2048,9 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2047,16 +2064,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2066,13 +2083,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -2082,9 +2099,9 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2098,9 +2115,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2115,9 +2132,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2130,12 +2147,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2146,13 +2163,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, @@ -2164,9 +2181,9 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2179,9 +2196,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2195,9 +2212,9 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2210,9 +2227,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz", + "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.15", @@ -2239,9 +2256,9 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2254,9 +2271,9 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2270,9 +2287,9 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2285,9 +2302,9 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2300,9 +2317,9 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2315,15 +2332,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz", + "integrity": "sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2333,9 +2350,9 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -2348,12 +2365,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2364,12 +2381,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2380,12 +2397,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -2396,25 +2413,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz", + "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.2", + "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2426,56 +2444,55 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.3", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.3", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.3", + "@babel/plugin-transform-classes": "^7.23.3", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.3", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.3", + "@babel/plugin-transform-for-of": "^7.23.3", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.3", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.3", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3", + "@babel/plugin-transform-numeric-separator": "^7.23.3", + "@babel/plugin-transform-object-rest-spread": "^7.23.3", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.3", + "@babel/plugin-transform-optional-chaining": "^7.23.3", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.3", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", "babel-plugin-polyfill-corejs2": "^0.4.6", "babel-plugin-polyfill-corejs3": "^0.8.5", "babel-plugin-polyfill-regenerator": "^0.5.3", @@ -2513,16 +2530,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -2538,9 +2555,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", + "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2564,19 +2581,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.4.tgz", + "integrity": "sha512-IYM8wSUwunWTB6tFC2dkKZhxbIjHoWemdK+3f8/wq8aKhbUscxD5MX72ubd90fxvFknaLPeGw5ycU84V1obHJg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.4", + "@babel/generator": "^7.23.4", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.4", + "@babel/types": "^7.23.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2585,12 +2602,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -2691,9 +2708,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2759,18 +2776,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@faker-js/faker": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.2.0.tgz", - "integrity": "sha512-VacmzZqVxdWdf9y64lDOMZNDMM/FQdtM9IsaOPKOm2suYwEatb8VkdHqOzXcDnZbk7YDE2BmsJmy/2Hmkn563g==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.3.1.tgz", + "integrity": "sha512-FdgpFxY6V6rLZE9mmIBb9hM0xpfvQOSNOLnzolzKwsE1DH+gC7lEKV1p1IbR0lAYyvYd5a4u3qWJzowUkw1bIw==", "funding": [ { "type": "opencollective", @@ -2826,9 +2843,9 @@ "dev": true }, "node_modules/@inertiajs/core": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.13.tgz", - "integrity": "sha512-xPvogbRgAXbogP16EBnGduEmVtImdncEBNQF9etRFF5Ne2nrJafeFgM0FZHqsSqCDvA4jjk8b8Ezt6gZRPK9hg==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inertiajs/core/-/core-1.0.14.tgz", + "integrity": "sha512-S33PU6mWEYbn/s2Op+CJ6MN7ON354vWw8Y+UvtQzPt0r7pVgOuIArrqqsoulf9oQz9sbP1+vp/tCvyBzm4XmpA==", "dependencies": { "axios": "^1.2.0", "deepmerge": "^4.0.0", @@ -2837,9 +2854,9 @@ } }, "node_modules/@inertiajs/core/node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -2857,11 +2874,11 @@ } }, "node_modules/@inertiajs/vue3": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.0.13.tgz", - "integrity": "sha512-KtUZBP0qRjAHX+ZKpBRFrAwwxUpq51eNhfxxp8A7NAn0OpajfQB8cwVkB4368JGOdjkGFLhDJkMpzfxe0qlPPg==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inertiajs/vue3/-/vue3-1.0.14.tgz", + "integrity": "sha512-lKL3Bm9k95Gw1GAq4RxgjfwSMfklkeMbvEfzwmsEBsZ4BbbWwfpC/+KS+4O4faTjjijczvkDPhMKv4duzFxtGw==", "dependencies": { - "@inertiajs/core": "1.0.13", + "@inertiajs/core": "1.0.14", "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0" }, @@ -3842,9 +3859,9 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.6.tgz", - "integrity": "sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", "dev": true, "dependencies": { "mini-svg-data-uri": "^1.2.3" @@ -3868,9 +3885,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "dependencies": { "@types/connect": "*", @@ -3878,29 +3895,29 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", - "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/bytes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.3.tgz", - "integrity": "sha512-eEgZiWn6cjG8tc+AkI3FIa9ub9zhLMSRHqbecHe5yffqws+848zoHdbgFYxvUks4RElfJB9cupvqcd1gvDFQig==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.4.tgz", + "integrity": "sha512-A0uYgOj3zNc4hNjHc5lYUfJQ/HVyBXiUMKdXd7ysclaE6k9oJdavQzODHuwjpUu2/boCP8afjQYi8z/GtvNCWA==" }, "node_modules/@types/chai": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", - "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-of+ICnbqjmFCiixUnqRulbylyXQrPqIGf/B3Jax1wIF3DvSheysQxAWvqHhZiW3IQrycvokcLcFQlveGp+vyNg==", "dev": true }, "node_modules/@types/clamscan": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.6.tgz", - "integrity": "sha512-8Tm9yQq2c3c/jnOf3E49Py8P9m32Ug7ZKR/owtIlxe25EFcGygSs1/gIFFFzBre4bJIkfUQ/Kfx3CUGUyZKBGw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/clamscan/-/clamscan-2.0.7.tgz", + "integrity": "sha512-YopQF+D1pqbvMbvqTQx2MdxEqFbQAiPJKtjj/KnK9xxgmYkdt3dInkj/k6a+bztT4TexQ+tCUi/5D3LqDZIdhg==", "dev": true, "dependencies": { "@types/node": "*", @@ -3917,18 +3934,18 @@ } }, "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", - "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.3.tgz", + "integrity": "sha512-6mfQ6iNvhSKCZJoY6sIG3m0pKkdUcweVNOLuBBKvoWGzl2yRxOJcYOTRyLKt3nxXvBLJWa6QkW//tgbIwJehmA==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -3936,15 +3953,15 @@ } }, "node_modules/@types/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-LZ8SD3LpNmLMDLkG2oCBjZg+ETnx6XdCjydUE0HwojDmnDfDUnhMKKbtth1TZh+hzcqb03azrYWoXLS8sMXdqg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-b698BLJ6kPVd6uhHsY7wlebZdrWPXYied883PDSzpJZYOP97EOn/oGdLCH3jJf157srkFReIZY5v0H1s8Dozrg==", "dev": true }, "node_modules/@types/eslint": { - "version": "8.44.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", - "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "version": "8.44.7", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", + "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, "peer": true, "dependencies": { @@ -3953,9 +3970,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", - "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "peer": true, "dependencies": { @@ -3964,16 +3981,16 @@ } }, "node_modules/@types/estree": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.4.tgz", - "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "peer": true }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -3983,9 +4000,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dev": true, "dependencies": { "@types/node": "*", @@ -4003,9 +4020,9 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.12", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.12.tgz", - "integrity": "sha512-uK2z1ZHJyC0nQRbuovXFt4mzXDwf27vQeUWNhfKGwRcWW429GOhP8HxUHlM6TLH4bzmlv/HlEjpvJh3JfmGsAA==", + "version": "7946.0.13", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz", + "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==", "dev": true }, "node_modules/@types/glob": { @@ -4019,35 +4036,35 @@ } }, "node_modules/@types/he": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.2.tgz", - "integrity": "sha512-v2gT1gRK65k9nz8SVSXo3lh7AHnRPL3mRcYNhhsqL/L2S1xt/MGyEI5a7vJPXWik/IxTtAktXf8/HlCxDR1nsw==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz", + "integrity": "sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==" }, "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.13", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", - "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -4064,55 +4081,55 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/katex": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.5.tgz", - "integrity": "sha512-DD2Y3xMlTQvAnN6d8803xdgnOeYZ+HwMglb7/9YCf49J9RkJL53azf9qKa40MkEYhqVwxZ1GS2+VlShnz4Z1Bw==", + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.6.tgz", + "integrity": "sha512-rZYO1HInM99rAFYNwGqbYPxHZHxu2IwZYKj4bJ4oh6edVrm1UId8mmbHIZLBtG253qU6y3piag0XYe/joNnwzQ==", "dev": true }, "node_modules/@types/leaflet": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.7.tgz", - "integrity": "sha512-FOfKB1ALYUDnXkH7LfTFreWiZr9R7GErqGP+8lYQGWr2GFq5+jy3Ih0M7e9j41cvRN65kLALJ4dc43yZwyl/6g==", + "version": "1.9.8", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.8.tgz", + "integrity": "sha512-EXdsL4EhoUtGm2GC2ZYtXn+Fzc6pluVgagvo2VC1RHWToLGlTRwVYoDpqS/7QXa01rmDyBjJk3Catpf60VMkwg==", "dev": true, "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/lodash": { - "version": "4.14.200", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz", - "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==", + "version": "4.14.201", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz", + "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ==", "dev": true }, "node_modules/@types/lodash-es": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.10.tgz", - "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.11.tgz", + "integrity": "sha512-eCw8FYAWHt2DDl77s+AMLLzPn310LKohruumpucZI4oOFJkIgnlaJcy23OKMJxx4r9PeTF13Gv6w+jqjWQaYUg==", "dev": true, "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/luxon": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.3.tgz", - "integrity": "sha512-/BJF3NT0pRMuxrenr42emRUF67sXwcZCd+S1ksG/Fcf9O7C3kKCY4uJSbKBE4KDUIYr3WMsvfmWD8hRjXExBJQ==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.4.tgz", + "integrity": "sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==" }, "node_modules/@types/md5": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.4.tgz", - "integrity": "sha512-e/L4hvpCK8GavKXmP02QlNilZOj8lpmZGGA9QGMMPZjCUoKgi1B4BvhXcbruIi6r+PqzpcjLfda/tocpHFKqDA==" + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.5.tgz", + "integrity": "sha512-/i42wjYNgE6wf0j2bcTX6kuowmdL/6PE4IVitMpm2eYKBUuYCprdcWVK+xEF0gcV6ufMCRhtxmReGfc6hIK7Jw==" }, "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, "node_modules/@types/minimatch": { @@ -4122,17 +4139,17 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", + "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", - "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.9.tgz", + "integrity": "sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -4168,24 +4185,24 @@ } }, "node_modules/@types/proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha512-6OK5kH63HPo+0kDR8c05960AYxsfMEFOd/CXmhy87jREIpVIgYTCrHEqjl3f1wS5USA0i2is4Bx1BLzt+5evfA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-TgAHHO4tNG3HgLTUhB+hM4iwW6JUNeQHCLnF1DjaDA9c69PN+IasoFu2MYDhubFc+ZIw5c5t9DMtjvrD6R3Egg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, "node_modules/@types/retry": { @@ -4195,15 +4212,15 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", + "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -4211,18 +4228,18 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", - "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -4231,27 +4248,27 @@ } }, "node_modules/@types/sockjs": { - "version": "0.3.35", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", - "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-91Jf4LyPAObBTFbpW3bSDK1ncdwXohvlBmzffSj7/44SY+1mD/HhesdfspCMxPIJwllgN2G4eVFatGs4Zw/lnw==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==", "dev": true, "dependencies": { "source-map": "^0.6.0" } }, "node_modules/@types/superagent": { - "version": "4.1.20", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.20.tgz", - "integrity": "sha512-GfpwJgYSr3yO+nArFkmyqv3i0vZavyEG5xPd/o95RwpKYpsOKJYI5XLdxLpdRbZI3YiGKKdIOFIf/jlP7A0Jxg==", + "version": "4.1.22", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.22.tgz", + "integrity": "sha512-GMaOrnnUsjChvH8zlzdDPARRXky8bU3E8xsU/fOclgqsINekbwDu1+wzJzJaGzZP91SGpOutf5Te5pm5M/qCWg==", "dev": true, "dependencies": { "@types/cookiejar": "*", @@ -4259,32 +4276,32 @@ } }, "node_modules/@types/validator": { - "version": "13.11.5", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", - "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" + "version": "13.11.6", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.6.tgz", + "integrity": "sha512-HUgHujPhKuNzgNXBRZKYexwoG+gHKU+tnfPqjWXFghZAnn73JElicMkuSKJyLGr9JgyA8IgK7fj88IyA9rwYeQ==" }, "node_modules/@types/ws": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", - "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "15.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.17.tgz", - "integrity": "sha512-cj53I8GUcWJIgWVTSVe2L7NJAB5XWGdsoMosVvUgv1jEnMbAcsbaCzt1coUcyi8Sda5PgTWAooG8jNyDTD+CWA==", + "version": "15.0.18", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.18.tgz", + "integrity": "sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.2.tgz", - "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -4554,36 +4571,36 @@ "dev": true }, "node_modules/@vue/compiler-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.7.tgz", - "integrity": "sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.8.tgz", + "integrity": "sha512-hN/NNBUECw8SusQvDSqqcVv6gWq8L6iAktUR0UF3vGu2OhzRqcOiAno0FmBJWwxhYEXRlQJT5XnoKsVq1WZx4g==", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/shared": "3.3.7", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz", - "integrity": "sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.8.tgz", + "integrity": "sha512-+PPtv+p/nWDd0AvJu3w8HS0RIm/C6VGBIRe24b9hSyNWOAPEUosFZ5diwawwP8ip5sJ8n0Pe87TNNNHnvjs0FQ==", "dependencies": { - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz", - "integrity": "sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.8.tgz", + "integrity": "sha512-WMzbUrlTjfYF8joyT84HfwwXo+8WPALuPxhy+BZ6R4Aafls+jDBnSz8PDz60uFhuqFbl3HxRfxvDzrUf3THwpA==", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-ssr": "3.3.7", - "@vue/reactivity-transform": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/compiler-core": "3.3.8", + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-ssr": "3.3.8", + "@vue/reactivity-transform": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.5", "postcss": "^8.4.31", @@ -4591,12 +4608,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz", - "integrity": "sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.8.tgz", + "integrity": "sha512-hXCqQL/15kMVDBuoBYpUnSYT8doDNwsjvm3jTefnXr+ytn294ySnT8NlsFHmTgKNjwpuFy7XVV8yTeLtNl/P6w==", "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/devtools-api": { @@ -4606,41 +4623,41 @@ "dev": true }, "node_modules/@vue/reactivity": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.7.tgz", - "integrity": "sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.8.tgz", + "integrity": "sha512-ctLWitmFBu6mtddPyOKpHg8+5ahouoTCRtmAHZAXmolDtuZXfjL2T3OJ6DL6ezBPQB1SmMnpzjiWjCiMYmpIuw==", "dependencies": { - "@vue/shared": "3.3.7" + "@vue/shared": "3.3.8" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz", - "integrity": "sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.8.tgz", + "integrity": "sha512-49CvBzmZNtcHua0XJ7GdGifM8GOXoUMOX4dD40Y5DxI3R8OUhMlvf2nvgUAcPxaXiV5MQQ1Nwy09ADpnLQUqRw==", "dependencies": { "@babel/parser": "^7.23.0", - "@vue/compiler-core": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/compiler-core": "3.3.8", + "@vue/shared": "3.3.8", "estree-walker": "^2.0.2", "magic-string": "^0.30.5" } }, "node_modules/@vue/runtime-core": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.7.tgz", - "integrity": "sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.8.tgz", + "integrity": "sha512-qurzOlb6q26KWQ/8IShHkMDOuJkQnQcTIp1sdP4I9MbCf9FJeGVRXJFr2mF+6bXh/3Zjr9TDgURXrsCr9bfjUw==", "dependencies": { - "@vue/reactivity": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/reactivity": "3.3.8", + "@vue/shared": "3.3.8" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz", - "integrity": "sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.8.tgz", + "integrity": "sha512-Noy5yM5UIf9UeFoowBVgghyGGPIDPy1Qlqt0yVsUdAVbqI8eeMSsTqBtauaEoT2UFXUk5S64aWVNJN4MJ2vRdA==", "dependencies": { - "@vue/runtime-core": "3.3.7", - "@vue/shared": "3.3.7", + "@vue/runtime-core": "3.3.8", + "@vue/shared": "3.3.8", "csstype": "^3.1.2" } }, @@ -4650,21 +4667,21 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/@vue/server-renderer": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.7.tgz", - "integrity": "sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.8.tgz", + "integrity": "sha512-zVCUw7RFskvPuNlPn/8xISbrf0zTWsTSdYTsUTN1ERGGZGVnRxM2QZ3x1OR32+vwkkCm0IW6HmJ49IsPm7ilLg==", "dependencies": { - "@vue/compiler-ssr": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-ssr": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { - "vue": "3.3.7" + "vue": "3.3.8" } }, "node_modules/@vue/shared": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.7.tgz", - "integrity": "sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==" + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.8.tgz", + "integrity": "sha512-8PGwybFwM4x8pcfgqEQFy70NaQxASvOC5DJwLQfpArw1UDfUXrJkdxD3BhVTMS+0Lef/TU7YO0Jvr0jJY8T+mw==" }, "node_modules/@vue/tsconfig": { "version": "0.4.0", @@ -6299,9 +6316,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001559", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", - "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", + "version": "1.0.30001563", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001563.tgz", + "integrity": "sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==", "dev": true, "funding": [ { @@ -6748,10 +6765,13 @@ "dev": true }, "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/compressible": { "version": "2.0.18", @@ -6909,9 +6929,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", + "version": "3.33.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz", + "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==", "dev": true, "dependencies": { "browserslist": "^4.22.1" @@ -7963,6 +7983,39 @@ "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, + "node_modules/dotenv-defaults": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz", + "integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==", + "dev": true, + "dependencies": { + "dotenv": "^8.2.0" + } + }, + "node_modules/dotenv-defaults/node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-webpack": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-8.0.1.tgz", + "integrity": "sha512-CdrgfhZOnx4uB18SgaoP9XHRN2v48BbjuXQsZY5ixs5A8579NxQkmMxRtI7aTwSiSQcM2ao12Fdu+L3ZS3bG4w==", + "dev": true, + "dependencies": { + "dotenv-defaults": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "^4 || ^5" + } + }, "node_modules/edge-error": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/edge-error/-/edge-error-2.0.8.tgz", @@ -8103,9 +8156,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.571", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.571.tgz", - "integrity": "sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==", + "version": "1.4.588", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.588.tgz", + "integrity": "sha512-soytjxwbgcCu7nh5Pf4S2/4wa6UIu+A3p03U2yVr53qGxi1/VTR3ENI+p50v+UxqqZAfl48j3z55ud7VHIOr9w==", "dev": true }, "node_modules/emittery": { @@ -8185,9 +8238,9 @@ } }, "node_modules/envinfo": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", - "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true, "peer": true, "bin": { @@ -8254,15 +8307,15 @@ } }, "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8896,9 +8949,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9098,9 +9151,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -9108,7 +9161,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { @@ -10184,9 +10237,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -10919,18 +10972,18 @@ } }, "node_modules/jest-util/node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/jest-util/node_modules/@types/yargs": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.29.tgz", - "integrity": "sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==", + "version": "17.0.31", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", + "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -11525,9 +11578,9 @@ } }, "node_modules/luxon": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", - "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } @@ -12086,9 +12139,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -13426,21 +13479,27 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -13454,6 +13513,15 @@ } } }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/postcss-loader": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", @@ -13927,9 +13995,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -14656,9 +14724,9 @@ } }, "node_modules/saxon-js/node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -15767,16 +15835,17 @@ } }, "node_modules/svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.4.tgz", + "integrity": "sha512-T+Xul3JwuJ6VGXKo/p2ndqx1ibxNKnLTvRc1ZTWKCfyKS/GgNjRZcYsK84fxTsy/izr91g/Rwx6fGnVgaFSI5g==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.2.1", - "csso": "^5.0.5", + "css-what": "^6.1.0", + "csso": "5.0.5", "picocolors": "^1.0.0" }, "bin": { @@ -16012,9 +16081,9 @@ } }, "node_modules/terser": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.23.0.tgz", - "integrity": "sha512-Iyy83LN0uX9ZZLCX4Qbu5JiHiWjOCTwrmM9InWOzVeM++KNWEsqV4YgN9U9E8AlohQ6Gs42ztczlWOG/lwDAMA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", + "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -16301,9 +16370,9 @@ "dev": true }, "node_modules/ts-loader": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", - "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -16579,9 +16648,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -16807,15 +16876,15 @@ } }, "node_modules/vue": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.7.tgz", - "integrity": "sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.8.tgz", + "integrity": "sha512-5VSX/3DabBikOXMsxzlW8JyfeLKlG9mzqnWgLQLty88vdZL7ZJgrdgBOmrArwxiLtmS+lNNpPcBYqrhE6TQW5w==", "dependencies": { - "@vue/compiler-dom": "3.3.7", - "@vue/compiler-sfc": "3.3.7", - "@vue/runtime-dom": "3.3.7", - "@vue/server-renderer": "3.3.7", - "@vue/shared": "3.3.7" + "@vue/compiler-dom": "3.3.8", + "@vue/compiler-sfc": "3.3.8", + "@vue/runtime-dom": "3.3.8", + "@vue/server-renderer": "3.3.8", + "@vue/shared": "3.3.8" }, "peerDependencies": { "typescript": "*" @@ -17232,9 +17301,9 @@ } }, "node_modules/webpack/node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true, "peer": true }, @@ -17429,9 +17498,9 @@ } }, "node_modules/xslt3/node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -17454,9 +17523,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "dev": true, "engines": { "node": ">= 14" @@ -17484,9 +17553,9 @@ } }, "node_modules/youch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.2.tgz", - "integrity": "sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", + "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", "dev": true, "dependencies": { "cookie": "^0.5.0", diff --git a/package.json b/package.json index 0800cfb..31c5d39 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "autoprefixer": "^10.4.13", "babel-preset-typescript-vue3": "^2.0.17", "chart.js": "^4.2.0", + "dotenv-webpack": "^8.0.1", "eslint": "^8.32.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-adonis": "^2.1.1", diff --git a/resources/js/Components/FileUpload.vue b/resources/js/Components/FileUpload.vue index 36b34fd..ea418d2 100644 --- a/resources/js/Components/FileUpload.vue +++ b/resources/js/Components/FileUpload.vue @@ -1,34 +1,21 @@ <template> - <section - aria-label="File Upload Modal" + <section aria-label="File Upload Modal" class="relative h-full flex flex-col bg-white dark:bg-slate-900/70 shadow-xl rounded-md" - v-on:dragenter="dragEnterHandler" - v-on:dragleave="dragLeaveHandler" - v-on:dragover="dragOverHandler" - v-on:drop="dropHandler" - > + v-on:dragenter="dragEnterHandler" v-on:dragleave="dragLeaveHandler" v-on:dragover="dragOverHandler" + v-on:drop="dropHandler"> <!-- ondrop="dropHandler(event);" ondragover="dragOverHandler(event);" ondragleave="dragLeaveHandler(event);" ondragenter="dragEnterHandler(event);" --> <!-- overlay --> - <div - id="overlay" - ref="overlay" - class="w-full h-full absolute top-0 left-0 pointer-events-none z-50 flex flex-col items-center justify-center rounded-md" - > + <div id="overlay" ref="overlay" + class="w-full h-full absolute top-0 left-0 pointer-events-none z-50 flex flex-col items-center justify-center rounded-md"> <i> - <svg - class="fill-current w-12 h-12 mb-3 text-blue-700" - xmlns="http://www.w3.org/2000/svg" - width="24" - height="24" - viewBox="0 0 24 24" - > + <svg class="fill-current w-12 h-12 mb-3 text-blue-700" xmlns="http://www.w3.org/2000/svg" width="24" + height="24" viewBox="0 0 24 24"> <path - d="M19.479 10.092c-.212-3.951-3.473-7.092-7.479-7.092-4.005 0-7.267 3.141-7.479 7.092-2.57.463-4.521 2.706-4.521 5.408 0 3.037 2.463 5.5 5.5 5.5h13c3.037 0 5.5-2.463 5.5-5.5 0-2.702-1.951-4.945-4.521-5.408zm-7.479-1.092l4 4h-3v4h-2v-4h-3l4-4z" - /> + d="M19.479 10.092c-.212-3.951-3.473-7.092-7.479-7.092-4.005 0-7.267 3.141-7.479 7.092-2.57.463-4.521 2.706-4.521 5.408 0 3.037 2.463 5.5 5.5 5.5h13c3.037 0 5.5-2.463 5.5-5.5 0-2.702-1.951-4.945-4.521-5.408zm-7.479-1.092l4 4h-3v4h-2v-4h-3l4-4z" /> </svg> </i> <p class="text-lg text-blue-700">Drop files to upload</p> @@ -46,25 +33,14 @@ </button> </header> --> <header class="flex items-center justify-center w-full"> - <label - for="dropzone-file" - class="flex flex-col items-center justify-center w-full h-64 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 dark:bg-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:bg-gray-600" - > + <label for="dropzone-file" + class="flex flex-col items-center justify-center w-full h-64 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 dark:bg-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:bg-gray-600"> <div class="flex flex-col items-center justify-center pt-5 pb-6"> - <svg - aria-hidden="true" - class="w-10 h-10 mb-3 text-gray-400" - fill="none" - stroke="currentColor" - viewBox="0 0 24 24" - xmlns="http://www.w3.org/2000/svg" - > - <path - stroke-linecap="round" - stroke-linejoin="round" - stroke-width="2" - d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12" - ></path> + <svg aria-hidden="true" class="w-10 h-10 mb-3 text-gray-400" fill="none" stroke="currentColor" + viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" + d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"> + </path> </svg> <p class="mb-2 text-sm text-gray-500 dark:text-gray-400"> <span class="font-semibold">Click to upload</span> or drag and drop @@ -78,7 +54,8 @@ <h1 class="pt-8 pb-3 font-semibold sm:text-lg text-gray-900">To Upload</h1> <!-- <ul id="gallery" class="flex flex-1 flex-wrap -m-1"> --> - <draggable id="gallery" tag="ul" class="flex flex-1 flex-wrap -m-1" v-model="files" item-key="sorting"> + + <draggable id="galleryxy" tag="ul" class="flex flex-1 flex-wrap -m-1" v-model="items" item-key="sort_order"> <!-- <li v-if="files.length == 0" id="empty" @@ -108,17 +85,12 @@ <span class="text-small text-gray-500">No files selected</span> </li> --> <template #item="{ index, element }"> - <li class="block p-1 w-1/2 sm:w-1/3 md:w-1/4 lg:w-1/6 xl:w-1/8 h-24"> - <article - v-if="element.type.match('image.*')" - tabindex="0" - class="bg-gray-50 group hasImage w-full h-full rounded-md cursor-pointer relative text-transparent hover:text-white shadow-sm" - > - <img - :alt="element.name" - :src="generateURL(element)" - class="img-preview w-full h-full sticky object-cover rounded-md bg-fixed opacity-75" - /> + <li class="block p-1 w-1/2 sm:w-1/3 md:w-1/4 lg:w-1/6 xl:w-1/8 h-24" :key="index"> + <article v-if="element.type.match('image.*')" tabindex="0" + class="bg-gray-50 group hasImage w-full h-full rounded-md cursor-pointer relative text-transparent hover:text-white shadow-sm"> + <!-- :src="element.fileSrc" :src="generateURL(element)" --> + <img :alt="element.name" :src="element.fileSrc" + class="img-preview w-full h-full sticky object-cover rounded-md bg-fixed opacity-75" /> <!-- <section class="hasError text-red-500 shadow-sm font-semibold flex flex-row rounded-md text-xs break-words w-full h-full z-21 absolute top-0 py-2 px-3" > @@ -132,15 +104,14 @@ <DeleteIcon></DeleteIcon> </button> </section> --> - <section class="flex flex-col rounded-md text-xs break-words w-full h-full z-20 absolute top-0 py-2 px-3"> + <section + class="flex flex-col rounded-md text-xs break-words w-full h-full z-20 absolute top-0 py-2 px-3"> <h1 class="flex-1">{{ element.name }}</h1> <div class="flex"> <p class="p-1 size text-xs">{{ getFileSize(element) }}</p> - <p class="p-1 size text-xs text-gray-700">{{ index }}</p> - <button - class="delete ml-auto focus:outline-none hover:bg-gray-300 p-1 rounded-md" - @click="removeFile(index)" - > + <p class="p-1 size text-xs text-gray-700">{{ element.sort_order }}</p> + <button class="delete ml-auto focus:outline-none hover:bg-gray-300 p-1 rounded-md" + @click="removeFile(index)"> <DeleteIcon></DeleteIcon> </button> </div> @@ -150,16 +121,17 @@ </div> --> </article> <!-- :class="errors && errors[`files.${index}`] ? 'bg-red-400' : 'bg-gray-100'" --> - <article v-else tabindex="0" class="bg-gray-100 group w-full h-full rounded-md cursor-pointer relative shadow-sm"> - <section class="flex flex-col rounded-md text-xs break-words w-full h-full z-20 absolute top-0 py-2 px-3"> + <article v-else tabindex="0" + class="bg-gray-100 group w-full h-full rounded-md cursor-pointer relative shadow-sm"> + <section + class="flex flex-col rounded-md text-xs break-words w-full h-full z-20 absolute top-0 py-2 px-3"> <h1 class="flex-1 text-gray-700 group-hover:text-blue-800">{{ element.name }}</h1> <div class="flex"> <p class="p-1 size text-xs text-gray-700">{{ getFileSize(element) }}</p> - <p class="p-1 size text-xs text-gray-700">{{ index }}</p> + <p class="p-1 size text-xs text-gray-700">{{ element.sort_order }}</p> <button class="delete ml-auto focus:outline-none hover:bg-gray-300 p-1 rounded-md text-gray-800" - @click="removeFile(index)" - > + @click="removeFile(index)"> <DeleteIcon></DeleteIcon> </button> </div> @@ -191,11 +163,8 @@ <!-- sticky footer --> <footer class="flex justify-end px-8 pb-8 pt-4"> - <button - id="cancel" - class="ml-3 rounded-sm px-3 py-1 hover:bg-gray-300 focus:shadow-outline focus:outline-none" - @click="clearAllFiles" - > + <button id="cancel" class="ml-3 rounded-sm px-3 py-1 hover:bg-gray-300 focus:shadow-outline focus:outline-none" + @click="clearAllFiles"> Clear </button> </footer> @@ -203,13 +172,20 @@ </template> <script lang="ts"> -import { Component, Vue, Prop, Ref } from 'vue-facing-decorator'; -// import BaseButton from './BaseButton.vue'; +import { Component, Vue, Prop, Ref, Watch } from 'vue-facing-decorator'; import { usePage } from '@inertiajs/vue3'; import DeleteIcon from '@/Components/Icons/Delete.vue'; // import { Page, PageProps, Errors, ErrorBag } from '@inertiajs/inertia'; import Draggable from 'vuedraggable'; -import { TestFile } from '@/Dataset'; +import { Buffer } from 'buffer'; +import { TethysFile } from '@/Dataset'; + +// lastModified: 1691759507591 +// lastModifiedDate: Fri Aug 11 2023 15:11:47 GMT+0200 (Mitteleuropäische Sommerzeit) +// name: 'freieIP.png' +// size: 112237 +// type: 'image/png' +// webkitRelativePath: '' interface IDictionary { [index: string]: Array<string>; @@ -239,7 +215,7 @@ interface InteriaPage { Draggable, }, }) -export default class FileUploadComponent extends Vue { +class FileUploadComponent extends Vue { /** * Connect map id. */ @@ -255,22 +231,45 @@ export default class FileUploadComponent extends Vue { // @Prop() files: Array<TestFile>; @Prop({ - type: Array<TestFile>, + type: Array<File>, default: [], }) - modelValue: Array<TestFile>; - // mdiTrashCan = mdiTrashCan; + files: Array<TethysFile | File>; - get files() { - return this.modelValue; + get items(): Array<TethysFile | File> { + return this.files; } - set files(value: Array<TestFile>) { + set items(values: Array<TethysFile | File>) { // this.modelValue = value; - this.modelValue.length = 0; - this.modelValue.push(...value); + this.files.length = 0; + this.files.push(...values); + // values.forEach((item, index) => { + // item.sort_order = index + 1; // Assuming sort_order starts from 1 + // this.files.push(item); + // }); } - dragEnterHandler(e) { + @Watch("files", { + deep: true + }) + public propertyWatcher(newItems: Array<TethysFile>) { + // Update sort_order based on the new index when the list is changed + newItems.forEach((item, index) => { + item.sort_order = index + 1; // Assuming sort_order starts from 1 + }); + } + + public created() { + for (const file of this.files) { + if (!(file instanceof File)) { + // console.log(`${file.name} path is ${file.filePath} here.`); + this.generateURL(file); + // console.log(`${file.fileSrc} path.`); + } + } + } + + public dragEnterHandler(e) { e.preventDefault(); if (!this._hasFiles(e.dataTransfer)) { return; @@ -278,17 +277,17 @@ export default class FileUploadComponent extends Vue { ++this.counter && this.overlay.classList.add('draggedover'); } - dragLeaveHandler() { + public dragLeaveHandler() { 1 > --this.counter && this.overlay.classList.remove('draggedover'); } - dragOverHandler(e) { + public dragOverHandler(e) { if (this._hasFiles(e.dataTransfer)) { e.preventDefault(); } } - startDrag(evt, item) { + public startDrag(evt, item) { evt.dataTransfer.dropEffect = 'move'; evt.dataTransfer.effectAllowed = 'move'; evt.dataTransfer.setData('itemID', item.id); @@ -296,28 +295,31 @@ export default class FileUploadComponent extends Vue { // reset counter and append file to gallery when file is dropped - dropHandler(event) { + public dropHandler(event) { event.preventDefault(); for (const file of event.dataTransfer.files) { // let fileName = String(file.name.replace(/\.[^/.]+$/, '')); // file.label = fileName; + // if (file.type.match('image.*')) { + // this.generateURL(file); + // } this._addFile(file); } this.overlay.classList.remove('draggedover'); this.counter = 0; } - onChangeFile(event) { + public onChangeFile(event) { event.preventDefault(); // let uploadedFile = event.target.files[0]; - // let fileName = String(event.target.files[0].name.replace(/\.[^/.]+$/, '')); - // form.file = event.target.files[0]; - // form.upload.label = fileName; - // console.log(file.file); + for (const file of event.target.files) { // let fileName = String(event.target.files[0].name.replace(/\.[^/.]+$/, '')); // file.label = fileName; + // if (file.type.match('image.*')) { + // this.generateURL(file); + // } this._addFile(file); } // this.overlay.classList.remove('draggedover'); @@ -341,24 +343,58 @@ export default class FileUploadComponent extends Vue { return Object.fromEntries(Object.entries(this.errors).filter(([key]) => key.startsWith('file'))); } - clearAllFiles(event) { + public clearAllFiles(event) { event.preventDefault(); - this.files.splice(0); + this.items.splice(0); } - removeFile(key) { - this.files.splice(key, 1); + public removeFile(key) { + this.items.splice(key, 1); } - generateURL(file) { - let fileSrc = URL.createObjectURL(file); - setTimeout(() => { - URL.revokeObjectURL(fileSrc); - }, 1000); - return fileSrc; + public generateURL(file: TethysFile | File): string { + // const arrayBuffer = Buffer.from(file.fileData.data); + // const blob = new Blob([file.fileData.data], { type: 'application/octet-stream' }); + // const blob = new Blob([file.fileData], { type: 'image/png'}); + // let fileSrc = file.fileData; + + let localUrl: string = ""; + if (file instanceof File) { + localUrl = URL.createObjectURL(file as Blob); + } else if (file.filePath) { + // const blob = new Blob([file.fileData]); + // localUrl = URL.createObjectURL(blob); + const parsed = JSON.parse(file.fileData); + // retrieve the original buffer of data + const buff = Buffer.from(parsed.blob, "base64"); + const blob = new Blob([buff], { type: 'application/octet-stream' }); + // file.blob = blob; + localUrl = URL.createObjectURL(blob); + file.fileSrc = localUrl; + } + + // setTimeout(() => { + // URL.revokeObjectURL(localUrl); + // }, 1000); + return localUrl; } - getFileSize(file) { + + + // private async downloadFile(id: number): Promise<string> { + // const response = await axios.get<Blob>(`/api/download/${id}`, { + // responseType: 'blob', + // }); + // const url = URL.createObjectURL(response.data); + // setTimeout(() => { + // URL.revokeObjectURL(url); + // }, 1000); + // return url; + // } + + + + public getFileSize(file) { if (file.size > 1024) { if (file.size > 1048576) { return Math.round(file.size / 1048576) + 'mb'; @@ -370,29 +406,75 @@ export default class FileUploadComponent extends Vue { } } - // check if file is of type image and prepend the initialied - // template to the target element - private _addFile(file: TestFile) { - // const isImage = file.type.match('image.*'); - // const objectURL = URL.createObjectURL(file); + // private _addFile(file) { + // // const isImage = file.type.match('image.*'); + // // const objectURL = URL.createObjectURL(file); - // this.files[objectURL] = file; - // let test: TethysFile = { upload: file, label: "dfdsfs", sorting: 0 }; - // file.sorting = this.files.length; - this.files.push(file); + // // this.files[objectURL] = file; + // // let test: TethysFile = { upload: file, label: "dfdsfs", sorting: 0 }; + // // file.sorting = this.files.length; + // file.sort_order = (this.items.length + 1), + // this.files.push(file); + // } + + private _addFile(file: File) { + // const reader = new FileReader(); + // reader.onload = (event) => { + // const base64Data = (event.target as FileReader).result as string; + // this.items.push(test); + + // }; + // reader.readAsDataURL(file); + if (file instanceof File) { + // const base64Data = await this.readBase64(file); + let test: TethysFile = { + label: file.name, + name: file.name, + size: file.size, + file_size: file.size, + // fileData: JSON.stringify({ blob: base64Data }), + // filePath: file.mozFullPath, + // path_name: file.mozFullPath, + webkitRelativePath: '', + lastModified: file.lastModified, + type: file.type, + mime_type: file.type, + visible_in_frontdoor: false, + visible_in_oai: false, + fileSrc: file.type.match('image.*')? this.generateURL(file) : "", + blob: file as Blob, + sort_order: (this.items.length + 1), + }; + // this.items.push(test); + this.items[this.items.length] = test; + } + else { + this.items.push(file); + } } + // private async readBase64(blob: Blob): Promise<string> { + // return new Promise<string>((resolve, reject) => { + // const reader = new FileReader(); + // reader.onload = (event) => resolve((event.target as FileReader).result as string); + // reader.onerror = reject; + // reader.readAsDataURL(blob); + // }); + // } + // use to check if a file is being dragged private _hasFiles({ types = [] as Array<string> }) { return types.indexOf('Files') > -1; } } +export default FileUploadComponent; </script> <style lang="css"> .hasImage:hover section { background-color: rgba(5, 5, 5, 0.4); } + .hasImage:hover button:hover { background: rgba(5, 5, 5, 0.45); } @@ -409,6 +491,7 @@ i { #overlay.draggedover { background-color: rgba(255, 255, 255, 0.7); } + #overlay.draggedover p, #overlay.draggedover i { opacity: 1; diff --git a/resources/js/Components/FormCheckRadioGroup.vue b/resources/js/Components/FormCheckRadioGroup.vue index 572221a..0ceb4aa 100644 --- a/resources/js/Components/FormCheckRadioGroup.vue +++ b/resources/js/Components/FormCheckRadioGroup.vue @@ -1,4 +1,4 @@ -<script setup> +<script setup lang="ts"> import { computed } from 'vue'; import FormCheckRadio from '@/Components/FormCheckRadio.vue'; const props = defineProps({ @@ -13,7 +13,7 @@ const props = defineProps({ type: { type: String, default: 'checkbox', - validator: (value) => ['checkbox', 'radio', 'switch'].includes(value), + validator: (value: string) => ['checkbox', 'radio', 'switch'].includes(value), }, componentClass: { type: String, @@ -27,11 +27,34 @@ const props = defineProps({ }); const emit = defineEmits(['update:modelValue']); const computedValue = computed({ - get: () => props.modelValue, + // get: () => props.modelValue, + get: () => { + // const ids = props.modelValue.map((obj) => obj.id); + // return ids; + if (Array.isArray(props.modelValue)) { + if (props.modelValue.every((item) => typeof item === 'number')) { + return props.modelValue; + } else if (props.modelValue.every((item) => hasIdAttribute(item))) { + const ids = props.modelValue.map((obj) => obj.id.toString()); + return ids; + } + return props.modelValue; + } + // return props.modelValue; + }, set: (value) => { emit('update:modelValue', value); }, }); + +// Define a type guard to check if an object has an 'id' attribute +// function hasIdAttribute(obj: any): obj is { id: any } { +// return typeof obj === 'object' && 'id' in obj; +// } + +const hasIdAttribute = (obj: any): obj is { id: any } => { + return typeof obj === 'object' && 'id' in obj; +}; </script> <template> diff --git a/resources/js/Components/Map/SearchMap.vue b/resources/js/Components/Map/SearchMap.vue index f306320..f899493 100644 --- a/resources/js/Components/Map/SearchMap.vue +++ b/resources/js/Components/Map/SearchMap.vue @@ -59,8 +59,9 @@ Map.include({ }); const DEFAULT_BASE_LAYER_NAME = 'BaseLayer'; const DEFAULT_BASE_LAYER_ATTRIBUTION = '© <a target="_blank" href="http://osm.org/copyright">OpenStreetMap</a> contributors'; -// const OPEN_SEARCH_HOST = 'http://localhost:9200'; -const OPEN_SEARCH_HOST = 'http://192.168.21.18'; +// const OPENSEARCH_HOST = 'http://localhost:9200'; +const OPENSEARCH_HOST = 'http://192.168.21.18'; +// const OPENSEARCH_HOST = `http://${process.env.OPENSEARCH_PUBLIC_HOST}`; let map: Map; const props = defineProps({ @@ -226,7 +227,7 @@ const handleDrawEventCreated = async (event) => { try { let response = await axios({ method: 'POST', - url: OPEN_SEARCH_HOST + '/tethys-records/_search', + url: OPENSEARCH_HOST + '/tethys-records/_search', headers: { 'Content-Type': 'application/json' }, data: { size: 1000, diff --git a/resources/js/Components/SectionFullScreen.vue b/resources/js/Components/SectionFullScreen.vue index 98d99e6..54635e7 100644 --- a/resources/js/Components/SectionFullScreen.vue +++ b/resources/js/Components/SectionFullScreen.vue @@ -6,7 +6,7 @@ import { gradientBgPurplePink, gradientBgDark, gradientBgPinkRed, gradientBgGree const props = defineProps({ bg: { type: String, - required: true, + required: false, validator: (value) => ['purplePink', 'pinkRed', 'greenBlue'].includes(value), }, }); @@ -23,9 +23,11 @@ const colorClass = computed(() => { return gradientBgPinkRed; case 'greenBlue': return gradientBgGreenBlue; + default: + return 'bg-white text-black dark:bg-slate-900/70 dark:text-white'; } - return 'bg-white'; + // return 'bg-white'; }); </script> diff --git a/resources/js/Dataset.ts b/resources/js/Dataset.ts index a42758a..93102d2 100644 --- a/resources/js/Dataset.ts +++ b/resources/js/Dataset.ts @@ -12,9 +12,10 @@ export interface Dataset { | (IErrorMessage | undefined) | Coverage | Array<DatasetReference> - | Array<File>; + | Array<File> + | (Array<number> | Array<Object>); language: Ref<string>; - // licenses: Array<number>; + licenses: Array<number> | Array<Object>; rights: boolean; type: string; creating_corporation: string; @@ -29,24 +30,49 @@ export interface Dataset { // async (user): Promise<void>; subjects: Array<Subject>; references: Array<DatasetReference>; - files: Array<TestFile> | undefined; + files: Array<TethysFile>; // upload: TethysFile } /** Provides information about files and allows JavaScript in a web page to access their content. */ -export interface TestFile extends Blob { +// export interface TethysFile { + +// readonly lastModified: number; +// readonly name: string; +// readonly webkitRelativePath: string; +// id: number; +// label: string; +// sorting: number; +// filePath: string; +// fileSrc: string; +// } + +export interface TethysFile { readonly lastModified: number; readonly name: string; readonly webkitRelativePath: string; + id?: number; label: string; - sorting: number; -} + // sorting: number; + // path_name?: string; //only db path_name + filePath?: string; + fileSrc?: string; + blob: Blob; + fileData?: any; -// export interface TethysFile { -// label: string, -// sorting: number, -// upload: File, -// } + //additional: + comment?: string; + document_id?: number; + file_size: number; + language?: string; + mime_type: string; + type?: string; + + size: number; + sort_order: number; + visible_in_frontdoor: boolean; + visible_in_oai: boolean; +} export interface Subject { // id: number; @@ -64,12 +90,14 @@ export interface DatasetReference { } export interface Title { + id?: number; value: string; type: string; language: string | Ref<string>; } export interface Description { + id?: number; value: string; type: string; language: string | Ref<string>; diff --git a/resources/js/Pages/Auth/Login.vue b/resources/js/Pages/Auth/Login.vue index c95ce4e..fcc8594 100644 --- a/resources/js/Pages/Auth/Login.vue +++ b/resources/js/Pages/Auth/Login.vue @@ -34,6 +34,7 @@ import FormControl from '@/Components/FormControl.vue'; <LayoutGuest> <Head title="Login" /> + <!-- <SectionFullScreen v-slot="{ cardClass }" :bg="'greenBlue'"> --> <SectionFullScreen v-slot="{ cardClass }"> <a class="text-2xl font-semibold flex justify-center items-center mb-8 lg:mb-10"> <img src="/logo.svg" class="h-10 mr-4" alt="Windster Logo" /> diff --git a/resources/js/Pages/Submitter/Dataset/Create.vue b/resources/js/Pages/Submitter/Dataset/Create.vue index 9048662..e7f855c 100644 --- a/resources/js/Pages/Submitter/Dataset/Create.vue +++ b/resources/js/Pages/Submitter/Dataset/Create.vue @@ -22,9 +22,7 @@ import CardBox from '@/Components/CardBox.vue'; import FormField from '@/Components/FormField.vue'; import FormControl from '@/Components/FormControl.vue'; import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'; -// import BaseDivider from '@/Components/BaseDivider.vue'; import BaseButton from '@/Components/BaseButton.vue'; -// import BaseButtons from '@/Components/BaseButtons.vue'; import { stardust } from '@eidellev/adonis-stardust/client'; // import { Inertia } from '@inertiajs/inertia'; import CardBoxModal from '@/Components/CardBoxModal.vue'; @@ -196,7 +194,7 @@ if (Object.keys(mainService.dataset).length == 0) { // titles: [{ value: '', type: 'Main', language: language }], // descriptions: [{ value: '', type: 'Abstract', language: language }], // }); -let form = useForm<Dataset>(dataset); +let form = useForm<Dataset>(dataset as Dataset); // form.defaults(); // const emit = defineEmits(['update:modelValue', 'setRef']); @@ -292,11 +290,14 @@ const submit = async () => { // this.currentStatus = STATUS_SAVING; // serrors = []; + // const files = form.files.map((obj) => { + // return new File([obj.blob], obj.label, { type: obj.type, lastModified: obj.lastModified }); + // }); // formStep.value++; await form .transform((data) => ({ - ...data, + ...data, rights: form.rights && form.rights == true ? 'true' : 'false', })) .post(route, { @@ -729,8 +730,9 @@ Removes a selected keyword </SearchAutocomplete> <TablePersons :persons="form.contributors" v-if="form.contributors.length > 0" - :contributortypes="contributorTypes" :errors="form.errors"/> - <div class="text-red-400 text-sm" v-if="form.errors.contributors && Array.isArray(form.errors.contributors)"> + :contributortypes="contributorTypes" :errors="form.errors" /> + <div class="text-red-400 text-sm" + v-if="form.errors.contributors && Array.isArray(form.errors.contributors)"> {{ form.errors.contributors.join(', ') }} </div> </CardBox> @@ -1013,7 +1015,7 @@ Removes a selected keyword </p> </div> --> - <FileUploadComponent v-model="form.files"></FileUploadComponent> + <FileUploadComponent :files="form.files"></FileUploadComponent> <div class="text-red-400 text-sm" v-if="form.errors['file'] && Array.isArray(form.errors['file'])"> {{ form.errors['file'].join(', ') }} @@ -1039,7 +1041,8 @@ Removes a selected keyword Next </button> - <button v-if="formStep == 4" :disabled="form.processing" :class="{ 'opacity-25': form.processing }" + <button v-if="formStep == 4" :disabled="form.processing" + :class="{ 'opacity-25': form.processing }" class="text-base hover:scale-110 focus:outline-none flex justify-center px-4 py-2 rounded font-bold cursor-pointer hover:bg-teal-200 bg-teal-100 text-teal-700 border duration-200 ease-in-out border-teal-600 transition" @click.stop="submit"> Save diff --git a/resources/js/Pages/Submitter/Dataset/Edit.vue b/resources/js/Pages/Submitter/Dataset/Edit.vue index e5618d0..212358d 100644 --- a/resources/js/Pages/Submitter/Dataset/Edit.vue +++ b/resources/js/Pages/Submitter/Dataset/Edit.vue @@ -12,6 +12,7 @@ <!-- <div class="max-w-2xl mx-auto"> --> <CardBox :form="true"> + <FormValidationErrors v-bind:errors="errors" /> <div class="mb-4"> <!-- <label for="title" class="block text-gray-700 font-bold mb-2">Title:</label> <input @@ -21,6 +22,7 @@ v-model="form.language" /> --> <div class="flex flex-col md:flex-row"> + <!-- (1) language field --> <FormField label="Language *" help="required: select dataset main language" :class="{ 'text-red-400': errors.language }" class="w-full flex-1"> <FormControl required v-model="form.language" :type="'select'" placeholder="[Enter Language]" @@ -31,17 +33,41 @@ </FormControl> </FormField> </div> - <FormField label="Dataset Type *" help="required: dataset type" - :class="{ 'text-red-400': form.errors.type }"> - <FormControl required v-model="form.type" :type="'select'" placeholder="-- select type --" - :errors="errors.type" :options="doctypes"> - <div class="text-red-400 text-sm" v-if="form.errors.type && Array.isArray(form.errors.type)"> - {{ form.errors.type.join(', ') }} - </div> - </FormControl> + + <!-- (2) licenses --> + <FormField label="Licenses" wrap-body :class="{ 'text-red-400': form.errors.licenses }" + class="mt-8 w-full mx-2 flex-1"> + <FormCheckRadioGroup v-model="form.licenses" name="licenses" is-column :options="licenses" /> </FormField> - <!-- titles --> + <div class="flex flex-col md:flex-row"> + <!-- (3) dataset_type --> + <FormField label="Dataset Type *" help="required: dataset type" + :class="{ 'text-red-400': form.errors.type }" class="w-full mx-2 flex-1"> + <FormControl required v-model="form.type" :type="'select'" placeholder="-- select type --" + :errors="errors.type" :options="doctypes"> + <div class="text-red-400 text-sm" + v-if="form.errors.type && Array.isArray(form.errors.type)"> + {{ form.errors.type.join(', ') }} + </div> + </FormControl> + </FormField> + <!-- (4) creating_corporation --> + <FormField label="Creating Corporation *" + :class="{ 'text-red-400': form.errors.creating_corporation }" class="w-full mx-2 flex-1"> + <FormControl required v-model="form.creating_corporation" type="text" + placeholder="[enter creating corporation]" :is-read-only="true"> + <div class="text-red-400 text-sm" + v-if="form.errors.creating_corporation && Array.isArray(form.errors.creating_corporation)"> + {{ form.errors.creating_corporation.join(', ') }} + </div> + </FormControl> + </FormField> + </div> + + <BaseDivider /> + + <!-- (5) titles --> <CardBox class="mb-6 shadow" :has-form-data="false" title="Titles" :icon="mdiFinance" :header-icon="mdiPlusCircle" v-on:header-icon-click="addTitle()"> <div class="flex flex-col md:flex-row"> @@ -79,8 +105,8 @@ </tr> </thead> <tbody> - <template v-for="(item, index) in form.titles" :key="index"> - <tr v-if="item.type != 'Main'"> + <template v-for="(title, index) in form.titles" :key="index"> + <tr v-if="title.type != 'Main'"> <!-- <td scope="row">{{ index + 1 }}</td> --> <td data-label="Title Value"> <FormControl required v-model="form.titles[index].value" type="text" @@ -113,7 +139,7 @@ <BaseButtons type="justify-start lg:justify-end" no-wrap> <!-- <BaseButton color="info" :icon="mdiEye" small @click="isModalActive = true" /> --> <BaseButton color="danger" :icon="mdiTrashCan" small - @click.prevent="removeTitle(index)" /> + v-if="title.id == undefined" @click.prevent="removeTitle(index)" /> </BaseButtons> </td> </tr> @@ -122,6 +148,7 @@ </table> </CardBox> + <!-- (6) descriptions --> <CardBox class="mb-6 shadow" :has-form-data="false" title="Descriptions" :icon="mdiFinance" :header-icon="mdiPlusCircle" v-on:header-icon-click="addDescription()"> <div class="flex flex-col md:flex-row"> @@ -172,7 +199,7 @@ </td> <td data-label="Description Type"> <FormControl required v-model="form.descriptions[index].type" type="select" - :options="props.descriptiontypes" placeholder="[select title type]"> + :options="descriptiontypes" placeholder="[select title type]"> <div class="text-red-400 text-sm" v-if="Array.isArray(form.errors[`descriptions.${index}.type`])"> {{ form.errors[`descriptions.${index}.type`].join(', ') }} @@ -191,7 +218,7 @@ <td class="before:hidden lg:w-1 whitespace-nowrap"> <BaseButtons type="justify-start lg:justify-end" no-wrap> <!-- <BaseButton color="info" :icon="mdiEye" small @click="isModalActive = true" /> --> - <BaseButton color="danger" :icon="mdiTrashCan" small + <BaseButton color="danger" :icon="mdiTrashCan" small v-if="item.id == undefined" @click.prevent="removeDescription(index)" /> </BaseButtons> </td> @@ -201,14 +228,182 @@ </table> </CardBox> - <MapComponent v-if="form.coverage" - :mapOptions="mapOptions" - :baseMaps="baseMaps" - :fitBounds="fitBounds" - :coverage="form.coverage" - :mapId="mapId" - v-bind-event:onMapInitializedEvent="onMapInitialized" - ></MapComponent> + <!-- (7) authors --> + <CardBox class="mb-6 shadow" has-table title="Authors" :icon="mdiBookOpenPageVariant"> + <SearchAutocomplete source="/api/persons" :response-property="'first_name'" + placeholder="search in person table...." v-on:person="onAddAuthor"></SearchAutocomplete> + + <TablePersons :persons="form.authors" v-if="form.authors.length > 0" /> + <div class="text-red-400 text-sm" v-if="errors.authors && Array.isArray(errors.authors)"> + {{ errors.authors.join(', ') }} + </div> + </CardBox> + + + <!-- (8) contributors --> + <CardBox class="mb-6 shadow" has-table title="Contributors" :icon="mdiBookOpenPageVariant"> + <SearchAutocomplete source="/api/persons" :response-property="'first_name'" + placeholder="search in person table...." v-on:person="onAddContributor"> + </SearchAutocomplete> + + <TablePersons :persons="form.contributors" v-if="form.contributors.length > 0" + :contributortypes="contributorTypes" :errors="form.errors" /> + <div class="text-red-400 text-sm" + v-if="form.errors.contributors && Array.isArray(form.errors.contributors)"> + {{ form.errors.contributors.join(', ') }} + </div> + </CardBox> + + <div class="flex flex-col md:flex-row"> + <!-- (9) project_id --> + <FormField label="Project.." help="project is optional" + :class="{ 'text-red-400': errors.project_id }" class="w-full mx-2 flex-1"> + <FormControl required v-model="form.project_id" :type="'select'" placeholder="[Select Project]" + :errors="form.errors.project_id" :options="projects"> + <div class="text-red-400 text-sm" v-if="form.errors.project_id"> + {{ form.errors.project_id.join(', ') }} + </div> + </FormControl> + </FormField> + <!-- (10) embargo_date --> + <FormField label="Embargo Date.." help="embargo date is optional" + :class="{ 'text-red-400': errors.embargo_date }" class="w-full mx-2 flex-1"> + <FormControl v-model="form.embargo_date" :type="'date'" placeholder="date('y-m-d')" + :errors="form.errors.embargo_date"> + <div class="text-red-400 text-sm" v-if="form.errors.embargo_date"> + {{ form.errors.embargo_date.join(', ') }} + </div> + </FormControl> + </FormField> + </div> + + <BaseDivider /> + + <MapComponent v-if="form.coverage" :mapOptions="mapOptions" :baseMaps="baseMaps" :fitBounds="fitBounds" + :coverage="form.coverage" :mapId="mapId" v-bind-event:onMapInitializedEvent="onMapInitialized"> + </MapComponent> + <div class="flex flex-col md:flex-row"> + <!-- x min and max --> + <FormField label="Coverage X Min" :class="{ 'text-red-400': form.errors['coverage.x_min'] }" + class="w-full mx-2 flex-1"> + <FormControl required v-model="form.coverage.x_min" type="text" placeholder="[enter x_min]"> + <div class="text-red-400 text-sm" + v-if="form.errors['coverage.x_min'] && Array.isArray(form.errors['coverage.x_min'])"> + {{ form.errors['coverage.x_min'].join(', ') }} + </div> + </FormControl> + </FormField> + <FormField label="Coverage X Max" :class="{ 'text-red-400': form.errors['coverage.x_max'] }" + class="w-full mx-2 flex-1"> + <FormControl required v-model="form.coverage.x_max" type="text" placeholder="[enter x_max]"> + <div class="text-red-400 text-sm" + v-if="form.errors['coverage.x_max'] && Array.isArray(form.errors['coverage.x_max'])"> + {{ form.errors['coverage.x_max'].join(', ') }} + </div> + </FormControl> + </FormField> + <!-- y min and max --> + <FormField label="Coverage Y Min" :class="{ 'text-red-400': form.errors['coverage.y_min'] }" + class="w-full mx-2 flex-1"> + <FormControl required v-model="form.coverage.y_min" type="text" placeholder="[enter y_min]"> + <div class="text-red-400 text-sm" + v-if="form.errors['coverage.y_min'] && Array.isArray(form.errors['coverage.y_min'])"> + {{ form.errors['coverage.y_min'].join(', ') }} + </div> + </FormControl> + </FormField> + <FormField label="Coverage Y Max" :class="{ 'text-red-400': form.errors['coverage.y_max'] }" + class="w-full mx-2 flex-1"> + <FormControl required v-model="form.coverage.y_max" type="text" placeholder="[enter y_max]"> + <div class="text-red-400 text-sm" + v-if="form.errors['coverage.y_max'] && Array.isArray(form.errors['coverage.y_max'])"> + {{ form.errors['coverage.y_max'].join(', ') }} + </div> + </FormControl> + </FormField> + </div> + + <CardBox class="mb-6 shadow" has-table title="Dataset References" :header-icon="mdiPlusCircle" + v-on:header-icon-click="addReference"> + <table class="table-fixed border-green-900" v-if="form.references.length"> + <thead> + <tr> + <th class="w-4/12">Value</th> + <th class="w-2/12">Type</th> + <th class="w-3/12">Relation</th> + <th class="w-2/12">Label</th> + <th class="w-1/12"></th> + </tr> + </thead> + <tbody> + <tr v-for="(item, index) in form.references"> + <td data-label="Reference Value"> + <!-- <input name="Reference Value" class="form-control" + placeholder="[VALUE]" v-model="item.value" /> --> + <FormControl required v-model="item.value" :type="'text'" placeholder="[VALUE]" + :errors="form.errors.embargo_date"> + <div class="text-red-400 text-sm" + v-if="form.errors[`references.${index}.value`] && Array.isArray(form.errors[`references.${index}.value`])"> + {{ form.errors[`references.${index}.value`].join(', ') }} + </div> + </FormControl> + + </td> + <td> + <FormControl required v-model="form.references[index].type" type="select" + :options="referenceIdentifierTypes" placeholder="[type]"> + <div class="text-red-400 text-sm" + v-if="Array.isArray(form.errors[`references.${index}.type`])"> + {{ form.errors[`references.${index}.type`].join(', ') }} + </div> + </FormControl> + </td> + + <td> + <!-- {!! Form::select('Reference[Relation]', $relationTypes, null, + ['placeholder' => '[relationType]', 'v-model' => 'item.relation', + 'data-vv-scope' => 'step-2']) + !!} --> + <FormControl required v-model="form.references[index].relation" type="select" + :options="relationTypes" placeholder="[relation type]"> + <div class="text-red-400 text-sm" + v-if="Array.isArray(form.errors[`references.${index}.relation`])"> + {{ form.errors[`references.${index}.relation`].join(', ') }} + </div> + </FormControl> + </td> + <td data-label="Reference Label"> + <!-- <input name="Reference Label" class="form-control" v-model="item.label" /> --> + <FormControl required v-model="form.references[index].label" type="text" + placeholder="[reference label]"> + <div class="text-red-400 text-sm" + v-if="form.errors[`references.${index}.label`] && Array.isArray(form.errors[`references.${index}.label`])"> + {{ form.errors[`references.${index}.label`].join(', ') }} + </div> + </FormControl> + </td> + <td class="before:hidden lg:w-1 whitespace-nowrap"> + <!-- <BaseButton color="info" :icon="mdiEye" small @click="isModalActive = true" /> --> + <BaseButton color="danger" :icon="mdiTrashCan" small + @click.prevent="removeReference(index)" /> + </td> + </tr> + </tbody> + </table> + </CardBox> + + <BaseDivider /> + + <CardBox class="mb-6 shadow" has-table title="Dataset Keywords" :icon="mdiEarthPlus" + :header-icon="mdiPlusCircle" v-on:header-icon-click="addKeyword"> + <!-- <ul> + <li v-for="(subject, index) in form.subjects" :key="index"> + {{ subject.value }} <BaseButton color="danger" :icon="mdiTrashCan" small @click.prevent="removeKeyword(index)" /> + </li> + </ul> --> + <TableKeywords :keywords="form.subjects" :errors="form.errors" :subjectTypes="subjectTypes" + v-if="form.subjects.length > 0" /> + </CardBox> </div> @@ -233,18 +428,14 @@ </option> </select> --> </div> - <div class="mb-4"> - <label for="license" class="block text-gray-700 font-bold mb-2">License:</label> - <!-- <select - id="license" - class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" - v-model="dataset.license_id" - > - <option v-for="license in licenses" :key="license.id" :value="license.id" class="block px-4 py-2 text-gray-700"> - {{ license.name_long }} - </option> - </select> --> + + <FileUploadComponent :files="form.files"></FileUploadComponent> + + <div class="text-red-400 text-sm" v-if="form.errors['file'] && Array.isArray(form.errors['files'])"> + {{ form.errors['files'].join(', ') }} </div> + + <!-- Add more input fields for the other properties of the dataset --> <!-- <button type="submit" @@ -252,11 +443,17 @@ > Save </button> --> + <template #footer> <BaseButtons> - <BaseButton type="submit" label="Submit" color="info" :class="{ 'opacity-25': form.processing }" - :disabled="form.processing"> + <BaseButton @click.stop="submit" :disabled="form.processing" label="Save" color="info" + :class="{ 'opacity-25': form.processing }" small> </BaseButton> + <!-- <button :disabled="form.processing" :class="{ 'opacity-25': form.processing }" + class="text-base hover:scale-110 focus:outline-none flex justify-center px-4 py-2 rounded font-bold cursor-pointer hover:bg-teal-200 bg-teal-100 text-teal-700 border duration-200 ease-in-out border-teal-600 transition" + @click.stop="submit"> + Save + </button> --> </BaseButtons> </template> </CardBox> @@ -266,31 +463,61 @@ </template> <script setup lang="ts"> -import { Head, useForm } from '@inertiajs/vue3'; +// import EditComponent from "./../EditComponent"; +// export default EditComponent; + +// import { Component, Vue, Prop, Setup, toNative } from 'vue-facing-decorator'; +// import AuthLayout from '@/Layouts/Auth.vue'; import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue'; -import { Dataset, Title } from '@/Dataset'; +import { useForm, Head } from '@inertiajs/vue3'; +// import { ref } from 'vue'; +// import { MainService } from '@/Stores/main'; +// import FormInput from '@/Components/FormInput.vue'; // @/Components/FormInput.vue' +import { Dataset, Title, Subject, TethysFile } from '@/Dataset'; +import { stardust } from '@eidellev/adonis-stardust/client'; + import FormField from '@/Components/FormField.vue'; import FormControl from '@/Components/FormControl.vue'; import SectionMain from '@/Components/SectionMain.vue'; import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue'; -import { mdiImageText, mdiArrowLeftBoldOutline, mdiPlusCircle, mdiFinance, mdiTrashCan } from '@mdi/js'; -// import BaseDivider from '@/Components/BaseDivider.vue'; +import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'; import BaseButton from '@/Components/BaseButton.vue'; import BaseButtons from '@/Components/BaseButtons.vue'; +import BaseDivider from '@/Components/BaseDivider.vue'; import CardBox from '@/Components/CardBox.vue'; -import { stardust } from '@eidellev/adonis-stardust/client'; - import MapComponent from '@/Components/Map/map.component.vue'; +import SearchAutocomplete from '@/Components/SearchAutocomplete.vue'; +import TablePersons from '@/Components/TablePersons.vue'; +import TableKeywords from '@/Components/TableKeywords.vue'; +import FormValidationErrors from '@/Components/FormValidationErrors.vue'; +import FileUploadComponent from '@/Components/FileUpload.vue'; import { MapOptions } from '@/Components/Map/MapOptions'; import { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds'; import { LayerOptions } from '@/Components/Map/LayerOptions'; +import { + mdiImageText, + mdiArrowLeftBoldOutline, + mdiPlusCircle, + mdiFinance, + mdiTrashCan, + mdiBookOpenPageVariant, + mdiEarthPlus, +} from '@mdi/js'; +import { notify } from '@/notiwind'; const props = defineProps({ - dataset: { + errors: { + type: Object, + default: () => ({}), + }, + licenses: { + type: Object, + default: () => ({}), + }, + languages: { type: Object, default: () => ({}), }, - languages: {}, doctypes: { type: Object, default: () => ({}), @@ -299,14 +526,37 @@ const props = defineProps({ type: Object, default: () => ({}), }, + projects: { + type: Object, + default: () => ({}), + }, descriptiontypes: { type: Object, default: () => ({}), }, - errors: { + contributorTypes: { type: Object, default: () => ({}), }, + subjectTypes: { + type: Object, + default: () => ({}), + }, + referenceIdentifierTypes: { + type: Object, + default: () => ({}), + }, + relationTypes: { + type: Object, + default: () => ({}), + }, + dataset: { + type: Object, + default: () => ({}), + }, + + + }); // const projects = reactive([]); @@ -325,7 +575,42 @@ const fitBounds: LatLngBoundsExpression = [ ]; const mapId = 'test'; +// const downloadFile = async (id: string): Promise<string> => { +// const response = await axios.get<Blob>(`/api/download/${id}`, { +// responseType: 'blob', +// }); +// const url = URL.createObjectURL(response.data); +// setTimeout(() => { +// URL.revokeObjectURL(url); +// }, 1000); +// return url; +// }; + +// for (const file of props.dataset.files) { +// // console.log(`${file.name} path is ${file.filePath} here.`); +// file.fileSrc = ref(""); +// // downloadFile(file.id).then((value: string) => { +// // file.fileSrc = ref(value); +// // form = useForm<Dataset>(props.dataset as Dataset); +// // }); +// } + let form = useForm<Dataset>(props.dataset as Dataset); + +// const mainService = MainService(); +// mainService.fetchfiles(props.dataset); + + + + + + +// const files = computed(() => props.dataset.file); + + + +// let form = useForm<Dataset>(props.dataset as Dataset); + // const form = useForm({ // _method: 'put', // login: props.user.login, @@ -342,9 +627,63 @@ let form = useForm<Dataset>(props.dataset as Dataset); // this.projects = data.projects; // this.licenses = data.licenses; // } + + + +const submit = async (): Promise<void> => { + let route = stardust.route('dataset.update', [props.dataset.id]); + // await Inertia.post('/app/register', this.form); + // await router.post('/app/register', this.form); + + if (form.licenses.every((item) => hasIdAttribute(item))) { + form.licenses = form.licenses.map((obj) => obj.id.toString()); + } + + const [fileUploads, fileInputs] = form.files?.reduce( + ([fileUploads, fileInputs], obj) => { + if (!obj.id) { + // return MultipartFile for file upload + fileUploads[obj.sort_order] = new File([obj.blob], obj.label, { type: obj.type, lastModified: obj.lastModified }); + } else { + // return normal request input + fileInputs.push(obj); + } + return [fileUploads, fileInputs]; + }, + [[], []] as [Array<File>, Array<TethysFile>] + ) as [Array<File>, Array<TethysFile>]; + + await form + .transform((data) => ({ + ...data, + licenses: form.licenses.every((item) => hasIdAttribute(item)) + ? form.licenses.map((obj) => obj.id.toString()) + : form.licenses, + files: fileUploads, + fileInputs: fileInputs, + // files: form.files.map((obj) => { + // let file; + // if (!obj.id) { + // // return MultipartFile for file upload + // file = new File([obj.blob], obj.label, { type: obj.type, lastModified: obj.lastModified }); + // } else { + // // return normal request input + // file = obj; + // } + // return file; + // }), + + rights: 'true', + })) + .put(route); +}; + +const hasIdAttribute = (obj: any): obj is { id: any } => { + return typeof obj === 'object' && 'id' in obj; +}; + const addTitle = () => { let newTitle: Title = { value: '', language: '', type: '' }; - //this.dataset.files.push(uploadedFiles[i]); form.titles.push(newTitle); }; const removeTitle = (key) => { @@ -353,20 +692,58 @@ const removeTitle = (key) => { const addDescription = () => { let newDescription = { value: '', language: '', type: '' }; - //this.dataset.files.push(uploadedFiles[i]); form.descriptions.push(newDescription); }; const removeDescription = (key) => { form.descriptions.splice(key, 1); }; +const onAddAuthor = (person) => { + if (form.authors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as author' }, 4000); + } else if (form.contributors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as contributor' }); + } else { + form.authors.push(person); + notify({ type: 'info', text: 'person has been successfully added as author' }); + } +}; + +const onAddContributor = (person) => { + if (form.contributors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as contributor' }, 4000); + } else if (form.authors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as author' }, 4000); + } else { + // person.pivot = { contributor_type: '' }; + // // person.pivot = { name_type: '', contributor_type: '' }; + form.contributors.push(person); + notify({ type: 'info', text: 'person has been successfully added as contributor' }, 4000); + } +}; + +const addKeyword = () => { + let newSubject: Subject = { value: 'test', language: '', type: 'uncontrolled' }; + //this.dataset.files.push(uploadedFiles[i]); + form.subjects.push(newSubject); +}; + +const addReference = () => { + let newReference = { value: '', label: '', relation: '', type: '' }; + //this.dataset.files.push(uploadedFiles[i]); + form.references.push(newReference); +}; + +const removeReference = (key) => { + form.references.splice(key, 1); +}; + const onMapInitialized = (newItem) => { - // notify({ type: 'info', text: message }); console.log(newItem); }; </script> -<!-- <style> +<style> .max-w-2xl { max-width: 2xl; } @@ -398,4 +775,4 @@ const onMapInitialized = (newItem) => { 0 2px 4px 0 rgba(66, 72, 78, 0.12), 0 4px 8px 0 rgba(66, 72, 78, 0.16); } -</style> --> +</style> diff --git a/resources/js/Pages/Submitter/EditComponent.ts b/resources/js/Pages/Submitter/EditComponent.ts new file mode 100644 index 0000000..834f524 --- /dev/null +++ b/resources/js/Pages/Submitter/EditComponent.ts @@ -0,0 +1,240 @@ +import { Component, Vue, Prop, toNative } from 'vue-facing-decorator'; +// import AuthLayout from '@/Layouts/Auth.vue'; +import LayoutAuthenticated from '@/Layouts/LayoutAuthenticated.vue'; +import { useForm, InertiaForm, Head } from '@inertiajs/vue3'; +import FormInput from '@/Components/FormInput.vue'; // @/Components/FormInput.vue' +import { Dataset, Title, Subject } from '@/Dataset'; +import { stardust } from '@eidellev/adonis-stardust/client'; + +import FormField from '@/Components/FormField.vue'; +import FormControl from '@/Components/FormControl.vue'; +import SectionMain from '@/Components/SectionMain.vue'; +import SectionTitleLineWithButton from '@/Components/SectionTitleLineWithButton.vue'; +import FormCheckRadioGroup from '@/Components/FormCheckRadioGroup.vue'; +import BaseButton from '@/Components/BaseButton.vue'; +import BaseButtons from '@/Components/BaseButtons.vue'; +import BaseDivider from '@/Components/BaseDivider.vue'; +import CardBox from '@/Components/CardBox.vue'; +import MapComponent from '@/Components/Map/map.component.vue'; +import SearchAutocomplete from '@/Components/SearchAutocomplete.vue'; +import TablePersons from '@/Components/TablePersons.vue'; +import TableKeywords from '@/Components/TableKeywords.vue'; +import FormValidationErrors from '@/Components/FormValidationErrors.vue'; +import FileUploadComponent from '@/Components/FileUpload.vue'; +import { MapOptions } from '@/Components/Map/MapOptions'; +import { LatLngBoundsExpression } from 'leaflet/src/geo/LatLngBounds'; +import { LayerOptions } from '@/Components/Map/LayerOptions'; + +import { + mdiImageText, + mdiArrowLeftBoldOutline, + mdiPlusCircle, + mdiFinance, + mdiTrashCan, + mdiBookOpenPageVariant, + mdiEarthPlus, +} from '@mdi/js'; +import { notify } from '@/notiwind'; + +export interface IErrorMessage { + [key: string]: Array<string>; +} + +@Component({ + name: 'EditComponent', + components: { + LayoutAuthenticated, + FormInput, + Head, + FormField, + FormControl, + SectionMain, + SectionTitleLineWithButton, + FormCheckRadioGroup, + BaseButton, + BaseButtons, + BaseDivider, + CardBox, + MapComponent, + SearchAutocomplete, + TablePersons, + TableKeywords, + FormValidationErrors, + FileUploadComponent, + }, +}) +class EditComponent extends Vue { + // Component Property + @Prop({ type: Object, default: () => ({}) }) + public errors: IErrorMessage; + + @Prop({ type: Object, default: () => ({}) }) + public licenses; + + @Prop({ type: Object, default: () => ({}) }) + public languages; + + @Prop({ type: Object, default: () => ({}) }) + public doctypes; + + @Prop({ type: Object, default: () => ({}) }) + public titletypes; + + @Prop({ type: Object, default: () => ({}) }) + public projects; + + @Prop({ type: Object, default: () => ({}) }) + public descriptiontypes; + + @Prop({ type: Object, default: () => {} }) + public contributorTypes; + + @Prop({ type: Object, default: () => ({}) }) + public subjectTypes; + + @Prop({ type: Object, default: () => ({}) }) + public referenceIdentifierTypes; + + @Prop({ type: Object, default: () => ({}) }) + public relationTypes; + + @Prop({ type: Object, default: () => ({}) }) + public dataset: Dataset; + + // @Prop({ + // type: Object, + // default: () => ({}), + // }) + // public datasetHasLicenses; + + // Data Property + // public form: InertiaForm<Dataset>; // = useForm<Dataset>(this.dataset as Dataset); + + // public form : InertiaForm<Dataset>= useForm<Dataset>([]); + + // @Setup(() => useForm<Dataset>(this.dataset as Dataset)) + public form: InertiaForm<Dataset>; + + // @Hook + created() { + this.form = useForm<Dataset>(this.dataset as Dataset); + // this.form.licenses = this.datasetHasLicenses; + this.form.uploads = []; + } + + public mapOptions: MapOptions = { + center: [48.208174, 16.373819], + zoom: 3, + zoomControl: false, + attributionControl: false, + }; + public baseMaps: Map<string, LayerOptions> = new Map<string, LayerOptions>(); + public fitBounds: LatLngBoundsExpression = [ + [46.4318173285, 9.47996951665], + [49.0390742051, 16.9796667823], + ]; + public mapId = 'test'; + mdiImageText = mdiImageText; + mdiArrowLeftBoldOutline = mdiArrowLeftBoldOutline; + mdiPlusCircle = mdiPlusCircle; + mdiFinance = mdiFinance; + mdiTrashCan = mdiTrashCan; + mdiBookOpenPageVariant = mdiBookOpenPageVariant; + mdiEarthPlus = mdiEarthPlus; + stardust = stardust; + + // mounted() { + // this.form = useForm<Dataset>(this.dataset as Dataset);// Initialize myData with the value of propValue + // } + + // public results: Array<any> = []; + + // Component method + public async submit(): Promise<void> { + let route = this.stardust.route('dataset.update', [this.dataset.id]); + // await Inertia.post('/app/register', this.form); + // await router.post('/app/register', this.form); + + if (this.form.licenses.every((item) => this.hasIdAttribute(item))) { + this.form.licenses = this.form.licenses.map((obj) => obj.id.toString()); + } + + await this.form + .transform((data) => ({ + ...data, + licenses: this.form.licenses.every((item) => this.hasIdAttribute(item)) + ? this.form.licenses.map((obj) => obj.id.toString()) + : this.form.licenses, + rights: 'true', + })) + .put(route); + } + + private hasIdAttribute(obj: any): obj is { id: any } { + return typeof obj === 'object' && 'id' in obj; + } + + public addTitle(): void { + const newTitle: Title = { value: '', language: '', type: '' }; + this.form.titles.push(newTitle); + } + public removeTitle(key: number): void { + this.form.titles.splice(key, 1); + } + + public addDescription(): void { + const newDescription = { value: '', language: '', type: '' }; + this.form.descriptions.push(newDescription); + } + + public removeDescription(key: number): void { + this.form.descriptions.splice(key, 1); + } + + public onAddAuthor(person) { + if (this.form.authors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as author' }, 4000); + } else if (this.form.contributors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as contributor' }); + } else { + this.form.authors.push(person); + notify({ type: 'info', text: 'person has been successfully added as author' }); + } + } + + public onAddContributor(person) { + if (this.form.contributors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as contributor' }, 4000); + } else if (this.form.authors.filter((e) => e.id === person.id).length > 0) { + notify({ type: 'warning', title: 'Warning', text: 'person is already defined as author' }, 4000); + } else { + // person.pivot = { contributor_type: '' }; + // // person.pivot = { name_type: '', contributor_type: '' }; + this.form.contributors.push(person); + notify({ type: 'info', text: 'person has been successfully added as contributor' }, 4000); + } + } + + public addKeyword() { + let newSubject: Subject = { value: 'test', language: '', type: 'uncontrolled' }; + //this.dataset.files.push(uploadedFiles[i]); + this.form.subjects.push(newSubject); + } + + public addReference() { + let newReference = { value: '', label: '', relation: '', type: '' }; + //this.dataset.files.push(uploadedFiles[i]); + this.form.references.push(newReference); + } + + public removeReference(key) { + this.form.references.splice(key, 1); + } + + public onMapInitialized(newItem: any): void { + console.log(newItem); + } +} + +export default toNative(EditComponent); +// export default toNative(EditComponent); diff --git a/resources/js/Stores/main.ts b/resources/js/Stores/main.ts index 767fac9..04f0a8a 100644 --- a/resources/js/Stores/main.ts +++ b/resources/js/Stores/main.ts @@ -39,6 +39,7 @@ export const MainService = defineStore('main', { authors: [] as Array<Person>, // persons: [] as Array<Person>, datasets: [], + files:[], dataset: {} as Dataset, }), @@ -108,5 +109,19 @@ export const MainService = defineStore('main', { alert(error.message); }); }, + + // fetchfiles(id) { + // // sampleDataKey= authors or datasets + // axios + // .get(`api/files/${id}`) + // .then((r) => { + // if (r.data) { + // this[sampleDataKey] = r.data; + // } + // }) + // .catch((error) => { + // alert(error.message); + // }); + // }, }, }); diff --git a/start/routes.ts b/start/routes.ts index ac3bb86..b1c000b 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -172,6 +172,12 @@ Route.group(() => { .as('dataset.edit') .where('id', Route.matchers.number()) .middleware(['auth', 'can:dataset-submit']); + + Route.put('/dataset/:id/update', 'DatasetController.update') + .as('dataset.update') + .where('id', Route.matchers.number()) + .middleware(['auth', 'can:dataset-submit']); + Route.get('/dataset/:id/delete', 'DatasetController.delete').as('dataset.delete').middleware(['auth', 'can:dataset-delete']); Route.put('/dataset/:id/deleteupdate', 'DatasetController.deleteUpdate') .as('dataset.deleteUpdate') diff --git a/start/routes/api.ts b/start/routes/api.ts index fbcf59e..0622bff 100644 --- a/start/routes/api.ts +++ b/start/routes/api.ts @@ -16,6 +16,8 @@ Route.group(() => { Route.get('/dataset/:publish_id', 'DatasetController.findOne').as('dataset.findOne'); Route.get('/sitelinks/:year', 'HomeController.findDocumentsPerYear'); Route.get('/years', 'HomeController.findYears'); + + Route.get('/download/:id', 'FileController.findOne').as('file.findOne'); }); // .middleware("auth:api"); }) diff --git a/webpack.config.js b/webpack.config.js index f9d63db..463a42d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,6 +1,17 @@ const { join, resolve, dirname } = require('path'); const Encore = require('@symfony/webpack-encore'); const { VueLoaderPlugin } = require('vue-loader'); +const dotenv = require('dotenv-webpack'); + +// Load the environment variables from the.env file +Encore.addPlugin( + new dotenv({ + path: ".env", + defaults: ".env", + systemvars: true, + allowEmptyValues: true, + }) + ) const babelLoader = { // test: /\.js$/,