diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index 99f9a31..0484ac7 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -33,6 +33,8 @@ 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) { @@ -342,9 +344,9 @@ export default class DatasetController { // Create a new instance of the Dataset model: const dataset = new Dataset(); dataset.type = request.input('type'); - dataset.creatingCorporation = request.input('creating_corporation'); + dataset.creating_corporation = request.input('creating_corporation'); dataset.language = request.input('language'); - dataset.embargoDate = request.input('embargo_date'); + dataset.embargo_date = request.input('embargo_date'); //await dataset.related('user').associate(user); // speichert schon ab // Dataset.$getRelation('user').boot(); // Dataset.$getRelation('user').setRelated(dataset, user); @@ -577,6 +579,23 @@ export default class DatasetController { 'files.extnames': 'file extension is not supported', }; + private async getDatasetXmlDomNode(dataset: Dataset) { + // dataset.fetchValues(); + const xmlModel = new XmlModel(dataset); + // xmlModel.setModel(dataset); + xmlModel.excludeEmptyFields(); + xmlModel.caching = true; + // const cache = dataset.xmlCache ? dataset.xmlCache : null; + // dataset.load('xmlCache'); + if (dataset.xmlCache) { + xmlModel.xmlCache = dataset.xmlCache; + } + + // return cache.getDomDocument(); + const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); + return domDocument; + } + // public async release({ params, view }) { public async release({ request, inertia, response }: HttpContextContract) { const id = request.param('id'); diff --git a/app/Library/Field.ts b/app/Library/Field.ts new file mode 100644 index 0000000..b0c1d10 --- /dev/null +++ b/app/Library/Field.ts @@ -0,0 +1,69 @@ +export default class Field { + // private _multiplicity: number | string = 1; + private _hasMultipleValues: boolean = false; + private _valueModelClass: string | null = null; + private _linkModelClass: string | null = null; + // private _owningModelClass: string | null = null; + private _value: any; + private _name: string; + + constructor(name: string) { + this._name = name; + this._value = null; + } + + getValueModelClass(): any { + return this._valueModelClass; + } + + setValueModelClass(classname: any): Field { + this._valueModelClass = classname; + return this; + } + + getName(): string { + return this._name; + } + + // setOwningModelClass(classname: string): Field { + // this._owningModelClass = classname; + // return this; + // } + + public setValue(value: string | string[] | number | boolean): Field { + if (value === null || value === this._value) { + return this; + } + + if (Array.isArray(value) && value.length === 0) { + value = []; + } else if (typeof value === 'boolean') { + value = value ? 1 : 0; + } else { + this._value = value; + } + return this; + } + public getValue() { + return this._value; + } + + hasMultipleValues(): boolean { + return this._hasMultipleValues; + } + + setMultiplicity(max: number | '*'): Field { + if (max !== '*') { + if (typeof max !== 'number' || max < 1) { + throw new Error('Only integer values > 1 or "*" allowed.'); + } + } + // this._multiplicity = max; + this._hasMultipleValues = (typeof max == 'number' && max > 1) || max === '*'; + return this; + } + + getLinkModelClass(): string | null { + return this._linkModelClass; + } +} diff --git a/app/Library/Strategy.ts b/app/Library/Strategy.ts new file mode 100644 index 0000000..e069b2d --- /dev/null +++ b/app/Library/Strategy.ts @@ -0,0 +1,177 @@ +import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; +import { create } from 'xmlbuilder2'; +import Dataset from 'App/Models/Dataset'; +import Field from './Field'; +import BaseModel from 'App/Models/BaseModel'; +import { DateTime } from 'luxon'; + +export default class Strategy { + private version: number; + private config; + private xml: XMLBuilder; + + constructor(config) { + this.version = 1.0; + this.config = config; + } + public async createDomDocument(): Promise { + if (this.config.model === null) { + throw new Error('No Model given for serialization.'); + } + // domDocument = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, ''); + + this.xml = create({ version: '1.0', encoding: 'UTF-8' }, ''); + this.xml.root().att('version', this.version.toString()); + // this.xml.root().att('version', this.getVersion()); + this.xml.root().att('xmlns:xlink', 'http://www.w3.org/1999/xlink'); + + await this._mapModel(this.config.model); + return this.xml; //.end({ prettyPrint: true }); + } + + private async _mapModel(model: Dataset) { + const fields: Array = await model.describe(); + const excludeFields = this.getConfig().excludeFields; + let fieldsDiff; + + if (excludeFields.length > 0) { + fieldsDiff = fields.filter((fieldname) => !excludeFields.includes(fieldname)); + } else { + fieldsDiff = fields; + } + + const modelNode: XMLBuilder = this.createModelNode(model); + // rootNode.appendChild(childNode); + + for (const fieldname of fieldsDiff) { + const field = model.getField(fieldname); + this.mapField(field, modelNode); + } + } + + private mapField(field, modelNode: XMLBuilder) { + const modelClass = field.getValueModelClass(); + let fieldValues = field.getValue(); + + if (this.config.excludeEmpty) { + if ( + fieldValues === null || + (typeof fieldValues === 'string' && fieldValues.trim() === '') || + (Array.isArray(fieldValues) && fieldValues.length === 0) + ) { + return; + } + } + + if (modelClass === null) { + this.mapSimpleField(modelNode, field); + } else { + // map related models with values: + // let modelInstance = new modelClass(); + const fieldName = field.getName(); + + if (!Array.isArray(fieldValues)) { + fieldValues = [fieldValues]; + } + + for (const value of fieldValues) { + const childNode = modelNode.ele(fieldName); + // rootNode.appendChild(childNode); + // if a field has no value then there is nothing more to do + // TODO maybe there must be another solution + if (value === null) { + continue; + } + if (modelClass.prototype instanceof BaseModel) { + this.mapModelAttributes(value, childNode); + } else if (modelClass instanceof DateTime) { + // console.log('Value is a luxon date'); + this.mapDateAttributes(value, childNode); + } else if (Array.isArray(value)) { + console.log('Value is an array'); + // this.mapArrayAttributes(value, childNode); + } + } + } + } + + private mapDateAttributes(model: DateTime, childNode: XMLBuilder) { + childNode.att('Year', model.year.toString()); + childNode.att('Month', model.month.toString()); + childNode.att('Day', model.day.toString()); + childNode.att('Hour', model.hour.toString()); + childNode.att('Minute', model.minute.toString()); + childNode.att('Second', model.second.toString()); + childNode.att('UnixTimestamp', model.toUnixInteger().toString()); + let zoneName = model.zoneName ? model.zoneName : ''; + childNode.att('Timezone', zoneName); + } + + private mapModelAttributes(myObject, childNode: XMLBuilder) { + Object.keys(myObject).forEach((prop) => { + let value = myObject[prop]; + console.log(`${prop}: ${value}`); + if (value != null) { + if (value instanceof DateTime) { + value = value.toFormat('yyyy-MM-dd HH:mm:ss').trim(); + } else { + value = value.toString().trim(); + } + + // Replace invalid XML-1.0-Characters by UTF-8 replacement character. + let fieldValues = value.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '\xEF\xBF\xBD '); + + // Create an attribute with the field name and field values + // const attr = { [fieldName]: fieldValues }; + + // Add the attribute to the root element + childNode.att(prop, fieldValues); + } + }); + } + + private mapSimpleField(modelNode: XMLBuilder, field: Field) { + const fieldName = field.getName(); + let fieldValues = this.getFieldValues(field); + + if (fieldValues != null) { + // Replace invalid XML-1.0-Characters by UTF-8 replacement character. + fieldValues = fieldValues.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '\xEF\xBF\xBD '); + + // Create an attribute with the field name and field values + // const attr = { [fieldName]: fieldValues }; + + // Add the attribute to the root element + modelNode.att(fieldName, fieldValues); + } + } + + private getFieldValues(field: any): string { + let fieldValues: number | string | Array = field.getValue(); //275 + + // workaround for simple fields with multiple values + if (field.hasMultipleValues() === true && Array.isArray(fieldValues)) { + fieldValues = fieldValues.join(','); + } + // Uncomment if needed + // if (fieldValues instanceof DateTimeZone) { + // fieldValues = fieldValues.getName(); + // } + + return fieldValues?.toString().trim(); + } + + private createModelNode(model) { + const className = 'Rdr_' + model.constructor.name.split('\\').pop(); //Rdr_Dataset + // return dom.createElement(className); + return this.xml.root().ele(className); + } + + // private getVersion() { + // return Math.floor(this.version); + // } + + private getConfig() { + return this.config; + } +} diff --git a/app/Library/XmlModel.ts b/app/Library/XmlModel.ts new file mode 100644 index 0000000..54feb2d --- /dev/null +++ b/app/Library/XmlModel.ts @@ -0,0 +1,117 @@ +import DocumentXmlCache from 'App/Models/DocumentXmlCache'; +import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; +import Dataset from 'App/Models/Dataset'; +import Strategy from './Strategy'; +import { DateTime } from 'luxon'; + +/** + * This is the description of the interface + * + * @interface Conf + * @member {Model} model holds the current dataset model + * @member {XMLBuilder} dom holds the current DOM representation + * @member {Array} excludeFields List of fields to skip on serialization. + * @member {boolean} excludeEmpty True, if empty fields get excluded from serialization. + * @member {string} baseUri Base URI for xlink:ref elements + */ +export interface Conf { + model: Dataset; + dom?: XMLBuilder; + excludeFields: Array; + excludeEmpty: boolean; + baseUri: string; +} + +export default class XmlModel { + private config: Conf; + // private strategy = null; + private cache: DocumentXmlCache | null = null; + private _caching = false; + private strategy: Strategy; + + constructor(dataset: Dataset) { + // $this->strategy = new Strategy();// Opus_Model_Xml_Version1; + // $this->config = new Conf(); + // $this->strategy->setup($this->config); + + this.config = { + excludeEmpty: false, + baseUri: '', + excludeFields: [], + model: dataset, + }; + + this.strategy = new Strategy({ + excludeEmpty: true, + baseUri: '', + excludeFields: [], + model: dataset, + }); + } + + set model(model: Dataset) { + this.config.model = model; + } + + public excludeEmptyFields(): void { + this.config.excludeEmpty = true; + } + + get xmlCache(): DocumentXmlCache | null { + return this.cache; + } + + set xmlCache(cache: DocumentXmlCache) { + this.cache = cache; + } + + get caching(): boolean { + return this._caching; + } + set caching(caching: boolean) { + this._caching = caching; + } + + public async getDomDocument(): Promise { + const dataset = this.config.model; + + let domDocument: XMLBuilder | null = await this.getDomDocumentFromXmlCache(); + if (domDocument == null) { + domDocument = await this.strategy.createDomDocument(); + // domDocument = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, ''); + if (this._caching) { + // caching is desired: + this.cache = this.cache || new DocumentXmlCache(); + this.cache.document_id = dataset.id; + this.cache.xml_version = 1; // (int)$this->strategy->getVersion(); + // this.cache.server_date_modified = dataset.server_date_modified.toFormat("yyyy-MM-dd HH:mm:ss"); + this.cache.xml_data = domDocument.end(); + await this.cache.save(); + } + } + return domDocument; + } + + private async getDomDocumentFromXmlCache(): Promise { + const dataset: Dataset = this.config.model; + if (!this.cache) { + return null; + } + //.toFormat('YYYY-MM-DD HH:mm:ss'); + let date: DateTime = dataset.server_date_modified; + const actuallyCached: boolean = await DocumentXmlCache.hasValidEntry(dataset.id, date); + if (!actuallyCached) { + return null; + } + //cache is actual return it for oai: + try { + if (this.cache) { + return this.cache.getDomDocument(); + } else { + return null; + } + } catch (error) { + return null; + } + } +} diff --git a/app/Models/BaseModel.ts b/app/Models/BaseModel.ts index 9c67d28..5954db6 100644 --- a/app/Models/BaseModel.ts +++ b/app/Models/BaseModel.ts @@ -13,6 +13,7 @@ import { BaseModel as LucidBaseModel } from '@ioc:Adonis/Lucid/Orm'; // } // } + /** * Helper to find if value is a valid Object or * not @@ -21,7 +22,7 @@ export function isObject(value: any): boolean { return value !== null && typeof value === 'object' && !Array.isArray(value); } -export default class BaseModel extends LucidBaseModel { +export default class BaseModel extends LucidBaseModel { /** * When `fill` method is called, then we may have a situation where it * removed the values which exists in `original` and hence the dirty @@ -116,4 +117,12 @@ export default class BaseModel extends LucidBaseModel { return this; } + } + +// export class DatasetRelatedBaseModel extends LucidBaseModel { +// public dataset: BelongsTo; +// } +// export interface DatasetRelatedBaseModel { +// dataset: BelongsTo; +// } diff --git a/app/Models/Collection.ts b/app/Models/Collection.ts index a9b871f..f15b74a 100644 --- a/app/Models/Collection.ts +++ b/app/Models/Collection.ts @@ -1,5 +1,6 @@ -import { column, BaseModel, SnakeCaseNamingStrategy, manyToMany, ManyToMany } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy, manyToMany, ManyToMany } from '@ioc:Adonis/Lucid/Orm'; import Dataset from './Dataset'; +import BaseModel from './BaseModel'; export default class Collection extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/Coverage.ts b/app/Models/Coverage.ts index 6baa2d7..9644ec8 100644 --- a/app/Models/Coverage.ts +++ b/app/Models/Coverage.ts @@ -1,6 +1,7 @@ -import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; import { DateTime } from 'luxon'; import Dataset from './Dataset'; +import BaseModel from './BaseModel'; export default class Coverage extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/Dataset.ts b/app/Models/Dataset.ts index 1e94850..85f7e7c 100644 --- a/app/Models/Dataset.ts +++ b/app/Models/Dataset.ts @@ -1,6 +1,5 @@ import { column, - BaseModel, SnakeCaseNamingStrategy, manyToMany, ManyToMany, @@ -26,8 +25,10 @@ import DatasetReference from './DatasetReference'; import Collection from './Collection'; import DatasetIdentifier from './DatasetIdentifier'; import Project from './Project'; +import DocumentXmlCache from './DocumentXmlCache'; +import DatasetExtension from 'App/Models/Traits/DatasetExtension'; // Adjust the import path -export default class Dataset extends BaseModel { +export default class Dataset extends DatasetExtension { public static namingStrategy = new SnakeCaseNamingStrategy(); public static primaryKey = 'id'; public static table = 'documents'; @@ -40,13 +41,13 @@ export default class Dataset extends BaseModel { public server_state: string; @column({}) - public publisherName: string; + public publisher_name: string; @column({ columnName: 'creating_corporation' }) - public creatingCorporation: string; + public creating_corporation: string; @column.dateTime({ columnName: 'embargo_date' }) - public embargoDate: DateTime; + public embargo_date: DateTime; @column({}) public type: string; @@ -82,7 +83,7 @@ export default class Dataset extends BaseModel { public reject_reviewer_note: string | null; @column.dateTime({ columnName: 'server_date_published' }) - public serverDatePublished: DateTime; + public server_date_published: DateTime; // @column.dateTime({ autoCreate: true, columnName: 'created_at' }) @column.dateTime({ @@ -92,10 +93,10 @@ export default class Dataset extends BaseModel { autoCreate: true, columnName: 'created_at', }) - public createdAt: DateTime; + public created_at: DateTime; @column.dateTime({ autoCreate: true, autoUpdate: true, columnName: 'server_date_modified' }) - public updatedAt: DateTime; + public server_date_modified: DateTime; @manyToMany(() => Person, { pivotForeignKey: 'document_id', @@ -208,4 +209,9 @@ export default class Dataset extends BaseModel { }, }) public contributors: ManyToMany; + + @hasOne(() => DocumentXmlCache, { + foreignKey: 'document_id', + }) + public xmlCache: HasOne; } diff --git a/app/Models/DatasetIdentifier.ts b/app/Models/DatasetIdentifier.ts index 5654f08..cd4b2d1 100644 --- a/app/Models/DatasetIdentifier.ts +++ b/app/Models/DatasetIdentifier.ts @@ -1,6 +1,7 @@ -import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; import { DateTime } from 'luxon'; import Dataset from './Dataset'; +import BaseModel from './BaseModel'; export default class DatasetIdentifier extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/DatasetReference.ts b/app/Models/DatasetReference.ts index ee51d4b..f4e1c3f 100644 --- a/app/Models/DatasetReference.ts +++ b/app/Models/DatasetReference.ts @@ -1,6 +1,7 @@ -import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; import { DateTime } from 'luxon'; import Dataset from './Dataset'; +import BaseModel from './BaseModel'; export default class DatasetReference extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/DocumentXmlCache.ts b/app/Models/DocumentXmlCache.ts new file mode 100644 index 0000000..4f20770 --- /dev/null +++ b/app/Models/DocumentXmlCache.ts @@ -0,0 +1,98 @@ +import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; +import Dataset from './Dataset'; +import { builder, create } from 'xmlbuilder2'; +import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; +import Database from '@ioc:Adonis/Lucid/Database'; +import dayjs from 'dayjs'; +import { DateTime } from 'luxon'; + +export default class DocumentXmlCache extends BaseModel { + public static namingStrategy = new SnakeCaseNamingStrategy(); + public static table = 'document_xml_cache'; + // public static fillable: string[] = ['value', 'label', 'type', 'relation']; + // public static primaryKey = false; + static primaryKey = ''; // Set primaryKey to null to indicate there is no primary key + + @column({ + isPrimary: true, + }) + public document_id: number; + + @column({}) + public xml_version: number; + + @column() + public server_date_modified?: string; + + // @column.dateTime({ + // autoCreate: true, + // autoUpdate: true, + // }) + // public updated_at?: DateTime; + + @column({}) + public xml_data: string; + + @belongsTo(() => Dataset, { + foreignKey: 'document_id', + }) + public dataset: BelongsTo; + + /** + * Get dom document of 'xml_data' string + * + * @returns {XMLBuilder} + */ + public getDomDocument(): XMLBuilder { + // const dom = xmlbuilder.create({ version: "1.0", encoding: "UTF-8", standalone: true }); + let dom: XMLBuilder = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, this.xml_data); + // return dom.first(); + + const rdrDataset = dom.find( + (n) => { + const test = n.node.nodeName == 'Rdr_Dataset'; + return test; + }, + false, + true, + )?.node; + + if (rdrDataset == undefined) { + return dom.first(); + } else { + dom = builder({ version: '1.0', encoding: 'UTF-8', standalone: true }, rdrDataset); + return dom; + } + } + + /** + * Check if a dataset in a specific xml version is already cached or not. + * + * @param mixed datasetId + * @param mixed serverDateModified + * @returns {Promise} Returns true on cached hit else false. + */ + // public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise { + // // const formattedDate = dayjs(datasetServerDateModified).format('YYYY-MM-DD HH:mm:ss'); + + // const query = Database.from(this.table) + // .where('document_id', datasetId) + // .where('server_date_modified', '2023-08-17 16:51:03') + // .first(); + + // const row = await query; + // return !!row; + // } + + // Assuming 'DocumentXmlCache' has a table with a 'server_date_modified' column in your database + public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise { + const serverDateModifiedString: string = datasetServerDateModified.toFormat('yyyy-MM-dd HH:mm:ss'); // Convert DateTime to ISO string + const query = Database.from(this.table) + .where('document_id', datasetId) + .where('server_date_modified', '>=', serverDateModifiedString) // Check if server_date_modified is newer or equal + .first(); + + const row = await query; + return !!row; + } +} diff --git a/app/Models/File.ts b/app/Models/File.ts index 4655520..45104c2 100644 --- a/app/Models/File.ts +++ b/app/Models/File.ts @@ -1,7 +1,6 @@ import { DateTime } from 'luxon'; import { column, - BaseModel, hasMany, HasMany, belongsTo, @@ -12,6 +11,7 @@ import { } from '@ioc:Adonis/Lucid/Orm'; import HashValue from './HashValue'; import Dataset from './Dataset'; +import BaseModel from './BaseModel'; export default class File extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/Language.ts b/app/Models/Language.ts index aba157a..456442d 100644 --- a/app/Models/Language.ts +++ b/app/Models/Language.ts @@ -1,4 +1,5 @@ -import { column, BaseModel, SnakeCaseNamingStrategy } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy } from '@ioc:Adonis/Lucid/Orm'; +import BaseModel from './BaseModel'; // import { DateTime } from 'luxon'; export default class Language extends BaseModel { diff --git a/app/Models/License.ts b/app/Models/License.ts index 9de47c2..8bcb38e 100644 --- a/app/Models/License.ts +++ b/app/Models/License.ts @@ -1,4 +1,5 @@ -import { column, BaseModel, SnakeCaseNamingStrategy } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy } from '@ioc:Adonis/Lucid/Orm'; +import BaseModel from './BaseModel'; export default class License extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/Permission.ts b/app/Models/Permission.ts index 4a44178..7b84855 100644 --- a/app/Models/Permission.ts +++ b/app/Models/Permission.ts @@ -1,7 +1,8 @@ -import { column, BaseModel, manyToMany, ManyToMany, SnakeCaseNamingStrategy, beforeUpdate, beforeCreate } from '@ioc:Adonis/Lucid/Orm'; +import { column, manyToMany, ManyToMany, SnakeCaseNamingStrategy, beforeUpdate, beforeCreate } from '@ioc:Adonis/Lucid/Orm'; import { DateTime } from 'luxon'; import dayjs from 'dayjs'; import Role from 'App/Models/Role'; +import BaseModel from './BaseModel'; export default class Permission extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/Project.ts b/app/Models/Project.ts index b06a574..482dc24 100644 --- a/app/Models/Project.ts +++ b/app/Models/Project.ts @@ -1,5 +1,6 @@ -import { column, BaseModel, SnakeCaseNamingStrategy } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy } from '@ioc:Adonis/Lucid/Orm'; import { DateTime } from 'luxon'; +import BaseModel from './BaseModel'; export default class Project extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); diff --git a/app/Models/Role.ts b/app/Models/Role.ts index a761d70..b9251b6 100644 --- a/app/Models/Role.ts +++ b/app/Models/Role.ts @@ -1,5 +1,5 @@ -import { column, BaseModel, SnakeCaseNamingStrategy, manyToMany, ManyToMany, beforeCreate, beforeUpdate } from '@ioc:Adonis/Lucid/Orm'; - +import { column, SnakeCaseNamingStrategy, manyToMany, ManyToMany, beforeCreate, beforeUpdate } from '@ioc:Adonis/Lucid/Orm'; +import BaseModel from './BaseModel'; import { DateTime } from 'luxon'; // import moment from 'moment'; import dayjs from 'dayjs'; diff --git a/app/Models/Subject.ts b/app/Models/Subject.ts index 58e394a..e3cec00 100644 --- a/app/Models/Subject.ts +++ b/app/Models/Subject.ts @@ -1,4 +1,5 @@ -import { column, BaseModel, SnakeCaseNamingStrategy, manyToMany, ManyToMany, beforeCreate, beforeUpdate } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy, manyToMany, ManyToMany, beforeCreate, beforeUpdate } from '@ioc:Adonis/Lucid/Orm'; +import BaseModel from './BaseModel'; import { DateTime } from 'luxon'; import dayjs from 'dayjs'; diff --git a/app/Models/Title.ts b/app/Models/Title.ts index cb68302..2eaa2d6 100644 --- a/app/Models/Title.ts +++ b/app/Models/Title.ts @@ -1,6 +1,7 @@ import { column, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; import Dataset from './Dataset'; import BaseModel from './BaseModel'; +// import { DatasetRelatedBaseModel } from './BaseModel'; export default class Title extends BaseModel { public static primaryKey = 'id'; diff --git a/app/Models/Traits/DatasetExtension.ts b/app/Models/Traits/DatasetExtension.ts new file mode 100644 index 0000000..926f14c --- /dev/null +++ b/app/Models/Traits/DatasetExtension.ts @@ -0,0 +1,329 @@ +import Title from 'App/Models/Title'; +import Description from 'App/Models/Description'; +import License from 'App/Models/License'; +import Person from 'App/Models/Person'; +import DatasetReference from 'App/Models/DatasetReference'; +import DatasetIdentifier from 'App/Models/DatasetIdentifier'; +import Subject from 'App/Models/Subject'; +import File from 'App/Models/File'; +import Coverage from 'App/Models/Coverage'; +import Collection from 'App/Models/Collection'; +import { BaseModel as LucidBaseModel } from '@ioc:Adonis/Lucid/Orm'; +import Field from 'App/Library/Field'; +import { DateTime } from 'luxon'; + +// @StaticImplements() +// class LucidDatasetModel extends BaseModel{ +// @belongsTo(() => Dataset, { +// foreignKey: 'dataset_id', +// }) +// dataset: BelongsTo; +// } + +export type DatasetRelatedModel = + | typeof Title + | typeof Description + | typeof Coverage + | typeof DatasetIdentifier + | typeof DatasetReference + | typeof Description + | typeof DatasetIdentifier + | typeof File; + + +export default abstract class DatasetExtension extends LucidBaseModel { + public abstract id; + public externalFields: Record = this.getExternalFields(); + // which fields shoud#t be published + protected internalFields: Record = {}; + protected fields: Record = {}; + + private getExternalFields(): Record { + // External fields definition + return { + TitleMain: { + model: Title, + options: { type: ['Main'] }, + fetch: 'eager', + }, + TitleAdditional: { + model: Title, + options: { type: ['Alternative', 'Sub', 'Translated', 'Other'] }, + fetch: 'eager', + }, + TitleAbstract: { + model: Description, + options: { type: ['Abstract', 'Translated'] }, + fetch: 'eager', + }, + TitleAbstractAdditional: { + model: Description, + options: { type: ['Methods', 'Technical_info', 'Series_information', 'Other'] }, + fetch: 'eager', + }, + Licence: { + model: License, + through: 'link_documents_licences', + relation: 'licenses', + fetch: 'eager', + }, + PersonAuthor: { + model: Person, + through: 'link_documents_persons', + pivot: { role: 'author', sort_order: 'sort_order', allow_email_contact: 'allow_email_contact' }, + relation: 'persons', + fetch: 'eager', + }, + PersonContributor: { + model: Person, + through: 'link_documents_persons', + pivot: { + role: 'contributor', + contributor_type: 'contributor_type', + sort_order: 'sort_order', + allow_email_contact: 'allow_email_contact', + }, + relation: 'persons', + fetch: 'eager', + }, + Reference: { + model: DatasetReference, + relation: 'references', + fetch: 'eager', + }, + Identifier: { + model: DatasetIdentifier, + relation: 'identifier', + fetch: 'eager', + }, + Subject: { + model: Subject, + through: 'link_dataset_subjects', + relation: 'subjects', + fetch: 'eager', + }, + File: { + model: File, + relation: 'files', + fetch: 'eager', + }, + Coverage: { + model: Coverage, + relation: 'coverage', + fetch: 'eager', + }, + Collection: { + model: Collection, + through: 'link_documents_collections', + relation: 'collections', + fetch: 'eager', + // 'include': { 'model': CollectionRole, 'relation': 'collectionrole' } + }, + }; + } + + public initFields(): void { + // Initialize internal fields + let fields = new Array( + 'Id', + 'PublisherName', + 'PublishId', + 'ContributingCorporation', + 'CreatingCorporation', + 'Language', + 'PublishedDate', + // 'PublishedYear', + 'PublisherName', + // 'PublisherPlace', + 'PublicationState', + 'EmbargoDate', + 'CreatedAt', + 'ServerDateModified', + 'ServerDatePublished', + 'ServerDateDeleted', + 'ServerState', + 'Type', + 'BelongsToBibliography', + ); + fields.forEach((fieldname) => { + let field = new Field(fieldname); + this.addField(field); + }); + // Initialize external fields + const fieldNames = Object.keys(this.externalFields); + for (const fieldName of fieldNames) { + // const field = this.externalFields[fieldName]; + let field = new Field(fieldName); + field.setMultiplicity('*'); + this.addField(field); + } + + // // Initialize available date fields and set up date validator + // // if the particular field is present + let dateFields = new Array('EmbargoDate', 'CreatedAt', 'ServerDatePublished', 'ServerDateDeleted'); + dateFields.forEach((fieldname) => { + let dateField = this.getField(fieldname); + dateField instanceof Field && dateField.setValueModelClass(DateTime.now()); + }); + } + + public async describe(): Promise> { + let length: number = Object.keys(this.fields).length; + if (length == 0) { + await this.fetchValues(); + } + // Get an array of all field names in the 'fields' object + const allFields = Object.keys(this.fields); + // Get an array of all field names in the 'internalFields' array + const internalFields = Object.keys(this.internalFields); + // Use the `filter` method to find field names that are not in 'internalFields' + const filteredFields = allFields.filter((fieldName) => !internalFields.includes(fieldName)); + return filteredFields; + } + + private addField(field: Field): void { + // Add field + const fieldName = field.getName(); + if (fieldName && this.externalFields[fieldName]) { + const options = this.externalFields[fieldName]; + + // Set ValueModelClass if a model option is given + if (options.model) { + field.setValueModelClass(options.model); + } + } + + this.fields[field.getName()] = field; + // field.setOwningModelClass(this.constructor.name); + } + + public getField(name: string): Field | null { + // Get field + return this.fields[name] !== undefined ? this.fields[name] : null; + } + + public async fetchValues(): Promise { + this.initFields(); + await this.loadFieldValues(); + } + + private async loadFieldValues(): Promise { + for (const [fieldname, field] of Object.entries(this.fields)) { + // extern fields via model relation + if (this.externalFields.hasOwnProperty(fieldname)) { + await this.loadExternal(fieldname); + // dataset attributes itself + } else { + // Field is not external and gets handled by simply reading. to snake_case + const property_name = this.convertFieldnameToColumn(fieldname); //id + const fieldVal = this[property_name]; //276 + + // Explicitly set null if the field represents a model except for dates. + if (field.getValueModelClass() !== null) { + field.setValue(fieldVal === undefined || fieldVal === null ? null : fieldVal); + } else { + field.setValue(fieldVal); + } + } + } + } + + private async loadExternal(fieldname: string): Promise { + const field = this.fields[fieldname]; + + // let modelclass: typeof Title | typeof Description; + let modelclass: DatasetRelatedModel = field.getValueModelClass(); + let modelInstance = new modelclass(); + + // Create a query builder + const select = modelclass.query(); + + // If any declared constraints, add them to the query + if (this.externalFields[fieldname]?.options) { + const options: Array = this.externalFields[fieldname].options; + for (const [column, value] of Object.entries(options)) { + if (Array.isArray(value)) { + select.whereIn(column, value); + } else { + select.where(column, value); + } + } + } + + // Get dependent rows + const result: Record[] = []; + const datasetId = this.id; + let rows: any[] = []; + + if (this.externalFields[fieldname]?.through) { + const relation = this.externalFields[fieldname].relation; + // rows = this[relation]; + rows = await this.related(relation).query(); + + if (this.externalFields[fieldname].pivot) { + const pivotArray = this.externalFields[fieldname].pivot; + const pivotValue = pivotArray.role; + // rows = this[relation]().wherePivot('role', pivotValue).get(); + rows = await this.related(relation).query().wherePivot('role', pivotValue); + } + } else if (modelInstance.hasOwnProperty('dataset')) { + rows = await select + .whereHas('dataset', (q) => { + q.where('id', datasetId); + }) + .orderBy('id') + .select(); + } + + // 1 ..n relations + for (const row of rows) { + const attributes = Object.keys(row.$attributes); + + if (this.externalFields[fieldname]?.pivot) { + const pivotArray = this.externalFields[fieldname].pivot; + const arrayKeys = Object.keys(pivotArray); + const extendedArrayKeys = arrayKeys.map((pivotAttribute) => { + return `pivot_${pivotAttribute}`; + }); + attributes.push(...extendedArrayKeys); + } + + const objArray: Record = {}; + + for (const property_name of attributes) { + let fieldName = this.convertColumnToFieldname(property_name); + let fieldval = ''; + + if (property_name.startsWith('pivot_')) { + const str = property_name.replace('pivot_', ''); + fieldName = this.convertColumnToFieldname(str); + // fieldval = row.$pivot[str]; + fieldval = row.$extras[property_name]; + } else if (fieldName === 'Type') { + fieldval = row[property_name]?.charAt(0).toUpperCase() + row[property_name]?.slice(1); + } else { + fieldval = row[property_name]; + } + + objArray[fieldName] = fieldval; + } + + result.push(objArray); + } + + // Set the field value + field.setValue(result); + } + + // to snakeCase + private convertFieldnameToColumn(fieldname: string): string { + return fieldname.replace(/([a-z\d])([A-Z])/g, '$1_$2').toLowerCase(); + } + + private convertColumnToFieldname(columnName: string): string { + return columnName + .split(/[-_]/) + .map((word) => (word.charAt(0).toUpperCase() + word.slice(1))) + .join(''); + } +} diff --git a/app/Models/User.ts b/app/Models/User.ts index aa418b8..02f249b 100644 --- a/app/Models/User.ts +++ b/app/Models/User.ts @@ -1,10 +1,11 @@ import { DateTime } from 'luxon'; -import { BaseModel, column, beforeSave, manyToMany, ManyToMany, hasMany, HasMany } from '@ioc:Adonis/Lucid/Orm'; +import { column, beforeSave, manyToMany, ManyToMany, hasMany, HasMany } from '@ioc:Adonis/Lucid/Orm'; import Hash from '@ioc:Adonis/Core/Hash'; import Role from './Role'; import Database from '@ioc:Adonis/Lucid/Database'; import Config from '@ioc:Adonis/Core/Config'; import Dataset from './Dataset'; +import BaseModel from './BaseModel'; // export default interface IUser { // id: number; diff --git a/config/database.ts b/config/database.ts index 4e0828a..0952a45 100644 --- a/config/database.ts +++ b/config/database.ts @@ -48,6 +48,8 @@ const databaseConfig: DatabaseConfig = { }, healthCheck: false, debug: false, + pool: { min: 1, max: 100 }, + }, }, }; diff --git a/package-lock.json b/package-lock.json index afa173e..701fe34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -462,9 +462,9 @@ } }, "node_modules/@adonisjs/lucid": { - "version": "18.4.0", - "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-18.4.0.tgz", - "integrity": "sha512-pSBhKFzqr6mWoeIiGdcW2OQIWAyCoLn+G7VmXXLqxHvGm+9SaioKJaSMmaJa0xgS5v64r/MVLeH/nw87Q4KpyQ==", + "version": "18.4.2", + "resolved": "https://registry.npmjs.org/@adonisjs/lucid/-/lucid-18.4.2.tgz", + "integrity": "sha512-4k8GOat/YQtobNqwBIU8VAuY19p+V3ucBRoZ+iwxd/qy/KE1XupPzuMZVWYt1vyBboCrBmEYYmvC851tNqoP0A==", "dependencies": { "@faker-js/faker": "^8.0.1", "@poppinss/hooks": "^5.0.3", @@ -480,6 +480,9 @@ "slash": "^3.0.0", "tarn": "^3.0.2" }, + "engines": { + "node": ">=14.15.4" + }, "peerDependencies": { "@adonisjs/core": "^5.1.0" } @@ -775,31 +778,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -823,12 +826,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -961,22 +964,22 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -995,12 +998,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", - "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -1019,16 +1022,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "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==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1059,14 +1062,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", - "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.17" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1076,13 +1079,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -1138,9 +1141,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1156,40 +1159,40 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", - "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", - "@babel/types": "^7.22.17" + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -1198,9 +1201,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1258,14 +1261,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.15.tgz", - "integrity": "sha512-kc0VvbbUyKelvzcKOSyQUSVVXS5pT3UhRB0e3c9An86MvLqs+gx0dN4asllrDluqSa3m9YyooXKGOFVomnyFkg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz", + "integrity": "sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==", "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.9", + "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/plugin-syntax-decorators": "^7.22.10" }, @@ -1634,9 +1637,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", - "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "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==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1721,9 +1724,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", - "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "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==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1909,12 +1912,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "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==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1925,12 +1928,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", - "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "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==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, @@ -1942,15 +1945,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", - "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "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==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-module-transforms": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -2090,9 +2093,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", - "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "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==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -2388,12 +2391,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.15.tgz", - "integrity": "sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", + "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", + "@babel/compat-data": "^7.22.20", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -2467,7 +2470,7 @@ "@babel/plugin-transform-unicode-regex": "^7.22.5", "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.15", + "@babel/types": "^7.22.19", "babel-plugin-polyfill-corejs2": "^0.4.5", "babel-plugin-polyfill-corejs3": "^0.8.3", "babel-plugin-polyfill-regenerator": "^0.5.2", @@ -2505,15 +2508,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz", - "integrity": "sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", + "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "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.22.15", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { @@ -2530,9 +2533,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", - "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -2556,19 +2559,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/generator": "^7.23.0", + "@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.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2577,13 +2580,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.15", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2674,9 +2677,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", + "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2712,9 +2715,9 @@ "dev": true }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2751,18 +2754,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@faker-js/faker": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz", - "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.1.0.tgz", + "integrity": "sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ==", "funding": [ { "type": "opencollective", @@ -3786,9 +3789,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", + "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", "dev": true, "dependencies": { "@types/connect": "*", @@ -3796,18 +3799,18 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.11.tgz", + "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-lOGyCnw+2JVPKU3wIV0srU0NyALwTBJlVSx5DfMQOFuuohA8y9S8orImpuIQikZ0uIQ8gehrRjxgQC1rLRi11w==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-92b6q7CSYBMVZDtMZh5PuKm3LjZwcU7s6H8e9sU20Z1tOrTuXN+Hz3VuP9E8axiQRaCoiEOMN1duqPCEIhamrQ==" }, "node_modules/@types/chai": { "version": "4.3.6", @@ -3860,9 +3863,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "version": "8.44.3", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.3.tgz", + "integrity": "sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==", "dev": true, "peer": true, "dependencies": { @@ -3871,9 +3874,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz", + "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==", "dev": true, "peer": true, "dependencies": { @@ -3882,16 +3885,16 @@ } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", + "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==", "dev": true, "peer": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -3901,9 +3904,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.36", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", - "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", + "version": "4.17.37", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", + "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", "dev": true, "dependencies": { "@types/node": "*", @@ -3921,9 +3924,9 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "version": "7946.0.11", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz", + "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==", "dev": true }, "node_modules/@types/glob": { @@ -3937,20 +3940,20 @@ } }, "node_modules/@types/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.0.tgz", - "integrity": "sha512-uH2smqTN4uGReAiKedIVzoLUAXIYLBTbSofhx3hbNqj74Ua6KqFsLYszduTrLCMEAEAozF73DbGi/SC1bzQq4g==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.1.tgz", + "integrity": "sha512-CdNmJMcSqX1BiP3iSsWt+VgixndRIDGzWyaGpBnW3i5heATSk5bJu2j3buutsoBQNjyryqxaNpr8M7fRsGL15w==" }, "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.12", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz", + "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==", "dev": true, "dependencies": { "@types/node": "*" @@ -3982,9 +3985,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/katex": { @@ -3994,18 +3997,18 @@ "dev": true }, "node_modules/@types/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-kfwgQf4eOxoe/tD9CaKQrBKHbc7VpyfJOG5sxsQtkH+ML9xYa8hUC3UMa0wU1pKfciJtO0pU9g9XbWhPo7iBCA==", + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.6.tgz", + "integrity": "sha512-HakGTK5LBBWegNWsAmTlG55zN1zszYec7aG47/z6SzT90bW2vqjmbqk3YKAbrtveO+G7fSTKTYqVbIwAFnTrbg==", "dev": true, "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/lodash": { - "version": "4.14.198", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", - "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==", + "version": "4.14.199", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.199.tgz", + "integrity": "sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==", "dev": true }, "node_modules/@types/lodash-es": { @@ -4040,9 +4043,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" }, "node_modules/@types/pino": { "version": "6.3.12", @@ -4074,9 +4077,9 @@ } }, "node_modules/@types/proxy-addr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.0.tgz", - "integrity": "sha512-JEm0kSrO3CjbFSLpYeYhCscS0vpW1mIWedhWuurJnYbMzY1vcm9fzJ6TL6SWq3m/m3g4KUV5JBT69mQSwUHZHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/proxy-addr/-/proxy-addr-2.0.1.tgz", + "integrity": "sha512-fLqXRu+ihH+/V7AB12siUu84uloauJ7SdBMrHARcHQN/yYIa0d9uQSYxSWnMRF0892N2/CJzPVYP3ltgtkkgsQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -4101,15 +4104,15 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", + "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -4117,18 +4120,18 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", + "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", "dev": true, "dependencies": { "@types/http-errors": "*", @@ -4137,27 +4140,27 @@ } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.34", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", + "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/source-map-support": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.7.tgz", - "integrity": "sha512-rJqBfLel8jPuL5MwXxMH2Cdb6D80Snu3YJxDE+VJAmtT04l7j3OA7h+FYXlYDys0WeBVH/MPbExj3B8NCaDw9g==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.8.tgz", + "integrity": "sha512-u5nwLcaENciDwebPwwZb2AM1LvdlgFQfqCKxWQxcgNsQhUQciGuUnJ2LjGFAkInY2APXQzIypiUSa9zB6Epddg==", "dev": true, "dependencies": { "source-map": "^0.6.0" } }, "node_modules/@types/superagent": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz", - "integrity": "sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.19.tgz", + "integrity": "sha512-McM1mlc7PBZpCaw0fw/36uFqo0YeA6m8JqoyE4OfqXsZCIg0hPP2xdE6FM7r6fdprDZHlJwDpydUj1R++93hCA==", "dev": true, "dependencies": { "@types/cookiejar": "*", @@ -4170,27 +4173,27 @@ "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.16", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.16.tgz", + "integrity": "sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -5441,9 +5444,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -5461,8 +5464,8 @@ ], "dependencies": { "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "fraction.js": "^4.2.0", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -5609,13 +5612,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", + "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "core-js-compat": "^3.32.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5865,9 +5868,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.21.11", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", + "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", "dev": true, "funding": [ { @@ -5884,10 +5887,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -6082,9 +6085,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001532", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", - "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", + "version": "1.0.30001539", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", + "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", "dev": true, "funding": [ { @@ -6698,9 +6701,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/cookie": { @@ -6752,9 +6755,9 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { "import-fresh": "^3.3.0", @@ -7021,13 +7024,13 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7304,9 +7307,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -7967,9 +7970,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.513", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", - "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==", + "version": "1.4.529", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", + "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", "dev": true }, "node_modules/emittery": { @@ -8118,15 +8121,15 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", + "@eslint/js": "8.50.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -8312,9 +8315,9 @@ "dev": true }, "node_modules/eslint/node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -9043,9 +9046,9 @@ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/flattie": { @@ -9057,9 +9060,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -9167,9 +9170,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", @@ -9990,9 +9993,9 @@ } }, "node_modules/http-status-codes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", - "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" }, "node_modules/human-signals": { "version": "2.1.0", @@ -10526,15 +10529,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -10756,9 +10759,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -10799,9 +10802,9 @@ } }, "node_modules/jest-util/node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.25", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.25.tgz", + "integrity": "sha512-gy7iPgwnzNvxgAEi2bXOHWCVOG6f7xsprVJH4MjlAWeBmJ7vh/Y1kwMtUrs64ztf24zVIRCpr3n/z6gm9QIkgg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -13170,9 +13173,9 @@ } }, "node_modules/postcss": { - "version": "8.4.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", - "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", "funding": [ { "type": "opencollective", @@ -13869,9 +13872,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -14199,9 +14202,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -14337,9 +14340,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -14396,6 +14399,12 @@ "node": ">=12" } }, + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -15962,9 +15971,9 @@ } }, "node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.20.0.tgz", + "integrity": "sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -16587,9 +16596,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -17413,9 +17422,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -17514,9 +17523,9 @@ } }, "node_modules/youch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.1.tgz", - "integrity": "sha512-Rg9ioi+AkKyje2Hk4qILSVvayaFW98KTsOJ4aIkjDf97LZX5WJVIHZmFLnM4ThcVofHo/fbbwtYajfBPHFOVtg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.2.tgz", + "integrity": "sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==", "dev": true, "dependencies": { "cookie": "^0.5.0", @@ -17525,9 +17534,9 @@ } }, "node_modules/youch-terminal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.2.tgz", - "integrity": "sha512-JfVAsD0r88+vWVz+Im6bMk+c7gErDp1lq6Z1Na5LAyPZTwhB3VgO6HUQsm83I217mRFSuwVwEpnvwkK/TDTNhQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.3.tgz", + "integrity": "sha512-/PE77ZwG072tXBvF47S9RL9/G80u86icZ5QwyjblyM67L4n/T5qQeM3Xrecbu8kkDDr/9T/PTj/X+6G/OSRQug==", "dev": true, "dependencies": { "kleur": "^4.1.5", diff --git a/resources/js/Pages/Submitter/Dataset/Create.vue b/resources/js/Pages/Submitter/Dataset/Create.vue index fe4ddfb..9048662 100644 --- a/resources/js/Pages/Submitter/Dataset/Create.vue +++ b/resources/js/Pages/Submitter/Dataset/Create.vue @@ -1039,7 +1039,7 @@ Removes a selected keyword Next -