diff --git a/addressbook/inc/class.addressbook_import_contacts_csv.inc.php b/addressbook/inc/class.addressbook_import_contacts_csv.inc.php index d670820bcf..20f417cd29 100644 --- a/addressbook/inc/class.addressbook_import_contacts_csv.inc.php +++ b/addressbook/inc/class.addressbook_import_contacts_csv.inc.php @@ -58,7 +58,6 @@ class addressbook_import_contacts_csv extends importexport_basic_import_csv { */ public function import( $_stream, importexport_definition $_definition ) { parent::import($_stream, $_definition); - if($_definition->plugin_options['empty_addressbook']) { $this->empty_addressbook($this->user, $this->ids); @@ -115,6 +114,45 @@ class addressbook_import_contacts_csv extends importexport_basic_import_csv { $contact_owner = $this->user; } $this->user = $contact_owner; + + // Special case fast lookup for simple condition "field exists" + // We find ALL matches first to save DB queries. This saves 1 query per row, at the cost of RAM + // Should be 10x faster for large (thousands of rows) files, may be slower for small (tens of rows) files + $this->cached_condition = []; + foreach($definition->plugin_options['conditions'] as $condition) + { + $contacts = array(); + $this->cached_condition[$condition['string']] = []; + switch($condition['type']) + { + // exists + case 'exists' : + $searchcondition = $condition['string'][0] == Api\Storage::CF_PREFIX ? [$condition['string']] : []; + + // if we use account_id for the condition, we need to set the owner for filtering, as this + // enables Api\Contacts\Storage to decide what backend is to be used + if($condition['string'] == 'account_id') + { + $searchcondition['owner'] = 0; + } + $field = $condition['string'][0] == Api\Storage::CF_PREFIX ? 'contact_value' : $condition['string']; + $contacts = $this->bocontacts->search( + //array( $condition['string'] => $record[$condition['string']],), + '', + ['contact_id', 'cat_id', $field], + '', '', '', false, 'AND', false, + $searchcondition + ); + foreach($contacts as $contact) + { + if(!isset($this->cached_condition[$condition['string']][$contact[$field]])) + { + $this->cached_condition[$condition['string']][$contact[$field]] = []; + } + $this->cached_condition[$condition['string']][$contact[$field]][] = $contact; + } + } + } } /** @@ -215,18 +253,9 @@ class addressbook_import_contacts_csv extends importexport_basic_import_csv { switch ( $condition['type'] ) { // exists case 'exists' : - if($record_array[$condition['string']]) { - $searchcondition = array( $condition['string'] => $record_array[$condition['string']]); - // if we use account_id for the condition, we need to set the owner for filtering, as this - // enables Api\Contacts\Storage to decide what backend is to be used - if ($condition['string']=='account_id') $searchcondition['owner']=0; - $contacts = $this->bocontacts->search( - //array( $condition['string'] => $record[$condition['string']],), - '', - $this->definition->plugin_options['update_cats'] == 'add' ? false : true, - '', '', '', false, 'AND', false, - $searchcondition - ); + if($record_array[$condition['string']] && $this->cached_condition[$condition['string']]) + { + $contacts = $this->cached_condition[$condition['string']][$record_array[$condition['string']]]; } if ( is_array( $contacts ) && count( array_keys( $contacts ) ) >= 1 ) { // apply action to all contacts matching this exists condition diff --git a/addressbook/js/app.ts b/addressbook/js/app.ts index 37f90add35..2bc193e0b2 100644 --- a/addressbook/js/app.ts +++ b/addressbook/js/app.ts @@ -21,18 +21,20 @@ import {fetchAll, nm_action, nm_compare_field} from "../../api/js/etemplate/et2_ import "./CRM"; import {egw} from "../../api/js/jsapi/egw_global"; import {LitElement} from "@lion/core"; -import {Et2SelectState} from "../../api/js/etemplate/Et2Select/Et2Select"; -import {Et2SelectCountry} from "../../api/js/etemplate/Et2Select/Et2SelectCountry"; +import {Et2SelectCountry} from "../../api/js/etemplate/Et2Select/Select/Et2SelectCountry"; + +import {Et2SelectState} from "../../api/js/etemplate/Et2Select/Select/Et2SelectState"; /** * Object to call app.addressbook.openCRMview with */ -export interface CrmParams { - contact_id: number|string; - crm_list?: "infolog"|"tracker"|"infolog-organisation"; // default: use preference - title?: string; // default: link-title of contact_id - icon?: string; // default: avatar for contact_id - index?: number; +export interface CrmParams +{ + contact_id : number | string; + crm_list? : "infolog" | "tracker" | "infolog-organisation"; // default: use preference + title? : string; // default: link-title of contact_id + icon? : string; // default: avatar for contact_id + index? : number; } /** diff --git a/admin/inc/class.admin_db_backup.inc.php b/admin/inc/class.admin_db_backup.inc.php index 0f1c74ee89..4295356128 100644 --- a/admin/inc/class.admin_db_backup.inc.php +++ b/admin/inc/class.admin_db_backup.inc.php @@ -3,36 +3,55 @@ * EGroupware - Admin - DB backup and restore * * @link http://www.egroupware.org - * @author Ralf Becker + * @author Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package admin - * @version $Id$ */ use EGroupware\Api; +use EGroupware\Stylite\Vfs\S3; class admin_db_backup { - var $public_functions = array( + /** + * @var true[] + */ + public $public_functions = array( 'index' => true, ); - var $db_backup; + /** + * @var Api\Db\Backup + */ + protected $db_backup; /** - * Method for sheduled backups, called via asynservice + * Method for scheduled backups, called via asynservice */ function do_backup() { - $this->db_backup = new Api\Db\Backup(); + if (class_exists(S3\Backup::class) && S3\Backup::available()) + { + $this->db_backup = new S3\Backup(); + } + else + { + $this->db_backup = new Api\Db\Backup(); + } - if (($f = $this->db_backup->fopen_backup())) - { + try { + $f = $this->db_backup->fopen_backup(); $this->db_backup->backup($f); - if(is_resource($f)) + if (is_resource($f)) + { fclose($f); + } /* Remove old backups. */ $this->db_backup->housekeeping(); } + catch (\Exception $e) { + // log error + _egw_log_exception($e); + } } /** @@ -50,4 +69,4 @@ class admin_db_backup unset($tpl_root, $self); echo $GLOBALS['egw']->framework->footer(); } -} +} \ No newline at end of file diff --git a/admin/templates/default/tokens.xet b/admin/templates/default/tokens.xet index 6fcf463fc5..12e4616a24 100644 --- a/admin/templates/default/tokens.xet +++ b/admin/templates/default/tokens.xet @@ -16,9 +16,9 @@ - - - + + + diff --git a/api/js/egw_action/egwDragActionImplementation.ts b/api/js/egw_action/egwDragActionImplementation.ts index 3b59173263..48a15ec9bc 100644 --- a/api/js/egw_action/egwDragActionImplementation.ts +++ b/api/js/egw_action/egwDragActionImplementation.ts @@ -44,12 +44,47 @@ export class EgwDragActionImplementation implements EgwActionImplementation { const pseudoNumRows = (_selected[0]?._context?._selectionMgr?._selectAll) ? _selected[0]._context?._selectionMgr?._total : _selected.length; - for (const egwActionObject of _selected) { - const row: Node = (egwActionObject.iface.getDOMNode()).cloneNode(true); - if (row) { - rows.push(row); - table.append(row); - } + // Clone nodes but use copy webComponent properties + const carefulClone = (node) => + { + // Don't clone text nodes, it causes duplication in et2-description + if(node.nodeType == node.TEXT_NODE) + { + return; + } + + let clone = node.cloneNode(); + + let widget_class = window.customElements.get(clone.localName); + let properties = widget_class ? widget_class.properties : []; + for(let key in properties) + { + clone[key] = node[key]; + } + // Children + node.childNodes.forEach(c => + { + const child = carefulClone(c) + if(child) + { + clone.appendChild(child); + } + }) + if(widget_class) + { + clone.requestUpdate(); + } + return clone; + } + + for(const egwActionObject of _selected) + { + const row : Node = carefulClone(egwActionObject.iface.getDOMNode()); + if(row) + { + rows.push(row); + table.append(row); + } index++; if (index == maxRows) { // Label to show number of items @@ -195,9 +230,33 @@ export class EgwDragActionImplementation implements EgwActionImplementation { event.dataTransfer.setData('application/json', JSON.stringify(data)) - event.dataTransfer.setDragImage(ai.helper, 12, 12); + // Wait for any webComponents to finish + let wait = []; + const webComponents = []; + const check = (element) => + { + if(typeof element.updateComplete !== "undefined") + { + webComponents.push(element) + element.requestUpdate(); + wait.push(element.updateComplete); + } + element.childNodes.forEach(child => check(child)); + } + check(ai.helper); + // Clumsily force widget update, since we can't do it async + Promise.all(wait).then(() => + { + wait = []; + webComponents.forEach(e => wait.push(e.updateComplete)); + Promise.all(wait).then(() => + { + event.dataTransfer.setDragImage(ai.helper, 12, 12); + debugger; + }); + }); - this.setAttribute('data-egwActionObjID', JSON.stringify(data.selected)); + this.setAttribute('data-egwActionObjID', JSON.stringify(data.selected)); }; const dragend = (_) => { diff --git a/api/js/etemplate/ActivateLinksDirective.ts b/api/js/etemplate/ActivateLinksDirective.ts index 810f2e1d42..b3f3870538 100644 --- a/api/js/etemplate/ActivateLinksDirective.ts +++ b/api/js/etemplate/ActivateLinksDirective.ts @@ -1,4 +1,6 @@ -import {Directive, directive, html, repeat} from "@lion/core"; +import {html} from "lit"; +import {Directive, directive} from "lit/directive.js"; +import {repeat} from "lit/directives/repeat.js"; import {et2_activateLinks} from "./et2_core_common"; /** diff --git a/api/js/etemplate/CustomHtmlElements/multi-video.ts b/api/js/etemplate/CustomHtmlElements/multi-video.ts index 8c49546116..bc17f58d03 100644 --- a/api/js/etemplate/CustomHtmlElements/multi-video.ts +++ b/api/js/etemplate/CustomHtmlElements/multi-video.ts @@ -121,6 +121,15 @@ class multi_video extends HTMLElement { } } + /** + * Calls load method for all its sub videos + * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/load + */ + load() + { + this._videos.forEach(_item =>{_item.node.load()}); + } + /** * init/update video tags * @param _value @@ -130,15 +139,24 @@ class multi_video extends HTMLElement { { let value = _value.split(','); let video = null; + let duration = 0; for (let i=0;i { - _item.duration = _item.node.duration; + _item.duration = _item.duration ? _item.duration : _item.node.duration; _item.previousDurations = _item.index > 0 ? this._videos[_item.index-1]['duration'] + this._videos[_item.index-1]['previousDurations'] : 0; }); this.duration = this.__duration(); diff --git a/api/js/etemplate/Et2Avatar/Et2Avatar.ts b/api/js/etemplate/Et2Avatar/Et2Avatar.ts index 81a959b6be..8912a1abd0 100644 --- a/api/js/etemplate/Et2Avatar/Et2Avatar.ts +++ b/api/js/etemplate/Et2Avatar/Et2Avatar.ts @@ -9,7 +9,7 @@ */ import {Et2Widget} from "../Et2Widget/Et2Widget"; -import {css, SlotMixin} from "@lion/core"; +import {css} from "lit"; import {SlAvatar} from "@shoelace-style/shoelace"; import {et2_IDetachedDOM} from "../et2_core_interfaces"; import {egw} from "../../jsapi/egw_global"; @@ -18,7 +18,7 @@ import {Et2Dialog} from "../Et2Dialog/Et2Dialog"; import "../../../../vendor/bower-asset/cropper/dist/cropper.min.js"; import {cropperStyles} from "./cropperStyles"; -export class Et2Avatar extends Et2Widget(SlotMixin(SlAvatar)) implements et2_IDetachedDOM +export class Et2Avatar extends Et2Widget(SlAvatar) implements et2_IDetachedDOM { private _contactId; private _delBtn: HTMLElement; @@ -91,6 +91,10 @@ export class Et2Avatar extends Et2Widget(SlotMixin(SlAvatar)) implements et2_IDe crop: {type: Boolean}, + /** + * Explicitly specify the avatar size. + * Better to set the --size CSS variable in app.css, since it allows inheritance and overriding + */ size: {type: String} } } @@ -103,7 +107,6 @@ export class Et2Avatar extends Et2Widget(SlotMixin(SlAvatar)) implements et2_IDe this.contactId = ""; this.editable = false; this.crop = false; - this.size = "2.7em"; this.icon = ""; this.shape = "rounded"; } @@ -246,10 +249,10 @@ export class Et2Avatar extends Et2Widget(SlotMixin(SlAvatar)) implements et2_IDe { let self = this; this._editBtn = document.createElement('et2-button-icon'); - this._editBtn.setAttribute('name', 'pencil'); + this._editBtn.setAttribute('image', 'pencil'); this._editBtn.setAttribute('part', 'edit'); this._delBtn = document.createElement('et2-button-icon'); - this._delBtn.setAttribute('name', 'trash'); + this._delBtn.setAttribute('image', 'delete'); this._delBtn.setAttribute('part', 'edit'); this._baseNode.append(this._editBtn); this._baseNode.append(this._delBtn); @@ -434,7 +437,8 @@ export class Et2Avatar extends Et2Widget(SlotMixin(SlAvatar)) implements et2_IDe } } } -customElements.define("et2-avatar", Et2Avatar as any); + +customElements.define("et2-avatar", Et2Avatar); // make et2_avatar publicly available as we need to call it from templates { window['et2_avatar'] = Et2Avatar; diff --git a/api/js/etemplate/Et2Avatar/Et2AvatarGroup.ts b/api/js/etemplate/Et2Avatar/Et2AvatarGroup.ts index 638c48914e..b1b6e36c63 100644 --- a/api/js/etemplate/Et2Avatar/Et2AvatarGroup.ts +++ b/api/js/etemplate/Et2Avatar/Et2AvatarGroup.ts @@ -1,5 +1,6 @@ import {Et2Widget} from "../Et2Widget/Et2Widget"; -import {css, html, LitElement, repeat} from "@lion/core"; +import {css, html, LitElement} from "lit"; +import {repeat} from "lit/directives/repeat.js"; import shoelace from "../Styles/shoelace"; /** diff --git a/api/js/etemplate/Et2Avatar/Et2LAvatar.ts b/api/js/etemplate/Et2Avatar/Et2LAvatar.ts index 2185e8b5bf..27c8e03b35 100644 --- a/api/js/etemplate/Et2Avatar/Et2LAvatar.ts +++ b/api/js/etemplate/Et2Avatar/Et2LAvatar.ts @@ -10,7 +10,7 @@ import {Et2Avatar} from "./Et2Avatar"; import shoelace from "../Styles/shoelace"; -import {css} from "@lion/core"; +import {css} from "lit"; export class Et2LAvatar extends Et2Avatar { @@ -126,4 +126,5 @@ export class Et2LAvatar extends Et2Avatar return {background: bg, initials: text}; } } -customElements.define("et2-lavatar", Et2LAvatar as any); \ No newline at end of file + +customElements.define("et2-lavatar", Et2LAvatar); \ No newline at end of file diff --git a/api/js/etemplate/Et2Avatar/cropperStyles.ts b/api/js/etemplate/Et2Avatar/cropperStyles.ts index db4ba7de36..05d96b2371 100644 --- a/api/js/etemplate/Et2Avatar/cropperStyles.ts +++ b/api/js/etemplate/Et2Avatar/cropperStyles.ts @@ -1,7 +1,7 @@ /** * Cropper styles constant */ -import {css} from "@lion/core"; +import {css} from "lit"; /*! * Cropper.js v1.5.12 diff --git a/api/js/etemplate/Et2Button/ButtonMixin.ts b/api/js/etemplate/Et2Button/ButtonMixin.ts index 922c91ca0e..718a4db941 100644 --- a/api/js/etemplate/Et2Button/ButtonMixin.ts +++ b/api/js/etemplate/Et2Button/ButtonMixin.ts @@ -9,9 +9,10 @@ */ -import {css, LitElement, PropertyValues} from "@lion/core"; +import {css, LitElement, PropertyValues} from "lit"; import '../Et2Image/Et2Image'; import shoelace from "../Styles/shoelace"; +import {egw_registerGlobalShortcut} from "../../egw_action/egw_keymanager"; type Constructor = new (...args : any[]) => T; export const ButtonMixin = (superclass : T) => class extends superclass @@ -49,6 +50,12 @@ export const ButtonMixin = (superclass : T) => class exte et2_button_delete: /delete(&|\]|$)/ // red }; + static readonly default_keys : object = { + //egw_shortcutIdx : id regex + _83_C: /save(&|\]|$)/, // CTRL+S + _27_: /cancel(&|\]|$)/, // Esc + }; + static get styles() { return [ @@ -323,6 +330,38 @@ export const ButtonMixin = (superclass : T) => class exte return ""; } + /** + * If button ID has a default keyboard shortcut (eg: Save: Ctrl+S), register with egw_keymanager + * + * @param {string} check_id + */ + _register_default_keyhandler(check_id : string) + { + if(!check_id) + { + return; + } + // @ts-ignore + for(const keyindex in this.constructor.default_keys) + { + // @ts-ignore + if(check_id.match(this.constructor.default_keys[keyindex])) + { + let [keycode, modifiers] = keyindex.substring(1).split("_"); + egw_registerGlobalShortcut( + parseInt(keycode), + modifiers.includes("S"), modifiers.includes("C"), modifiers.includes("A"), + () => + { + this.dispatchEvent(new MouseEvent("click")); + return true; + }, + this + ) + } + } + } + /** * Get a default class for the button based on ID * diff --git a/api/js/etemplate/Et2Button/Et2Button.ts b/api/js/etemplate/Et2Button/Et2Button.ts index 97c8dd77f0..ad4971a66a 100644 --- a/api/js/etemplate/Et2Button/Et2Button.ts +++ b/api/js/etemplate/Et2Button/Et2Button.ts @@ -13,7 +13,7 @@ import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import '../Et2Image/Et2Image'; import {SlButton} from "@shoelace-style/shoelace"; import {ButtonMixin} from "./ButtonMixin"; -import {PropertyValues} from "@lion/core"; +import {PropertyValues} from "lit"; export class Et2Button extends ButtonMixin(Et2InputWidget(SlButton)) @@ -22,7 +22,7 @@ export class Et2Button extends ButtonMixin(Et2InputWidget(SlButton)) { return { ...super.properties, - label: {type: String} + label: {type: String, noAccessor: true} } } @@ -30,6 +30,9 @@ export class Et2Button extends ButtonMixin(Et2InputWidget(SlButton)) { super.firstUpdated(_changedProperties); + // Register default keyboard shortcut, if applicable + this._register_default_keyhandler(this.id); + if(!this.label && this.__image) { /* diff --git a/api/js/etemplate/Et2Button/Et2ButtonIcon.ts b/api/js/etemplate/Et2Button/Et2ButtonIcon.ts index ec51a0376c..3f610b00ad 100644 --- a/api/js/etemplate/Et2Button/Et2ButtonIcon.ts +++ b/api/js/etemplate/Et2Button/Et2ButtonIcon.ts @@ -14,7 +14,7 @@ import '../Et2Image/Et2Image'; import {SlIconButton} from "@shoelace-style/shoelace"; import {ButtonMixin} from "./ButtonMixin"; import shoelace from "../Styles/shoelace"; -import {css} from "@lion/core"; +import {css} from "lit"; export class Et2ButtonIcon extends ButtonMixin(Et2InputWidget(SlIconButton)) @@ -45,7 +45,7 @@ export class Et2ButtonIcon extends ButtonMixin(Et2InputWidget(SlIconButton)) } if(new_image && !this.src) { - this.name = new_image; + this.__name = new_image; } } @@ -53,6 +53,16 @@ export class Et2ButtonIcon extends ButtonMixin(Et2InputWidget(SlIconButton)) { return this.src || this.name; } + + set name(name) + { + // No - use image to avoid conflicts between our icons & SlIconButton's image/url loading + } + + get name() + { + return super.name; + } } customElements.define("et2-button-icon", Et2ButtonIcon); \ No newline at end of file diff --git a/api/js/etemplate/Et2Button/Et2ButtonScroll.ts b/api/js/etemplate/Et2Button/Et2ButtonScroll.ts index f089cdf56b..870b83e272 100644 --- a/api/js/etemplate/Et2Button/Et2ButtonScroll.ts +++ b/api/js/etemplate/Et2Button/Et2ButtonScroll.ts @@ -8,7 +8,7 @@ * @author Nathan Gray */ -import {css, html, LitElement} from "@lion/core"; +import {css, html, LitElement} from "lit"; import {ButtonMixin} from "./ButtonMixin"; /** @@ -87,14 +87,14 @@ export class Et2ButtonScroll extends ButtonMixin(LitElement) diff --git a/api/js/etemplate/Et2Checkbox/Et2Checkbox.ts b/api/js/etemplate/Et2Checkbox/Et2Checkbox.ts index 4141f41966..8e6460c42b 100644 --- a/api/js/etemplate/Et2Checkbox/Et2Checkbox.ts +++ b/api/js/etemplate/Et2Checkbox/Et2Checkbox.ts @@ -9,7 +9,7 @@ */ -import {css} from "@lion/core"; +import {css} from "lit"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import '../Et2Image/Et2Image'; import {SlCheckbox} from "@shoelace-style/shoelace"; diff --git a/api/js/etemplate/Et2Checkbox/Et2CheckboxReadonly.ts b/api/js/etemplate/Et2Checkbox/Et2CheckboxReadonly.ts index ba63a515a0..843a6a8e5c 100644 --- a/api/js/etemplate/Et2Checkbox/Et2CheckboxReadonly.ts +++ b/api/js/etemplate/Et2Checkbox/Et2CheckboxReadonly.ts @@ -1,7 +1,8 @@ import {et2_IDetachedDOM} from "../et2_core_interfaces"; import {et2_checkbox} from "../et2_widget_checkbox"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; -import {classMap, css, html, LitElement} from "@lion/core"; +import {css, html, LitElement} from "lit"; +import {classMap} from "lit/directives/class-map.js" import shoelace from "../Styles/shoelace"; /** diff --git a/api/js/etemplate/Et2Colorpicker/Et2Colorpicker.ts b/api/js/etemplate/Et2Colorpicker/Et2Colorpicker.ts index 24bbf0d450..49e8018b78 100644 --- a/api/js/etemplate/Et2Colorpicker/Et2Colorpicker.ts +++ b/api/js/etemplate/Et2Colorpicker/Et2Colorpicker.ts @@ -9,7 +9,7 @@ */ -import {css, html, PropertyValues, render} from "@lion/core"; +import {css, html, PropertyValues, render} from "lit"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import {SlColorPicker} from "@shoelace-style/shoelace"; import shoelace from "../Styles/shoelace"; diff --git a/api/js/etemplate/Et2Date/DateStyles.ts b/api/js/etemplate/Et2Date/DateStyles.ts index e0686c80da..382235508e 100644 --- a/api/js/etemplate/Et2Date/DateStyles.ts +++ b/api/js/etemplate/Et2Date/DateStyles.ts @@ -2,7 +2,7 @@ * Sharable date styles constant */ -import {css} from "@lion/core"; +import {css} from "lit"; import {colorsDefStyles} from "../Styles/colorsDefStyles"; import {cssImage} from "../Et2Widget/Et2Widget"; diff --git a/api/js/etemplate/Et2Date/Et2Date.ts b/api/js/etemplate/Et2Date/Et2Date.ts index 25d0c2e716..514ffbe52f 100644 --- a/api/js/etemplate/Et2Date/Et2Date.ts +++ b/api/js/etemplate/Et2Date/Et2Date.ts @@ -9,7 +9,7 @@ */ -import {css, html} from "@lion/core"; +import {css, html} from "lit"; import 'lit-flatpickr'; import {dateStyles} from "./DateStyles"; import type {Instance} from 'flatpickr/dist/types/instance'; @@ -19,15 +19,11 @@ import flatpickr from "flatpickr"; import {egw} from "../../jsapi/egw_global"; import type {HTMLElementWithValue} from "@lion/form-core/types/FormControlMixinTypes"; import {Et2Textbox} from "../Et2Textbox/Et2Textbox"; -import {Et2ButtonIcon} from "../Et2Button/Et2ButtonIcon"; import {FormControlMixin} from "@lion/form-core"; import {LitFlatpickr} from "lit-flatpickr"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import shoelace from "../Styles/shoelace"; -const textbox = new Et2Textbox(); -const button = new Et2ButtonIcon(); - // list of existing localizations from node_modules/flatpicker/dist/l10n directory: const l10n = [ 'ar', 'at', 'az', 'be', 'bg', 'bn', 'bs', 'cat', 'cs', 'cy', 'da', 'de', 'eo', 'es', 'et', 'fa', 'fi', 'fo', @@ -1033,13 +1029,13 @@ export class Et2Date extends Et2InputWidget(FormControlMixin(LitFlatpickr))
diff --git a/api/js/etemplate/Et2Date/Et2DateDuration.ts b/api/js/etemplate/Et2Date/Et2DateDuration.ts index 16d2f6adcb..9d97b536f5 100644 --- a/api/js/etemplate/Et2Date/Et2DateDuration.ts +++ b/api/js/etemplate/Et2Date/Et2DateDuration.ts @@ -9,7 +9,8 @@ */ -import {classMap, css, html, LitElement} from "@lion/core"; +import {css, html, LitElement} from "lit"; +import {classMap} from "lit/directives/class-map.js"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import {sprintf} from "../../egw_action/egw_action_common"; import {dateStyles} from "./DateStyles"; @@ -50,7 +51,7 @@ export function formatDuration(value : number | string, options : formatOptions) for(let i = 0; i < options.displayFormat.length; ++i) { let unit = options.displayFormat[i]; - let val = this._unit_from_value(value, unit, i === 0); + let val = this._unit_from_value(value, unit, i === 0, options); if(unit === 's' || unit === 'm' || unit === 'h' && options.displayFormat[0] === 'd') { vals.push(sprintf('%02d', val)); @@ -132,6 +133,7 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) } .input-group__after { + display: contents; margin-inline-start: var(--sl-input-spacing-medium); } @@ -274,6 +276,16 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) this.formatter = formatDuration; } + async getUpdateComplete() + { + const result = await super.getUpdateComplete(); + + // Format select does not start with value, needs an update + this._formatNode?.requestUpdate("value"); + + return result; + } + transformAttributes(attrs) { // Clean formats, but avoid things that need to be expanded like $cont[displayFormat] @@ -432,7 +444,10 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) for(let i = 0; i < this.displayFormat.length; ++i) { let unit = this.displayFormat[i]; - let val = this._unit_from_value(_value, unit, i === 0); + let val = this._unit_from_value(_value, unit, i === 0, { + hoursPerDay: this.hoursPerDay, + dataFormat: this.dataFormat + }); if(unit === 's' || unit === 'm' || unit === 'h' && this.displayFormat[0] === 'd') { vals.push(sprintf('%02d', val)); @@ -505,9 +520,9 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) } } - private _unit_from_value(_value, _unit, _highest) + private _unit_from_value(_value, _unit, _highest, options) { - _value *= this._unit2seconds(this.dataFormat); + _value *= this._unit2seconds(options.dataFormat); // get value for given _unit switch(_unit) { @@ -518,9 +533,9 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) return _highest ? _value : _value % 60; case 'h': _value = Math.floor(_value / 3600); - return _highest ? _value : _value % this.hoursPerDay; + return _highest ? _value : _value % options.hoursPerDay; case 'd': - return Math.floor(_value / 3600 / this.hoursPerDay); + return Math.floor(_value / 3600 / options.hoursPerDay); } } @@ -605,15 +620,19 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) s: this.shortLabels ? this.egw().lang("s") : this.egw().lang("Seconds") }; // It would be nice to use an et2-select here, but something goes weird with the styling + const current = this._display.unit || this.displayFormat[0]; return html` - + ${[...this.displayFormat].map((format : string) => html` - + ${this.time_formats[format]} - ` + ` )} - + `; } @@ -631,7 +650,7 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) */ get _formatNode() : HTMLSelectElement { - return this.shadowRoot ? this.shadowRoot.querySelector("et2-select") : null; + return this.shadowRoot ? this.shadowRoot.querySelector("sl-select") : null; } } diff --git a/api/js/etemplate/Et2Date/Et2DateDurationReadonly.ts b/api/js/etemplate/Et2Date/Et2DateDurationReadonly.ts index 32a1832a6d..9463b00b44 100644 --- a/api/js/etemplate/Et2Date/Et2DateDurationReadonly.ts +++ b/api/js/etemplate/Et2Date/Et2DateDurationReadonly.ts @@ -8,7 +8,7 @@ */ -import {css, html} from "@lion/core"; +import {css, html} from "lit"; import {Et2DateDuration, formatOptions} from "./Et2DateDuration"; import {dateStyles} from "./DateStyles"; diff --git a/api/js/etemplate/Et2Date/Et2DateRange.ts b/api/js/etemplate/Et2Date/Et2DateRange.ts index 69c9739008..97d9e852f9 100644 --- a/api/js/etemplate/Et2Date/Et2DateRange.ts +++ b/api/js/etemplate/Et2Date/Et2DateRange.ts @@ -1,11 +1,11 @@ import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import {FormControlMixin} from "@lion/form-core"; -import {classMap, css, html, ifDefined, LitElement, TemplateResult} from "@lion/core"; +import {css, html, LitElement, TemplateResult} from "lit"; +import {classMap} from "lit/directives/class-map.js"; +import {ifDefined} from "lit/directives/if-defined.js"; import shoelace from "../Styles/shoelace"; import {dateStyles} from "./DateStyles"; -import flatpickr from "flatpickr"; -import {default as rangePlugin} from "flatpickr/dist/plugins/rangePlugin"; -import {Et2Date, formatDate, parseDate} from "./Et2Date"; +import {formatDate, parseDate} from "./Et2Date"; import {egw} from "../../jsapi/egw_global"; /** diff --git a/api/js/etemplate/Et2Date/Et2DateReadonly.ts b/api/js/etemplate/Et2Date/Et2DateReadonly.ts index c4dd1b4d7c..d6a70e9c06 100644 --- a/api/js/etemplate/Et2Date/Et2DateReadonly.ts +++ b/api/js/etemplate/Et2Date/Et2DateReadonly.ts @@ -8,7 +8,7 @@ */ -import {html, LitElement} from "@lion/core"; +import {html, LitElement} from "lit"; import {formatDate, parseDate} from "./Et2Date"; import {et2_IDetachedDOM} from "../et2_core_interfaces"; import {Et2Widget} from "../Et2Widget/Et2Widget"; diff --git a/api/js/etemplate/Et2Date/Et2DateSinceReadonly.ts b/api/js/etemplate/Et2Date/Et2DateSinceReadonly.ts index 30fbc7aaa9..1c3091de95 100644 --- a/api/js/etemplate/Et2Date/Et2DateSinceReadonly.ts +++ b/api/js/etemplate/Et2Date/Et2DateSinceReadonly.ts @@ -8,7 +8,7 @@ */ -import {html} from "@lion/core"; +import {html} from "lit"; import {parseDate, parseDateTime} from "./Et2Date"; import {Et2DateReadonly} from "./Et2DateReadonly"; diff --git a/api/js/etemplate/Et2Date/Et2DateTime.ts b/api/js/etemplate/Et2Date/Et2DateTime.ts index 1d27e10a6e..6240b89e52 100644 --- a/api/js/etemplate/Et2Date/Et2DateTime.ts +++ b/api/js/etemplate/Et2Date/Et2DateTime.ts @@ -9,7 +9,7 @@ */ -import {css} from "@lion/core"; +import {css} from "lit"; import {Et2Date, formatDate, formatDateTime} from "./Et2Date"; import type {Instance} from "flatpickr/dist/types/instance"; import {default as ShortcutButtonsPlugin} from "shortcut-buttons-flatpickr/dist/shortcut-buttons-flatpickr"; diff --git a/api/js/etemplate/Et2Description/Et2Description.ts b/api/js/etemplate/Et2Description/Et2Description.ts index 900d340527..915aca68c2 100644 --- a/api/js/etemplate/Et2Description/Et2Description.ts +++ b/api/js/etemplate/Et2Description/Et2Description.ts @@ -8,7 +8,7 @@ */ import {Et2Widget} from "../Et2Widget/Et2Widget"; -import {css, html, LitElement, render} from "@lion/core"; +import {css, html, LitElement, render} from "lit"; import {et2_IDetachedDOM} from "../et2_core_interfaces"; import {activateLinks} from "../ActivateLinksDirective"; import {et2_csvSplit} from "../et2_core_common"; @@ -144,14 +144,14 @@ export class Et2Description extends Et2Widget(LitElement) implements et2_IDetach this.requestUpdate('value', oldValue); } - requestUpdate(attribute, oldValue) + updated(changedProperties) { - super.requestUpdate(...arguments); + super.updated(changedProperties); // Due to how we do the rendering into the light DOM (not sure it's right) we need this after // value change or it won't actually show up - if(["value", "href", "activateLinks"].indexOf(attribute) != -1 && this.parentNode) + if((changedProperties.has("value") || changedProperties.has("href") || changedProperties.has("activateLinks")) && this.parentNode) { - this.updateComplete.then(() => render(this._renderContent(), this)); + render(this._renderContent(), this); } } diff --git a/api/js/etemplate/Et2Dialog/Et2Dialog.ts b/api/js/etemplate/Et2Dialog/Et2Dialog.ts index 2c96c2db55..5269d5e866 100644 --- a/api/js/etemplate/Et2Dialog/Et2Dialog.ts +++ b/api/js/etemplate/Et2Dialog/Et2Dialog.ts @@ -12,7 +12,12 @@ import {Et2Widget} from "../Et2Widget/Et2Widget"; import {et2_button} from "../et2_widget_button"; import {et2_widget} from "../et2_core_widget"; -import {classMap, css, html, ifDefined, LitElement, render, repeat, SlotMixin, styleMap} from "@lion/core"; +import {css, html, LitElement, render} from "lit"; +import {classMap} from "lit/directives/class-map.js"; +import {ifDefined} from "lit/directives/if-defined.js"; +import {repeat} from "lit/directives/repeat.js"; +import {styleMap} from "lit/directives/style-map.js"; +import {SlotMixin} from "@lion/core"; import {et2_template} from "../et2_widget_template"; import {etemplate2} from "../etemplate2"; import {egw, IegwAppLocal} from "../../jsapi/egw_global"; @@ -35,8 +40,6 @@ export interface DialogButton } /** - * Et2Dialog widget - * * A common dialog widget that makes it easy to inform users or prompt for information. * * It is possible to have a custom dialog by using a template, but you can also use @@ -47,7 +50,7 @@ export interface DialogButton * * Or a more complete example: * ```js - * let callback = function (button_id) + * let callback = function (button_id) * { * if(button_id == Et2Dialog.YES_BUTTON) * { @@ -78,22 +81,22 @@ export interface DialogButton * ``` * * The parameters for the above are all optional, except callback (which can be null) and message: - * callback - function called when the dialog closes, or false/null. + * - callback - function called when the dialog closes, or false/null. * The ID of the button will be passed. Button ID will be one of the Et2Dialog.*_BUTTON constants. * The callback is _not_ called if the user closes the dialog with the X in the corner, or presses ESC. - * message - (plain) text to display - * title - Dialog title - * value (for prompt) - * buttons - Et2Dialog BUTTONS_* constant, or an array of button settings. Use DialogButton interface. - * dialog_type - Et2Dialog *_MESSAGE constant - * icon - URL of icon + * - message - (plain) text to display + * - title - Dialog title + * - value (for prompt) + * - buttons - Et2Dialog BUTTONS_* constant, or an array of button settings. Use DialogButton interface. + * - dialog_type - Et2Dialog *_MESSAGE constant + * - icon - URL of icon * * Note that these methods will _not_ block program flow while waiting for user input unless you use "await" on getComplete(). * The user's input will be provided to the callback. * * You can also create a custom dialog using an etemplate, even setting all the buttons yourself. * ```ts - * // Pass egw in the constructor + * // Pass egw in the constructor * let dialog = new Et2Dialog(my_egw_reference); * * // Set attributes. They can be set in any way, but this is convenient. @@ -131,6 +134,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog)) * * @type {IegwAppLocal} * @protected + * @internal */ protected __egw : IegwAppLocal @@ -140,6 +144,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog)) * * @type {et2_template | null} * @protected + * @internal */ protected _template_widget : etemplate2 | null; protected _template_promise : Promise; @@ -148,6 +153,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog)) * Treat the dialog as an atomic operation, and use this promise to notify when * "done" instead of (or in addition to) using the callback function. * It gives the button ID and the dialog value. + * @internal */ protected _complete_promise : Promise<[number, Object]>; @@ -166,6 +172,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog)) * * @type {number|null} * @protected + * @internal */ protected _button_id : number | null; @@ -233,6 +240,10 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog)) margin-top: 0.5em; } + .dialog_content { + height: var(--height, auto); + } + /* Non-modal dialogs don't have an overlay */ :host(:not([ismodal])) .dialog, :host(:not([isModal])) .dialog__overlay { @@ -877,7 +888,7 @@ export class Et2Dialog extends Et2Widget(SlotMixin(SlDialog)) } if(this.height) { - styles.height = "--height: " + this.height; + styles["--height"] = this.height; } return html` diff --git a/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts b/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts index d50ce96694..1185db5ec2 100644 --- a/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts +++ b/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts @@ -9,11 +9,11 @@ */ -import {Et2Button} from "../Et2Button/Et2Button"; import {SlButtonGroup, SlDropdown} from "@shoelace-style/shoelace"; -import {css, html, TemplateResult} from "@lion/core"; -import {Et2widgetWithSelectMixin} from "../Et2Select/Et2WidgetWithSelectMixin"; +import {css, html, LitElement, TemplateResult} from "lit"; +import {Et2WidgetWithSelectMixin} from "../Et2Select/Et2WidgetWithSelectMixin"; import {SelectOption} from "../Et2Select/FindSelectOptions"; +import shoelace from "../Styles/shoelace"; /** * A split button - a button with a dropdown list @@ -28,13 +28,14 @@ import {SelectOption} from "../Et2Select/FindSelectOptions"; * as for a select box, but the title can also be full HTML if needed. * */ -export class Et2DropdownButton extends Et2widgetWithSelectMixin(Et2Button) +export class Et2DropdownButton extends Et2WidgetWithSelectMixin(LitElement) { static get styles() { return [ ...super.styles, + shoelace, css` :host { /* Avoid unwanted style overlap from button */ @@ -98,6 +99,7 @@ export class Et2DropdownButton extends Et2widgetWithSelectMixin(Et2Button) // We have our own render, so we can handle it internally } + render() : TemplateResult { if(this.readonly) diff --git a/api/js/etemplate/Et2Favorites/Et2Favorites.ts b/api/js/etemplate/Et2Favorites/Et2Favorites.ts index ab8c4177bb..3eccdb09c5 100644 --- a/api/js/etemplate/Et2Favorites/Et2Favorites.ts +++ b/api/js/etemplate/Et2Favorites/Et2Favorites.ts @@ -10,7 +10,7 @@ */ import {Et2DropdownButton} from "../Et2DropdownButton/Et2DropdownButton"; -import {css, html, PropertyValues, TemplateResult} from "@lion/core"; +import {css, html, PropertyValues, TemplateResult} from "lit"; import {SelectOption} from "../Et2Select/FindSelectOptions"; import {et2_INextmatchHeader, et2_nextmatch} from "../et2_extension_nextmatch"; import {Et2Image} from "../Et2Image/Et2Image"; @@ -76,24 +76,24 @@ export class Et2Favorites extends Et2DropdownButton implements et2_INextmatchHea min-width: 15em; } - sl-menu-item:hover et2-image[src="trash"] { + sl-option:hover et2-image[src="trash"] { display: initial; } /* Add star icons - radio button is already in prefix */ - sl-menu-item::part(base) { + sl-option::part(base) { background-image: ${cssImage("fav_filter")}; background-repeat: no-repeat; background-size: 16px 16px; background-position: 5px center; } - sl-menu-item[checked]::part(base) { + sl-option[checked]::part(base) { background-image: ${cssImage("favorites")}; } - sl-menu-item:last-child::part(base) { + sl-option:last-child::part(base) { background-image: none; } `, @@ -185,11 +185,11 @@ export class Et2Favorites extends Et2DropdownButton implements et2_INextmatchHea statustext="${this.egw().lang("Delete")}">`; return html` - + ${option.value !== Et2Favorites.ADD_VALUE ? radio : ""} ${icon} ${option.label} - `; + `; } diff --git a/api/js/etemplate/Et2Iframe/Et2Iframe.ts b/api/js/etemplate/Et2Iframe/Et2Iframe.ts index 4b70a954cd..308b31ee75 100644 --- a/api/js/etemplate/Et2Iframe/Et2Iframe.ts +++ b/api/js/etemplate/Et2Iframe/Et2Iframe.ts @@ -9,7 +9,8 @@ */ -import {css, html, LitElement, SlotMixin} from "@lion/core"; +import {css, html, LitElement} from "lit"; +import {SlotMixin} from "@lion/core"; import {Et2Widget} from "../Et2Widget/Et2Widget"; export class Et2Iframe extends Et2Widget(SlotMixin(LitElement)) diff --git a/api/js/etemplate/Et2Image/Et2Image.ts b/api/js/etemplate/Et2Image/Et2Image.ts index 2d33ea2eb4..0bbd0b0d18 100644 --- a/api/js/etemplate/Et2Image/Et2Image.ts +++ b/api/js/etemplate/Et2Image/Et2Image.ts @@ -8,8 +8,8 @@ * @author Nathan Gray */ - -import {css, html, LitElement, render, SlotMixin} from "@lion/core"; +import {css, html, LitElement, render} from "lit"; +import {SlotMixin} from "@lion/core"; import {Et2Widget} from "../Et2Widget/Et2Widget"; import {et2_IDetachedDOM} from "../et2_core_interfaces"; @@ -248,4 +248,4 @@ export class Et2Image extends Et2Widget(SlotMixin(LitElement)) implements et2_ID } } -customElements.define("et2-image", Et2Image as any, {extends: 'img'}); \ No newline at end of file +customElements.define("et2-image", Et2Image, {extends: 'img'}); \ No newline at end of file diff --git a/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts b/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts index 9c0f0863f3..4d97779928 100644 --- a/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts +++ b/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts @@ -1,10 +1,11 @@ import {et2_IInput, et2_IInputNode, et2_ISubmitListener} from "../et2_core_interfaces"; import {Et2Widget} from "../Et2Widget/Et2Widget"; -import {css, dedupeMixin, LitElement, PropertyValues} from "@lion/core"; +import {css, LitElement, PropertyValues} from "lit"; import {Required} from "../Validators/Required"; import {ManualMessage} from "../Validators/ManualMessage"; import {LionValidationFeedback, Validator} from "@lion/form-core"; import {et2_csvSplit} from "../et2_core_common"; +import {dedupeMixin} from "@lion/core"; /** * This mixin will allow any LitElement to become an Et2InputWidget @@ -486,6 +487,15 @@ const Et2InputWidgetMixin = >(superclass : T) { super.transformAttributes(attrs); + // Set attributes for the form / autofill. It's the individual widget's + // responsibility to do something appropriate with these properties. + if(this.autocomplete == "on" && window.customElements.get(this.localName).getPropertyOptions("name") != "undefined" && + this.getArrayMgr("content") !== null + ) + { + this.name = this.getArrayMgr("content").explodeKey(this.id).pop(); + } + // Check whether an validation error entry exists if(this.id && this.getArrayMgr("validation_errors")) { @@ -512,7 +522,7 @@ const Et2InputWidgetMixin = >(superclass : T) */ async validate(skipManual = false) { - if(this.readonly) + if(this.readonly || this.disabled) { // Don't validate if the widget is read-only, there's nothing the user can do about it return Promise.resolve(); diff --git a/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts b/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts index 29a0dc00be..bc398c489d 100644 --- a/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts +++ b/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts @@ -82,11 +82,21 @@ export function inputBasicTests(before : Function, test_value : string, value_se { element = await before(); }); - it("no value gives empty string", () => + it("no value gives empty string", async() => { + element.set_value(""); + await elementUpdated(element); + // Shows as empty / no value let value = (element).querySelector(value_selector) || (element).shadowRoot.querySelector(value_selector); + assert.isDefined(value, "Bad value selector '" + value_selector + "'"); + debugger; assert.equal(value.textContent.trim(), "", "Displaying something when there is no value"); + if(element.multiple) + { + assert.isEmpty(element.get_value()); + return; + } // Gives no value assert.equal(element.get_value(), "", "Value mismatch"); }); @@ -94,7 +104,7 @@ export function inputBasicTests(before : Function, test_value : string, value_se it("value out matches value in", async() => { element.set_value(test_value); - + debugger; // wait for asychronous changes to the DOM await elementUpdated(element); diff --git a/api/js/etemplate/Et2Link/Et2Link.ts b/api/js/etemplate/Et2Link/Et2Link.ts index f371086e69..08c82ca081 100644 --- a/api/js/etemplate/Et2Link/Et2Link.ts +++ b/api/js/etemplate/Et2Link/Et2Link.ts @@ -11,7 +11,7 @@ import {ExposeMixin, ExposeValue} from "../Expose/ExposeMixin"; -import {css, html, LitElement, TemplateResult} from "@lion/core"; +import {css, html, LitElement, TemplateResult} from "lit"; import {Et2Widget} from "../Et2Widget/Et2Widget"; import {et2_IDetachedDOM} from "../et2_core_interfaces"; diff --git a/api/js/etemplate/Et2Link/Et2LinkAdd.ts b/api/js/etemplate/Et2Link/Et2LinkAdd.ts index d92a10ead8..a35736f5d5 100644 --- a/api/js/etemplate/Et2Link/Et2LinkAdd.ts +++ b/api/js/etemplate/Et2Link/Et2LinkAdd.ts @@ -1,6 +1,7 @@ import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; +import {css, html, LitElement, PropertyValues} from "lit"; import {FormControlMixin, ValidateMixin} from "@lion/form-core"; -import {css, html, LitElement, PropertyValues, SlotMixin} from "@lion/core"; +import {SlotMixin} from "@lion/core"; import {Et2LinkAppSelect} from "./Et2LinkAppSelect"; import {LinkInfo} from "./Et2Link"; import {Et2Button} from "../Et2Button/Et2Button"; diff --git a/api/js/etemplate/Et2Link/Et2LinkAppSelect.ts b/api/js/etemplate/Et2Link/Et2LinkAppSelect.ts index a9c4cacec2..2890ae7ca1 100644 --- a/api/js/etemplate/Et2Link/Et2LinkAppSelect.ts +++ b/api/js/etemplate/Et2Link/Et2LinkAppSelect.ts @@ -1,9 +1,9 @@ import {cleanSelectOptions, SelectOption} from "../Et2Select/FindSelectOptions"; -import {css, html, SlotMixin, TemplateResult} from "@lion/core"; +import {css, html, TemplateResult} from "lit"; import {Et2Select} from "../Et2Select/Et2Select"; -export class Et2LinkAppSelect extends SlotMixin(Et2Select) +export class Et2LinkAppSelect extends Et2Select { static get styles() { @@ -49,22 +49,11 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) } }; - get slots() - { - return { - ...super.slots, - "": () => - { + /* + icon.style.width = "var(--icon-width)"; + icon.style.height = "var(--icon-width)"; - const icon = document.createElement("et2-image"); - icon.setAttribute("slot", "prefix"); - icon.setAttribute("src", "api/navbar"); - icon.style.width = "var(--icon-width)"; - icon.style.height = "var(--icon-width)"; - return icon; - } - } - } + */ protected __applicationList : string[]; protected __onlyApp : string; @@ -104,9 +93,6 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) { super.connectedCallback(); - // Set icon - this.querySelector(":scope > [slot='prefix']").setAttribute("src", this.egw().link_get_registry(this.value, 'icon') ?? this.value + "/navbar"); - if(!this.value) { // use preference @@ -118,7 +104,7 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) this.value = this.egw().preference('link_app', appname || this.egw().app_name()); } // Register to - this.addEventListener("change", this._handleChange); + this.addEventListener("sl-change", this._handleChange); if(this.__onlyApp) { @@ -129,7 +115,7 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) disconnectedCallback() { super.disconnectedCallback(); - this.removeEventListener("change", this._handleChange); + this.removeEventListener("sl-change", this._handleChange); } /** @@ -173,10 +159,9 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) super.value = new_value; } - _handleChange(e) + handleValueChange(e) { - // Set icon - this.querySelector(":scope > [slot='prefix']").setAttribute("src", this.egw().link_get_registry(this.value, 'icon')); + super.handleValueChange(e); // update preference let appname = ""; @@ -198,13 +183,21 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) // Limit to one app if(this.onlyApp) { - select_options.push({value: this.onlyApp, label: this.egw().lang(this.onlyApp)}); + select_options.push({ + value: this.onlyApp, + label: this.egw().lang(this.onlyApp), + icon: this.egw().link_get_registry(this.onlyApp, 'icon') ?? this.onlyApp + "/navbar" + }); } else if(this.applicationList.length > 0) { select_options = this.applicationList.map((app) => { - return {value: app, label: this.egw().lang(app)}; + return { + value: app, + label: this.egw().lang(app), + icon: this.egw().link_get_registry(app, 'icon') ?? app + "/navbar" + }; }); } else @@ -215,29 +208,27 @@ export class Et2LinkAppSelect extends SlotMixin(Et2Select) { delete select_options['addressbook-email']; } + select_options = cleanSelectOptions(select_options); + select_options.map((option) => + { + option.icon = this.egw().link_get_registry(option.value, 'icon') ?? option.value + "/navbar" + }); } if (!this.value) { this.value = this.egw().preference('link_app', this.egw().app_name()); } - this.select_options = cleanSelectOptions(select_options); + this.select_options = select_options; } _optionTemplate(option : SelectOption) : TemplateResult { return html` - + ${this.appIcons ? "" : option.label} - ${this._iconTemplate(option.value)} - `; - } - - _iconTemplate(appname) - { - let url = appname ? this.egw().link_get_registry(appname, 'icon') : ""; - return html` - `; + ${this._iconTemplate(option)} + `; } } diff --git a/api/js/etemplate/Et2Link/Et2LinkEntry.ts b/api/js/etemplate/Et2Link/Et2LinkEntry.ts index a9bc984538..6d08b9eaed 100644 --- a/api/js/etemplate/Et2Link/Et2LinkEntry.ts +++ b/api/js/etemplate/Et2Link/Et2LinkEntry.ts @@ -6,8 +6,8 @@ * @link https://www.egroupware.org * @author Nathan Gray */ - -import {css, html, LitElement, PropertyValues, SlotMixin} from "@lion/core"; +import {css, html, LitElement, PropertyValues} from "lit"; +import {SlotMixin} from "@lion/core"; import {Et2LinkAppSelect} from "./Et2LinkAppSelect"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import {FormControlMixin} from "@lion/form-core"; diff --git a/api/js/etemplate/Et2Link/Et2LinkList.ts b/api/js/etemplate/Et2Link/Et2LinkList.ts index 93893da8cf..cf956ad3e9 100644 --- a/api/js/etemplate/Et2Link/Et2LinkList.ts +++ b/api/js/etemplate/Et2Link/Et2LinkList.ts @@ -10,8 +10,9 @@ */ -import {css, html, repeat, TemplateResult} from "@lion/core"; -import {Et2Link, LinkInfo} from "./Et2Link"; +import {css, html, TemplateResult} from "lit"; +import {repeat} from "lit/directives/repeat.js"; +import {LinkInfo} from "./Et2Link"; import {egw} from "../../jsapi/egw_global"; import {Et2LinkString} from "./Et2LinkString"; import {egwMenu} from "../../egw_action/egw_menu"; diff --git a/api/js/etemplate/Et2Link/Et2LinkSearch.ts b/api/js/etemplate/Et2Link/Et2LinkSearch.ts index efebaec920..d5f0fe9c9e 100644 --- a/api/js/etemplate/Et2Link/Et2LinkSearch.ts +++ b/api/js/etemplate/Et2Link/Et2LinkSearch.ts @@ -7,7 +7,7 @@ * @author Nathan Gray */ -import {css} from "@lion/core"; +import {css} from "lit"; import {Et2Select} from "../Et2Select/Et2Select"; import {Et2LinkAppSelect} from "./Et2LinkAppSelect"; import {Et2Link} from "./Et2Link"; @@ -86,9 +86,9 @@ export class Et2LinkSearch extends Et2Select super.updated(changedProperties); // Set a value we don't have as an option? That's OK, we'll just add it - if(changedProperties.has("value") && this.value && ( - this.menuItems && this.menuItems.length == 0 || - this.menuItems?.filter && this.menuItems.filter(item => this.value.includes(item.value)).length == 0 + if(changedProperties.has("value") && this.value && this.value.length > 0 && ( + this.select_options.length == 0 || + this.select_options.filter && this.select_options.filter(item => this.getValueAsArray().includes(item.value)).length == 0 )) { this._missingOption(this.value) @@ -120,19 +120,16 @@ export class Et2LinkSearch extends Et2Select option.label = title || Et2Link.MISSING_TITLE; option.class = ""; // It's probably already been rendered, find the item - let item = this.menuItems.find(i => i.value === option.value); + let item = this.getAllOptions().find(i => i.value === option.value); if(item) { item.textContent = title; item.classList.remove("loading"); - this.syncItemsFromValue(); } else { // Not already rendered, update the select option this.requestUpdate("select_options"); - // update the displayed text - this.updateComplete.then(() => this.syncItemsFromValue()); } }); } diff --git a/api/js/etemplate/Et2Link/Et2LinkString.ts b/api/js/etemplate/Et2Link/Et2LinkString.ts index 29a1b3342c..70fc0d5ecc 100644 --- a/api/js/etemplate/Et2Link/Et2LinkString.ts +++ b/api/js/etemplate/Et2Link/Et2LinkString.ts @@ -10,7 +10,8 @@ */ -import {css, html, LitElement, PropertyValues, render, TemplateResult, until} from "@lion/core"; +import {css, html, LitElement, PropertyValues, render, TemplateResult} from "lit"; +import {until} from "lit/directives/until.js"; import {Et2Widget} from "../Et2Widget/Et2Widget"; import {Et2Link, LinkInfo} from "./Et2Link"; import {et2_IDetachedDOM} from "../et2_core_interfaces"; diff --git a/api/js/etemplate/Et2Link/Et2LinkTo.ts b/api/js/etemplate/Et2Link/Et2LinkTo.ts index 8e454aa124..c688c3b65f 100644 --- a/api/js/etemplate/Et2Link/Et2LinkTo.ts +++ b/api/js/etemplate/Et2Link/Et2LinkTo.ts @@ -12,7 +12,8 @@ import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import {FormControlMixin, ValidateMixin} from "@lion/form-core"; -import {css, html, LitElement, ScopedElementsMixin} from "@lion/core"; +import {css, html, LitElement} from "lit"; +import {ScopedElementsMixin} from "@lion/core"; import {et2_createWidget, et2_widget} from "../et2_core_widget"; import {et2_file} from "../et2_widget_file"; import {Et2Button} from "../Et2Button/Et2Button"; @@ -140,7 +141,7 @@ export class Et2LinkTo extends Et2InputWidget(ScopedElementsMixin(FormControlMix { this.sort = Sortable.create(this.shadowRoot.querySelector('sl-menu'), { @@ -99,7 +103,7 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) - + ${repeat(this.__columns, (column) => column.id, (column) => this.rowTemplate(column))} `; } @@ -132,13 +136,20 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) */ protected rowTemplate(column) : TemplateResult { - let isCustom = column.widget?.instanceOf(et2_nextmatch_customfields) || false; - /* ?disabled=${column.visibility == et2_dataview_column.ET2_COL_VISIBILITY_DISABLED} */ + const isCustom = column.widget?.instanceOf(et2_nextmatch_customfields) || false; + const alwaysOn = [et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS, et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT].indexOf(column.visibility) !== -1; + + // Don't show disabled columns + if(column.visibility == et2_dataview_column.ET2_COL_VISIBILITY_DISABLED) + { + return html``; + } return html` { - value.push(cf.value); + value.push(cf.value.replaceAll("___", " ")); }) } } diff --git a/api/js/etemplate/Et2Nextmatch/Headers/AccountFilterHeader.ts b/api/js/etemplate/Et2Nextmatch/Headers/AccountFilterHeader.ts index 3f6bfc3080..7e248d68b1 100644 --- a/api/js/etemplate/Et2Nextmatch/Headers/AccountFilterHeader.ts +++ b/api/js/etemplate/Et2Nextmatch/Headers/AccountFilterHeader.ts @@ -1,4 +1,4 @@ -import {Et2SelectAccount} from "../../Et2Select/Et2SelectAccount"; +import {Et2SelectAccount} from "../../Et2Select/Select/Et2SelectAccount"; import {et2_INextmatchHeader} from "../../et2_extension_nextmatch"; import {FilterMixin} from "./FilterMixin"; diff --git a/api/js/etemplate/Et2Nextmatch/Headers/CustomFilterHeader.ts b/api/js/etemplate/Et2Nextmatch/Headers/CustomFilterHeader.ts index 069a66fbf9..4868261612 100644 --- a/api/js/etemplate/Et2Nextmatch/Headers/CustomFilterHeader.ts +++ b/api/js/etemplate/Et2Nextmatch/Headers/CustomFilterHeader.ts @@ -2,7 +2,8 @@ import {loadWebComponent} from "../../Et2Widget/Et2Widget"; import {Et2Select} from "../../Et2Select/Et2Select"; import {Et2InputWidget, Et2InputWidgetInterface} from "../../Et2InputWidget/Et2InputWidget"; import {FilterMixin} from "./FilterMixin"; -import {html, LitElement} from "@lion/core"; +import {html, LitElement} from "lit"; +import {cleanSelectOptions} from "../../Et2Select/FindSelectOptions"; /** * Filter by some other type of widget @@ -84,6 +85,20 @@ export class Et2CustomFilterHeader extends FilterMixin(Et2InputWidget(LitElement } } + /** + * New filter options from server + * @param new_options + */ + set_select_options(new_options) + { + const widget_class = window.customElements.get(this.filter_node?.localName); + const property = widget_class.getPropertyOptions('select_options'); + if(this.filter_node && property) + { + this.filter_node.select_options = cleanSelectOptions(new_options); + } + } + render() { return html` diff --git a/api/js/etemplate/Et2Nextmatch/Headers/FilterMixin.ts b/api/js/etemplate/Et2Nextmatch/Headers/FilterMixin.ts index 33d390a37d..c2ea61fd9a 100644 --- a/api/js/etemplate/Et2Nextmatch/Headers/FilterMixin.ts +++ b/api/js/etemplate/Et2Nextmatch/Headers/FilterMixin.ts @@ -1,6 +1,6 @@ import {egw} from "../../../jsapi/egw_global"; import {et2_INextmatchHeader, et2_nextmatch} from "../../et2_extension_nextmatch"; -import {LitElement} from "@lion/core"; +import {LitElement} from "lit"; // Export the Interface for TypeScript type Constructor = new (...args : any[]) => T; diff --git a/api/js/etemplate/Et2Portlet/Et2Portlet.ts b/api/js/etemplate/Et2Portlet/Et2Portlet.ts index 7f3aeffa51..afad5417ec 100644 --- a/api/js/etemplate/Et2Portlet/Et2Portlet.ts +++ b/api/js/etemplate/Et2Portlet/Et2Portlet.ts @@ -15,8 +15,9 @@ import {SlCard} from "@shoelace-style/shoelace"; import interact from "@interactjs/interactjs"; import type {InteractEvent} from "@interactjs/core/InteractEvent"; import {egw} from "../../jsapi/egw_global"; -import {classMap, css, html, TemplateResult} from "@lion/core"; -import {HasSlotController} from "@shoelace-style/shoelace/dist/internal/slot"; +import {css, html, TemplateResult} from "lit"; +import {classMap} from "lit/directives/class-map.js"; +import type {HasSlotController} from "../../../../node_modules/@shoelace-style/shoelace/dist/internal/slot"; import shoelace from "../Styles/shoelace"; import {Et2Dialog} from "../Et2Dialog/Et2Dialog"; import {et2_IResizeable} from "../et2_core_interfaces"; @@ -92,11 +93,11 @@ export class Et2Portlet extends Et2Widget(SlCard) user-select: none; } - .portlet__header et2-button-icon { + .portlet__header .portlet__settings-icon { display: none; } - .portlet__header:hover et2-button-icon { + .portlet__header:hover .portlet__settings-icon { display: initial; } @@ -577,8 +578,9 @@ export class Et2Portlet extends Et2Widget(SlCard)
${this.headerTemplate()} - + +
${this.bodyTemplate()} ${this.footerTemplate()} diff --git a/api/js/etemplate/Et2Select/Et2Listbox.ts b/api/js/etemplate/Et2Select/Et2Listbox.ts index 7cfdb2accf..384edc7f8b 100644 --- a/api/js/etemplate/Et2Select/Et2Listbox.ts +++ b/api/js/etemplate/Et2Select/Et2Listbox.ts @@ -1,8 +1,8 @@ import {SlMenu} from "@shoelace-style/shoelace"; -import {Et2widgetWithSelectMixin} from "./Et2WidgetWithSelectMixin"; +import {Et2WidgetWithSelectMixin} from "./Et2WidgetWithSelectMixin"; import {RowLimitedMixin} from "../Layout/RowLimitedMixin"; import shoelace from "../Styles/shoelace"; -import {css, html, TemplateResult} from "@lion/core"; +import {css, html, TemplateResult} from "lit"; import {SelectOption} from "./FindSelectOptions"; /** @@ -12,7 +12,7 @@ import {SelectOption} from "./FindSelectOptions"; * * Use Et2Selectbox in most cases, it's better. */ -export class Et2Listbox extends RowLimitedMixin(Et2widgetWithSelectMixin(SlMenu)) +export class Et2Listbox extends RowLimitedMixin(Et2WidgetWithSelectMixin(SlMenu)) { static get styles() @@ -40,7 +40,8 @@ export class Et2Listbox extends RowLimitedMixin(Et2widgetWithSelectMixin(SlMenu) overflow-x: clip; } /* Ellipsis when too small */ - sl-menu-item.menu-item__label { + + sl-option.option__label { display: block; text-overflow: ellipsis; /* This is usually not used due to flex, but is the basis for ellipsis calculation */ @@ -153,15 +154,15 @@ export class Et2Listbox extends RowLimitedMixin(Et2widgetWithSelectMixin(SlMenu) // Tag used must match this.optionTag, but you can't use the variable directly. // Pass option along so SearchMixin can grab it if needed return html` - ${icon} ${this.noLang ? option.label : this.egw().lang(option.label)} - `; + `; } } diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index dbb9707bb2..e1c3e35e9e 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -8,20 +8,27 @@ */ -import {css, html, PropertyValues, TemplateResult} from "@lion/core"; -import {Et2StaticSelectMixin, StaticOptions as so} from "./StaticOptions"; -import {Et2widgetWithSelectMixin} from "./Et2WidgetWithSelectMixin"; -import {cleanSelectOptions, SelectOption} from "./FindSelectOptions"; -import {SlMenuItem, SlSelect} from "@shoelace-style/shoelace"; +import {css, LitElement, nothing, PropertyValues, TemplateResult} from "lit"; +import {html, literal, StaticValue} from "lit/static-html.js"; +import {Et2WidgetWithSelectMixin} from "./Et2WidgetWithSelectMixin"; +import {SelectOption} from "./FindSelectOptions"; import shoelace from "../Styles/shoelace"; -import {Et2WithSearchMixin} from "./SearchMixin"; -import {Et2Tag} from "./Tag/Et2Tag"; -import {LionValidationFeedback} from "@lion/form-core"; import {RowLimitedMixin} from "../Layout/RowLimitedMixin"; +import {Et2WithSearchMixin} from "./SearchMixin"; +import {property} from "lit/decorators/property.js"; +import {SlChangeEvent, SlOption, SlSelect} from "@shoelace-style/shoelace"; +import {repeat} from "lit/directives/repeat.js"; +import {classMap} from "lit/directives/class-map.js"; // export Et2WidgetWithSelect which is used as type in other modules -export class Et2WidgetWithSelect extends RowLimitedMixin(Et2widgetWithSelectMixin(SlSelect)) +export class Et2WidgetWithSelect extends RowLimitedMixin(Et2WidgetWithSelectMixin(LitElement)) { + // Gets an array of all elements + protected getAllOptions() + { + // @ts-ignore + return [...this.querySelectorAll('sl-option')]; + } }; /** @@ -65,14 +72,14 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) shoelace, super.styles, css` - :host { + :host { display: block; flex: 1 0 auto; --icon-width: 20px; - } - - - ::slotted(img), img { + } + + + ::slotted(img), img { vertical-align: middle; } @@ -137,13 +144,13 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) /* Hide dropdown trigger when multiple & readonly */ - :host([readonly][multiple]) .select__icon { + :host([readonly][multiple])::part(expand-icon) { display: none; } /* Style for tag count if rows=1 */ - :host([readonly][multiple][rows]) .select__tags sl-tag { + :host([readonly][multiple][rows])::part(tags) { position: absolute; right: 0px; top: 1px; @@ -167,9 +174,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) width: fill-available; } - /* Style for the popup */ - - ::part(popup) { + ::part(listbox) { z-index: 1; background: var(--sl-input-background-color); padding: var(--sl-input-spacing-small); @@ -186,10 +191,22 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) ::part(display-label) { margin: 0; } - :host::part(display-label) { - max-height: 8em; + + :host::part(display-label) { + max-height: 8em; overflow-y: auto; - } + } + :host([readonly])::part(combobox) { + background: none; + opacity: 1; + border: none; + } + + /* Position & style of group titles */ + + small { + padding: var(--sl-spacing-medium); + } ` ]; } @@ -216,6 +233,42 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } } + + /** Placeholder text to show as a hint when the select is empty. */ + @property() placeholder = ''; + /** Allows more than one option to be selected. */ + @property({type: Boolean, reflect: true}) multiple = false; + /** Disables the select control. */ + @property({type: Boolean, reflect: true}) disabled = false; + + /** Adds a clear button when the select is not empty. */ + @property({type: Boolean}) clearable = false; + + /** The select's label. If you need to display HTML, use the `label` slot instead. */ + @property() label = ''; + + /** + * The preferred placement of the select's menu. Note that the actual placement may vary as needed to keep the listbox + * inside of the viewport. + */ + @property({reflect: true}) placement : 'top' | 'bottom' = 'bottom'; + + /** The select's help text. If you need to display HTML, use the `help-text` slot instead. */ + @property({attribute: 'help-text'}) helpText = ''; + + /** The select's required attribute. */ + @property({type: Boolean, reflect: true}) required = false; + + + private __value : string | string[] = ""; + + constructor() + { + super(); + this.hoist = true; + + this._tagTemplate = this._tagTemplate.bind(this); + } /** * List of properties that get translated * @@ -229,73 +282,16 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } } - get slots() - { - return { - ...super.slots, - input: () => - { - return document.createElement("select"); - } - } - } - - /** - * If fix_bad_value() has to change the value, the update will trigger a change event. - * We don't want that event to fire since it happens too soon, before the handler is ready and app.ts has set up - * @type {boolean} - * @private - */ - private _block_change_event = false; - - /** - * Close the dropdown after user selects an option. - * Only applies when multiple="true". We initialize it in constructor to the common preference "select_multiple_close" - * @type {boolean} - * @private - */ - private _close_on_select : boolean; - - constructor(...args : any[]) - { - super(); - // We want this on more often than off - this.hoist = true; - - this._close_on_select = this.egw().preference("select_multiple_close") == "close"; - - this._triggerChange = this._triggerChange.bind(this); - this._doResize = this._doResize.bind(this); - this._handleMouseWheel = this._handleMouseWheel.bind(this); - this._handleMouseEnter = this._handleMouseEnter.bind(this); - this._handleMouseLeave = this._handleMouseLeave.bind(this); - this.handleOptionClick = this.handleOptionClick.bind(this); - this.handleKeyDown = this.handleKeyDown.bind(this); - this.handleTagRemove = this.handleTagRemove.bind(this); - } - connectedCallback() { super.connectedCallback(); - - // Re-bind focus/blur to after show/hide to avoid buggy behaviour like menu won't hide - this.removeEventListener("blur", this.et2HandleBlur); - this.removeEventListener("focus", this.et2HandleFocus); - this.addEventListener("sl-after-show", this.et2HandleFocus); - this.addEventListener("sl-after-hide", this.et2HandleBlur); - - this.addEventListener("mousewheel", this._handleMouseWheel); - this.addEventListener("mouseenter", this._handleMouseEnter); - this.addEventListener("mouseup", this.handleOptionClick); - this.addEventListener("keydown", this.handleKeyDown); - this.updateComplete.then(() => { this.addEventListener("sl-change", this._triggerChange); - this.addEventListener("sl-after-show", this._doResize) - - /* A hack to deal with how we do dark mode to avoid re-coloring the dropdown icon */ - this.shadowRoot.querySelector(".select__icon").setAttribute("part", "dropdown-icon"); + // Fixes missing empty label + this.select?.requestUpdate("value"); + // Fixes incorrect opening position + this.select?.popup?.handleAnchorChange(); }); } @@ -303,127 +299,15 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { super.disconnectedCallback(); - this.removeEventListener("mousewheel", this._handleMouseWheel); - this.removeEventListener("sl-clear", this._triggerChange) this.removeEventListener("sl-change", this._triggerChange); - this.removeEventListener("sl-after-show", this._doResize); - this.removeEventListener("sl-after-show", this.et2HandleFocus); - this.removeEventListener("sl-after-hide", this.et2HandleBlur); - } - - firstUpdated(changedProperties?) - { - super.firstUpdated(changedProperties); } _triggerChange(e) { - if(super._triggerChange(e) && !this._block_change_event) + if(super._triggerChange(e)) { this.dispatchEvent(new Event("change", {bubbles: true})); } - if(this._block_change_event) - { - this.updateComplete.then(() => this._block_change_event = false); - } - } - - /** - * Change the menu sizing to allow the menu to be wider than the field width, but no smaller - * - * @param e - * @private - */ - private _doResize(e) - { - this.menu.style.minWidth = this.menu.style.width; - this.menu.style.width = ""; - } - - /** - * Stop scroll from bubbling so the sidemenu doesn't scroll too - * - * @param {MouseEvent} e - */ - private _handleMouseWheel(e : MouseEvent) - { - e.stopPropagation(); - } - - /** - * If rows=1 and multiple=true, when they put the mouse over the widget show all tags - * @param {MouseEvent} e - * @private - */ - private _handleMouseEnter(e : MouseEvent) - { - if(this.rows == 1 && this.multiple == true && this.value.length > 1) - { - e.stopPropagation(); - let distance = (-1 * parseInt(getComputedStyle(this).height)) - 2; - - // Show all tags - this._oldMaxTagsVisible = this.maxTagsVisible; - this.maxTagsVisible = 0; - this._oldRows = this.rows; - this.rows = 10; - this.syncItemsFromValue(); - - // Bind to turn this all off - this.addEventListener("mouseleave", this._handleMouseLeave); - - // Popup - this might get wiped out next render(), might not - this.updateComplete.then(() => - { - let label = this.dropdown.querySelector(".select__label"); - let popup = document.createElement("sl-popup"); - popup.anchor = this; - popup.distance = distance; - popup.placement = "bottom"; - popup.strategy = "fixed"; - popup.active = true; - popup.sync = "width"; - popup.classList.add("hover__popup", "details", "hoist", "details__body"); - label.parentNode.insertBefore(popup, label); - popup.appendChild(label); - label.style.width = getComputedStyle(this).width; - label.style.margin = 0; - }); - } - } - - /** - * If we're showing all rows because of _handleMouseEnter, reset when mouse leaves - * @param {MouseEvent} e - * @private - */ - private _handleMouseLeave(e : MouseEvent) - { - let popup = this.dropdown.querySelector("sl-popup"); - if(popup) - { - // Popup still here. Remove it - let label = popup.firstChild; - popup.parentNode.insertBefore(label, popup); - popup.remove(); - } - this.maxTagsVisible = this._oldMaxTagsVisible; - delete this._oldMaxTagsVisible; - this.rows = this._oldRows; - delete this._oldRows; - this.syncItemsFromValue(); - this.removeEventListener("mouseleave", this._handleMouseLeave); - this.dropdown.requestUpdate(); - } - - /** - * Get the node where we're putting the selection options - * - * @returns {HTMLElement} - */ - get _optionTargetNode() : HTMLElement - { - return this; } /** @@ -443,9 +327,13 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) return; } - let valueArray = Array.isArray(this.value) ? this.value : ( - !this.value ? [] : (this.multiple ? this.value.toString().split(',') : [this.value]) - ); + // emptyLabel is fine + if(!(this.value) && this.value !== '0' && (this.emptyLabel || this.placeholder)) + { + return; + } + + let valueArray = this.getValueAsArray(); // Check for value using missing options (deleted or otherwise not allowed) let filtered = this.filterOutMissingOptions(valueArray); @@ -480,24 +368,36 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { let oldValue = this.value; this.value = this.emptyLabel ? "" : "" + this.select_options[0]?.value; - this._block_change_event = (oldValue != this.value); // ""+ to cast value of 0 to "0", to not replace with "" this.requestUpdate("value", oldValue); } } - /** - * @deprecated use this.multiple = multi - * - * @param multi - */ - set_multiple(multi) + @property() + get value() { - this.multiple = multi; + // Handle a bunch of non-values, if it's multiple we want an array + if(this.multiple && (this.__value == "null" || this.__value == null || typeof this.__value == "undefined" || + !this.emptyLabel && this.__value == "" && !this.select_options.find(o => o.value == ""))) + { + return []; + } + if(!this.multiple && !this.emptyLabel && this.__value == "" && !this.select_options.find(o => o.value == "")) + { + return null; + } + return this.multiple ? + this.__value ?? [] : + this.__value ?? ""; } - set_value(val : string | string[] | number | number[]) + // @ts-ignore + set value(val : string | string[] | number | number[]) { + if(typeof val === "undefined" || val == null) + { + val = ""; + } if(typeof val === 'string' && val.indexOf(',') !== -1 && this.multiple) { val = val.split(','); @@ -506,12 +406,25 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { val = val.toString(); } + const oldValue = this.value; if(Array.isArray(val)) { // Make sure value has no duplicates, and values are strings - val = [...new Set(val.map(v => typeof v === 'number' ? v.toString() : v || ''))]; + this.__value = [...new Set(val.map(v => (typeof v === 'number' ? v.toString() : v || '')))]; } - this.value = val || ''; + else + { + this.__value = val; + } + if(this.multiple && typeof this.__value == "string") + { + this.__value = this.__value != "" ? [this.__value] : []; + } + if(this.select) + { + this.select.value = this.__value; + } + this.requestUpdate("value", oldValue); } /** @@ -551,31 +464,25 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) return filteredArray; } + // Empty is allowed, if there's an emptyLabel + if(value.toString() == "" && this.emptyLabel) + { + return value; + } + const missing = filterBySelectOptions(value, this.select_options); if(missing.length > 0) { - console.warn("Invalid option '" + missing.join(", ") + " ' removed"); + debugger; + console.warn("Invalid option '" + missing.join(", ") + "' removed from " + this.id, this); value = value.filter(item => missing.indexOf(item) == -1); } } return value; } - transformAttributes(attrs) - { - super.transformAttributes(attrs); - - // Deal with initial value of multiple set as CSV - if(this.multiple && typeof this.value == "string") - { - this.value = this.value.length ? this.value.split(",") : []; - } - } - /** - * Load extra stuff from the template node. - * Overridden from parent to force value to be "good", since this is the earliest place we have both value and - * select options when loading from a template. + * Additional customisations from the XET node * * @param {Element} _node */ @@ -592,173 +499,28 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { super.willUpdate(changedProperties); - if(changedProperties.has('select_options') || changedProperties.has("value") || changedProperties.has('emptyLabel')) + if(changedProperties.has("multiple")) + { + this.value = this.__value; + } + if(changedProperties.has("select_options") || changedProperties.has("value") || changedProperties.has("emptyLabel")) { this.updateComplete.then(() => this.fix_bad_value()); } if(changedProperties.has("select_options") && changedProperties.has("value")) { - // Re-set value, the option for it may have just shown up - this.updateComplete.then(() => this.syncItemsFromValue()) } } - /** - * Override this method from SlSelect to stick our own tags in there - */ - syncItemsFromValue() - { - if(typeof super.syncItemsFromValue === "function") - { - super.syncItemsFromValue(); - } - - // Only applies to multiple - if(typeof this.displayTags !== "object" || !this.multiple) - { - return; - } - - let overflow = null; - if(this.maxTagsVisible > 0 && this.displayTags.length > this.maxTagsVisible) - { - overflow = this.displayTags.pop(); - } - - const checkedItems = Object.values(this._menuItems).filter(item => this.value.includes(item.value)); - this.displayTags = checkedItems.map(item => this._createTagNode(item)); - - if(checkedItems.length !== this.value.length && this.multiple) - { - // There's a value that does not have a menu item, probably invalid. - // Add it as a marked tag so it can be corrected or removed. - const filteredValues = this.value.filter(str => !checkedItems.some(obj => obj.value === str)); - for(let i = 0; i < filteredValues.length; i++) - { - const badTag = this._createTagNode({ - value: filteredValues[i], - getTextLabel: () => filteredValues[i], - classList: {value: ""} - }); - badTag.variant = "danger"; - badTag.contactPlus = false; - // Put it in front so it shows - this.displayTags.unshift(badTag); - } - } - - // Re-slice & add overflow tag - if(overflow) - { - this.displayTags = this.displayTags.slice(0, this.maxTagsVisible); - this.displayTags.push(overflow); - } - else if(this.multiple && this.rows == 1 && this.readonly && this.value.length > 1) - { - // Maybe more tags than we can show, show the count - this.displayTags.push(html` - ${this.value.length} `); - } - } - - _emptyLabelTemplate() : TemplateResult - { - if(!this.emptyLabel || this.multiple) - { - return html``; - } - return html` - ${this.emptyLabel}`; - } - - - /** - * Tag used for rendering options - * Used for finding & filtering options, they're created by the mixed-in class - * @returns {string} - */ - public get optionTag() - { - return "sl-menu-item"; - } - - - _optionTemplate(option : SelectOption) : TemplateResult - { - // Tag used must match this.optionTag, but you can't use the variable directly. - // Pass option along so SearchMixin can grab it if needed - return html` - - ${this._iconTemplate(option)} - ${this.noLang ? option.label : this.egw().lang(option.label)} - `; - } - /** * Tag used for rendering tags when multiple=true * Used for creating, finding & filtering options. * @see createTagNode() * @returns {string} */ - public get tagTag() : string + public get tagTag() : StaticValue { - return "et2-tag"; - } - - /** - * Customise how tags are rendered. This overrides what SlSelect - * does in syncItemsFromValue(). - * This is a copy+paste from SlSelect.syncItemsFromValue(). - * - * @param item - * @protected - */ - protected _createTagNode(item) - { - let tag; - if(typeof super._createTagNode == "function") - { - tag = super._createTagNode(item); - } - else - { - tag = document.createElement(this.tagTag); - } - tag.value = item.value; - tag.textContent = item.getTextLabel().trim(); - tag.class = item.classList.value + " search_tag"; - tag.setAttribute("exportparts", "icon"); - if(this.size) - { - tag.size = this.size; - } - if(this.readonly || item.option && typeof (item.option.disabled) != "undefined" && item.option.disabled) - { - tag.removable = false; - tag.readonly = true; - } - else - { - tag.addEventListener("dblclick", this._handleDoubleClick); - tag.addEventListener("click", this.handleTagInteraction); - tag.addEventListener("keydown", this.handleTagInteraction); - tag.addEventListener("sl-remove", (event : CustomEvent) => this.handleTagRemove(event, item)); - } - // Allow click handler even if read only - if(typeof this.onTagClick == "function") - { - tag.addEventListener("click", (e) => this.onTagClick(e, e.target)); - } - let image = this._createImage(item); - if(image) - { - tag.prepend(image); - } - return tag; + return literal`et2-tag`; } blur() @@ -767,9 +529,10 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { super.blur(); } - this.dropdown.hide(); + this.hide(); } + /* Parent should be fine now? private handleTagRemove(event : CustomEvent, option) { event.stopPropagation(); @@ -784,11 +547,12 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } this.dispatchEvent(new CustomEvent('sl-input')); this.dispatchEvent(new CustomEvent('sl-change')); - this.syncItemsFromValue(); this.validate(); } } + */ + /** * Apply the user preference to close the dropdown if an option is clicked, even if multiple=true. * The default (from SlSelect) leaves the dropdown open for multiple=true @@ -798,21 +562,17 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) */ private handleOptionClick(event : MouseEvent) { - if(event.target == this) + super.handleOptionClick(event); + + // Only interested in option clicks, but handler is bound higher + if(event.target.tagName !== "SL-OPTION") { - // Don't hide dropdown when clicking on select. That can close it after user opens it. return; } + if(this._close_on_select) { - this.dropdown.hide().then(() => - { - if(typeof this.handleMenuHide == "function") - { - // Make sure search gets hidden - this.handleMenuHide(); - } - }); + this.hide(); } } @@ -822,7 +582,22 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { super.et2HandleBlur(event); } - this.dropdown?.hide(); + } + + + protected handleValueChange(e : SlChangeEvent) + { + // Only interested when selected value changes, not any nested inputs + if(e.target !== this.select) + { + return; + } + + const old_value = this.__value; + this.__value = Array.isArray(this.select.value) ? + this.select.value.map(e => e.replaceAll("___", " ")) : + this.select.value.replaceAll("___", " "); + this.requestUpdate("value", old_value); } /** @@ -849,13 +624,128 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } + /** Shows the listbox. */ + async show() + { + return this.select.show(); + } + + /** Hides the listbox. */ + async hide() + { + this.select.hide(); + } + + get open() + { + return this.select?.open ?? false; + } + + protected _renderOptions() + {return Promise.resolve();} + + protected get select() : SlSelect + { + return this.shadowRoot?.querySelector("sl-select"); + } + + /** + * Custom, dynamic styling + * + * Put as much as you can in static styles for performance reasons + * Override this for custom dynamic styles + * + * @returns {TemplateResult} + * @protected + */ + protected _styleTemplate() : TemplateResult + { + return null; + } + + /** + * Used for the "no value" option for single select + * Placeholder is used for multi-select with no value + * + * @returns {TemplateResult} + */ + _emptyLabelTemplate() : TemplateResult + { + if(!this.emptyLabel || this.multiple) + { + return html``; + } + return html` + v == "")} + > + ${this.emptyLabel} + `; + } + + /** + * Iterate over all the options + * @returns {TemplateResult} + * @protected + */ + protected _optionsTemplate() : TemplateResult + { + return html`${repeat(this.select_options + // Filter out empty values if we have empty label to avoid duplicates + .filter(o => this.emptyLabel ? o.value !== '' : o), o => o.value, this._groupTemplate.bind(this)) + }`; + } + + /** + * Used to render each option into the select + * Override for custom select options. Note that spaces are not allowed in option values, + * and sl-select _requires_ options to be + * + * @param {SelectOption} option + * @returns {TemplateResult} + */ + protected _optionTemplate(option : SelectOption) : TemplateResult + { + // Exclude non-matches when searching + // unless they're already selected, in which case removing them removes them from value + if(typeof option.isMatch == "boolean" && !option.isMatch && !this.getValueAsArray().includes(option.value)) + { + return html``; + } + + // Tag used must match this.optionTag, but you can't use the variable directly. + // Pass option along so SearchMixin can grab it if needed + const value = (option.value).replaceAll(" ", "___"); + const classes = option.class ? Object.fromEntries((option.class).split(" ").map(k => [k, true])) : {}; + return html` + v == value)} + ?disabled=${option.disabled} + > + ${this._iconTemplate(option)} + ${this.noLang ? option.label : this.egw().lang(option.label)} + `; + } + /** * Get the icon for the select option * * @param option * @protected */ - protected _iconTemplate(option) + protected _iconTemplate(option : SelectOption) { if(!option.icon) { @@ -867,423 +757,120 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) src="${option.icon}">` } - protected _createImage(item) - { - let image = item?.querySelector ? item.querySelector("et2-image") || item.querySelector("[slot='prefix']") : null; - if(image) - { - image = image.clone(); - image.slot = "prefix"; - image.class = "tag_image"; - return image; - } - return ""; - } - - public get _menuItems() : HTMLElement[] - { - return [...this.querySelectorAll(this.optionTag)]; - } - /** - * Override parent to always call validate(), as our simple implementation needs to validate on clear as well. + * Custom tag * - * @param {string | false} err + * Override this to customise display when multiple=true. + * There is no restriction on the tag used, unlike _optionTemplate() + * + * @param {Et2Option} option + * @param {number} index + * @returns {TemplateResult} + * @protected */ - set_validation_error(err : string | false) + protected _tagTemplate(option : SlOption, index : number) : TemplateResult { - super.set_validation_error(err); - if(err == false) - { - this.validate(); - } - } -} - -customElements.define("et2-select", Et2Select); -if(typeof customElements.get("lion-validation-feedback") === "undefined") -{ - customElements.define("lion-validation-feedback", LionValidationFeedback); -} - -export class Et2SelectApp extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); + const readonly = (this.readonly || option && typeof (option.disabled) != "undefined" && option.disabled); + const isEditable = this.editModeEnabled && !readonly; + const image = this._iconTemplate(option.option ?? option); + const tagName = this.tagTag; + return html` + <${tagName} + part="tag" + exportparts=" + base:tag__base, + content:tag__content, + remove-button:tag__remove-button, + remove-button__base:tag__remove-button__base, + icon:icon + " + class=${"search_tag " + option.classList.value} + ?pill=${this.pill} + size=${this.size || "medium"} + ?removable=${!readonly} + ?readonly=${readonly} + ?editable=${isEditable} + .value=${option.value.replaceAll("___", " ")} + @change=${this.handleTagEdit} + @dblclick=${this._handleDoubleClick} + @click=${typeof this.onTagClick == "function" ? (e) => this.onTagClick(e, e.target) : nothing} + > + ${image ?? nothing} + ${option.getTextLabel().trim()} + + `; } - public connectedCallback() - { - super.connectedCallback() - this.fetchComplete = so.app(this, {}).then((options) => - { - this.set_static_options(cleanSelectOptions(options)); - }) - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-app", Et2SelectApp); - -export class Et2SelectTab extends Et2SelectApp -{ - constructor() - { - super(...arguments); - - this.allowFreeEntries = true; - } - - set value(new_value) - { - if(!new_value) - { - super.value = new_value; - return; - } - const values = Array.isArray(new_value) ? new_value : [new_value]; - const options = this.select_options; - values.forEach(value => - { - if(!options.filter(option => option.value == value).length) - { - const matches = value.match(/^([a-z0-9]+)\-/i); - let option : SelectOption = {value: value, label: value}; - if(matches) - { - option = options.filter(option => option.value == matches[1])[0] || { - value: value, - label: this.egw().lang(matches[1]) - }; - option.value = value; - option.label += ' ' + this.egw().lang('Tab'); - } - try { - const app = opener?.framework.getApplicationByName(value); - if (app && app.displayName) - { - option.label = app.displayName; - } - } - catch (e) { - // ignore security exception, if opener is not accessible - } - this.select_options.concat(option); - } - }) - super.value = new_value; - } - - get value() - { - return super.value; - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-tab", Et2SelectTab); - -export class Et2SelectBitwise extends Et2StaticSelectMixin(Et2Select) -{ - set value(new_value) - { - /* beforeSendToClient does this, we don't want it twice - let oldValue = this._value; - let expanded_value = []; - let options = this.select_options; - for(let index in options) - { - let right = parseInt(options[index].value); - if(!!(new_value & right)) - { - expanded_value.push(right); - } - } - super.value = expanded_value; - */ - super.value = new_value; - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-bitwise", Et2SelectBitwise); - -export class Et2SelectBool extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); - - this.static_options = so.bool(this); - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-bool", Et2SelectBool); - - -export class Et2SelectDay extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); - - this.static_options = so.day(this, {}); - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-day", Et2SelectDay); - -export class Et2SelectDayOfWeek extends Et2StaticSelectMixin(Et2Select) -{ - connectedCallback() - { - super.connectedCallback(); - - // Wait for connected instead of constructor because attributes make a difference in - // which options are offered - this.fetchComplete = so.dow(this, {other: this.other || []}).then(options => - { - this.set_static_options(cleanSelectOptions(options)); - }); - } - - set value(new_value) - { - let expanded_value = typeof new_value == "object" ? new_value : []; - if(new_value && (typeof new_value == "string" || typeof new_value == "number")) - { - let int_value = parseInt(new_value); - this.updateComplete.then(() => - { - this.fetchComplete.then(() => - { - let options = this.select_options; - for(let index in options) - { - let right = parseInt(options[index].value); - - if((int_value & right) == right) - { - expanded_value.push("" + right); - } - } - super.value = expanded_value; - }) - }); - return; - } - super.value = expanded_value; - } - - get value() - { - return super.value; - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-dow", Et2SelectDayOfWeek); - -export class Et2SelectHour extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); - - this.static_options = so.hour(this, {other: this.other || []}); - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-hour", Et2SelectHour); - -export class Et2SelectMonth extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); - - this.static_options = so.month(this); - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-month", Et2SelectMonth); - -export class Et2SelectNumber extends Et2StaticSelectMixin(Et2Select) -{ - static get properties() - { - return { - ...super.properties, - /** - * Step between numbers - */ - interval: {type: Number}, - min: {type: Number}, - max: {type: Number}, - - /** - * Add one or more leading zeros - * Set to how many zeros you want (000) - */ - leading_zero: {type: String}, - /** - * Appended after every number - */ - suffix: {type: String} - } - } - - constructor(...args) - { - super(...args); - this.min = 1; - this.max = 10; - this.interval = 1; - this.leading_zero = ""; - this.suffix = ""; - } - - updated(changedProperties : PropertyValues) - { - super.updated(changedProperties); - - if(changedProperties.has('min') || changedProperties.has('max') || changedProperties.has('interval') || changedProperties.has('suffix')) - { - this.static_options = so.number(this); - this.requestUpdate("select_options"); - } - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-number", Et2SelectNumber); - -export class Et2SelectPercent extends Et2SelectNumber -{ - constructor(...args) - { - super(...args); - this.min = 0; - this.max = 100; - this.interval = 10; - this.suffix = "%%"; - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-percent", Et2SelectPercent); - -export class Et2SelectPriority extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); - - this.static_options = so.priority(this); - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-priority", Et2SelectPriority); - -export class Et2SelectState extends Et2StaticSelectMixin(Et2Select) -{ /** - * Two-letter ISO country code + * Additional customisation template + * Override if needed. Added after select options. + * + * @protected */ - protected __country_code; - - static get properties() + protected _extraTemplate() : TemplateResult | typeof nothing { - return { - ...super.properties, - countryCode: String, - } + return typeof super._extraTemplate == "function" ? super._extraTemplate() : nothing; } - constructor() + public render() { - super(...arguments); + const value = Array.isArray(this.value) ? + this.value.map(v => { return v.replaceAll(" ", "___"); }) : + (typeof this.value == "string" ? this.value.replaceAll(" ", "___") : ""); - this.countryCode = 'DE'; - } - - get countryCode() - { - return this.__countryCode; - } - - set countryCode(code : string) - { - this.__countryCode = code; - this.static_options = so.state(this, {country_code: code}); - this.requestUpdate("select_options"); - } - - set_country_code(code) - { - this.countryCode = code; - } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-state", Et2SelectState); - -export class Et2SelectTimezone extends Et2StaticSelectMixin(Et2Select) -{ - constructor() - { - super(...arguments); - - const options = so.timezone(this, {other: this.other || []}); - if(Array.isArray(options)) + let icon : TemplateResult | typeof nothing = nothing; + if(!this.multiple) { - this.static_options = options; + const icon_option = this.select_options.find(o => (o.value == value || Array.isArray(value) && value.includes(o.value)) && o.icon); + if(icon_option) + { + icon = this._iconTemplate(icon_option); + } } + return html` + ${this._styleTemplate()} + e.stopImmediatePropagation() + } + > + ${icon} + ${this._emptyLabelTemplate()} + ${this._optionsTemplate()} + ${this._extraTemplate()} + + + `; } } -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-timezone", Et2SelectTimezone); - -export class Et2SelectYear extends Et2SelectNumber +if(typeof customElements.get("et2-select") === "undefined") { - constructor(args) - { - super(...args); - this.min = -3; - this.max = 2; - } - - updated(changedProperties : PropertyValues) - { - super.updated(changedProperties); - - if(changedProperties.has('min') || changedProperties.has('max') || changedProperties.has('interval') || changedProperties.has('suffix')) - { - this.select_options = so.year(this); - } - } + customElements.define("et2-select", Et2Select); } -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-year", Et2SelectYear); - -export class Et2SelectLang extends Et2StaticSelectMixin(Et2Select) +declare global { - constructor() + interface HTMLElementTagNameMap { - super(...arguments); - - this.static_options = so.lang(this, {other: this.other || []}); + "et2-select" : Et2Select; } -} - -// @ts-ignore TypeScript is not recognizing that this widget is a LitElement -customElements.define("et2-select-lang", Et2SelectLang); +} \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2SelectCategory.ts b/api/js/etemplate/Et2Select/Et2SelectCategory.ts deleted file mode 100644 index d614d383ce..0000000000 --- a/api/js/etemplate/Et2Select/Et2SelectCategory.ts +++ /dev/null @@ -1,177 +0,0 @@ -/** - * EGroupware eTemplate2 - Select Category WebComponent - * - * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License - * @package api - * @link https://www.egroupware.org - * @author Nathan Gray - */ - - -import {css, PropertyValues} from "@lion/core"; -import {Et2Select} from "./Et2Select"; -import {Et2StaticSelectMixin, StaticOptions as so} from "./StaticOptions"; -import {cleanSelectOptions} from "./FindSelectOptions"; - -/** - * Customised Select widget for categories - * This widget gives us category colors and icons in the options and selected value. - */ -export class Et2SelectCategory extends Et2StaticSelectMixin(Et2Select) -{ - static get styles() - { - return [ - ...super.styles, - css` - /* Category color on options */ - ::slotted(*) { - border-left: 6px solid var(--category-color, transparent); - } - /* Border on the (single) selected value */ - :host(.hasValue:not([multiple])) .select--standard .select__control { - border-left: 6px solid var(--sl-input-border-color); - } - ` - ] - } - - static get properties() - { - return { - ...super.properties, - /** - * Include global categories - */ - globalCategories: {type: Boolean}, - /** - * Show categories from this application. If not set, will be the current application - */ - application: {type: String}, - /** - * Show categories below this parent category - */ - parentCat: {type: Number} - } - } - - constructor() - { - super(); - // we should not translate categories name - this.noLang = true; - } - - async connectedCallback() - { - super.connectedCallback(); - - if(typeof this.application == 'undefined') - { - this.application = - // When the widget is first created, it doesn't have a parent and can't find it's instanceManager - (this.getInstanceManager() && this.getInstanceManager().app) || - this.egw().app_name(); - } - // If app passes options (addressbook index) we'll use those instead. - // They will be found automatically by update() after ID is set. - await this.updateComplete; - if(this.select_options.length == 0) - { - - } - } - - - willUpdate(changedProperties : PropertyValues) - { - super.willUpdate(changedProperties); - - if(changedProperties.has("global_categories") || changedProperties.has("application") || changedProperties.has("parentCat")) - { - this.fetchComplete = so.cat(this).then(options => - { - this.static_options = cleanSelectOptions(options); - this.requestUpdate("select_options"); - }); - } - - if(changedProperties.has("value") || changedProperties.has('select_options')) - { - this.doLabelChange() - } - } - - /** - * Override from parent (SlSelect) to customise display of the current value. - * Here's where we add the icon & color border - */ - doLabelChange() - { - // Update the display label when checked menu item's label changes - if(this.multiple) - { - return; - } - - const checkedItem = this.menuItems.find(item => item.value === this.value); - this.displayLabel = checkedItem ? checkedItem.textContent : ''; - this.querySelector("[slot=prefix].tag_image")?.remove(); - if(checkedItem) - { - let image = this._createImage(checkedItem) - if(image) - { - this.append(image); - } - this.dropdown.querySelector(".select__control").style.borderColor = - getComputedStyle(checkedItem).getPropertyValue("--category-color") || ""; - } - } - - /** - * Render select_options as child DOM Nodes - * - * Overridden here so we can re-do the displayed label after first load of select options. - * Initial load order / lifecycle does not have all the options at the right time - * @protected - */ - protected _renderOptions() - { - // @ts-ignore Doesn't know about Et2WidgetWithSelectMixin._renderOptions() - return super._renderOptions().then(() => - { - // @ts-ignore Doesn't know about SlSelect.menuItems - if(this.menuItems.length > 0) - { - this.doLabelChange(); - } - }); - } - - /** - * Use a custom tag for when multiple=true - * - * @returns {string} - */ - get tagTag() : string - { - return "et2-category-tag"; - } - - /** - * Customise how tags are rendered. - * This overrides parent to set application - * - * @param item - * @protected - */ - protected _createTagNode(item) - { - let tag = super._createTagNode(item); - tag.application = this.application; - return tag; - } -} - -customElements.define("et2-select-cat", Et2SelectCategory); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2SelectCountry.ts b/api/js/etemplate/Et2Select/Et2SelectCountry.ts deleted file mode 100644 index 1cd7d3aaa9..0000000000 --- a/api/js/etemplate/Et2Select/Et2SelectCountry.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * EGroupware eTemplate2 - Select Country WebComponent - * - * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License - * @package api - * @link https://www.egroupware.org - * @author Nathan Gray - */ - - -import {Et2Select} from "./Et2Select"; -import {Et2StaticSelectMixin, StaticOptions as so} from "./StaticOptions"; -import {egw} from "../../jsapi/egw_global"; -import {SelectOption} from "./FindSelectOptions"; - -/** - * Customised Select widget for countries - * This widget uses CSS from api/templates/default/css/flags.css to set flags - */ -egw(window).includeCSS("api/templates/default/css/flags.css") - -export class Et2SelectCountry extends Et2StaticSelectMixin(Et2Select) -{ - static get properties() - { - return { - ...super.properties, - /* Reflect the value so we can use CSS selectors */ - value: {type: String, reflect: true} - } - } - - constructor() - { - super(); - - this.search = true; - - (>so.country(this, {}, true)).then(options => - { - this.static_options = options - this.requestUpdate("select_options"); - }); - } - - connectedCallback() - { - super.connectedCallback(); - - // Add element for current value flag - this.querySelector("[slot=prefix].tag_image")?.remove(); - let image = document.createElement("span"); - image.slot = "prefix"; - image.classList.add("tag_image", "flag"); - this.appendChild(image); - } -} - -customElements.define("et2-select-country", Et2SelectCountry); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2WidgetWithSelectMixin.ts b/api/js/etemplate/Et2Select/Et2WidgetWithSelectMixin.ts index 3095045b07..449adac54c 100644 --- a/api/js/etemplate/Et2Select/Et2WidgetWithSelectMixin.ts +++ b/api/js/etemplate/Et2Select/Et2WidgetWithSelectMixin.ts @@ -8,7 +8,8 @@ */ import {Et2InputWidget, Et2InputWidgetInterface} from "../Et2InputWidget/Et2InputWidget"; -import {html, LitElement, PropertyValues, render, TemplateResult} from "@lion/core"; +import {html, LitElement, PropertyValues, render, TemplateResult} from "lit"; +import {property} from "lit/decorators/property.js"; import {et2_readAttrWithDefault} from "../et2_core_xml"; import {cleanSelectOptions, find_select_options, SelectOption} from "./FindSelectOptions"; import {SearchMixinInterface} from "./SearchMixin"; @@ -17,7 +18,7 @@ import {SearchMixinInterface} from "./SearchMixin"; * Base class for things that do selectbox type behaviour, to avoid putting too much or copying into read-only * selectboxes, also for common handling of properties for more special selectboxes. * - * As with most other widgets that extend Lion components, do not override render(). + * As with most other widgets that extend Shoelace components, do not override render() without good reason. * To extend this mixin, override: * - _optionTargetNode(): Return the HTMLElement where the "options" go. * - _optionTemplate(option:SelectOption): Renders the option. To use a special widget, use its tag in render. @@ -46,46 +47,54 @@ import {SearchMixinInterface} from "./SearchMixin"; * You can specify something else, or return {} to do your own thing. This is a little more complicated. You should * also override _inputGroupInputTemplate() to do what you normally would in render(). * - * - * Technical note: - * LionSelect (and any other LionField) use slots to wrap a real DOM node. ET2 doesn't expect this, - * so we have to create the input node (via slots()) and respect that it is _external_ to the Web Component. - * This complicates things like adding the options, since we can't just override _inputGroupInputTemplate() - * and include them when rendering - the parent expects to find the >(superclass @blur=${this.stopEdit.bind(this)} />`; } - // I can't figure out how to get this full width via CSS return html` - + ${edit} +
`; } protected _noResultsTemplate() { + if(this._total_result_count !== 0 || !this._searchInputNode?.value) + { + return nothing; + } + return html`
${this.egw().lang("no suggestions")}
`; } @@ -496,7 +503,7 @@ export const Et2WithSearchMixin = >(superclass return !this.readonly && (this.search || this.searchUrl.length > 0); } - protected get _searchInputNode() : HTMLInputElement + protected get _searchInputNode() : Et2Textbox { return this._activeControls?.querySelector("#search"); } @@ -512,6 +519,10 @@ export const Et2WithSearchMixin = >(superclass this.querySelector(".search_input"); } + protected get optionTag() + { + return 'sl-option'; + } /** * Only local options, excludes server options @@ -520,7 +531,7 @@ export const Et2WithSearchMixin = >(superclass */ protected get localItems() : NodeList { - return this.querySelectorAll(this.optionTag + ":not(.remote)"); + return this.select.querySelectorAll(this.optionTag + ":not(.remote)"); } /** @@ -530,7 +541,7 @@ export const Et2WithSearchMixin = >(superclass */ protected get remoteItems() : NodeList { - return this.querySelectorAll(this.optionTag + ".remote"); + return this.select?.querySelectorAll(this.optionTag + ".remote") ?? []; } /** @@ -540,7 +551,7 @@ export const Et2WithSearchMixin = >(superclass */ protected get freeEntries() : NodeList { - return this.querySelectorAll(this.optionTag + ".freeEntry"); + return this.select?.querySelectorAll(this.optionTag + ".freeEntry") ?? []; } get select_options() : SelectOption[] @@ -553,11 +564,14 @@ export const Et2WithSearchMixin = >(superclass // Any kept remote options options = options.concat(this._selected_remote ?? []); + // Current search results + options = options.concat(this._remote_options ?? []); + if(this.allowFreeEntries) { - this.freeEntries.forEach((item : SlMenuItem) => + this.freeEntries.forEach((item : SlOption) => { - if(!options.some(i => i.value == item.value)) + if(!options.some(i => i.value == item.value.replaceAll("___", " "))) { options.push({value: item.value, label: item.textContent, class: item.classList.toString()}); } @@ -595,11 +609,11 @@ export const Et2WithSearchMixin = >(superclass { return; } - + // If widget is currently open, we may need to re-calculate search / dropdown positioning if(this.isOpen) { - this.handleMenuShow(); + this._handleMenuShow(); } } @@ -619,7 +633,7 @@ export const Et2WithSearchMixin = >(superclass this.remoteSearch(newValueElement, this.searchOptions).then((result : SelectOption[]) => { const option = result.find(o => o.value == newValueElement); - if(option) + if(option && !this._selected_remote.some(o => o.value == newValueElement)) { this._selected_remote.push(option); } @@ -636,7 +650,7 @@ export const Et2WithSearchMixin = >(superclass const valueArray = Array.isArray(this.value) ? this.value : (!this.value ? [] : this.value.toString().split(',')); // Check any already found options - if(Object.values(this.menuItems).filter((option) => valueArray.find(val => val == option.value)).length === 0) + if(Object.values(this.getAllOptions()).filter((option) => valueArray.find(val => val == option.value)).length === 0) { return false; } @@ -648,7 +662,9 @@ export const Et2WithSearchMixin = >(superclass protected _bindListeners() { this.addEventListener("sl-clear", this._handleClear); + this.addEventListener("sl-show", this._handleMenuShow); this.addEventListener("sl-after-show", this._handleAfterShow); + this.addEventListener("sl-hide", this._handleMenuHide); // Need our own change to catch the change event from search input this.addEventListener("change", this._handleChange); @@ -668,14 +684,16 @@ export const Et2WithSearchMixin = >(superclass this._searchInputNode?.removeEventListener("change", this._searchInputNode.handleChange); this._searchInputNode?.addEventListener("change", this._handleSearchChange); - this.dropdown.querySelector('.select__label').addEventListener("change", this.handleTagEdit); + // this.dropdown.querySelector('.select__label').addEventListener("change", this.handleTagEdit); }); } protected _unbindListeners() { this.removeEventListener("sl-select", this._handleSelect); + this.removeEventListener("sl-show", this._handleMenuShow); this.removeEventListener("sl-after-show", this._handleAfterShow); + this.removeEventListener("sl-hide", this._handleMenuHide); this.removeEventListener("sl-clear", this._handleClear) this.removeEventListener("change", this._handleChange); this.removeEventListener("paste", this._handlePaste); @@ -683,25 +701,23 @@ export const Et2WithSearchMixin = >(superclass this._searchInputNode?.removeEventListener("change", this._handleSearchChange); } - handleMenuShow() + _handleMenuShow() { if(this.readonly) { return; } + this.setAttribute("open", ""); + // Move search (& menu) if there's no value this._activeControls?.classList.toggle("novalue", this.multiple && this.value == '' || !this.multiple); // Reset for parent calculations, will be adjusted after if needed - this.dropdown.setAttribute("distance", 0); - - super.handleMenuShow(); + //this.dropdown.setAttribute("distance", 0); if(this.searchEnabled || this.allowFreeEntries) { this._activeControls?.classList.add("active"); - this._searchInputNode.focus(); - this._searchInputNode.select(); // Hide edit explicitly since it's so hard via CSS if(this._editInputNode) { @@ -724,6 +740,12 @@ export const Et2WithSearchMixin = >(superclass */ _handleAfterShow() { + if(this.searchEnabled || this.allowFreeEntries) + { + this._searchInputNode.focus(); + this._searchInputNode.select(); + } + return; // Need to give positioner a chance to position. // If we call it right away, it has not updated. // I haven't found an event or Promise to hook on to @@ -744,24 +766,26 @@ export const Et2WithSearchMixin = >(superclass ); } }, 100); + } focus() { - this.dropdown?.show().then(() => + this.show().then(() => { - this._searchInputNode.focus(); + this._searchInputNode?.focus(); }); } - handleMenuHide() + _handleMenuHide() { if(this.readonly) { return; } - clearTimeout(this._searchTimeout); - super.handleMenuHide(); + this.removeAttribute("open"); + + this.clearSearch(); // Reset display if(this._searchInputNode) @@ -773,11 +797,7 @@ export const Et2WithSearchMixin = >(superclass this._editInputNode.style.display = ""; } - if(this.searchEnabled || this.allowFreeEntries) - { - this._activeControls?.classList.remove("active"); - this.shadowRoot.querySelector('.select__label').style.display = ""; - } + this._activeControls?.classList.remove("active"); } _triggerChange(event) @@ -789,6 +809,10 @@ export const Et2WithSearchMixin = >(superclass event.preventDefault(); return false; } + + // Find and keep any selected remote entries + // Doing it here catches keypress changes too + this._keepSelectedRemote(); return true; } @@ -815,24 +839,53 @@ export const Et2WithSearchMixin = >(superclass // Find the tag const path = event.composedPath(); const tag = path.find((el) => el instanceof Et2Tag); - this.dropdown.hide(); + this.hide(); this.updateComplete.then(() => { tag.startEdit(event); }); } + _keepSelectedRemote() + { + this.select.querySelectorAll("[aria-selected=true].remote").forEach((node) => + { + const value = node.value.replaceAll("___", " "); + if(!node.selected || this._selected_remote.some(o => o.value == value)) + { + return; + } + const filter = (options) => + { + for(let i = options.length - 1; i >= 0; i--) + { + if(Array.isArray(options[i].value)) + { + filter(options[i].value); + } + else if(options[i].value == value) + { + this._selected_remote.push(options[i]); + options.splice(i, 1); + } + } + } + filter(this._remote_options) + }); + } /** * An option was selected */ - handleMenuSelect(event) + handleOptionClick(event) { - // Need to keep the remote option - only if selected - if(event.detail.item.classList.contains("remote") && !this.select_options.find(o => o.value == event.detail.item.value)) + // Only interested in option clicks, but handler is bound higher + if(event.target.tagName !== "SL-OPTION") { - this._selected_remote.push({...event.detail.item.option}); + return; } - super.handleMenuSelect(event); + + if(typeof super.handleOptionClick == "function") + super.handleOptionClick(event); this.updateComplete.then(() => { @@ -841,25 +894,6 @@ export const Et2WithSearchMixin = >(superclass { this._searchInputNode.focus(); this._searchInputNode.select(); - - // If we were overlapping, reset - if(this._activeControls.classList.contains("novalue")) - { - this.handleMenuShow(); - this._handleAfterShow(); - } - - // Scroll the new tag into view - if(event.detail && event.detail.item) - { - // Causes sidemenu (calendar) to scroll to top & get stuck - /* - this.updateComplete.then(() => - { - this.shadowRoot.querySelector("et2-tag[value='" + event.detail.item.value.replace(/'/g, "\\\'") + "']")?.scrollIntoView({block: "nearest"}); - }); - */ - } } else if(!this.multiple && this.searchEnabled) { @@ -876,17 +910,14 @@ export const Et2WithSearchMixin = >(superclass _handleClear(e) { // Only keep remote options that are still used - this._selected_remote = this._selected_remote.filter((option) => this.getValueAsArray().indexOf(option.value) !== -1); + this._selected_remote = this._selected_remote.filter((option) => this.value.indexOf(option.value) !== -1); if(!this.multiple && this.searchEnabled) { this._handleSearchAbort(e); - // Restore label styling - this.shadowRoot.querySelector("[part='display-label']").style.display = ""; - // Start searching again - this.updateComplete.then(() => this.handleMenuShow()) + this._handleMenuShow(); } } @@ -901,17 +932,6 @@ export const Et2WithSearchMixin = >(superclass async _handleSearchBlur(event : FocusEvent) { clearTimeout(this._searchTimeout); - if(event.relatedTarget && event.relatedTarget instanceof SlMenuItem) - { - return; - } - - // Try any value they had in progress - if(this._searchInputNode.value && this.allowFreeEntries) - { - this.createFreeEntry(this._searchInputNode.value); - } - this.clearSearch(); } /** @@ -923,15 +943,14 @@ export const Et2WithSearchMixin = >(superclass { clearTimeout(this._searchTimeout); this._activeControls?.classList.add("active"); - this.dropdown.show(); // Pass off some keys to select if(['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key)) { // Strip out hidden non-matching selected & disabled items so key navigation works - this.menuItems = this.menuItems.filter(i => !i.disabled); - return super.handleKeyDown(event); + // TODO + return; } event.stopPropagation(); @@ -941,12 +960,12 @@ export const Et2WithSearchMixin = >(superclass { event.preventDefault(); this._searchInputNode.value = ""; - this.dropdown.hide().then(async() => + this.updateComplete.then(async() => { // update sizing / position before getting ready for another one if(this.multiple) { - await this.dropdown.show(); + // await this.show(); this._searchInputNode.focus(); } }); @@ -960,7 +979,7 @@ export const Et2WithSearchMixin = >(superclass else if(event.key == "Escape") { this._handleSearchAbort(event); - this.dropdown.hide(); + this.hide(); return; } @@ -972,6 +991,17 @@ export const Et2WithSearchMixin = >(superclass } } + /** + * Combobox listens for mousedown, which interferes with search clear button. + * Here we block it from bubbling + * @param {MouseEvent} event + * @protected + */ + protected _handleSearchMouseDown(event : MouseEvent) + { + event.stopPropagation(); + } + protected _handleEditKeyDown(event : KeyboardEvent) { // Stop propagation, or parent key handler will add again @@ -1030,19 +1060,22 @@ export const Et2WithSearchMixin = >(superclass // Stop timeout timer clearTimeout(this._searchTimeout); + this.setAttribute("searching", ""); + // Show a spinner let spinner = document.createElement("sl-spinner"); - spinner.slot = "suffix"; - this.appendChild(spinner); + spinner.slot = "expand-icon"; + this.select.appendChild(spinner); // Hide clear button - let clear_button = this._searchInputNode.shadowRoot.querySelector(".input__clear") + let clear_button = this._searchInputNode?.shadowRoot?.querySelector(".input__clear"); if(clear_button) { clear_button.style.display = "none"; } // Clear previous results + this._total_result_count = 0; this._clearResults(); await this.updateComplete; @@ -1050,17 +1083,9 @@ export const Et2WithSearchMixin = >(superclass return Promise.all([ this.localSearch(this._searchInputNode.value, this.searchOptions), this.remoteSearch(this._searchInputNode.value, this.searchOptions) - ]).then(() => + ]).then(async() => { - // Show no results indicator - if(this.menuItems.filter(e => !e.classList.contains("no-match")).length == 0) - { - let target = this._optionTargetNode || this; - let temp = document.createElement("div"); - render(this._noResultsTemplate(), temp); - target.append(temp.children[0]); - } - + this.removeAttribute("searching"); // Remove spinner spinner.remove(); @@ -1069,13 +1094,7 @@ export const Et2WithSearchMixin = >(superclass { clear_button.style.display = ""; } - }).then(() => - { - // Not sure why this stays hidden if there's no results, but it sticks and hides all results afterward - this.dropdown.shadowRoot.querySelector(".dropdown__panel").removeAttribute("hidden"); - - // Call our resize stuff explicitly - this._handleAfterShow(); + await this.updateComplete; }); } @@ -1102,35 +1121,26 @@ export const Et2WithSearchMixin = >(superclass { let target = this._optionTargetNode || this; - // Remove "no suggestions" - target.querySelector(".no-results")?.remove(); + this._keepSelectedRemote(); - // Remove any previously selected remote options that aren't used anymore - this._selected_remote = this._selected_remote.filter((option) => + this._remote_options = []; + + this._total_result_count = 0; + + // Not searching anymore, clear flag + const clear_flag = (option) => { - return this.multiple ? this.value.indexOf(option.value) != -1 : this.value == option.value; - }); - // Remove remote options that aren't used - let keepers = this._selected_remote.reduce((prev, current) => - { - return prev + ":not([value='" + ('' + current.value).replace(/'/g, "\\\'") + "'])"; - }, ""); - target.querySelectorAll(".remote" + keepers).forEach(o => o.remove()); - target.childNodes.forEach((n) => - { - if(n.nodeType == Node.COMMENT_NODE) + if(Array.isArray(option.value)) { - n.remove(); + option.value.map(clear_flag) } - }) - - // Reset remaining options. It might be faster to re-create instead. - this._menuItems.forEach((item) => - { - item.disabled = item.option?.disabled || false; - item.classList.remove("match"); - item.classList.remove("no-match"); - }); + else + { + option.isMatch = null + } + } + this.select_options.map(clear_flag); + this.requestUpdate("select_options"); } /** @@ -1143,14 +1153,11 @@ export const Et2WithSearchMixin = >(superclass { return new Promise((resolve) => { - this.localItems.forEach((item) => + this.select_options.forEach((option) => { - let match = this.searchMatch(search, item); - item.classList.toggle("match", match); - // set disabled so arrow keys step over. Might be a better way to handle that - item.disabled = !match; - item.classList.toggle("no-match", !match); + option.isMatch = this.searchMatch(search, option); }) + this.requestUpdate("select_options"); resolve(); }); } @@ -1203,13 +1210,13 @@ export const Et2WithSearchMixin = >(superclass return option.label.toLowerCase().includes(lower_search) || option.value.includes(search) }); // Limit results - const totalCount = filtered.length; + this._total_result_count += filtered.length; if(filtered.length > Et2WidgetWithSearch.RESULT_LIMIT) { filtered.splice(Et2WidgetWithSearch.RESULT_LIMIT); } // Add the matches - this.processRemoteResults(filtered, totalCount); + this._total_result_count -= this.processRemoteResults(filtered); return filtered; }) .catch((_err) => @@ -1247,84 +1254,74 @@ export const Et2WithSearchMixin = >(superclass { // If results have a total included, pull it out. // It will cause errors if left in the results - let total = null; if(typeof results.total !== "undefined") { - total = results.total; + this._total_result_count += results.total; delete results.total; + // Make it an array, since it was probably an object, and cleanSelectOptions() treats objects differently + results = Object.values(results); + } + else + { + this._total_result_count += results.length; } let entries = cleanSelectOptions(results); - this.processRemoteResults(entries, total); + let entryCount = entries.length; + this._total_result_count -= this.processRemoteResults(entries); + return entries; }); } /** * Add in remote results + * + * Any results that already exist will be removed to avoid duplicates + * * @param results - * @param totalResults If there are more results than were returned, total number of matches + * @return Duplicate count * @protected */ - protected processRemoteResults(entries, totalResults = 0) + protected processRemoteResults(entries) { - let resultCount = entries.length; - - if(entries.length == 0) + if(!entries?.length) { - return Promise.resolve(); + return 0; } - // Add a "remote" class so we can tell these apart from any local results - entries.forEach((entry) => entry.class = (entry.class || "") + " remote"); + let duplicateCount = 0; - let target = this._optionTargetNode || this; - if(target) + const process = (entries) => { - // Add in remote options, avoiding duplicates - this.select_options.filter(function(item) + // Add a "remote" class so we can tell these apart from any local results + for(let i = entries.length - 1; i >= 0; i--) { - let i = entries.findIndex(x => (x.value == item.value)); - if(i <= -1) + const entry = entries[i]; + entry.class = (entry.class || "") + " remote"; + + // Handle option groups + if(Array.isArray(entry.value)) { - entries.push(item); + process(entry.value); + continue; } - return null; - }); - let options = html`${entries.map(this._optionTemplate.bind(this))}`; + // Server says it's a match + entry.isMatch = true; - /** - * Add in new options. - * Rendering directly into target will remove existing options, which we don't need to do - */ - - let temp_target = document.createElement("div"); - - render(options, temp_target); - return Promise.all(([...temp_target.querySelectorAll(":scope > *")].map(item => item.render))) - .then(() => + // Avoid duplicates with existing options + if(this.select_options.some(o => o.value == entry.value)) { - temp_target.querySelectorAll(":scope > *").forEach((item) => - { - // Avoid duplicate error - if(!target.querySelector("[value='" + ('' + item.value).replace(/'/g, "\\\'") + "']")) - { - target.appendChild(item); - } - }) - this.handleMenuSlotChange(); - }) - .then(() => - { - if(totalResults && totalResults > resultCount) - { - // More results available that were not sent - let count = document.createElement("span") - count.classList.add("remote"); - count.textContent = this.egw().lang("%1 more...", totalResults - resultCount); - target.appendChild(count); - } - }); + duplicateCount++ + entries.splice(i, 1); + } + } } + process(entries); + + this._remote_options = entries; + this.requestUpdate("select_options"); + + return duplicateCount; } /** @@ -1335,21 +1332,21 @@ export const Et2WithSearchMixin = >(superclass * @returns {boolean} * @protected */ - protected searchMatch(search, item) : boolean + protected searchMatch(search, option : SelectOption) : boolean { - if(!item || !item.value) + if(!option || !option.value) { return false; } - if(item.textContent?.toLowerCase().includes(search.toLowerCase())) + if(option.label?.toLowerCase().includes(search.toLowerCase())) { return true; } - if(typeof item.value == "string") + if(typeof option.value == "string") { - return item.value.includes(search.toLowerCase()); + return option.value.includes(search.toLowerCase()); } - return item.value == search; + return option.value == search; } /** @@ -1364,7 +1361,7 @@ export const Et2WithSearchMixin = >(superclass return false; } // Make sure not to double-add - if(!this.querySelector("[value='" + text.replace(/'/g, "\\\'") + "']") && !this.__select_options.find(o => o.value == text)) + if(!this.querySelector("[value='" + text.replace(/'/g, "\\\'") + "']") && !this.select_options.find(o => o.value == text)) { this.__select_options.push({ value: text.trim(), @@ -1374,16 +1371,18 @@ export const Et2WithSearchMixin = >(superclass this.requestUpdate('select_options'); } - // Make sure not to double-add - if(this.multiple && this.value.indexOf(text) == -1) + // Make sure not to double-add, but wait until the option is there + if(this.multiple && this.getValueAsArray().indexOf(text) == -1) { - this.value.push(text); + let value = this.getValueAsArray(); + value.push(text); + this.value = value; } else if(!this.multiple && this.value !== text) { this.value = text; } - this.requestUpdate("value"); + this.dispatchEvent(new Event("change", {bubbles: true})); // If we were overlapping edit inputbox with the value display, reset if(!this.readonly && this._activeControls?.classList.contains("novalue")) @@ -1437,7 +1436,6 @@ export const Et2WithSearchMixin = >(superclass { this.value = value; } - this.querySelector("[value='" + original.replace(/'/g, "\\\'") + "']")?.remove(); this.__select_options = this.__select_options.filter(v => v.value !== original); } } @@ -1474,7 +1472,7 @@ export const Et2WithSearchMixin = >(superclass // type to select will focus matching entries, but we don't want to stop the edit yet if(typeof abort == "object" && abort.type == "blur") { - if(abort.relatedTarget?.localName == "sl-menu-item") + if(abort.relatedTarget?.localName == this.optionTag) { return; } @@ -1526,14 +1524,12 @@ export const Et2WithSearchMixin = >(superclass this.dropdown.panel.setAttribute("hidden", ""); }); } - this.syncItemsFromValue(); } protected _handleSearchAbort(e) { this._activeControls.classList.remove("active"); this.clearSearch(); - this.syncItemsFromValue(); } /** @@ -1548,7 +1544,14 @@ export const Et2WithSearchMixin = >(superclass e.preventDefault(); return false; } + + protected _handleSearchClear(e) + { + e.stopImmediatePropagation(); + e.preventDefault(); + this.clearSearch(); + } } return Et2WidgetWithSearch as unknown as Constructor & T; -} \ No newline at end of file +}); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2SelectAccount.ts b/api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts similarity index 67% rename from api/js/etemplate/Et2Select/Et2SelectAccount.ts rename to api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts index 850f061ac1..e92f9b0ecd 100644 --- a/api/js/etemplate/Et2Select/Et2SelectAccount.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts @@ -7,13 +7,13 @@ * @author Ralf Becker */ -import {Et2Select} from "./Et2Select"; -import {cleanSelectOptions, SelectOption} from "./FindSelectOptions"; -import {SelectAccountMixin} from "./SelectAccountMixin"; -import {Et2StaticSelectMixin} from "./StaticOptions"; -import {html, nothing} from "@lion/core"; +import {Et2Select} from "../Et2Select"; +import {cleanSelectOptions, SelectOption} from "../FindSelectOptions"; +import {SelectAccountMixin} from "../SelectAccountMixin"; +import {Et2StaticSelectMixin} from "../StaticOptions"; +import {html, nothing} from "lit"; -export type AccountType = 'accounts'|'groups'|'both'|'owngroups'; +export type AccountType = 'accounts' | 'groups' | 'both' | 'owngroups'; /** * @customElement et2-select-account @@ -51,32 +51,47 @@ export class Et2SelectAccount extends SelectAccountMixin(Et2StaticSelectMixin(Et super.connectedCallback(); // Start fetch of select_options + this.fetchComplete = this._getAccounts(); + } + + /** + * Pre-fill the account list according to type & preferences + * + * @protected + * @internal + */ + protected _getAccounts() + { const type = this.egw().preference('account_selection', 'common'); let fetch = []; + let process = (options) => + { + // Shallow copy to avoid re-using the same object. + // Uses more memory, but otherwise multiple selectboxes get "tied" together + let cleaned = cleanSelectOptions(options) + // slice to avoid problems with lots of accounts + .slice(0, /* Et2WidgetWithSearch.RESULT_LIMIT */ 100); + this.account_options = this.account_options.concat(cleaned); + }; // for primary_group we only display owngroups == own memberships, not other groups if(type === 'primary_group' && this.accountType !== 'accounts') { if(this.accountType === 'both') { - fetch.push(this.egw().accounts('accounts').then(options => {this.static_options = this.static_options.concat(cleanSelectOptions(options))})); + fetch.push(this.egw().accounts('accounts').then(process)); } - fetch.push(this.egw().accounts('owngroups').then(options => {this.static_options = this.static_options.concat(cleanSelectOptions(options))})); + fetch.push(this.egw().accounts('owngroups').then(process)); } - else if(["primary_group", "groupmembers"].includes(type)) + else if(type !== "none") { - fetch.push(this.egw().accounts(this.accountType).then(options => {this.static_options = this.static_options.concat(cleanSelectOptions(options))})); + fetch.push(this.egw().accounts(this.accountType).then(process)); } - this.fetchComplete = Promise.all(fetch) - .then(() => this._renderOptions()); - } - - firstUpdated(changedProperties?) - { - super.firstUpdated(changedProperties); - // Due to the different way Et2SelectAccount handles options, we call this explicitly - this._renderOptions(); + return Promise.all(fetch).then(() => + { + this.requestUpdate("select_options"); + }); } set accountType(type : AccountType) @@ -102,12 +117,7 @@ export class Et2SelectAccount extends SelectAccountMixin(Et2StaticSelectMixin(Et { return []; } - let select_options : Array = [...(this.static_options || []), ...super.select_options]; - - return select_options.filter((value, index, self) => - { - return self.findIndex(v => v.value === value.value) === index; - }); + return super.select_options; } set select_options(new_options : SelectOption[]) diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectApp.ts b/api/js/etemplate/Et2Select/Select/Et2SelectApp.ts new file mode 100644 index 0000000000..c748c6edad --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectApp.ts @@ -0,0 +1,17 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions as so} from "../StaticOptions"; +import {cleanSelectOptions} from "../FindSelectOptions"; + +export class Et2SelectApp extends Et2StaticSelectMixin(Et2Select) +{ + public connectedCallback() + { + super.connectedCallback() + this.fetchComplete = so.app(this, {}).then((options) => + { + this.set_static_options(cleanSelectOptions(options)); + }) + } +} + +customElements.define("et2-select-app", Et2SelectApp); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectBitwise.ts b/api/js/etemplate/Et2Select/Select/Et2SelectBitwise.ts new file mode 100644 index 0000000000..84d8abf661 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectBitwise.ts @@ -0,0 +1,26 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin} from "../StaticOptions"; + +export class Et2SelectBitwise extends Et2StaticSelectMixin(Et2Select) +{ + /* currently handled server-side */ + /* + set value(new_value) + { + let oldValue = this._value; + let expanded_value = []; + let options = this.select_options; + for(let index in options) + { + let right = parseInt(options[index].value); + if(!!(new_value & right)) + { + expanded_value.push(right); + } + } + super.value = expanded_value; + } + */ +} + +customElements.define("et2-select-bitwise", Et2SelectBitwise); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectBool.ts b/api/js/etemplate/Et2Select/Select/Et2SelectBool.ts new file mode 100644 index 0000000000..f91675acfa --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectBool.ts @@ -0,0 +1,28 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; + +export class Et2SelectBool extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + + this._static_options = StaticOptions.bool(this); + } + + get value() + { + return super.value; + } + + /** + * Boolean option values are "0" and "1", so change boolean to those + * @param {string | string[]} new_value + */ + set value(new_value) + { + super.value = new_value ? "1" : "0"; + } +} + +customElements.define("et2-select-bool", Et2SelectBool); diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts b/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts new file mode 100644 index 0000000000..084627bcc5 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts @@ -0,0 +1,145 @@ +/** + * EGroupware eTemplate2 - Select Category WebComponent + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @package api + * @link https://www.egroupware.org + * @author Nathan Gray + */ + + +import {css, html, nothing, PropertyValues, TemplateResult, unsafeCSS} from "lit"; +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions as so} from "../StaticOptions"; +import {cleanSelectOptions} from "../FindSelectOptions"; +import {StaticValue} from "lit/development/static-html"; +import {literal} from "lit/static-html.js"; +import {repeat} from "lit/directives/repeat.js"; + +/** + * Customised Select widget for categories + * This widget gives us category colors and icons in the options and selected value. + */ +export class Et2SelectCategory extends Et2StaticSelectMixin(Et2Select) +{ + static get styles() + { + return [ + ...super.styles, + css` + /* Category color on options */ + + sl-option { + border-left: 6px solid var(--category-color, transparent); + } + /* Border on the (single) selected value */ + + :host(:not([multiple]))::part(combobox) { + border-left: 6px solid var(--category-color, var(--sl-input-border-color)); + } + ` + ] + } + + static get properties() + { + return { + ...super.properties, + /** + * Include global categories + */ + globalCategories: {type: Boolean}, + /** + * Show categories from this application. If not set, will be the current application + */ + application: {type: String}, + /** + * Show categories below this parent category + */ + parentCat: {type: Number} + } + } + + constructor() + { + super(); + // we should not translate categories name + this.noLang = true; + } + + async connectedCallback() + { + super.connectedCallback(); + + if(typeof this.application == 'undefined') + { + this.application = + // When the widget is first created, it doesn't have a parent and can't find it's instanceManager + (this.getInstanceManager() && this.getInstanceManager().app) || + this.egw().app_name(); + } + } + + + willUpdate(changedProperties : PropertyValues) + { + super.willUpdate(changedProperties); + + if(changedProperties.has("global_categories") || changedProperties.has("application") || changedProperties.has("parentCat")) + { + this.fetchComplete = so.cat(this).then(options => + { + this._static_options = cleanSelectOptions(options); + this.requestUpdate("select_options"); + }); + } + } + + + protected handleValueChange(e) + { + super.handleValueChange(e); + + // Just re-draw to get the colors & icon + this.requestUpdate(); + } + + /** + * Custom, dynamic styling + * + * CSS variables are not making it through to options, re-declaring them here works + * + * @returns {TemplateResult} + * @protected + */ + protected _styleTemplate() : TemplateResult + { + return html` + + `; + } + + /** + * Use a custom tag for when multiple=true + * + * @returns {string} + */ + public get tagTag() : StaticValue + { + return literal`et2-category-tag`; + } +} + +customElements.define("et2-select-cat", Et2SelectCategory); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts b/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts new file mode 100644 index 0000000000..4c364c0837 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts @@ -0,0 +1,97 @@ +/** + * EGroupware eTemplate2 - Select Country WebComponent + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @package api + * @link https://www.egroupware.org + * @author Nathan Gray + */ + + +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions as so} from "../StaticOptions"; +import {egw} from "../../../jsapi/egw_global"; +import {SelectOption} from "../FindSelectOptions"; +import {html} from "lit"; + +/** + * Customised Select widget for countries + * This widget uses CSS from api/templates/default/css/flags.css to set flags + */ +egw(window).includeCSS("api/templates/default/css/flags.css") + +export class Et2SelectCountry extends Et2StaticSelectMixin(Et2Select) +{ + static get properties() + { + return { + ...super.properties, + /* Reflect the value so we can use CSS selectors */ + value: {type: String, reflect: true} + } + } + + constructor() + { + super(); + + this.search = true; + + (>so.country(this, {}, true)).then(options => + { + this._static_options = options + this.requestUpdate("select_options"); + }); + } + + connectedCallback() + { + super.connectedCallback(); + } + + /** + * Get the element for the flag + * + * @param option + * @protected + */ + protected _iconTemplate(option) + { + return html` + + `; + } + + /** + * Used to render each option into the select + * Override to get flags in + * + * @param {SelectOption} option + * @returns {TemplateResult} + * + protected _optionTemplate(option : SelectOption) : TemplateResult + { + // Exclude non-matches when searching + if(typeof option.isMatch == "boolean" && !option.isMatch) + { + return html``; + } + + return html` + v == value)} + ?disabled=${option.disabled} + > + ${this._iconTemplate(option)} + ${this.noLang ? option.label : this.egw().lang(option.label)} + `; + } + */ +} + +customElements.define("et2-select-country", Et2SelectCountry); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectDay.ts b/api/js/etemplate/Et2Select/Select/Et2SelectDay.ts new file mode 100644 index 0000000000..e2979c5c7b --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectDay.ts @@ -0,0 +1,14 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions as so} from "../StaticOptions"; + +export class Et2SelectDay extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + + this._static_options = so.day(this, {}); + } +} + +customElements.define("et2-select-day", Et2SelectDay); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectDayOfWeek.ts b/api/js/etemplate/Et2Select/Select/Et2SelectDayOfWeek.ts new file mode 100644 index 0000000000..0ebee30b58 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectDayOfWeek.ts @@ -0,0 +1,53 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; +import {cleanSelectOptions} from "../FindSelectOptions"; + +export class Et2SelectDayOfWeek extends Et2StaticSelectMixin(Et2Select) +{ + connectedCallback() + { + super.connectedCallback(); + + // Wait for connected instead of constructor because attributes make a difference in + // which options are offered + this.fetchComplete = StaticOptions.dow(this, {other: this.other || []}).then(options => + { + this.set_static_options(cleanSelectOptions(options)); + }); + } + + set value(new_value) + { + let expanded_value = typeof new_value == "object" ? new_value : []; + if(new_value && (typeof new_value == "string" || typeof new_value == "number")) + { + let int_value = parseInt(new_value); + this.updateComplete.then(() => + { + this.fetchComplete.then(() => + { + let options = this.select_options; + for(let index in options) + { + let right = parseInt(options[index].value); + + if((int_value & right) == right) + { + expanded_value.push("" + right); + } + } + super.value = expanded_value; + }) + }); + return; + } + super.value = expanded_value; + } + + get value() + { + return super.value; + } +} + +customElements.define("et2-select-dow", Et2SelectDayOfWeek); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2SelectEmail.ts b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts similarity index 84% rename from api/js/etemplate/Et2Select/Et2SelectEmail.ts rename to api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts index 5979a7507a..25ae6edabc 100644 --- a/api/js/etemplate/Et2Select/Et2SelectEmail.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts @@ -7,11 +7,12 @@ * @author Nathan Gray */ -import {Et2Select} from "./Et2Select"; -import {css, html, nothing, PropertyValues} from "@lion/core"; -import {IsEmail} from "../Validators/IsEmail"; +import {Et2Select} from "../Et2Select"; +import {css, html, nothing, PropertyValues} from "lit"; +import {IsEmail} from "../../Validators/IsEmail"; import interact from "@interactjs/interact"; import {Validator} from "@lion/form-core"; +import {classMap} from "lit/directives/class-map.js"; /** * Select email address(es) @@ -100,6 +101,7 @@ export class Et2SelectEmail extends Et2Select this.defaultValidators.push(new IsEmail(this.allowPlaceholder)); } + /** @param {import('@lion/core').PropertyValues } changedProperties */ willUpdate(changedProperties : PropertyValues) { @@ -112,9 +114,38 @@ export class Et2SelectEmail extends Et2Select } } - connectedCallback() + updated(changedProperties : Map) { - super.connectedCallback(); + // Make tags draggable + if(!this.readonly && this.allowFreeEntries && this.allowDragAndDrop) + { + let dragTranslate = {x: 0, y: 0}; + const tags = this.shadowRoot.querySelectorAll(".select__tags [part='tag']"); + let draggable = interact(tags).draggable({ + startAxis: 'xy', + listeners: { + start: function(e) + { + let dragPosition = {x: e.page.x, y: e.page.y}; + dragTranslate = {x: 0, y: 0}; + e.target.setAttribute('style', `width:${e.target.clientWidth}px !important`); + e.target.style.position = 'fixed'; + e.target.style.zIndex = 10; + e.target.style.transform = + `translate(${dragPosition.x}px, ${dragPosition.y}px)`; + }, + move: function(e) + { + dragTranslate.x += e.delta.x; + dragTranslate.y += e.delta.y; + e.target.style.transform = + `translate(${dragTranslate.x}px, ${dragTranslate.y}px)`; + } + } + }); + // set parent_node with widget context in order to make it accessible after drop + draggable.parent_node = this; + } } protected _bindListeners() @@ -145,7 +176,7 @@ export class Et2SelectEmail extends Et2Select } }); } - + /** * Handle keypresses inside the search input * Overridden from parent to also skip the hidden selected options, which other selects do not do @@ -187,55 +218,27 @@ export class Et2SelectEmail extends Et2Select * * @returns {string} */ - get tagTag() : string + _tagTemplate(option, index) { - return "et2-email-tag"; - } + const readonly = (this.readonly || option && typeof (option.disabled) != "undefined" && option.disabled); + const isEditable = this.editModeEnabled && !readonly; - /** - * override tag creation in order to add DND functionality - * @param item - * @protected - */ - protected _createTagNode(item) - { - let tag = super._createTagNode(item); - - tag.fullEmail = this.fullEmail; - tag.onlyEmail = this.onlyEmail; - - // Re-set after setting fullEmail as that can change what we show - tag.textContent = item.getTextLabel().trim(); - - if(!this.readonly && this.allowFreeEntries && this.allowDragAndDrop) - { - let dragTranslate = {x: 0, y: 0}; - tag.class = item.classList.value + " et2-select-draggable"; - let draggable = interact(tag).draggable({ - startAxis: 'xy', - listeners: { - start: function(e) - { - let dragPosition = {x:e.page.x, y:e.page.y}; - e.target.setAttribute('style', `width:${e.target.clientWidth}px !important`); - e.target.style.position = 'fixed'; - e.target.style.zIndex = 10; - e.target.style.transform = - `translate(${dragPosition.x}px, ${dragPosition.y}px)`; - }, - move : function(e) - { - dragTranslate.x += e.delta.x; - dragTranslate.y += e.delta.y; - e.target.style.transform = - `translate(${dragTranslate.x}px, ${dragTranslate.y}px)`; - } - } - }); - // set parent_node with widget context in order to make it accessible after drop - draggable.parent_node = this; - } - return tag; + return html` + + ${option.getTextLabel().trim()} + + `; } /** @@ -258,16 +261,6 @@ export class Et2SelectEmail extends Et2Select `; } - /** - * Override image to skip it, we add images in Et2EmailTag using CSS - * @param item - * @protected - */ - protected _createImage(item) - { - return this.multiple ? "" : super._createImage(item); - } - /** * Overwritten to NOT split RFC822 addresses containing a comma in quoted name part * diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectHour.ts b/api/js/etemplate/Et2Select/Select/Et2SelectHour.ts new file mode 100644 index 0000000000..4423a53d88 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectHour.ts @@ -0,0 +1,14 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; + +export class Et2SelectHour extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + + this._static_options = StaticOptions.hour(this, {other: this.other || []}); + } +} + +customElements.define("et2-select-hour", Et2SelectHour); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectLang.ts b/api/js/etemplate/Et2Select/Select/Et2SelectLang.ts new file mode 100644 index 0000000000..6ea9f7eb3e --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectLang.ts @@ -0,0 +1,14 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; + +export class Et2SelectLang extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + + this._static_options = StaticOptions.lang(this, {other: this.other || []}); + } +} + +customElements.define("et2-select-lang", Et2SelectLang); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectMonth.ts b/api/js/etemplate/Et2Select/Select/Et2SelectMonth.ts new file mode 100644 index 0000000000..72d9a8577a --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectMonth.ts @@ -0,0 +1,14 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; + +export class Et2SelectMonth extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + + this._static_options = StaticOptions.month(this); + } +} + +customElements.define("et2-select-month", Et2SelectMonth); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectNumber.ts b/api/js/etemplate/Et2Select/Select/Et2SelectNumber.ts new file mode 100644 index 0000000000..960dff879b --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectNumber.ts @@ -0,0 +1,52 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; +import {PropertyValues} from 'lit'; + +export class Et2SelectNumber extends Et2StaticSelectMixin(Et2Select) +{ + static get properties() + { + return { + ...super.properties, + /** + * Step between numbers + */ + interval: {type: Number}, + min: {type: Number}, + max: {type: Number}, + + /** + * Add one or more leading zeros + * Set to how many zeros you want (000) + */ + leading_zero: {type: String}, + /** + * Appended after every number + */ + suffix: {type: String} + } + } + + constructor() + { + super(); + this.min = 1; + this.max = 10; + this.interval = 1; + this.leading_zero = ""; + this.suffix = ""; + } + + updated(changedProperties : PropertyValues) + { + super.updated(changedProperties); + + if(changedProperties.has('min') || changedProperties.has('max') || changedProperties.has('interval') || changedProperties.has('suffix')) + { + this._static_options = StaticOptions.number(this); + this.requestUpdate("select_options"); + } + } +} + +customElements.define("et2-select-number", Et2SelectNumber); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectPercent.ts b/api/js/etemplate/Et2Select/Select/Et2SelectPercent.ts new file mode 100644 index 0000000000..491fcb58bc --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectPercent.ts @@ -0,0 +1,15 @@ +import {Et2SelectNumber} from "./Et2SelectNumber"; + +export class Et2SelectPercent extends Et2SelectNumber +{ + constructor() + { + super(); + this.min = 0; + this.max = 100; + this.interval = 10; + this.suffix = "%%"; + } +} + +customElements.define("et2-select-percent", Et2SelectPercent); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectPriority.ts b/api/js/etemplate/Et2Select/Select/Et2SelectPriority.ts new file mode 100644 index 0000000000..265477369f --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectPriority.ts @@ -0,0 +1,14 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; + +export class Et2SelectPriority extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + + this._static_options = StaticOptions.priority(this); + } +} + +customElements.define("et2-select-priority", Et2SelectPriority); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2SelectReadonly.ts b/api/js/etemplate/Et2Select/Select/Et2SelectReadonly.ts similarity index 92% rename from api/js/etemplate/Et2Select/Et2SelectReadonly.ts rename to api/js/etemplate/Et2Select/Select/Et2SelectReadonly.ts index fa5053e954..3c49b1b3b4 100644 --- a/api/js/etemplate/Et2Select/Et2SelectReadonly.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectReadonly.ts @@ -8,12 +8,13 @@ */ -import {css, html, LitElement, repeat, TemplateResult} from "@lion/core"; -import {et2_IDetachedDOM} from "../et2_core_interfaces"; -import {Et2Widget} from "../Et2Widget/Et2Widget"; -import {Et2StaticSelectMixin, StaticOptions, StaticOptions as so} from "./StaticOptions"; -import {cleanSelectOptions, find_select_options, SelectOption} from "./FindSelectOptions"; -import {SelectAccountMixin} from "./SelectAccountMixin"; +import {css, html, LitElement, TemplateResult} from "lit"; +import {repeat} from "lit/directives/repeat.js"; +import {et2_IDetachedDOM} from "../../et2_core_interfaces"; +import {Et2Widget} from "../../Et2Widget/Et2Widget"; +import {Et2StaticSelectMixin, StaticOptions, StaticOptions as so} from "../StaticOptions"; +import {cleanSelectOptions, find_select_options, SelectOption} from "../FindSelectOptions"; +import {SelectAccountMixin} from "../SelectAccountMixin"; /** * This is a stripped-down read-only widget used in nextmatch @@ -143,6 +144,11 @@ li { return this.value; } + getValueAsArray() + { + return (Array.isArray(this.value) ? this.value : [this.value]); + } + set value(new_value : string | string[]) { // Split anything that is still a CSV @@ -206,10 +212,11 @@ li { render() { + const value = this.getValueAsArray(); return html`
    ${repeat( - (Array.isArray(this.value) ? this.value : [this.value]), + this.getValueAsArray(), (val : string) => val, (val) => { let option = (this.select_options).find(option => option.value == val); @@ -282,14 +289,16 @@ customElements.define("et2-select-app_ro", Et2SelectAppReadonly); export class Et2SelectBitwiseReadonly extends Et2SelectReadonly { + /* Currently handled server side, we get an array render() { let new_value = []; + let int_value = parseInt(this.value); for(let index in this.select_options) { let option = this.select_options[index]; let right = parseInt(option && option.value ? option.value : index); - if(!!(this.value & right)) + if(!!(int_value & right)) { new_value.push(right); } @@ -307,6 +316,8 @@ export class Et2SelectBitwiseReadonly extends Et2SelectReadonly })}
`; } + + */ } // @ts-ignore TypeScript is not recognizing that this widget is a LitElement @@ -349,7 +360,6 @@ export class Et2SelectPercentReadonly extends Et2SelectReadonly constructor() { super(...arguments); - this.suffix = "%%"; this.select_options = so.percent(this); } } @@ -391,6 +401,23 @@ export class Et2SelectDayOfWeekReadonly extends Et2StaticSelectMixin(Et2SelectRe this.set_static_options(cleanSelectOptions(options)); }); } + + getValueAsArray() + { + let expanded_value = []; + let int_value = parseInt(this.value); + let options = this.select_options; + for(let index in options) + { + let right = parseInt(options[index].value); + + if((int_value & right) == right) + { + expanded_value.push("" + right); + } + } + return expanded_value; + } } // @ts-ignore TypeScript is not recognizing that this widget is a LitElement @@ -422,7 +449,7 @@ export class Et2SelectNumberReadonly extends Et2StaticSelectMixin(Et2SelectReado { protected find_select_options(_attrs) { - this.static_options = so.number(this, _attrs); + this._static_options = so.number(this, _attrs); } } diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectState.ts b/api/js/etemplate/Et2Select/Select/Et2SelectState.ts new file mode 100644 index 0000000000..9c1ac5336b --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectState.ts @@ -0,0 +1,45 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; +import {SelectOption} from "../FindSelectOptions"; + +export class Et2SelectState extends Et2StaticSelectMixin(Et2Select) +{ + /** + * Two-letter ISO country code + */ + protected __countryCode; + + static get properties() + { + return { + ...super.properties, + countryCode: String, + } + } + + constructor() + { + super(); + + this.countryCode = 'DE'; + } + + get countryCode() + { + return this.__countryCode; + } + + set countryCode(code : string) + { + this.__countryCode = code; + this._static_options = StaticOptions.state(this, {country_code: code}); + this.requestUpdate("select_options"); + } + + set_country_code(code) + { + this.countryCode = code; + } +} + +customElements.define("et2-select-state", Et2SelectState); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectTab.ts b/api/js/etemplate/Et2Select/Select/Et2SelectTab.ts new file mode 100644 index 0000000000..ec39624827 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectTab.ts @@ -0,0 +1,61 @@ +import {Et2SelectApp} from "./Et2SelectApp"; +import {SelectOption} from "../FindSelectOptions"; + +export class Et2SelectTab extends Et2SelectApp +{ + constructor() + { + super(); + + this.allowFreeEntries = true; + } + + set value(new_value) + { + if(!new_value) + { + super.value = new_value; + return; + } + const values = Array.isArray(new_value) ? new_value : [new_value]; + const options = this.select_options; + values.forEach(value => + { + if(!options.filter(option => option.value == value).length) + { + const matches = value.match(/^([a-z0-9]+)\-/i); + let option : SelectOption = {value: value, label: value}; + if(matches) + { + option = options.filter(option => option.value == matches[1])[0] || { + value: value, + label: this.egw().lang(matches[1]) + }; + option.value = value; + option.label += ' ' + this.egw().lang('Tab'); + } + try + { + const app = opener?.framework.getApplicationByName(value); + if(app && app.displayName) + { + option.label = app.displayName; + } + } + catch(e) + { + // ignore security exception, if opener is not accessible + } + this.select_options.concat(option); + } + }) + super.value = new_value; + } + + get value() + { + return super.value; + } +} + +customElements.define("et2-select-tab", Et2SelectTab); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Et2SelectThumbnail.ts b/api/js/etemplate/Et2Select/Select/Et2SelectThumbnail.ts similarity index 95% rename from api/js/etemplate/Et2Select/Et2SelectThumbnail.ts rename to api/js/etemplate/Et2Select/Select/Et2SelectThumbnail.ts index a651703903..1313af2891 100644 --- a/api/js/etemplate/Et2Select/Et2SelectThumbnail.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectThumbnail.ts @@ -7,9 +7,9 @@ * @author Nathan Gray */ -import {Et2Select} from "./Et2Select"; -import {css} from "@lion/core"; -import {SelectOption} from "./FindSelectOptions"; +import {Et2Select} from "../Et2Select"; +import {css} from "lit"; +import {SelectOption} from "../FindSelectOptions"; export class Et2SelectThumbnail extends Et2Select { diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts b/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts new file mode 100644 index 0000000000..1c008905b5 --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts @@ -0,0 +1,17 @@ +import {Et2Select} from "../Et2Select"; +import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; +import {cleanSelectOptions} from "../FindSelectOptions"; + +export class Et2SelectTimezone extends Et2StaticSelectMixin(Et2Select) +{ + constructor() + { + super(); + this.fetchComplete = StaticOptions.timezone(this, {other: this.other ?? []}).then((options) => + { + this.set_static_options(cleanSelectOptions(options)); + }) + } +} + +customElements.define("et2-select-timezone", Et2SelectTimezone); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectYear.ts b/api/js/etemplate/Et2Select/Select/Et2SelectYear.ts new file mode 100644 index 0000000000..db231aa2fc --- /dev/null +++ b/api/js/etemplate/Et2Select/Select/Et2SelectYear.ts @@ -0,0 +1,25 @@ +import {Et2SelectNumber} from "./Et2SelectNumber"; +import {PropertyValues} from "lit"; +import {StaticOptions} from "../StaticOptions"; + +export class Et2SelectYear extends Et2SelectNumber +{ + constructor() + { + super(); + this.min = -3; + this.max = 2; + } + + updated(changedProperties : PropertyValues) + { + super.updated(changedProperties); + + if(changedProperties.has('min') || changedProperties.has('max') || changedProperties.has('interval') || changedProperties.has('suffix')) + { + this._static_options = StaticOptions.year(this); + } + } +} + +customElements.define("et2-select-year", Et2SelectYear); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/SelectAccountMixin.ts b/api/js/etemplate/Et2Select/SelectAccountMixin.ts index 429ad91672..f83a6f62ea 100644 --- a/api/js/etemplate/Et2Select/SelectAccountMixin.ts +++ b/api/js/etemplate/Et2Select/SelectAccountMixin.ts @@ -1,5 +1,5 @@ import {SelectOption} from "./FindSelectOptions"; -import {LitElement} from "@lion/core"; +import {LitElement} from "lit"; /** * EGroupware eTemplate2 - SelectAccountMixin @@ -110,7 +110,8 @@ export const SelectAccountMixin = >(superclass get select_options() { - return [...(this.account_options || []), ...super.select_options]; + return [...new Map([...this.account_options, ...(super.select_options || [])].map(item => + [item.value, item])).values()]; } set select_options(value : SelectOption[]) diff --git a/api/js/etemplate/Et2Select/SelectTypes.ts b/api/js/etemplate/Et2Select/SelectTypes.ts new file mode 100644 index 0000000000..ab23cdb7f8 --- /dev/null +++ b/api/js/etemplate/Et2Select/SelectTypes.ts @@ -0,0 +1,25 @@ +/** + * Import all our sub-types + */ + +import './Select/Et2SelectAccount'; +import './Select/Et2SelectApp'; +import './Select/Et2SelectBitwise'; +import './Select/Et2SelectBool'; +import './Select/Et2SelectCategory'; +import './Select/Et2SelectCountry'; +import './Select/Et2SelectDay'; +import './Select/Et2SelectDayOfWeek'; +import './Select/Et2SelectEmail'; +import './Select/Et2SelectHour'; +import './Select/Et2SelectLang'; +import './Select/Et2SelectMonth'; +import './Select/Et2SelectNumber'; +import './Select/Et2SelectPercent'; +import './Select/Et2SelectPriority'; +import './Select/Et2SelectReadonly'; +import './Select/Et2SelectState'; +import './Select/Et2SelectTab'; +import './Select/Et2SelectThumbnail'; +import './Select/Et2SelectTimezone'; +import './Select/Et2SelectYear'; \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/StaticOptions.ts b/api/js/etemplate/Et2Select/StaticOptions.ts index c854d656da..99e7a6c2e8 100644 --- a/api/js/etemplate/Et2Select/StaticOptions.ts +++ b/api/js/etemplate/Et2Select/StaticOptions.ts @@ -8,11 +8,18 @@ * @param {type} widget */ import {sprintf} from "../../egw_action/egw_action_common"; -import {Et2SelectReadonly} from "./Et2SelectReadonly"; +import {Et2SelectReadonly} from "./Select/Et2SelectReadonly"; import {cleanSelectOptions, find_select_options, SelectOption} from "./FindSelectOptions"; import {Et2Select, Et2WidgetWithSelect} from "./Et2Select"; +import {state} from "lit/decorators/state.js"; export type Et2SelectWidgets = Et2Select | Et2WidgetWithSelect | Et2SelectReadonly; +type NumberOptions = { + min? : number, + max? : number, + interval? : number, + format? : string +}; // Export the Interface for TypeScript type Constructor = new (...args : any[]) => T; @@ -31,27 +38,25 @@ export const Et2StaticSelectMixin = > // Hold the static widget options separately so other options (like sent from server in sel_options) won't // conflict or be wiped out - protected static_options : SelectOption[]; + @state() + protected _static_options : SelectOption[] = []; // If widget needs to fetch options from server, we might want to wait for them - protected fetchComplete : Promise; + @state() + protected fetchComplete : Promise = Promise.resolve(); - constructor(...args) + async getUpdateComplete() : Promise { - super(...args); - - this.static_options = []; - this.fetchComplete = Promise.resolve(); - - // Trigger the options to get rendered into the DOM - this.requestUpdate("select_options"); + const result = await super.getUpdateComplete(); + await this.fetchComplete; + return result; } get select_options() : SelectOption[] { // @ts-ignore const options = super.select_options || []; - const statics = this.static_options || []; + const statics = this._static_options || []; if(options.length == 0) { @@ -62,7 +67,7 @@ export const Et2StaticSelectMixin = > return options; } // Merge & make sure result is unique - return [...new Map([...options, ...statics].map(item => + return [...new Map([...options, ...(this._static_options || [])].map(item => [item.value, item])).values()]; } @@ -75,7 +80,7 @@ export const Et2StaticSelectMixin = > set_static_options(new_static_options) { - this.static_options = new_static_options; + this._static_options = new_static_options; this.requestUpdate("select_options"); } @@ -273,19 +278,14 @@ export const StaticOptions = new class StaticOptionsType ]; } - number(widget : Et2SelectWidgets, attrs = { - min: undefined, - max: undefined, - interval: undefined, - format: undefined - }) : SelectOption[] + number(widget : Et2SelectWidgets, attrs : NumberOptions = {}) : SelectOption[] { - var options = []; - var min = parseFloat(attrs.min ?? widget.min ?? 1); - var max = parseFloat(attrs.max ?? widget.max ?? 10); - var interval = parseFloat(attrs.interval ?? widget.interval ?? 1); - var format = attrs.format ?? '%d'; + const options = []; + const min = parseFloat(attrs.min ?? widget.min ?? 1); + const max = parseFloat(attrs.max ?? widget.max ?? 10); + let interval = parseFloat(attrs.interval ?? widget.interval ?? 1); + let format = attrs.format ?? '%d'; // leading zero specified in interval if(widget.leading_zero && widget.leading_zero[0] == '0') @@ -313,7 +313,7 @@ export const StaticOptions = new class StaticOptionsType percent(widget : Et2SelectWidgets) : SelectOption[] { - return this.number(widget, {min: 0, max: 100, interval: 10, format: undefined}); + return this.number(widget, {min: 0, max: 100, interval: 10, format: "%d%%"}); } year(widget : Et2SelectWidgets, attrs?) : SelectOption[] @@ -323,15 +323,14 @@ export const StaticOptions = new class StaticOptionsType attrs = {} } var t = new Date(); - attrs.min = t.getFullYear() + parseInt(widget.min); - attrs.max = t.getFullYear() + parseInt(widget.max); + attrs.min = t.getFullYear() + parseInt(attrs.min ?? widget.min ?? -3); + attrs.max = t.getFullYear() + parseInt(attrs.max ?? widget.max ?? 2); return this.number(widget, attrs); } day(widget : Et2SelectWidgets, attrs) : SelectOption[] { - attrs.other = [1, 31, 1]; - return this.number(widget, attrs); + return this.number(widget, {min: 1, max: 31, interval: 1}); } hour(widget : Et2SelectWidgets, attrs) : SelectOption[] @@ -394,9 +393,9 @@ export const StaticOptions = new class StaticOptionsType return this.cached_server_side(widget, 'select-lang', options); } - timezone(widget : Et2SelectWidgets, attrs) : SelectOption[] | Promise + timezone(widget : Et2SelectWidgets, attrs) : Promise { var options = ',' + (attrs.other || []).join(','); - return this.cached_server_side(widget, 'select-timezone', options); + return >this.cached_server_side(widget, 'select-timezone', options, true); } } \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/Tag/Et2CategoryTag.ts b/api/js/etemplate/Et2Select/Tag/Et2CategoryTag.ts index 62bb2c61b8..77270b9431 100644 --- a/api/js/etemplate/Et2Select/Tag/Et2CategoryTag.ts +++ b/api/js/etemplate/Et2Select/Tag/Et2CategoryTag.ts @@ -6,7 +6,7 @@ * @link https://www.egroupware.org * @author Nathan Gray */ -import {css, html, TemplateResult} from "@lion/core"; +import {css, html, TemplateResult} from "lit"; import shoelace from "../../Styles/shoelace"; import {Et2Tag} from "./Et2Tag"; diff --git a/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts b/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts index 8ea12f53cb..5ec4b83778 100644 --- a/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts +++ b/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts @@ -6,7 +6,8 @@ * @link https://www.egroupware.org * @author Nathan Gray */ -import {classMap, css, html, nothing, PropertyValues, TemplateResult} from "@lion/core"; +import {css, html, nothing, PropertyValues, TemplateResult} from "lit"; +import {classMap} from "lit/directives/class-map.js"; import shoelace from "../../Styles/shoelace"; import {Et2Tag} from "./Et2Tag"; @@ -56,6 +57,15 @@ export class Et2EmailTag extends Et2Tag .tag__remove { order: 3; } + + /* Shoelace disabled gives a not-allowed cursor, but we also set disabled for read-only. + * We don't want the not-allowed cursor, since you can always click the email address + */ + + :host([readonly]) { + cursor: pointer !important; + } + `]; } @@ -95,8 +105,8 @@ export class Et2EmailTag extends Et2Tag this.onlyEmail = false; this.handleMouseEnter = this.handleMouseEnter.bind(this); this.handleMouseLeave = this.handleMouseLeave.bind(this); - this.handleClick = this.handleClick.bind(this); - this.handleContactClick = this.handleContactClick.bind(this); + this.handleMouseDown = this.handleMouseDown.bind(this); + this.handleContactMouseDown = this.handleContactMouseDown.bind(this); } connectedCallback() @@ -166,7 +176,7 @@ export class Et2EmailTag extends Et2Tag this.shadowRoot.querySelector(".tag").classList.remove("contact_plus"); } - handleClick(e : MouseEvent) + handleMouseDown(e : MouseEvent) { e.stopPropagation(); @@ -177,7 +187,7 @@ export class Et2EmailTag extends Et2Tag this.egw().open('', 'addressbook', 'add', extra); } - handleContactClick(e : MouseEvent) + handleContactMouseDown(e : MouseEvent) { e.stopPropagation(); this.checkContact(this.value).then((result) => @@ -217,15 +227,15 @@ export class Et2EmailTag extends Et2Tag { let content = this.value; // If there's a name, just show the name, otherwise show the email - if(!this.onlyEmail && Et2EmailTag.email_cache[this.value]) + if(!this.onlyEmail && Et2EmailTag.email_cache[content]) { // Append current value as email, data may have work & home email in it - content = (Et2EmailTag.email_cache[this.value]?.n_fn || "") + " <" + (Et2EmailTag.splitEmail(this.value)?.email || this.value) + ">" + content = (Et2EmailTag.email_cache[content]?.n_fn || "") + " <" + (Et2EmailTag.splitEmail(content)?.email || content) + ">" } if (this.onlyEmail) { const split = Et2EmailTag.splitEmail(content); - content = split.email || this.value; + content = split.email || content; } else if(!this.fullEmail) { @@ -255,7 +265,7 @@ export class Et2EmailTag extends Et2Tag button_or_avatar = html` `; diff --git a/api/js/etemplate/Et2Select/Tag/Et2Tag.ts b/api/js/etemplate/Et2Select/Tag/Et2Tag.ts index d9e50c1d46..1eab4fca40 100644 --- a/api/js/etemplate/Et2Select/Tag/Et2Tag.ts +++ b/api/js/etemplate/Et2Select/Tag/Et2Tag.ts @@ -8,7 +8,8 @@ */ import {Et2Widget} from "../../Et2Widget/Et2Widget"; import {SlTag} from "@shoelace-style/shoelace"; -import {classMap, css, html, TemplateResult} from "@lion/core"; +import {css, html, TemplateResult} from "lit"; +import {classMap} from "lit/directives/class-map.js"; import shoelace from "../../Styles/shoelace"; /** @@ -23,7 +24,6 @@ export class Et2Tag extends Et2Widget(SlTag) shoelace, css` :host { flex: 1 1 auto; - overflow: hidden; } .tag--pill { @@ -35,6 +35,9 @@ export class Et2Tag extends Et2Widget(SlTag) width: 20px; } + .tag__prefix { + line-height: normal; + } .tag__content { padding: 0px 0.2rem; flex: 1 2 auto; @@ -113,11 +116,12 @@ export class Et2Tag extends Et2Widget(SlTag) ` : ''} diff --git a/api/js/etemplate/Et2Select/Tag/Et2ThumbnailTag.ts b/api/js/etemplate/Et2Select/Tag/Et2ThumbnailTag.ts index ff4c8d2e32..d09cd429ad 100644 --- a/api/js/etemplate/Et2Select/Tag/Et2ThumbnailTag.ts +++ b/api/js/etemplate/Et2Select/Tag/Et2ThumbnailTag.ts @@ -6,7 +6,7 @@ * @link https://www.egroupware.org * @author Nathan Gray */ -import {css} from "@lion/core"; +import {css} from "lit"; import shoelace from "../../Styles/shoelace"; import {Et2Tag} from "./Et2Tag"; diff --git a/api/js/etemplate/Et2Select/test/EditableTag.test.ts b/api/js/etemplate/Et2Select/test/EditableTag.test.ts index 5a3976d8e6..c6521e4aac 100644 --- a/api/js/etemplate/Et2Select/test/EditableTag.test.ts +++ b/api/js/etemplate/Et2Select/test/EditableTag.test.ts @@ -13,6 +13,7 @@ window.egw = { }; let element : Et2Select; +const tag_name = "et2-tag"; async function before(editable = true) { @@ -20,16 +21,19 @@ async function before(editable = true) // @ts-ignore element = await fixture(html` - One - Two + + `); + // Need to call loadFromXML() explicitly to read the options + element.loadFromXML(element); + // Stub egw() sinon.stub(element, "egw").returns(window.egw); await element.updateComplete; let tags = []; - element.shadowRoot.querySelectorAll(element.tagTag).forEach((t : Et2Tag) => tags.push(t.updateComplete)); + element.shadowRoot.querySelectorAll(tag_name).forEach((t : Et2Tag) => tags.push(t.updateComplete)); await Promise.all(tags); return element; @@ -48,30 +52,29 @@ describe("Editable tag", () => it("Tag editable matches editModeEnabled", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.isTrue(tag[0].editable); // Change it to false & force immediate update element.editModeEnabled = false; - element.syncItemsFromValue(); element.requestUpdate(); await element.updateComplete; - tag = element.shadowRoot.querySelectorAll(element.tagTag); + tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.isFalse(tag[0].editable); }); it("Has edit button when editable ", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.exists(tag[0].shadowRoot.querySelector("et2-button-icon[label='edit*']"), "No edit button"); }); it("Shows input when edit button is clicked", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag)[0]; + let tag = element.select.combobox.querySelectorAll(tag_name)[0]; let edit_button = tag.shadowRoot.querySelector("et2-button-icon"); edit_button.click(); @@ -81,7 +84,7 @@ describe("Editable tag", () => }); it("Changes value when edited", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag)[0]; + let tag = element.select.combobox.querySelectorAll(tag_name)[0]; tag.isEditing = true; tag.requestUpdate(); await tag.updateComplete; @@ -119,7 +122,7 @@ describe("Editable tag", () => await listener2; assert.equal(tag.value, "change select too"); - // Haven't turned on allow free entries, so no change here + // Have turned on allow free entries, so it should change here assert.equal(element.value, "change select too", "Tag change did not cause value change in parent select (allowFreeEntries was on)"); }); @@ -129,7 +132,7 @@ describe("Editable tag", () => element.readonly = true; await element.updateComplete; - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); let wait = []; @@ -146,7 +149,7 @@ describe("Select is not editable", () => it("Does not have edit button when not editable", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.isNull(tag[0].shadowRoot.querySelector("et2-button-icon[label='edit*']"), "Unexpected edit button"); diff --git a/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts b/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts new file mode 100644 index 0000000000..77a1af7c3e --- /dev/null +++ b/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts @@ -0,0 +1,104 @@ +/** + * EGroupware eTemplate2 - Email Tag WebComponent tests + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @package api + * @link https://www.egroupware.org + * @author Nathan Gray + */ + +import {assert, fixture, html} from '@open-wc/testing'; +import {Et2EmailTag} from "../Tag/Et2EmailTag"; +import * as sinon from 'sinon'; + +// Stub global egw +// @ts-ignore +window.egw = { + tooltipUnbind: () => {}, + lang: i => i + "*", + image: () => "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkViZW5lXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzJweCIgaGVpZ2h0PSIzMnB4IiB2aWV3Qm94PSIwIDAgMzIgMzIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMyIDMyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjNjk2OTY5IiBkPSJNNi45NDMsMjguNDUzDQoJYzAuOTA2LDAuNzY1LDIuMDk3LDEuMTI3LDMuMjg2LDEuMTA5YzAuNDMsMC4wMTQsMC44NTItMC4wNjgsMS4yNjUtMC4yMDdjMC42NzktMC4xOCwxLjMyOC0wLjQ1LDEuODY2LTAuOTAyTDI5LjQwMywxNC45DQoJYzEuNzcyLTEuNDk4LDEuNzcyLTMuOTI1LDAtNS40MjJjLTEuNzcyLTEuNDk3LTQuNjQ2LTEuNDk3LTYuNDE4LDBMMTAuMTE5LDIwLjM0OWwtMi4zODktMi40MjRjLTEuNDQtMS40NTctMy43NzItMS40NTctNS4yMTIsMA0KCWMtMS40MzgsMS40Ni0xLjQzOCwzLjgyNSwwLDUuMjgxQzIuNTE4LDIzLjIwNiw1LjQ3NCwyNi45NDcsNi45NDMsMjguNDUzeiIvPg0KPC9zdmc+DQo=", + webserverUrl: "", + app: (_app) => _app, + jsonq: () => Promise.resolve({}) +}; + +describe('Et2EmailTag', () => +{ + let component : Et2EmailTag; + + beforeEach(async() => + { + component = await fixture(html` + `); + // Stub egw() + // @ts-ignore + sinon.stub(component, "egw").returns(window.egw); + await component.updateComplete; + + // Asserting this instanceOf forces class loading + assert.instanceOf(component, Et2EmailTag); + }); + + it('should be defined', () => + { + assert.isDefined(component); + }); + + it('should have a value property', () => + { + assert.equal(component.value, 'test@example.com'); + }); + + it('should have a contactPlus property', () => + { + assert.isTrue(component.contactPlus); + }); + + it('should have an onlyEmail property', () => + { + assert.isFalse(component.onlyEmail); + }); + + it('should have a fullEmail property', () => + { + assert.isFalse(component.fullEmail); + }); + + it('should open addressbook with email preset on (+) click', () => + { + window.egw.open = () => + { + open: (url, app, mode, extra) => + { + assert.equal(url, ''); + assert.equal(app, 'addressbook'); + assert.equal(mode, 'add'); + assert.equal(extra['presets[email]'], 'test@example.com'); + } + }; + component.handleMouseDown(new MouseEvent('click')); + }); + + it('should open addressbook CRM on avatar click', async() => + { + // Fake data to test against + const contact = { + id: '123', + n_fn: 'Test User', + photo: 'test.jpg' + }; + component.value = 'test@example.com'; + component.checkContact = async(email) => contact; + component.egw.open = () => + { + open: (id, app, mode, extra) => + { + assert.equal(id, contact.id); + assert.equal(app, 'addressbook'); + assert.equal(mode, 'view'); + assert.deepEqual(extra, {title: contact.n_fn, icon: contact.photo}); + } + }; + await component.handleContactMouseDown(new MouseEvent('click')); + }); +}); diff --git a/api/js/etemplate/Et2Select/test/Et2SelectBasic.test.ts b/api/js/etemplate/Et2Select/test/Et2SelectBasic.test.ts index d6789034d2..c9bd9c4987 100644 --- a/api/js/etemplate/Et2Select/test/Et2SelectBasic.test.ts +++ b/api/js/etemplate/Et2Select/test/Et2SelectBasic.test.ts @@ -25,11 +25,13 @@ async function before() // Create an element to test with, and wait until it's ready // @ts-ignore element = await fixture(html` - + + `); // Stub egw() sinon.stub(element, "egw").returns(window.egw); + await elementUpdated(element); return element; } @@ -48,7 +50,6 @@ describe("Select widget basics", () => it('has a label', async() => { element.set_label("Label set"); - // @ts-ignore TypeScript doesn't recognize widgets as Elements await elementUpdated(element); assert.equal(element.querySelector("[slot='label']").textContent, "Label set"); @@ -59,6 +60,36 @@ describe("Select widget basics", () => assert.notExists(element.querySelector("option"), "Static option not found in DOM"); assert.deepEqual(element.select_options, [], "Unexpected option(s)"); }) + + it("closes when losing focus", async() => + { + // WIP + const blurSpy = sinon.spy(); + element.addEventListener('sl-hide', blurSpy); + const showPromise = new Promise(resolve => + { + element.addEventListener("sl-after-show", resolve); + }); + const hidePromise = new Promise(resolve => + { + element.addEventListener("sl-hide", resolve); + }); + await elementUpdated(element); + element.focus(); + + await showPromise; + await elementUpdated(element); + + element.blur(); + await elementUpdated(element); + + await hidePromise; + + sinon.assert.calledOnce(blurSpy); + + // Check that it actually closed dropdown + assert.isFalse(element.select?.hasAttribute("open")); + }) }); describe("Multiple", () => @@ -69,10 +100,11 @@ describe("Multiple", () => // @ts-ignore element = await fixture(html` - One - Two + + `); + element.loadFromXML(element); element.set_value("one,two"); // Stub egw() @@ -83,14 +115,14 @@ describe("Multiple", () => it("Can remove tags", async() => { - assert.equal(element.querySelectorAll("sl-menu-item").length, 2, "Did not find options"); + assert.equal(element.select.querySelectorAll("sl-option").length, 2, "Did not find options"); assert.sameMembers(element.value, ["one", "two"]); - let tags = element.shadowRoot.querySelectorAll('.select__tags > *'); + let tags = element.select.combobox.querySelectorAll('.select__tags et2-tag'); // Await tags to render let tag_updates = [] - element.shadowRoot.querySelectorAll(element.tagTag).forEach((t : Et2Tag) => tag_updates.push(t.updateComplete)); + element.select.combobox.querySelectorAll("et2-tag").forEach((t : Et2Tag) => tag_updates.push(t.updateComplete)); await Promise.all(tag_updates); assert.equal(tags.length, 2); @@ -110,15 +142,21 @@ describe("Multiple", () => // Wait for widget to update await element.updateComplete; tag_updates = [] - element.shadowRoot.querySelectorAll(element.tagTag).forEach((t : Et2Tag) => tag_updates.push(t.updateComplete)); + element.select.combobox.querySelectorAll('et2-tag').forEach((t : Et2Tag) => tag_updates.push(t.updateComplete)); await Promise.all(tag_updates); // Check assert.sameMembers(element.value, ["two"], "Removing tag did not remove value"); - tags = element.shadowRoot.querySelectorAll('.select__tags > *'); + tags = element.select.combobox.querySelectorAll('.select__tags et2-tag'); assert.equal(tags.length, 1, "Removed tag is still there"); }); }); -inputBasicTests(before, "", "select"); \ No newline at end of file +inputBasicTests(async() => +{ + const element = await before(); + element.noLang = true; + element.select_options = [{value: "", label: ""}]; + return element +}, "", "sl-select"); \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts b/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts index 357216a683..105364c533 100644 --- a/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts +++ b/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts @@ -1,8 +1,11 @@ import {assert, elementUpdated, fixture, html} from '@open-wc/testing'; import {Et2Box} from "../../Layout/Et2Box/Et2Box"; -import {Et2Select, SelectOption} from "../Et2Select"; +import {Et2Select} from "../Et2Select"; import * as sinon from "sinon"; import {et2_arrayMgr} from "../../et2_core_arrayMgr"; +import {SelectOption} from "../FindSelectOptions"; +import '../Select/Et2SelectNumber'; +import {Et2SelectNumber} from "../Select/Et2SelectNumber"; let parser = new window.DOMParser(); @@ -30,7 +33,6 @@ describe("Select widget", () => beforeEach(async() => { // This stuff because otherwise Et2Select isn't actually loaded when testing - // @ts-ignore TypeScript is not recognizing that this widget is a LitElement element = await fixture(html` `); @@ -39,7 +41,6 @@ describe("Select widget", () => assert.instanceOf(element, Et2Select); element.remove(); - // @ts-ignore TypeScript is not recognizing that this widget is a LitElement container = await fixture(html` `); @@ -51,7 +52,7 @@ describe("Select widget", () => describe("Finds options", () => { - it("static", async() => + it("from DOM/Template", async() => { /** SETUP **/ // Create an element to test with, and wait until it's ready @@ -60,13 +61,12 @@ describe("Select widget", () => container.loadFromXML(parser.parseFromString(node, "text/xml")); // wait for asychronous changes to the DOM - // @ts-ignore TypeScript is not recognizing that this widget is a LitElement await elementUpdated(container); element = container.getWidgetById('select'); await element.updateComplete; /** TESTING **/ - assert.isNotNull(element.querySelector("[value='option']"), "Missing static option"); + assert.isNotNull(element.select.querySelector("[value='option']"), "Missing template option"); }); it("directly in sel_options", async() => @@ -80,16 +80,15 @@ describe("Select widget", () => container.loadFromXML(parser.parseFromString(node, "text/xml")); // wait for asychronous changes to the DOM - // @ts-ignore TypeScript is not recognizing that this widget is a LitElement await elementUpdated(container); element = container.getWidgetById('select'); await element.updateComplete; /** TESTING **/ - assert.equal(element.querySelectorAll("sl-menu-item").length, 2); + assert.equal(element.select.querySelectorAll("sl-option").length, 2); }); - it("merges static options with sel_options", async() => + it("merges template options with sel_options", async() => { /** SETUP **/ @@ -101,19 +100,115 @@ describe("Select widget", () => container.loadFromXML(parser.parseFromString(node, "text/xml")); // wait for asychronous changes to the DOM - // @ts-ignore TypeScript is not recognizing that this widget is a LitElement await elementUpdated(container); element = container.getWidgetById('select'); await element.updateComplete; /** TESTING **/ - - // @ts-ignore o.value isn't known by TypeScript, but it's there - let option_keys = Object.values(element.querySelectorAll("sl-menu-item")).map(o => o.value); - assert.include(option_keys, "option", "Static option missing"); + let option_keys = Object.values(element.select.querySelectorAll("sl-option")).map(o => o.value); + assert.include(option_keys, "option", "Template option missing"); assert.includeMembers(option_keys, ["1", "2", "option"], "Option mis-match"); assert.equal(option_keys.length, 3); }); + + it("static options (number)", async() => + { + /** SETUP **/ + // Create an element to test with, and wait until it's ready + // Default number options are 1-10 + let element = await fixture(html` + + `); + + // wait for asychronous changes to the DOM + await elementUpdated(element); + await element.updateComplete; + + /** TESTING **/ + assert.equal(element.select.querySelectorAll("sl-option").length, 10); + }); + + it("merges static options with sel_options", async() => + { + /** SETUP **/ + let options = [ + {value: "one", label: "Option 1"}, + {value: "two", label: "Option 2"} + ]; + // Create an element to test with, and wait until it's ready + let node = ''; + container.setArrayMgr("sel_options", new et2_arrayMgr({ + select: options + })); + container.loadFromXML(parser.parseFromString(node, "text/xml")); + + // wait for asychronous changes to the DOM + await elementUpdated(container); + element = container.getWidgetById('select'); + await element.updateComplete; + + /** TESTING **/ + let option_keys = Object.values(element.select.querySelectorAll("sl-option")).map(o => o.value); + assert.includeMembers(option_keys, ["1", "2", "one", "two"], "Option mis-match"); + assert.equal(option_keys.length, 4); + }); + + it("merges static options with template options", async() => + { + /** SETUP **/ + + // Create an element to test with, and wait until it's ready + // Default number options are 1-10 + let element = await fixture(html` + + + + `); + + // wait for asychronous changes to the DOM + element.loadFromXML(element); + await elementUpdated(element); + await element.updateComplete; + + /** TESTING **/ + let option_keys = Object.values(element.select.querySelectorAll("sl-option")).map(o => o.value); + assert.include(option_keys, "option", "Template option missing"); + assert.includeMembers(option_keys, ["1", "2", "option"], "Option mis-match"); + assert.equal(option_keys.length, 11); + }); + + it("actually shows the options", async() => + { + // Create an element to test with, and wait until it's ready + // @ts-ignore + element = await fixture(html` + + `); + // Stub egw() + sinon.stub(element, "egw").returns(window.egw); + element.select_options = [ + {value: "one", label: "one"}, + {value: "two", label: "two"}, + {value: "three", label: "three"}, + {value: "four", label: "four"}, + {value: "five", label: "five"} + ]; + + await element.updateComplete; + await elementUpdated(element); + + await element.show(); + + // Not actually testing if the browser renders, just if they show where expected + const options = element.select.querySelectorAll("sl-option"); + assert.equal(options.length, 5, "Wrong number of options"); + + // Still not checking if they're _really_ visible, just that they have the correct display + options.forEach(o => + { + assert.equal(getComputedStyle(o).display, "block", "Wrong style.display"); + }) + }); }); describe("Value tests", () => diff --git a/api/js/etemplate/Et2Select/test/SearchActions.test.ts b/api/js/etemplate/Et2Select/test/SearchActions.test.ts index 2b2f4d683f..b7e0f37f49 100644 --- a/api/js/etemplate/Et2Select/test/SearchActions.test.ts +++ b/api/js/etemplate/Et2Select/test/SearchActions.test.ts @@ -3,19 +3,22 @@ * Currently just checking to make sure onchange is only called once. */ import {SelectOption} from "../FindSelectOptions"; -import {assert, elementUpdated, fixture, html} from '@open-wc/testing'; +import {assert, elementUpdated, fixture, html, oneEvent} from '@open-wc/testing'; import * as sinon from 'sinon'; import {Et2Box} from "../../Layout/Et2Box/Et2Box"; import {Et2Select} from "../Et2Select"; import {Et2Textbox} from "../../Et2Textbox/Et2Textbox"; -let keep_import : Et2Textbox = new Et2Textbox(); +let keep_import : Et2Textbox = null; // Stub global egw for cssImage to find // @ts-ignore window.egw = { + ajaxUrl: url => url, + decodePath: url => url, //image: () => "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkViZW5lXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iMzJweCIgaGVpZ2h0PSIzMnB4IiB2aWV3Qm94PSIwIDAgMzIgMzIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMyIDMyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsPSIjNjk2OTY5IiBkPSJNNi45NDMsMjguNDUzDQoJYzAuOTA2LDAuNzY1LDIuMDk3LDEuMTI3LDMuMjg2LDEuMTA5YzAuNDMsMC4wMTQsMC44NTItMC4wNjgsMS4yNjUtMC4yMDdjMC42NzktMC4xOCwxLjMyOC0wLjQ1LDEuODY2LTAuOTAyTDI5LjQwMywxNC45DQoJYzEuNzcyLTEuNDk4LDEuNzcyLTMuOTI1LDAtNS40MjJjLTEuNzcyLTEuNDk3LTQuNjQ2LTEuNDk3LTYuNDE4LDBMMTAuMTE5LDIwLjM0OWwtMi4zODktMi40MjRjLTEuNDQtMS40NTctMy43NzItMS40NTctNS4yMTIsMA0KCWMtMS40MzgsMS40Ni0xLjQzOCwzLjgyNSwwLDUuMjgxQzIuNTE4LDIzLjIwNiw1LjQ3NCwyNi45NDcsNi45NDMsMjguNDUzeiIvPg0KPC9zdmc+DQo=", lang: i => i + "*", + link: l => l, tooltipUnbind: () => {}, webserverUrl: "", window: window @@ -65,14 +68,17 @@ describe("Search actions", () => ''; container.loadFromXML(parser.parseFromString(node, "text/xml")); + await elementUpdated(container); const change = sinon.spy(); let element = container.getWidgetById('select'); element.onchange = change; await elementUpdated(element); - - element.value = "two"; + const option = element.select.querySelector("[value='two']"); + const listener = oneEvent(option, "mouseup"); + option.dispatchEvent(new Event("mouseup", {bubbles: true})); + await listener; await elementUpdated(element); @@ -96,14 +102,14 @@ describe("Trigger search", () => // Create an element to test with, and wait until it's ready // @ts-ignore element = await fixture(html` - - One - Two - Three - Four - Five - Six - Seven + + One + Two + Three + Four + Five + Six + Seven `); // Stub egw() @@ -111,6 +117,7 @@ describe("Trigger search", () => await element.updateComplete; await element._searchInputNode.updateComplete; + await elementUpdated(element); }); afterEach(() => @@ -125,11 +132,11 @@ describe("Trigger search", () => let searchSpy = sinon.spy(element, "startSearch"); // Send two keypresses, but we need to explicitly set the value - element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "o"})); element._searchInputNode.value = "o"; + element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "o"})); assert(searchSpy.notCalled); - element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "n"})); element._searchInputNode.value = "on"; + element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "n"})); assert(searchSpy.notCalled); // Skip the timeout @@ -145,8 +152,8 @@ describe("Trigger search", () => let searchSpy = sinon.spy(element, "startSearch"); // Send two keypresses, but we need to explicitly set the value - element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "o"})); element._searchInputNode.value = "t"; + element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "o"})); assert(searchSpy.notCalled); element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "Enter"})); @@ -161,11 +168,207 @@ describe("Trigger search", () => let searchSpy = sinon.spy(element, "startSearch"); // Send two keypresses, but we need to explicitly set the value - element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "t"})); element._searchInputNode.value = "t"; + element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "t"})); element._searchInputNode.dispatchEvent(new KeyboardEvent("keydown", {"key": "Escape"})); assert(searchSpy.notCalled, "startSearch() was called"); assert(abortSpy.calledOnce, "_handleSearchAbort() was not called"); }) +}); + +async function doSearch(element, search) +{ + // we need to explicitly set the value + element._searchInputNode.value = search; + + await element.startSearch(); + + await elementUpdated(element) +}; + +describe("Search results", () => +{ + let element : Et2Select; + const remote_results = [ + {value: "remote_one", label: "remote_one"}, + {value: "remote_two", label: "remote_two"} + ]; + let clickOption = (value) => + { + const option = element.select.querySelector("[value='" + value + "']"); + let listener = oneEvent(option, "mouseup"); + option.dispatchEvent(new Event("mouseup", {bubbles: true})); + return listener; + } + + // Setup run before each test + beforeEach(async() => + { + // Create an element to test with, and wait until it's ready + // @ts-ignore + element = await fixture(html` + + + + + + + + + + `); + element.loadFromXML(element); + // Stub egw() + sinon.stub(element, "egw").returns(window.egw); + + await element.updateComplete; + await element._searchInputNode.updateComplete; + await elementUpdated(element); + }); + + it("Correct local results", async() => + { + // Search + await doSearch(element, "one") + // Check the result is offered + const option = element.select.querySelector("[value='one']") + assert.isNotNull(option, "Did not find option in result"); + + // _only_ that one? + assert.sameMembers(Array.from(element.select.querySelectorAll("sl-option")).map(e => e.value), ["one"], "Unexpected search results"); + }); + it("Correct remote results", async() => + { + // Enable searching + element.searchUrl = "test"; + + // Fake remote search + window.egw.request = sinon.fake + .returns(Promise.resolve([remote_results[0]])); + + // Search + await doSearch(element, "remote_one") + + // Check the result is offered + const option = element.select.querySelector("[value='remote_one']") + assert.isNotNull(option, "Did not find option in result"); + + // _only_ that one? + // N.B. that "one" will stay, since that's the current value + assert.sameMembers(Array.from(element.select.querySelectorAll("sl-option.remote")).map(e => e.value), ["remote_one"], "Unexpected search results"); + }); + it("Correct local and remote together", async() => + { + // Enable searching + element.searchUrl = "test"; + + // Fake remote search + window.egw.request = sinon.fake + .returns(Promise.resolve([remote_results[0]])); + + // Search + await doSearch(element, "one") + + // Check the result is offered + const local_option = element.select.querySelector("[value='one']") + assert.isNotNull(local_option, "Did not find local option in result"); + const remote_option = element.select.querySelector("[value='remote_one']") + assert.isNotNull(remote_option, "Did not find remote option in result"); + + // _only_ that one? + assert.sameMembers(Array.from(element.select.querySelectorAll("sl-option")).map(e => e.value), ["one", "remote_one"], "Unexpected search results"); + }); + it("Selected local result is in value", async() => + { + // Search + await doSearch(element, "one") + + // "Click" that one + await clickOption("one"); + await element.updateComplete; + + assert.equal(element.value, "one", "Selected search result was not in value"); + }); + it("Selected remote result in value", async() => + { + // Enable searching + element.searchUrl = "test"; + + // Fake remote search + window.egw.request = sinon.fake + .returns(Promise.resolve([remote_results[0]])); + + // Search + await doSearch(element, "remote_one") + + // Click + await clickOption("remote_one"); + await element.updateComplete; + + assert.equal(element.value, "remote_one", "Selected search result was not in value"); + }); + it("Selected multiple remote results in value", async() => + { + // Enable multiple + element.multiple = true; + + // Clear auto-selected value + element.value = ""; + + // Enable searching + element.searchUrl = "test"; + + // Fake remote search + window.egw.request = sinon.fake + .returns(Promise.resolve(remote_results)); + + // Search + await doSearch(element, "doesn't matter, we're faking it") + + // Click + const values = ["remote_one", "remote_two"]; + let listener; + values.forEach(value => + { + listener = clickOption(value); + }); + await listener; + await element.updateComplete; + + assert.deepEqual(element.value, values, "Selected search results were not in value"); + }); + it("Adding (multiple) remote keeps value", async() => + { + const values = ["remote_one", "remote_two"]; + + // Enable multiple + element.multiple = true; + + // Clear value ("one" was selected automatically) + element.value = ""; + await element.updateComplete; + + // Enable searching + element.searchUrl = "test"; + + // Fake remote search + window.egw.request = sinon.fake + .returns(Promise.resolve(remote_results)); + + // Search + await doSearch(element, "doesn't matter, we're faking it") + + debugger; + // Select the first one + await clickOption("remote_one"); + await element.updateComplete; + + // Search & select another one + await doSearch(element, "doesn't matter, we're faking it"); + await clickOption("remote_two"); + await element.updateComplete; + + assert.deepEqual(element.value, values, "Selected search results were not in value"); + }); }); \ No newline at end of file diff --git a/api/js/etemplate/Et2Spinner/Et2Spinner.ts b/api/js/etemplate/Et2Spinner/Et2Spinner.ts index c4efa49393..f311cbe381 100644 --- a/api/js/etemplate/Et2Spinner/Et2Spinner.ts +++ b/api/js/etemplate/Et2Spinner/Et2Spinner.ts @@ -11,7 +11,7 @@ import {Et2Widget} from "../Et2Widget/Et2Widget"; import {SlSpinner} from "@shoelace-style/shoelace"; import shoelace from "../Styles/shoelace"; -import {css} from "@lion/core"; +import {css} from "lit"; export class Et2Spinner extends Et2Widget(SlSpinner) { diff --git a/api/js/etemplate/Et2Switch/Et2Switch.ts b/api/js/etemplate/Et2Switch/Et2Switch.ts index bd93c87108..ead8a691ef 100644 --- a/api/js/etemplate/Et2Switch/Et2Switch.ts +++ b/api/js/etemplate/Et2Switch/Et2Switch.ts @@ -8,8 +8,8 @@ * @author Hadi Nategh */ - -import {css, html, SlotMixin} from "@lion/core"; +import {css, html} from "lit"; +import {SlotMixin} from "@lion/core"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import '../Et2Image/Et2Image'; import {SlSwitch} from "@shoelace-style/shoelace"; @@ -151,14 +151,13 @@ export class Et2Switch extends Et2InputWidget(SlotMixin(SlSwitch)) if(new_value) { this._labelNode?.classList.add('on'); - this.checked = true; } else { this._labelNode?.classList.remove('on'); - this.checked = false; } } + this.checked = !!new_value; return; } @@ -174,8 +173,9 @@ export class Et2Switch extends Et2InputWidget(SlotMixin(SlSwitch)) labelTemplate() { + const labelClass = this.checked ? "label on" : "label"; return html` - + ${this.toggleOn} ${this.toggleOff} diff --git a/api/js/etemplate/Et2Textarea/Et2Textarea.ts b/api/js/etemplate/Et2Textarea/Et2Textarea.ts index 4d1b115d88..24872f5ff5 100644 --- a/api/js/etemplate/Et2Textarea/Et2Textarea.ts +++ b/api/js/etemplate/Et2Textarea/Et2Textarea.ts @@ -9,7 +9,7 @@ */ -import {css} from "@lion/core"; +import {css} from "lit"; import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; import {SlTextarea} from "@shoelace-style/shoelace"; import shoelace from "../Styles/shoelace"; @@ -29,14 +29,16 @@ export class Et2Textarea extends Et2InputWidget(SlTextarea) width: 100%; height: 100%; } - .textarea--resize-vertical .textarea__control { + + .textarea--resize-vertical { height: 100%; } :host::part(form-control) { height: 100%; align-items: stretch !important; } - :host::part(base) { + + :host::part(form-control-input), :host::part(textarea) { height: 100%; } `, diff --git a/api/js/etemplate/Et2Textbox/Et2Number.ts b/api/js/etemplate/Et2Textbox/Et2Number.ts index 879a20adce..ab02b8df9e 100644 --- a/api/js/etemplate/Et2Textbox/Et2Number.ts +++ b/api/js/etemplate/Et2Textbox/Et2Number.ts @@ -9,7 +9,7 @@ */ import {Et2Textbox} from "./Et2Textbox"; -import {css, html, render} from "@lion/core"; +import {css, html, render} from "lit"; export class Et2Number extends Et2Textbox { diff --git a/api/js/etemplate/Et2Textbox/Et2Password.ts b/api/js/etemplate/Et2Textbox/Et2Password.ts index 79c1c737e5..1dd5004474 100644 --- a/api/js/etemplate/Et2Textbox/Et2Password.ts +++ b/api/js/etemplate/Et2Textbox/Et2Password.ts @@ -11,7 +11,9 @@ import {Et2InvokerMixin} from "../Et2Url/Et2InvokerMixin"; import {Et2Textbox} from "./Et2Textbox"; import {Et2Dialog} from "../Et2Dialog/Et2Dialog"; -import {classMap, html, ifDefined} from "@lion/core"; +import {html} from "lit"; +import {classMap} from "lit/directives/class-map.js"; +import {ifDefined} from "lit/directives/if-defined.js"; import {egw} from "../../jsapi/egw_global"; const isChromium = navigator.userAgentData?.brands.some(b => b.brand.includes('Chromium')); @@ -68,14 +70,14 @@ export class Et2Password extends Et2InvokerMixin(Et2Textbox) if(typeof attrs.viewable !== "undefined") { - attrs['passwordToggle'] = attrs.viewable; + attrs['togglePassword'] = attrs.viewable; delete attrs.viewable; } - if(typeof attrs.passwordToggle !== "undefined" && !attrs.passwordToggle - || typeof attrs.passwordToggle == "string" && !this.getArrayMgr("content").parseBoolExpression(attrs.passwordToggle)) + if(typeof attrs.togglePassword !== "undefined" && !attrs.togglePassword + || typeof attrs.togglePassword == "string" && !this.getArrayMgr("content").parseBoolExpression(attrs.togglePassword)) { - // Unset passwordToggle if its false. It's from parent, and it doesn't handle string "false" = false - delete attrs.passwordToggle; + // Unset togglePassword if its false. It's from parent, and it doesn't handle string "false" = false + delete attrs.togglePassword; } super.transformAttributes(attrs); @@ -299,7 +301,7 @@ export class Et2Password extends Et2InvokerMixin(Et2Textbox) : '' } ${ - this.passwordToggle && !this.disabled + this.togglePassword && !this.disabled ? html` + + {# Icon toolbar #} +
+ {# GitHub #} + + + + + {# Theme selector #} + + + + + + + Light + Dark + + System + + +
+ + + + {# Content #} +
+ +
+ {% if toc %} + + {% endif %} + +
+ {% block content %} + {{ content | safe }} + {% endblock %} +
+
+
+ + diff --git a/doc/etemplate2/_includes/sidebar.njk b/doc/etemplate2/_includes/sidebar.njk new file mode 100644 index 0000000000..e9594ed343 --- /dev/null +++ b/doc/etemplate2/_includes/sidebar.njk @@ -0,0 +1,46 @@ + diff --git a/doc/etemplate2/_utilities/active-links.cjs b/doc/etemplate2/_utilities/active-links.cjs new file mode 100644 index 0000000000..7a998054e0 --- /dev/null +++ b/doc/etemplate2/_utilities/active-links.cjs @@ -0,0 +1,35 @@ +function normalizePathname(pathname) { + // Remove /index.html + if (pathname.endsWith('/index.html')) { + pathname = pathname.replace(/\/index\.html/, ''); + } + + // Remove trailing slashes + return pathname.replace(/\/$/, ''); +} + +/** + * Adds a class name to links that are currently active. + */ +module.exports = function (doc, options) { + options = { + className: 'active-link', // the class to add to active links + pathname: undefined, // the current pathname to compare + within: 'body', // element containing the target links + ...options + }; + + const within = doc.querySelector(options.within); + + if (!within) { + return doc; + } + + within.querySelectorAll('a').forEach(link => { + if (normalizePathname(options.pathname) === normalizePathname(link.pathname)) { + link.classList.add(options.className); + } + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/anchor-headings.cjs b/doc/etemplate2/_utilities/anchor-headings.cjs new file mode 100644 index 0000000000..64a71668a2 --- /dev/null +++ b/doc/etemplate2/_utilities/anchor-headings.cjs @@ -0,0 +1,64 @@ +const { createSlug } = require('./strings.cjs'); + +/** + * Turns headings into clickable, deep linkable anchors. The provided doc should be a document object provided by JSDOM. + * The same document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc, options) { + options = { + levels: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'], // the headings to convert + className: 'anchor-heading', // the class name to add + within: 'body', // the element containing the target headings + ...options + }; + + const within = doc.querySelector(options.within); + + if (!within) { + return doc; + } + + within.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach(heading => { + const hasAnchor = heading.querySelector('a'); + const anchor = doc.createElement('a'); + let id = heading.textContent ?? ''; + let suffix = 0; + + // Skip heading levels we don't care about + if (!options.levels?.includes(heading.tagName.toLowerCase())) { + return; + } + + // Convert dots to underscores + id = id.replace(/\./g, '_'); + + // Turn it into a slug + id = createSlug(id); + + // Make sure it starts with a letter + if (!/^[a-z]/i.test(id)) { + id = `id_${id}`; + } + + // Make sure the id is unique + const originalId = id; + while (doc.getElementById(id) !== null) { + id = `${originalId}-${++suffix}`; + } + + if (hasAnchor || !id) return; + + heading.setAttribute('id', id); + anchor.setAttribute('href', `#${encodeURIComponent(id)}`); + anchor.setAttribute('aria-label', `Direct link to "${heading.textContent}"`); + + if (options.className) { + heading.classList.add(options.className); + } + + // Append the anchor + heading.append(anchor); + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/cem.cjs b/doc/etemplate2/_utilities/cem.cjs new file mode 100644 index 0000000000..279a8f8e20 --- /dev/null +++ b/doc/etemplate2/_utilities/cem.cjs @@ -0,0 +1,98 @@ +const customElementsManifest = require('../../dist/custom-elements.json'); +const fs = require('fs'); + +// +// Export it here so we can import it elsewhere and use the same version +// +module.exports.customElementsManifest = customElementsManifest; + +// +// Gets all components from custom-elements.json and returns them in a more documentation-friendly format. +// +module.exports.getAllComponents = function () +{ + const allComponents = []; + + customElementsManifest.modules?.forEach(module => + { + module.declarations?.forEach(declaration => + { + if (declaration.customElement) + { + // Generate the dist path based on the src path and attach it to the component + declaration.path = module.path.replace(/^src\//, 'dist/').replace(/\.ts$/, '.js'); + + // Remove members that are private or don't have a description + const members = declaration.members?.filter(member => member.description && member.privacy !== 'private') || []; + const methods = members?.filter(prop => prop.kind === 'method' && prop.privacy !== 'private') || []; + const properties = members?.filter(prop => + { + // Look for a corresponding attribute + const attribute = declaration.attributes?.find(attr => attr.fieldName === prop.name); + if (attribute) + { + prop.attribute = attribute.name || attribute.fieldName; + } + + return prop.kind === 'field' && prop.privacy !== 'private'; + }); + allComponents.push({ + ...declaration, + methods, + properties + }); + } + }); + }); + + // Build dependency graphs + allComponents.forEach(component => + { + const dependencies = []; + + // Recursively fetch sub-dependencies + function getDependencies(tag) + { + const cmp = allComponents.find(c => c.tagName === tag); + if (!cmp || !Array.isArray(component.dependencies)) + { + return; + } + + cmp.dependencies?.forEach(dependentTag => + { + if (!dependencies.includes(dependentTag)) + { + dependencies.push(dependentTag); + } + getDependencies(dependentTag); + }); + } + + getDependencies(component.tagName); + + component.dependencies = dependencies.sort(); + }); + + // Sort by name + return allComponents.sort((a, b) => + { + if (a.name < b.name) + { + return -1; + } + if (a.name > b.name) + { + return 1; + } + return 0; + }); +}; + +module.exports.getShoelaceVersion = function () +{ + const shoelace = "@shoelace-style/shoelace" + + const package = JSON.parse(fs.readFileSync('../../package.json', "utf8")) || {dependencies: {}} + return package.dependencies[shoelace] || ""; +} \ No newline at end of file diff --git a/doc/etemplate2/_utilities/code-previews.cjs b/doc/etemplate2/_utilities/code-previews.cjs new file mode 100644 index 0000000000..89840f6b4b --- /dev/null +++ b/doc/etemplate2/_utilities/code-previews.cjs @@ -0,0 +1,138 @@ +let count = 1; + +function escapeHtml(str) { + return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +/** + * Turns code fields with the :preview suffix into interactive code previews. + */ +module.exports = function (doc, options) { + options = { + within: 'body', // the element containing the code fields to convert + ...options + }; + + const within = doc.querySelector(options.within); + if (!within) { + return doc; + } + + within.querySelectorAll('[class*=":preview"]').forEach(code => { + const pre = code.closest('pre'); + if (!pre) { + return; + } + const adjacentPre = pre.nextElementSibling?.tagName.toLowerCase() === 'pre' ? pre.nextElementSibling : null; + const reactCode = adjacentPre?.querySelector('code[class$="react"]'); + const sourceGroupId = `code-preview-source-group-${count}`; + const isExpanded = code.getAttribute('class').includes(':expanded'); + const noCodePen = code.getAttribute('class').includes(':no-codepen'); + + count++; + + const htmlButton = ` + + `; + + const reactButton = ` + + `; + + const codePenButton = ` + + `; + + const codePreview = ` +
+
+ ${code.textContent} +
+ +
+
+ +
+
+
${escapeHtml(code.textContent)}
+
+ + ${ + reactCode + ? ` +
+
${escapeHtml(reactCode.textContent)}
+
+ ` + : '' + } +
+ +
+ + + ${reactCode ? ` ${htmlButton} ${reactButton} ` : ''} + + ${noCodePen ? '' : codePenButton} +
+
+ `; + + pre.insertAdjacentHTML('afterend', codePreview); + pre.remove(); + + if (adjacentPre) { + adjacentPre.remove(); + } + }); + + // Wrap code preview scripts in anonymous functions so they don't run in the global scope + doc.querySelectorAll('.code-preview__preview script').forEach(script => { + if (script.type === 'module') { + // Modules are already scoped + script.textContent = script.innerHTML; + } else { + // Wrap non-modules in an anonymous function so they don't run in the global scope + script.textContent = `(() => { ${script.innerHTML} })();`; + } + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/copy-code-buttons.cjs b/doc/etemplate2/_utilities/copy-code-buttons.cjs new file mode 100644 index 0000000000..306164b246 --- /dev/null +++ b/doc/etemplate2/_utilities/copy-code-buttons.cjs @@ -0,0 +1,26 @@ +/** + * Adds copy code buttons to code fields. The provided doc should be a document object provided by JSDOM. The same + * document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc) { + doc.querySelectorAll('pre > code').forEach(code => { + const pre = code.closest('pre'); + const button = doc.createElement('button'); + button.setAttribute('type', 'button'); + button.classList.add('copy-code-button'); + button.setAttribute('aria-label', 'Copy'); + button.innerHTML = ` + + + + + + `; + + pre.append(button); + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/external-links.cjs b/doc/etemplate2/_utilities/external-links.cjs new file mode 100644 index 0000000000..36a95898a2 --- /dev/null +++ b/doc/etemplate2/_utilities/external-links.cjs @@ -0,0 +1,41 @@ +const { isExternalLink } = require('./strings.cjs'); + +/** + * Transforms external links to make them safer and optionally add a target. The provided doc should be a document + * object provided by JSDOM. The same document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc, options) { + options = { + className: 'external-link', // the class name to add to links + noopener: true, // sets rel="noopener" + noreferrer: true, // sets rel="noreferrer" + ignore: () => false, // callback function to filter links that should be ignored + within: 'body', // element that contains the target links + target: '', // sets the target attribute + ...options + }; + + const within = doc.querySelector(options.within); + + if (within) { + within.querySelectorAll('a').forEach(link => { + if (isExternalLink(link) && !options.ignore(link)) { + link.classList.add(options.className); + + const rel = []; + if (options.noopener) rel.push('noopener'); + if (options.noreferrer) rel.push('noreferrer'); + + if (rel.length) { + link.setAttribute('rel', rel.join(' ')); + } + + if (options.target) { + link.setAttribute('target', options.target); + } + } + }); + } + + return doc; +}; diff --git a/doc/etemplate2/_utilities/highlight-code.cjs b/doc/etemplate2/_utilities/highlight-code.cjs new file mode 100644 index 0000000000..bb4c01f092 --- /dev/null +++ b/doc/etemplate2/_utilities/highlight-code.cjs @@ -0,0 +1,63 @@ +const Prism = require('prismjs'); +const PrismLoader = require('prismjs/components/index.js'); + +PrismLoader('diff'); +PrismLoader.silent = true; + +/** Highlights a code string. */ +function highlight(code, language) { + const alias = language.replace(/^diff-/, ''); + const isDiff = /^diff-/i.test(language); + + // Auto-load the target language + if (!Prism.languages[alias]) { + PrismLoader(alias); + + if (!Prism.languages[alias]) { + throw new Error(`Unsupported language for code highlighting: "${language}"`); + } + } + + // Register diff-* languages to use the diff grammar + if (isDiff) { + Prism.languages[language] = Prism.languages.diff; + } + + return Prism.highlight(code, Prism.languages[language], language); +} + +/** + * Highlights all code fields that have a language parameter. If the language has a colon in its name, the first chunk + * will be the language used and additional chunks will be applied as classes to the `
`. For example, a code field
+ * tagged with "html:preview" will be rendered as `
`.
+ *
+ * The provided doc should be a document object provided by JSDOM. The same document will be returned with the
+ * appropriate DOM manipulations.
+ */
+module.exports = function (doc) {
+  doc.querySelectorAll('pre > code[class]').forEach(code => {
+    // Look for class="language-*" and split colons into separate classes
+    code.classList.forEach(className => {
+      if (className.startsWith('language-')) {
+        //
+        // We use certain suffixes to indicate code previews, expanded states, etc. The class might look something like
+        // this:
+        //
+        //  class="language-html:preview:expanded"
+        //
+        // The language will always come first, so we need to drop the "language-" prefix and everything after the first
+        // color to get the highlighter language.
+        //
+        const language = className.replace(/^language-/, '').split(':')[0];
+
+        try {
+          code.innerHTML = highlight(code.textContent ?? '', language);
+        } catch (err) {
+          // Language not found, skip it
+        }
+      }
+    });
+  });
+
+  return doc;
+};
diff --git a/doc/etemplate2/_utilities/markdown.cjs b/doc/etemplate2/_utilities/markdown.cjs
new file mode 100644
index 0000000000..4a73e8f399
--- /dev/null
+++ b/doc/etemplate2/_utilities/markdown.cjs
@@ -0,0 +1,67 @@
+const MarkdownIt = require('markdown-it');
+const markdownItContainer = require('markdown-it-container');
+const markdownItIns = require('markdown-it-ins');
+const markdownItKbd = require('markdown-it-kbd');
+const markdownItMark = require('markdown-it-mark');
+const markdownItReplaceIt = require('markdown-it-replace-it');
+
+const markdown = MarkdownIt({
+  html: true,
+  xhtmlOut: false,
+  breaks: false,
+  langPrefix: 'language-',
+  linkify: false,
+  typographer: false
+});
+
+// Third-party plugins
+markdown.use(markdownItContainer);
+markdown.use(markdownItIns);
+markdown.use(markdownItKbd);
+markdown.use(markdownItMark);
+markdown.use(markdownItReplaceIt);
+
+// Callouts
+['tip', 'warning', 'danger'].forEach(type => {
+  markdown.use(markdownItContainer, type, {
+    render: function (tokens, idx) {
+      if (tokens[idx].nesting === 1) {
+        return `\n';
+    }
+  });
+});
+
+// Asides
+markdown.use(markdownItContainer, 'aside', {
+  render: function (tokens, idx) {
+    if (tokens[idx].nesting === 1) {
+      return `\n';
+  }
+});
+
+// Details
+markdown.use(markdownItContainer, 'details', {
+  validate: params => params.trim().match(/^details\s+(.*)$/),
+  render: (tokens, idx) => {
+    const m = tokens[idx].info.trim().match(/^details\s+(.*)$/);
+    if (tokens[idx].nesting === 1) {
+      return `
\n${markdown.utils.escapeHtml(m[1])}\n`; + } + return '
\n'; + } +}); + +// Replace [#1234] with a link to GitHub issues +markdownItReplaceIt.replacements.push({ + name: 'github-issues', + re: /\[#([0-9]+)\]/gs, + sub: '#$1', + html: true, + default: true +}); + +module.exports = markdown; diff --git a/doc/etemplate2/_utilities/prettier.cjs b/doc/etemplate2/_utilities/prettier.cjs new file mode 100644 index 0000000000..67850eaff4 --- /dev/null +++ b/doc/etemplate2/_utilities/prettier.cjs @@ -0,0 +1,27 @@ +const {format} = require('prettier'); + +/** Formats markup using prettier. */ +module.exports = function (content, options) +{ + options = { + arrowParens: 'avoid', + bracketSpacing: true, + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + bracketSameLine: false, + jsxSingleQuote: false, + parser: 'html', + printWidth: 120, + proseWrap: 'preserve', + quoteProps: 'as-needed', + requirePragma: false, + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + useTabs: false, + ...options + }; + + return format(content, options); +}; diff --git a/doc/etemplate2/_utilities/replacer.cjs b/doc/etemplate2/_utilities/replacer.cjs new file mode 100644 index 0000000000..ddc4d4a374 --- /dev/null +++ b/doc/etemplate2/_utilities/replacer.cjs @@ -0,0 +1,19 @@ +/** + * @typedef {object} Replacement + * @property {string | RegExp} pattern + * @property {string} replacement + */ + +/** + * @typedef {Array} Replacements + */ + +/** + * @param {Document} content + * @param {Replacements} replacements + */ +module.exports = function (content, replacements) { + replacements.forEach(replacement => { + content.body.innerHTML = content.body.innerHTML.replaceAll(replacement.pattern, replacement.replacement); + }); +}; diff --git a/doc/etemplate2/_utilities/scrolling-tables.cjs b/doc/etemplate2/_utilities/scrolling-tables.cjs new file mode 100644 index 0000000000..148248dbe8 --- /dev/null +++ b/doc/etemplate2/_utilities/scrolling-tables.cjs @@ -0,0 +1,21 @@ +/** + * Turns headings into clickable, deep linkable anchors. The provided doc should be a document object provided by JSDOM. + * The same document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc, options) { + const tables = [...doc.querySelectorAll('table')]; + + options = { + className: 'table-scroll', // the class name to add to the table's container + ...options + }; + + tables.forEach(table => { + const div = doc.createElement('div'); + div.classList.add(options.className); + table.insertAdjacentElement('beforebegin', div); + div.append(table); + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/strings.cjs b/doc/etemplate2/_utilities/strings.cjs new file mode 100644 index 0000000000..6831d66d96 --- /dev/null +++ b/doc/etemplate2/_utilities/strings.cjs @@ -0,0 +1,16 @@ +const slugify = require('slugify'); + +/** Creates a slug from an arbitrary string of text. */ +module.exports.createSlug = function (text) { + return slugify(String(text), { + remove: /[^\w|\s]/g, + lower: true + }); +}; + +/** Determines whether or not a link is external. */ +module.exports.isExternalLink = function (link) { + // We use the "internal" hostname when initializing JSDOM so we know that those are local links + if (!link.hostname || link.hostname === 'internal') return false; + return true; +}; diff --git a/doc/etemplate2/_utilities/table-of-contents.cjs b/doc/etemplate2/_utilities/table-of-contents.cjs new file mode 100644 index 0000000000..1ac04fd31c --- /dev/null +++ b/doc/etemplate2/_utilities/table-of-contents.cjs @@ -0,0 +1,42 @@ +/** + * Generates an in-page table of contents based on headings. + */ +module.exports = function (doc, options) { + options = { + levels: ['h2'], // headings to include (they must have an id) + container: 'nav', // the container to append links to + listItem: true, // if true, links will be wrapped in
  • + within: 'body', // the element containing the headings to summarize + ...options + }; + + const container = doc.querySelector(options.container); + const within = doc.querySelector(options.within); + const headingSelector = options.levels.map(h => `${h}[id]`).join(', '); + + if (!container || !within) { + return doc; + } + + within.querySelectorAll(headingSelector).forEach(heading => { + const listItem = doc.createElement('li'); + const link = doc.createElement('a'); + const level = heading.tagName.slice(1); + + link.href = `#${heading.id}`; + link.textContent = heading.textContent; + + if (options.listItem) { + // List item + link + listItem.setAttribute('data-level', level); + listItem.append(link); + container.append(listItem); + } else { + // Link only + link.setAttribute('data-level', level); + container.append(link); + } + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/typography.cjs b/doc/etemplate2/_utilities/typography.cjs new file mode 100644 index 0000000000..53fe84b611 --- /dev/null +++ b/doc/etemplate2/_utilities/typography.cjs @@ -0,0 +1,23 @@ +const smartquotes = require('smartquotes'); + +smartquotes.replacements.push([/---/g, '\u2014']); // em dash +smartquotes.replacements.push([/--/g, '\u2013']); // en dash +smartquotes.replacements.push([/\.\.\./g, '\u2026']); // ellipsis +smartquotes.replacements.push([/\(c\)/gi, '\u00A9']); // copyright +smartquotes.replacements.push([/\(r\)/gi, '\u00AE']); // registered trademark +smartquotes.replacements.push([/\?!/g, '\u2048']); // ?! +smartquotes.replacements.push([/!!/g, '\u203C']); // !! +smartquotes.replacements.push([/\?\?/g, '\u2047']); // ?? +smartquotes.replacements.push([/([0-9]\s?)-(\s?[0-9])/g, '$1\u2013$2']); // number ranges use en dash + +/** + * Improves typography by adding smart quotes and similar corrections within the specified element(s). + * + * The provided doc should be a document object provided by JSDOM. The same document will be returned with the + * appropriate DOM manipulations. + */ +module.exports = function (doc, selector = 'body') { + const elements = [...doc.querySelectorAll(selector)]; + elements.forEach(el => smartquotes.element(el)); + return doc; +}; diff --git a/doc/etemplate2/assets/examples/include.html b/doc/etemplate2/assets/examples/include.html new file mode 100644 index 0000000000..3a5dc6228d --- /dev/null +++ b/doc/etemplate2/assets/examples/include.html @@ -0,0 +1,19 @@ +

    + The content in this example was included from + a separate file. 🤯 +

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Fringilla urna porttitor rhoncus dolor purus + non enim. Nullam vehicula ipsum a arcu cursus vitae congue mauris. Gravida in fermentum et sollicitudin. +

    +

    + Cursus sit amet dictum sit amet justo donec enim. Sed id semper risus in hendrerit gravida. Viverra accumsan in nisl + nisi scelerisque eu ultrices vitae. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit. Nec + ullamcorper sit amet risus nullam. Et egestas quis ipsum suspendisse ultrices gravida dictum. Lorem donec massa sapien + faucibus et molestie. A cras semper auctor neque vitae. +

    + + diff --git a/doc/etemplate2/assets/images/styling_et2-label-fixed_1.png b/doc/etemplate2/assets/images/styling_et2-label-fixed_1.png new file mode 100644 index 0000000000..cd0c608104 Binary files /dev/null and b/doc/etemplate2/assets/images/styling_et2-label-fixed_1.png differ diff --git a/doc/etemplate2/assets/images/styling_et2-label-fixed_2.png b/doc/etemplate2/assets/images/styling_et2-label-fixed_2.png new file mode 100644 index 0000000000..339da59b1f Binary files /dev/null and b/doc/etemplate2/assets/images/styling_et2-label-fixed_2.png differ diff --git a/doc/etemplate2/assets/images/styling_et2-label-fixed_3.png b/doc/etemplate2/assets/images/styling_et2-label-fixed_3.png new file mode 100644 index 0000000000..169382d5ba Binary files /dev/null and b/doc/etemplate2/assets/images/styling_et2-label-fixed_3.png differ diff --git a/doc/etemplate2/assets/images/widgets_rendered_example.png b/doc/etemplate2/assets/images/widgets_rendered_example.png new file mode 100644 index 0000000000..73343154a6 Binary files /dev/null and b/doc/etemplate2/assets/images/widgets_rendered_example.png differ diff --git a/doc/etemplate2/assets/scripts/code-previews.js b/doc/etemplate2/assets/scripts/code-previews.js new file mode 100644 index 0000000000..db6bd79102 --- /dev/null +++ b/doc/etemplate2/assets/scripts/code-previews.js @@ -0,0 +1,286 @@ +(() => +{ + function convertModuleLinks(html) + { + html = html + .replace(/@shoelace-style\/shoelace/g, `https://esm.sh/@shoelace-style/shoelace@${egwVersion}`) + .replace(/from 'react'/g, `from 'https://esm.sh/react@${reactVersion}'`) + .replace(/from "react"/g, `from "https://esm.sh/react@${reactVersion}"`); + + return html; + } + + function getAdjacentExample(name, pre) + { + let currentPre = pre.nextElementSibling; + + while (currentPre?.tagName.toLowerCase() === 'pre') + { + if (currentPre?.getAttribute('data-lang').split(' ').includes(name)) + { + return currentPre; + } + + currentPre = currentPre.nextElementSibling; + } + + return null; + } + + function runScript(script) + { + const newScript = document.createElement('script'); + + if (script.type === 'module') + { + newScript.type = 'module'; + newScript.textContent = script.innerHTML; + } + else + { + newScript.appendChild(document.createTextNode(`(() => { ${script.innerHTML} })();`)); + } + + script.parentNode.replaceChild(newScript, script); + } + + function getFlavor() + { + return sessionStorage.getItem('flavor') || 'html'; + } + + function setFlavor(newFlavor) + { + flavor = ['html', 'react'].includes(newFlavor) ? newFlavor : 'html'; + sessionStorage.setItem('flavor', flavor); + + // Set the flavor class on the body + document.documentElement.classList.toggle('flavor-html', flavor === 'html'); + document.documentElement.classList.toggle('flavor-react', flavor === 'react'); + } + + function syncFlavor() + { + setFlavor(getFlavor()); + + document.querySelectorAll('.code-preview__button--html').forEach(preview => + { + if (flavor === 'html') + { + preview.classList.add('code-preview__button--selected'); + } + }); + + document.querySelectorAll('.code-preview__button--react').forEach(preview => + { + if (flavor === 'react') + { + preview.classList.add('code-preview__button--selected'); + } + }); + } + + const egwVersion = document.documentElement.getAttribute('data-egroupware-version'); + const shoelaceVersion = document.documentElement.getAttribute('data-shoelace-version'); + const reactVersion = '18.2.0'; + const cdndir = 'cdn'; + const npmdir = 'dist'; + let flavor = getFlavor(); + let count = 1; + + // We need the version to open + if (!egwVersion) + { + throw new Error('The data-egroupware-version attribute is missing from .'); + } + + // Sync flavor UI on page load + syncFlavor(); + + // + // Resizing previews + // + document.addEventListener('mousedown', handleResizerDrag); + document.addEventListener('touchstart', handleResizerDrag, {passive: true}); + + function handleResizerDrag(event) + { + const resizer = event.target.closest('.code-preview__resizer'); + const preview = event.target.closest('.code-preview__preview'); + + if (!resizer || !preview) + { + return; + } + + let startX = event.changedTouches ? event.changedTouches[0].pageX : event.clientX; + let startWidth = parseInt(document.defaultView.getComputedStyle(preview).width, 10); + + event.preventDefault(); + preview.classList.add('code-preview__preview--dragging'); + document.documentElement.addEventListener('mousemove', dragMove); + document.documentElement.addEventListener('touchmove', dragMove); + document.documentElement.addEventListener('mouseup', dragStop); + document.documentElement.addEventListener('touchend', dragStop); + + function dragMove(event) + { + const width = startWidth + (event.changedTouches ? event.changedTouches[0].pageX : event.pageX) - startX; + preview.style.width = `${width}px`; + } + + function dragStop() + { + preview.classList.remove('code-preview__preview--dragging'); + document.documentElement.removeEventListener('mousemove', dragMove); + document.documentElement.removeEventListener('touchmove', dragMove); + document.documentElement.removeEventListener('mouseup', dragStop); + document.documentElement.removeEventListener('touchend', dragStop); + } + } + + // + // Toggle source mode + // + document.addEventListener('click', event => + { + const button = event.target.closest('.code-preview__button'); + const codeBlock = button?.closest('.code-preview'); + + if (button?.classList.contains('code-preview__button--html')) + { + // Show HTML + setFlavor('html'); + toggleSource(codeBlock, true); + } + else if (button?.classList.contains('code-preview__button--react')) + { + // Show React + setFlavor('react'); + toggleSource(codeBlock, true); + } + else if (button?.classList.contains('code-preview__toggle')) + { + // Toggle source + toggleSource(codeBlock); + } + else + { + return; + } + + // Update flavor buttons + [...document.querySelectorAll('.code-preview')].forEach(cb => + { + cb.querySelector('.code-preview__button--html')?.classList.toggle( + 'code-preview__button--selected', + flavor === 'html' + ); + cb.querySelector('.code-preview__button--react')?.classList.toggle( + 'code-preview__button--selected', + flavor === 'react' + ); + }); + }); + + function toggleSource(codeBlock, force) + { + codeBlock.classList.toggle('code-preview--expanded', force); + event.target.setAttribute('aria-expanded', codeBlock.classList.contains('code-preview--expanded')); + } + + // + // Open in CodePen + // + document.addEventListener('click', event => + { + const button = event.target.closest('button'); + + if (button?.classList.contains('code-preview__button--codepen')) + { + const codeBlock = button.closest('.code-preview'); + const htmlExample = codeBlock.querySelector('.code-preview__source--html > pre > code')?.textContent; + const reactExample = codeBlock.querySelector('.code-preview__source--react > pre > code')?.textContent; + const isReact = flavor === 'react' && typeof reactExample === 'string'; + const theme = document.documentElement.classList.contains('sl-theme-dark') ? 'dark' : 'light'; + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + const isDark = theme === 'dark' || (theme === 'auto' && prefersDark); + const editors = isReact ? '0010' : '1000'; + let htmlTemplate = ''; + let jsTemplate = ''; + let cssTemplate = ''; + + const form = document.createElement('form'); + form.action = 'https://codepen.io/pen/define'; + form.method = 'POST'; + form.target = '_blank'; + + // HTML templates + if (!isReact) + { + htmlTemplate = + `\n` + + `\n${htmlExample}`; + jsTemplate = ''; + } + + // React templates + if (isReact) + { + htmlTemplate = '
    '; + jsTemplate = + `import ReactDOM from 'https://esm.sh/react-dom@${reactVersion}';\n` + + `import { setBasePath } from 'https://esm.sh/@shoelace-style/shoelace@${shoelaceVersion}/${cdndir}/utilities/base-path';\n` + + `\n` + + `// Set the base path for Shoelace assets\n` + + `setBasePath('https://esm.sh/@shoelace-style/shoelace@${shoelaceVersion}/${npmdir}/')\n` + + `\n${convertModuleLinks(reactExample)}\n` + + `\n` + + `ReactDOM.render(, document.getElementById('root'));`; + } + + // CSS templates + cssTemplate = + `@import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@${shoelaceVersion}/${cdndir}/themes/${ + isDark ? 'dark' : 'light' + }.css';\n` + + '\n' + + 'body {\n' + + ' font: 16px sans-serif;\n' + + ' background-color: var(--sl-color-neutral-0);\n' + + ' color: var(--sl-color-neutral-900);\n' + + ' padding: 1rem;\n' + + '}'; + + // Docs: https://blog.codepen.io/documentation/prefill/ + const data = { + title: '', + description: '', + tags: ['shoelace', 'web components'], + editors, + head: ``, + html_classes: `sl-theme-${isDark ? 'dark' : 'light'}`, + css_external: ``, + js_external: ``, + js_module: true, + js_pre_processor: isReact ? 'babel' : 'none', + html: htmlTemplate, + css: cssTemplate, + js: jsTemplate + }; + + const input = document.createElement('input'); + input.type = 'hidden'; + input.name = 'data'; + input.value = JSON.stringify(data); + form.append(input); + + document.documentElement.append(form); + form.submit(); + form.remove(); + } + }); + + // Set the initial flavor + window.addEventListener('turbo:load', syncFlavor); +})(); diff --git a/doc/etemplate2/assets/scripts/docs.js b/doc/etemplate2/assets/scripts/docs.js new file mode 100644 index 0000000000..60b1fa8cad --- /dev/null +++ b/doc/etemplate2/assets/scripts/docs.js @@ -0,0 +1,298 @@ +// +// Sidebar +// +// When the sidebar is hidden, we apply the inert attribute to prevent focus from reaching it. Due to the many states +// the sidebar can have (e.g. static, hidden, expanded), we test for visibility by checking to see if it's placed +// offscreen or not. Then, on resize/transition we make sure to update the attribute accordingly. +// +(() => { + function getSidebar() { + return document.getElementById('sidebar'); + } + + function isSidebarOpen() { + return document.documentElement.classList.contains('sidebar-open'); + } + + function isSidebarVisible() { + return getSidebar().getBoundingClientRect().x >= 0; + } + + function toggleSidebar(force) { + const isOpen = typeof force === 'boolean' ? force : !isSidebarOpen(); + return document.documentElement.classList.toggle('sidebar-open', isOpen); + } + + function updateInert() { + getSidebar().inert = !isSidebarVisible(); + } + + // Toggle the menu + document.addEventListener('click', event => { + const menuToggle = event.target.closest('#menu-toggle'); + if (!menuToggle) return; + toggleSidebar(); + }); + + // Update the sidebar's inert state when the window resizes and when the sidebar transitions + window.addEventListener('resize', () => toggleSidebar(false)); + + document.addEventListener('transitionend', event => { + const sidebar = event.target.closest('#sidebar'); + if (!sidebar) return; + updateInert(); + }); + + // Close when a menu item is selected on mobile + document.addEventListener('click', event => { + const sidebar = event.target.closest('#sidebar'); + const link = event.target.closest('a'); + if (!sidebar || !link) return; + + if (isSidebarOpen()) { + toggleSidebar(); + } + }); + + // Close when open and escape is pressed + document.addEventListener('keydown', event => { + if (event.key === 'Escape' && isSidebarOpen()) { + event.stopImmediatePropagation(); + toggleSidebar(); + } + }); + + // Close when clicking outside of the sidebar + document.addEventListener('mousedown', event => { + if (isSidebarOpen() & !event.target?.closest('#sidebar, #menu-toggle')) { + event.stopImmediatePropagation(); + toggleSidebar(); + } + }); + + updateInert(); +})(); + +// +// Theme selector +// +(() => { + function getTheme() { + return localStorage.getItem('theme') || 'auto'; + } + + function isDark() { + if (theme === 'auto') { + return window.matchMedia('(prefers-color-scheme: dark)').matches; + } + return theme === 'dark'; + } + + function setTheme(newTheme) { + theme = newTheme; + localStorage.setItem('theme', theme); + + // Update the UI + updateSelection(); + + // Toggle the dark mode class + document.documentElement.classList.toggle('sl-theme-dark', isDark()); + } + + function updateSelection() { + const menu = document.querySelector('#theme-selector sl-menu'); + if (!menu) return; + [...menu.querySelectorAll('sl-menu-item')].map(item => (item.checked = item.getAttribute('value') === theme)); + } + + let theme = getTheme(); + + // Selection is not preserved when changing page, so update when opening dropdown + document.addEventListener('sl-show', event => { + const themeSelector = event.target.closest('#theme-selector'); + if (!themeSelector) return; + updateSelection(); + }); + + // Listen for selections + document.addEventListener('sl-select', event => { + const menu = event.target.closest('#theme-selector sl-menu'); + if (!menu) return; + setTheme(event.detail.item.value); + }); + + // Update the theme when the preference changes + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => setTheme(theme)); + + // Toggle with backslash + document.addEventListener('keydown', event => { + if ( + event.key === '\\' && + !event.composedPath().some(el => ['input', 'textarea'].includes(el?.tagName?.toLowerCase())) + ) { + event.preventDefault(); + setTheme(isDark() ? 'light' : 'dark'); + } + }); + + // Set the initial theme and sync the UI + setTheme(theme); +})(); + +// +// Open details when printing +// +(() => { + const detailsOpenOnPrint = new Set(); + + window.addEventListener('beforeprint', () => { + detailsOpenOnPrint.clear(); + document.querySelectorAll('details').forEach(details => { + if (details.open) { + detailsOpenOnPrint.add(details); + } + details.open = true; + }); + }); + + window.addEventListener('afterprint', () => { + document.querySelectorAll('details').forEach(details => { + details.open = detailsOpenOnPrint.has(details); + }); + detailsOpenOnPrint.clear(); + }); +})(); + +// +// Copy code buttons +// +(() => { + document.addEventListener('click', event => { + const button = event.target.closest('.copy-code-button'); + const pre = button?.closest('pre'); + const code = pre?.querySelector('code'); + const copyIcon = button?.querySelector('.copy-code-button__copy-icon'); + const copiedIcon = button?.querySelector('.copy-code-button__copied-icon'); + + if (button && code) { + navigator.clipboard.writeText(code.innerText); + copyIcon.style.display = 'none'; + copiedIcon.style.display = 'inline'; + button.classList.add('copy-code-button--copied'); + + setTimeout(() => { + copyIcon.style.display = 'inline'; + copiedIcon.style.display = 'none'; + button.classList.remove('copy-code-button--copied'); + }, 1000); + } + }); +})(); + +// +// Smooth links +// +(() => { + document.addEventListener('click', event => { + const link = event.target.closest('a'); + const id = (link?.hash ?? '').substr(1); + const isFragment = link?.hasAttribute('href') && link?.getAttribute('href').startsWith('#'); + + if (!link || !isFragment || link.getAttribute('data-smooth-link') === 'false') { + return; + } + + // Scroll to the top + if (link.hash === '') { + event.preventDefault(); + window.scroll({ top: 0, behavior: 'smooth' }); + history.pushState(undefined, undefined, location.pathname); + } + + // Scroll to an id + if (id) { + const target = document.getElementById(id); + + if (target) { + event.preventDefault(); + window.scroll({ top: target.offsetTop, behavior: 'smooth' }); + history.pushState(undefined, undefined, `#${id}`); + } + } + }); +})(); + +// +// Table of Contents scrollspy +// +(() => { + // This will be stale if its not a function. + const getLinks = () => [...document.querySelectorAll('.content__toc a')]; + const linkTargets = new WeakMap(); + const visibleTargets = new WeakSet(); + const observer = new IntersectionObserver(handleIntersect, { rootMargin: '0px 0px' }); + let debounce; + + function handleIntersect(entries) { + entries.forEach(entry => { + // Remember which targets are visible + if (entry.isIntersecting) { + visibleTargets.add(entry.target); + } else { + visibleTargets.delete(entry.target); + } + }); + + updateActiveLinks(); + } + + function updateActiveLinks() { + const links = getLinks(); + // Find the first visible target and activate the respective link + links.find(link => { + const target = linkTargets.get(link); + + if (target && visibleTargets.has(target)) { + links.forEach(el => el.classList.toggle('active', el === link)); + return true; + } + + return false; + }); + } + + // Observe link targets + function observeLinks() { + getLinks().forEach(link => { + const hash = link.hash.slice(1); + const target = hash ? document.querySelector(`.content__body #${hash}`) : null; + + if (target) { + linkTargets.set(link, target); + observer.observe(target); + } + }); + } + + observeLinks(); + + document.addEventListener('turbo:load', updateActiveLinks); + document.addEventListener('turbo:load', observeLinks); +})(); + +// +// Show custom versions in the sidebar +// +(() => { + function updateVersion() { + const el = document.querySelector('.sidebar-version'); + if (!el) return; + + if (location.hostname === 'next.shoelace.style') el.textContent = 'Next'; + if (location.hostname === 'localhost') el.textContent = 'Development'; + } + + updateVersion(); + + document.addEventListener('turbo:load', updateVersion); +})(); diff --git a/doc/etemplate2/assets/scripts/search.js b/doc/etemplate2/assets/scripts/search.js new file mode 100644 index 0000000000..049ab30a4f --- /dev/null +++ b/doc/etemplate2/assets/scripts/search.js @@ -0,0 +1,376 @@ +(() => { + // Append the search dialog to the body + const siteSearch = document.createElement('div'); + const scrollbarWidth = Math.abs(window.innerWidth - document.documentElement.clientWidth); + + siteSearch.classList.add('search'); + siteSearch.innerHTML = ` +
    + +
    +
    +
    + + + +
    +
    +
    +
      +
      No matching pages
      +
      +
      + Navigate + Select + Esc Close +
      +
      +
      + `; + + const overlay = siteSearch.querySelector('.search__overlay'); + const dialog = siteSearch.querySelector('.search__dialog'); + const input = siteSearch.querySelector('.search__input'); + const clearButton = siteSearch.querySelector('.search__clear-button'); + const results = siteSearch.querySelector('.search__results'); + const version = document.documentElement.getAttribute('data-shoelace-version'); + const key = `search_${version}`; + const searchDebounce = 50; + const animationDuration = 150; + let isShowing = false; + let searchTimeout; + let searchIndex; + let map; + + const loadSearchIndex = new Promise(resolve => { + const cache = localStorage.getItem(key); + const wait = 'requestIdleCallback' in window ? requestIdleCallback : requestAnimationFrame; + + // Cleanup older search indices (everything before this version) + try { + const items = { ...localStorage }; + + Object.keys(items).forEach(k => { + if (key > k) { + localStorage.removeItem(k); + } + }); + } catch { + /* do nothing */ + } + + // Look for a cached index + try { + if (cache) { + const data = JSON.parse(cache); + + searchIndex = window.lunr.Index.load(data.searchIndex); + map = data.map; + + return resolve(); + } + } catch { + /* do nothing */ + } + + // Wait until idle to fetch the index + wait(() => { + fetch('/assets/search.json') + .then(res => res.json()) + .then(data => { + if (!window.lunr) { + console.error('The Lunr search client has not yet been loaded.'); + } + + searchIndex = window.lunr.Index.load(data.searchIndex); + map = data.map; + + // Cache the search index for this version + if (version) { + try { + localStorage.setItem(key, JSON.stringify(data)); + } catch (err) { + console.warn(`Unable to cache the search index: ${err}`); + } + } + + resolve(); + }); + }); + }); + + async function show() { + isShowing = true; + document.body.append(siteSearch); + document.body.classList.add('search-visible'); + document.body.style.setProperty('--docs-search-scroll-lock-size', `${scrollbarWidth}px`); + clearButton.hidden = true; + requestAnimationFrame(() => input.focus()); + updateResults(); + + dialog.showModal(); + + await Promise.all([ + dialog.animate( + [ + { opacity: 0, transform: 'scale(.9)', transformOrigin: 'top' }, + { opacity: 1, transform: 'scale(1)', transformOrigin: 'top' } + ], + { duration: animationDuration } + ).finished, + overlay.animate([{ opacity: 0 }, { opacity: 1 }], { duration: animationDuration }).finished + ]); + + dialog.addEventListener('mousedown', handleMouseDown); + dialog.addEventListener('keydown', handleKeyDown); + } + + async function hide() { + isShowing = false; + + await Promise.all([ + dialog.animate( + [ + { opacity: 1, transform: 'scale(1)', transformOrigin: 'top' }, + { opacity: 0, transform: 'scale(.9)', transformOrigin: 'top' } + ], + { duration: animationDuration } + ).finished, + overlay.animate([{ opacity: 1 }, { opacity: 0 }], { duration: animationDuration }).finished + ]); + + dialog.close(); + + input.blur(); // otherwise Safari will scroll to the bottom of the page on close + input.value = ''; + document.body.classList.remove('search-visible'); + document.body.style.removeProperty('--docs-search-scroll-lock-size'); + siteSearch.remove(); + updateResults(); + + dialog.removeEventListener('mousedown', handleMouseDown); + dialog.removeEventListener('keydown', handleKeyDown); + } + + function handleInput() { + clearButton.hidden = input.value === ''; + + // Debounce search queries + clearTimeout(searchTimeout); + searchTimeout = setTimeout(() => updateResults(input.value), searchDebounce); + } + + function handleClear() { + clearButton.hidden = true; + input.value = ''; + input.focus(); + updateResults(); + } + + function handleMouseDown(event) { + if (!event.target.closest('.search__content')) { + hide(); + } + } + + function handleKeyDown(event) { + // Close when pressing escape + if (event.key === 'Escape') { + event.preventDefault(); // prevent from closing immediately so it can animate + event.stopImmediatePropagation(); + hide(); + return; + } + + // Handle keyboard selections + if (['ArrowDown', 'ArrowUp', 'Home', 'End', 'Enter'].includes(event.key)) { + event.preventDefault(); + + const currentEl = results.querySelector('[data-selected="true"]'); + const items = [...results.querySelectorAll('li')]; + const index = items.indexOf(currentEl); + let nextEl; + + if (items.length === 0) { + return; + } + + switch (event.key) { + case 'ArrowUp': + nextEl = items[Math.max(0, index - 1)]; + break; + case 'ArrowDown': + nextEl = items[Math.min(items.length - 1, index + 1)]; + break; + case 'Home': + nextEl = items[0]; + break; + case 'End': + nextEl = items[items.length - 1]; + break; + case 'Enter': + currentEl?.querySelector('a')?.click(); + break; + } + + // Update the selected item + items.forEach(item => { + if (item === nextEl) { + input.setAttribute('aria-activedescendant', item.id); + item.setAttribute('data-selected', 'true'); + nextEl.scrollIntoView({ block: 'nearest' }); + } else { + item.setAttribute('data-selected', 'false'); + } + }); + } + } + + async function updateResults(query = '') { + try { + await loadSearchIndex; + + const hasQuery = query.length > 0; + const searchTerms = query + .split(' ') + .map((term, index, arr) => { + // Search API: https://lunrjs.com/guides/searching.html + if (index === arr.length - 1) { + // The last term is not mandatory and 1x fuzzy. We also duplicate it with a wildcard to match partial words + // as the user types. + return `${term}~1 ${term}*`; + } else { + // All other terms are mandatory and 1x fuzzy + return `+${term}~1`; + } + }) + .join(' '); + const matches = hasQuery ? searchIndex.search(searchTerms) : []; + const hasResults = hasQuery && matches.length > 0; + + siteSearch.classList.toggle('search--has-results', hasQuery && hasResults); + siteSearch.classList.toggle('search--no-results', hasQuery && !hasResults); + + input.setAttribute('aria-activedescendant', ''); + results.innerHTML = ''; + + matches.forEach((match, index) => { + const page = map[match.ref]; + const li = document.createElement('li'); + const a = document.createElement('a'); + const displayTitle = page.title ?? ''; + const displayDescription = page.description ?? ''; + const displayUrl = page.url.replace(/^\//, '').replace(/\/$/, ''); + let icon = 'file-text'; + + a.setAttribute('role', 'option'); + a.setAttribute('id', `search-result-item-${match.ref}`); + + if (page.url.includes('getting-started/')) { + icon = 'lightbulb'; + } + if (page.url.includes('resources/')) { + icon = 'book'; + } + if (page.url.includes('components/')) { + icon = 'puzzle'; + } + if (page.url.includes('tokens/')) { + icon = 'palette2'; + } + if (page.url.includes('utilities/')) { + icon = 'wrench'; + } + if (page.url.includes('tutorials/')) { + icon = 'joystick'; + } + + li.classList.add('search__result'); + li.setAttribute('role', 'option'); + li.setAttribute('id', `search-result-item-${match.ref}`); + li.setAttribute('data-selected', index === 0 ? 'true' : 'false'); + + a.href = page.url; + a.innerHTML = ` + +
      +
      +
      +
      +
      + `; + a.querySelector('.search__result-title').textContent = displayTitle; + a.querySelector('.search__result-description').textContent = displayDescription; + a.querySelector('.search__result-url').textContent = displayUrl; + + li.appendChild(a); + results.appendChild(li); + }); + } catch { + // Ignore query errors as the user types + } + } + + // Show the search dialog when clicking on data-plugin="search" + document.addEventListener('click', event => { + const searchButton = event.target.closest('[data-plugin="search"]'); + if (searchButton) { + show(); + } + }); + + // Show the search dialog when slash (or CMD+K) is pressed and focus is not inside a form element + document.addEventListener('keydown', event => { + if ( + !isShowing && + (event.key === '/' || (event.key === 'k' && (event.metaKey || event.ctrlKey))) && + !event.composedPath().some(el => ['input', 'textarea'].includes(el?.tagName?.toLowerCase())) + ) { + event.preventDefault(); + show(); + } + }); + + // Purge cache when we press CMD+CTRL+R + document.addEventListener('keydown', event => { + if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') { + localStorage.clear(); + } + }); + + input.addEventListener('input', handleInput); + clearButton.addEventListener('click', handleClear); + + // Close when a result is selected + results.addEventListener('click', event => { + if (event.target.closest('a')) { + hide(); + } + }); +})(); diff --git a/doc/etemplate2/assets/scripts/turbo.js b/doc/etemplate2/assets/scripts/turbo.js new file mode 100644 index 0000000000..7075217f03 --- /dev/null +++ b/doc/etemplate2/assets/scripts/turbo.js @@ -0,0 +1,29 @@ +import * as Turbo from 'https://cdn.jsdelivr.net/npm/@hotwired/turbo@7.3.0/+esm'; + +(() => { + if (!window.scrollPositions) { + window.scrollPositions = {}; + } + + function preserveScroll() { + document.querySelectorAll('[data-preserve-scroll').forEach(element => { + scrollPositions[element.id] = element.scrollTop; + }); + } + + function restoreScroll(event) { + document.querySelectorAll('[data-preserve-scroll').forEach(element => { + element.scrollTop = scrollPositions[element.id]; + }); + + if (event.detail && event.detail.newBody) { + event.detail.newBody.querySelectorAll('[data-preserve-scroll').forEach(element => { + element.scrollTop = scrollPositions[element.id]; + }); + } + } + + window.addEventListener('turbo:before-cache', preserveScroll); + window.addEventListener('turbo:before-render', restoreScroll); + window.addEventListener('turbo:render', restoreScroll); +})(); diff --git a/doc/etemplate2/assets/styles/code-previews.css b/doc/etemplate2/assets/styles/code-previews.css new file mode 100644 index 0000000000..0fa5efacc6 --- /dev/null +++ b/doc/etemplate2/assets/styles/code-previews.css @@ -0,0 +1,173 @@ +/* Interactive code blocks */ +.code-preview { + position: relative; + border-radius: 3px; + background-color: var(--sl-color-neutral-50); + margin-bottom: 1.5rem; +} + +.code-preview__preview { + position: relative; + border: solid 1px var(--sl-color-neutral-200); + border-bottom: none; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: var(--sl-color-neutral-0); + min-width: 20rem; + max-width: 100%; + padding: 1.5rem 3.25rem 1.5rem 1.5rem; +} + +/* Block the preview while dragging to prevent iframes from intercepting drag events */ +.code-preview__preview--dragging:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: ew-resize; +} + +.code-preview__resizer { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 1.75rem; + font-size: 20px; + color: var(--sl-color-neutral-600); + background-color: var(--sl-color-neutral-0); + border-left: solid 1px var(--sl-color-neutral-200); + border-top-right-radius: 3px; + cursor: ew-resize; +} + +@media screen and (max-width: 600px) { + .code-preview__preview { + padding-right: 1.5rem; + } + + .code-preview__resizer { + display: none; + } +} + +.code-preview__source { + border: solid 1px var(--sl-color-neutral-200); + border-bottom: none; + border-radius: 0 !important; + display: none; +} + +.code-preview--expanded .code-preview__source { + display: block; +} + +.code-preview__source pre { + margin: 0; +} + +.code-preview__buttons { + position: relative; + border: solid 1px var(--sl-color-neutral-200); + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + display: flex; +} + +.code-preview__button { + flex: 0 0 auto; + height: 2.5rem; + min-width: 2.5rem; + border: none; + border-radius: 0; + background: var(--sl-color-neutral-0); + font: inherit; + font-size: 0.7rem; + font-weight: 500; + text-transform: uppercase; + color: var(--sl-color-neutral-600); + padding: 0 1rem; + cursor: pointer; +} + +.code-preview__button:not(:last-of-type) { + border-right: solid 1px var(--sl-color-neutral-200); +} + +.code-preview__button--html, +.code-preview__button--react { + width: 70px; + display: flex; + place-items: center; + justify-content: center; +} + +.code-preview__button--selected { + font-weight: 700; + color: var(--sl-color-primary-600); +} + +.code-preview__button--codepen { + display: flex; + place-items: center; + width: 6rem; +} + +.code-preview__button:first-of-type { + border-bottom-left-radius: 3px; +} + +.code-preview__button:last-of-type { + border-bottom-right-radius: 3px; +} + +.code-preview__button:hover, +.code-preview__button:active { + box-shadow: 0 0 0 1px var(--sl-color-primary-400); + border-right-color: transparent; + background-color: var(--sl-color-primary-50); + color: var(--sl-color-primary-600); + z-index: 1; +} + +.code-preview__button:focus-visible { + outline: none; + outline: var(--sl-focus-ring); + z-index: 2; +} + +.code-preview__toggle { + position: relative; + display: flex; + flex: 1 1 auto; + align-items: center; + justify-content: center; + width: 100%; + color: var(--sl-color-neutral-600); + cursor: pointer; +} + +.code-preview__toggle svg { + width: 1em; + height: 1em; + margin-left: 0.25rem; +} + +.code-preview--expanded .code-preview__toggle svg { + transform: rotate(180deg); +} + +/* We can apply data-flavor="html|react" to any element on the page to toggle it when the flavor changes */ +.flavor-html [data-flavor]:not([data-flavor='html']) { + display: none; +} + +.flavor-react [data-flavor]:not([data-flavor='react']) { + display: none; +} diff --git a/doc/etemplate2/assets/styles/docs.css b/doc/etemplate2/assets/styles/docs.css new file mode 100644 index 0000000000..de1f8ae660 --- /dev/null +++ b/doc/etemplate2/assets/styles/docs.css @@ -0,0 +1,1426 @@ +:root { + --docs-background-color: var(--sl-color-neutral-0); + --docs-border-color: var(--sl-color-neutral-200); + --docs-border-width: 1px; + --docs-border-radius: var(--sl-border-radius-medium); + --docs-content-max-width: 100%; + --docs-sidebar-width: 320px; + --docs-sidebar-transition-speed: 250ms; + --docs-content-toc-max-width: 220px; + --docs-content-padding: 2rem; + --docs-content-vertical-spacing: 2rem; + --docs-search-overlay-background: rgb(0 0 0 / 0.2); + --docs-skip-to-main-width: 200px; +} + +/* Light theme */ +:root { + color-scheme: normal; + + --sl-color-primary-50: var(--sl-color-sky-50); + --sl-color-primary-100: var(--sl-color-sky-100); + --sl-color-primary-200: var(--sl-color-sky-200); + --sl-color-primary-300: var(--sl-color-sky-300); + --sl-color-primary-400: var(--sl-color-sky-400); + --sl-color-primary-500: var(--sl-color-sky-500); + --sl-color-primary-600: var(--sl-color-sky-600); + --sl-color-primary-700: var(--sl-color-sky-700); + --sl-color-primary-800: var(--sl-color-sky-800); + --sl-color-primary-900: var(--sl-color-sky-900); + --sl-color-primary-950: var(--sl-color-sky-950); + + --docs-overlay-color: hsl(240 3.8% 46.1% / 33%); + --docs-shadow-x-small: 0 1px 2px hsl(240 3.8% 46.1% / 12%); + --docs-shadow-small: 0 1px 2px hsl(240 3.8% 46.1% / 24%); + --docs-shadow-medium: 0 2px 4px hsl(240 3.8% 46.1% / 24%); + --docs-shadow-large: 0 2px 8px hsl(240 3.8% 46.1% / 24%); + --docs-shadow-x-large: 0 4px 16px hsl(240 3.8% 46.1% / 24%); +} + +/* Dark theme */ +.sl-theme-dark { + color-scheme: dark; + + --docs-overlay-color: hsl(0 0% 0% / 66%); + --docs-shadow-x-small: 0 1px 2px rgb(0 0 0 / 36%); + --docs-shadow-small: 0 1px 2px rgb(0 0 0 / 48%); + --docs-shadow-medium: 0 2px 4px rgb(0 0 0 / 48%); + --docs-shadow-large: 0 2px 8px rgb(0 0 0 / 48%); + --docs-shadow-x-large: 0 4px 16px rgb(0 0 0 / 48%); +} + +/* Utils */ +html.sl-theme-dark .only-light, +html:not(.sl-theme-dark) .only-dark { + display: none !important; +} + +.visually-hidden:not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + clip: rect(0 0 0 0) !important; + clip-path: inset(50%) !important; + border: none !important; + overflow: hidden !important; + white-space: nowrap !important; + padding: 0 !important; +} + +.nowrap { + white-space: nowrap; +} + +@media screen and (max-width: 900px) { + :root { + --docs-content-padding: 1rem; + } +} + +/* Bare styles */ +*, +*:before, +*:after { + box-sizing: inherit; +} + +a:focus, +button:focus { + outline: none; +} + +a:focus-visible, +button:focus-visible { + outline: var(--sl-focus-ring); + outline-offset: var(--sl-focus-ring-offset); +} + +::selection { + background-color: var(--sl-color-primary-200); + color: var(--sl-color-neutral-900); +} + +/* Show custom elements only after they're registered */ +:not(:defined), +:not(:defined) * { + opacity: 0; +} + +:defined { + opacity: 1; + transition: 0.1s opacity; +} + +html { + height: 100%; + box-sizing: border-box; + line-height: var(--sl-line-height-normal); + padding: 0; + margin: 0; +} + +body { + height: 100%; + font: 16px var(--sl-font-sans); + font-weight: var(--sl-font-weight-normal); + background-color: var(--docs-background-color); + line-height: var(--sl-line-height-normal); + color: var(--sl-color-neutral-900); + padding: 0; + margin: 0; + overflow-x: hidden; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} + +/* Common elements */ +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--sl-font-sans); + font-weight: var(--sl-font-weight-semibold); + margin: 3rem 0 1.5rem 0; +} + +h1:first-of-type { + margin-top: 1rem; +} + +h1 { + font-size: 2.5rem; +} + +h2 { + font-size: 1.875rem; + border-bottom: solid var(--docs-border-width) var(--docs-border-color); +} + +h3 { + font-size: 1.625rem; +} + +h4 { + font-size: 1.375rem; +} + +h5 { + font-size: 1.125rem; +} + +h6 { + font-size: 0.875rem; +} + +p { + margin-block-end: 1.5em; +} + +img { + max-width: 100%; +} + +.badges img { + border-radius: var(--sl-border-radius-medium); +} + +.callout img, +details img { + width: 100%; + margin-left: 0; + margin-right: 0; +} + +details pre { + border: solid var(--docs-border-width) var(--docs-border-color); +} + +a { + color: var(--sl-color-primary-700); +} + +a:hover { + color: var(--sl-color-primary-800); +} + +abbr[title] { + text-decoration: none; + border-bottom: dashed 1px var(--sl-color-primary-700); + cursor: help; +} + +em { + font-style: italic; +} + +strong { + font-weight: var(--sl-font-weight-bold); +} + +code { + font-family: var(--sl-font-mono); + font-size: 0.9125em; + background-color: rgba(0 0 0 / 0.025); + background-blend-mode: darken; + border-radius: var(--docs-border-radius); + padding: 0.125em 0.25em; +} + +code.deprecated { + text-decoration: line-through; +} + +.sl-theme-dark code { + background-color: rgba(255 255 255 / 0.03); +} + +kbd { + background: var(--sl-color-neutral-100); + border: solid 1px var(--sl-color-neutral-200); + box-shadow: inset 0 1px 0 0 var(--sl-color-neutral-0), inset 0 -1px 0 0 var(--sl-color-neutral-200); + font-family: var(--sl-font-mono); + font-size: 0.9125em; + border-radius: var(--docs-border-radius); + color: var(--sl-color-neutral-800); + padding: 0.125em 0.4em; +} + +ins { + background-color: var(--sl-color-green-200); + color: var(--sl-color-green-900); + border-radius: var(--docs-border-radius); + text-decoration: none; + padding: 0.125em 0.25em; +} + +s { + background-color: var(--sl-color-red-200); + color: var(--sl-color-red-900); + border-radius: var(--docs-border-radius); + text-decoration: none; + padding: 0.125em 0.25em; +} + +mark { + background-color: var(--sl-color-yellow-200); + border-radius: var(--docs-border-radius); + padding: 0.125em 0.25em; +} + +hr { + border: none; + border-bottom: solid var(--docs-border-width) var(--docs-border-color); + margin: calc(var(--docs-content-vertical-spacing) * 2) 0; +} + +/* Block quotes */ +blockquote { + position: relative; + font-family: var(--sl-font-serif); + font-size: 1.33rem; + font-style: italic; + color: var(--sl-color-neutral-700); + background-color: var(--sl-color-neutral-100); + border-radius: var(--docs-border-radius); + border-left: solid 6px var(--sl-color-neutral-300); + padding: 1.5rem; + margin: 0 0 1.5rem 0; +} + +blockquote > :first-child { + margin-top: 0; +} + +blockquote > :last-child { + margin-bottom: 0; +} + +/* Lists */ +ul, +ol { + padding: 0; + margin: 0 0 var(--docs-content-vertical-spacing) 2rem; +} + +ul { + list-style: disc; +} + +li { + padding: 0; + margin: 0 0 0.25rem 0; +} + +li ul, +li ol { + margin-top: 0.25rem; +} + +ul ul:last-child, +ul ol:last-child, +ol ul:last-child, +ol ol:last-child { + margin-bottom: 0; +} + +/* Anchor headings */ +.anchor-heading { + position: relative; + color: inherit; + text-decoration: none; +} + +.anchor-heading a { + text-decoration: none; + color: inherit; +} + +.anchor-heading a::after { + content: '#'; + color: var(--sl-color-primary-700); + margin-inline: 0.5rem; + opacity: 0; + transition: 100ms opacity; +} + +.anchor-heading:hover a::after, +.anchor-heading:focus-within a::after { + opacity: 1; +} + +/* External links */ +.external-link__icon { + width: 0.75em; + height: 0.75em; + vertical-align: 0; + margin-left: 0.25em; + margin-right: 0.125em; +} + +/* Tables */ +table { + max-width: 100%; + border: none; + border-collapse: collapse; + color: inherit; + margin-bottom: var(--docs-content-vertical-spacing); +} + +table tr { + border-bottom: solid var(--docs-border-width) var(--docs-border-color); +} + +table th { + font-weight: var(--sl-font-weight-semibold); + text-align: left; +} + +table td, +table th { + line-height: var(--sl-line-height-normal); + padding: 1rem 1rem; +} + +table th p:first-child, +table td p:first-child { + margin-top: 0; +} + +table th p:last-child, +table td p:last-child { + margin-bottom: 0; +} + +.table-scroll { + max-width: 100%; + overflow-x: auto; +} + +.table-scroll code { + white-space: nowrap; +} + +th.table-name, +th.table-event-detail { + min-width: 15ch; +} + +th.table-description { + min-width: 50ch !important; + max-width: 70ch; +} + +/* Code blocks */ +pre { + position: relative; + background-color: var(--sl-color-neutral-50); + font-family: var(--sl-font-mono); + color: var(--sl-color-neutral-900); + border-radius: var(--docs-border-radius); + padding: 1rem; + white-space: pre; +} + +.sl-theme-dark pre { + background-color: var(--sl-color-neutral-50); +} + +pre:not(:last-child) { + margin-bottom: 1.5rem; +} + +pre > code { + display: block; + background: none !important; + border-radius: 0; + hyphens: none; + tab-size: 2; + white-space: pre; + padding: 1rem; + margin: -1rem; + overflow: auto; +} + +pre .token.comment { + color: var(--sl-color-neutral-600); +} + +pre .token.prolog, +pre .token.doctype, +pre .token.cdata, +pre .token.operator, +pre .token.punctuation { + color: var(--sl-color-neutral-700); +} + +.namespace { + opacity: 0.7; +} + +pre .token.property, +pre .token.keyword, +pre .token.tag, +pre .token.url { + color: var(--sl-color-blue-700); +} + +pre .token.symbol, +pre .token.deleted { + color: var(--sl-color-red-700); +} + +pre .token.boolean, +pre .token.constant, +pre .token.selector, +pre .token.attr-name, +pre .token.string, +pre .token.char, +pre .token.builtin, +pre .token.inserted { + color: var(--sl-color-emerald-700); +} + +pre .token.atrule, +pre .token.attr-value, +pre .token.number, +pre .token.variable { + color: var(--sl-color-violet-700); +} + +pre .token.function, +pre .token.class-name, +pre .token.regex { + color: var(--sl-color-orange-700); +} + +pre .token.important { + color: var(--sl-color-red-700); +} + +pre .token.important, +pre .token.bold { + font-weight: bold; +} + +pre .token.italic { + font-style: italic; +} + +/* Copy code button */ +.copy-code-button { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 0.5rem; + right: 0.5rem; + background: var(--sl-color-neutral-0); + border-radius: calc(var(--docs-border-radius) * 0.875); + border: solid 1px var(--sl-color-neutral-200); + color: var(--sl-color-neutral-800); + text-transform: uppercase; + padding: 0.5rem; + margin: 0; + cursor: pointer; + transition: 100ms opacity, 100ms scale; +} + +.copy-code-button svg { + width: 1rem; + height: 1rem; +} + +pre .copy-code-button { + opacity: 0; + scale: 0.9; +} + +pre:hover .copy-code-button, +.copy-code-button:focus-visible { + opacity: 1; + scale: 1; +} + +pre:hover .copy-code-button:hover, +pre:hover .copy-code-button--copied { + background: var(--sl-color-neutral-200); + border-color: var(--sl-color-neutral-300); + color: var(--sl-color-neutral-900); +} + +/* Callouts */ +.callout { + position: relative; + background-color: var(--sl-color-neutral-100); + border-left: solid 4px var(--sl-color-neutral-500); + border-radius: var(--docs-border-radius); + color: var(--sl-color-neutral-800); + padding: 1.5rem 1.5rem 1.5rem 2rem; + margin-bottom: var(--docs-content-vertical-spacing); +} + +.callout > :first-child { + margin-top: 0; +} + +.callout > :last-child { + margin-bottom: 0; +} + +.callout--tip { + background-color: var(--sl-color-primary-100); + border-left-color: var(--sl-color-primary-600); + color: var(--sl-color-primary-800); +} + +.callout::before { + content: ''; + position: absolute; + top: calc(50% - 0.8rem); + left: calc(-0.8rem - 2px); + width: 1.6rem; + height: 1.6rem; + display: flex; + align-items: center; + justify-content: center; + font-family: var(--sl-font-serif); + font-weight: var(--sl-font-weight-bold); + color: var(--sl-color-neutral-0); + clip-path: circle(50% at 50% 50%); +} + +.callout--tip::before { + content: 'i'; + font-style: italic; + background-color: var(--sl-color-primary-600); +} + +.callout--warning { + background-color: var(--sl-color-warning-100); + border-left-color: var(--sl-color-warning-600); + color: var(--sl-color-warning-800); +} + +.callout--warning::before { + content: '!'; + background-color: var(--sl-color-warning-600); +} + +.callout--danger { + background-color: var(--sl-color-danger-100); + border-left-color: var(--sl-color-danger-600); + color: var(--sl-color-danger-800); +} + +.callout--danger::before { + content: '‼'; + background-color: var(--sl-color-danger-600); +} + +.callout + .callout { + margin-top: calc(-0.5 * var(--docs-content-vertical-spacing)); +} + +.callout a { + color: inherit; +} + +/* Aside */ +.content aside { + float: right; + min-width: 300px; + max-width: 50%; + background: var(--sl-color-neutral-100); + border-radius: var(--docs-border-radius); + padding: 1rem; + margin-left: 1rem; +} + +.content aside > :first-child { + margin-top: 0; +} + +.content aside > :last-child { + margin-bottom: 0; +} + +@media screen and (max-width: 600px) { + .content aside { + float: none; + width: calc(100% + (var(--docs-content-padding) * 2)); + max-width: none; + margin: var(--docs-content-vertical-spacing) calc(-1 * var(--docs-content-padding)); + } +} + +/* Details */ +.content details { + background-color: var(--sl-color-neutral-100); + border-radius: var(--docs-border-radius); + padding: 1rem; + margin: 0 0 var(--docs-content-vertical-spacing) 0; +} + +.content details summary { + font-weight: var(--sl-font-weight-semibold); + border-radius: var(--docs-border-radius); + padding: 1rem; + margin: -1rem; + cursor: pointer; + user-select: none; +} + +.content details summary span { + padding-left: 0.5rem; +} + +.content details[open] summary { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + margin-bottom: 1rem; +} + +.content details[open] summary:focus-visible { + border-radius: var(--docs-border-radius); +} + +.content details > :last-child { + margin-bottom: 0; +} + +.content details > :nth-child(2) { + margin-top: 0; +} + +.content details + details { + margin-top: calc(-1 * var(--docs-content-vertical-spacing) + (2 * var(--docs-border-width))); +} + +/* Sidebar */ +#sidebar { + position: fixed; + flex: 0; + top: 0; + left: 0; + bottom: 0; + z-index: 20; + width: var(--docs-sidebar-width); + background-color: var(--docs-background-color); + border-right: solid var(--docs-border-width) var(--docs-border-color); + border-radius: 0; + padding: 2rem; + margin: 0; + overflow: auto; + scrollbar-width: thin; + transition: var(--docs-sidebar-transition-speed) translate ease-in-out; +} + +#sidebar::-webkit-scrollbar { + width: 4px; +} + +#sidebar::-webkit-scrollbar-thumb { + background: transparent; + border-radius: 9999px; +} + +#sidebar:hover::-webkit-scrollbar-thumb { + background: var(--sl-color-neutral-400); +} + +#sidebar:hover::-webkit-scrollbar-track { + background: var(--sl-color-neutral-100); +} + +#sidebar > header { + margin-bottom: 1.5rem; +} + +#sidebar > header h1 { + margin: 0; +} + +#sidebar > header a { + display: block; +} + +#sidebar nav a { + text-decoration: none; +} + +#sidebar nav h2 { + font-size: var(--sl-font-size-medium); + font-weight: var(--sl-font-weight-semibold); + border-bottom: solid var(--docs-border-width) var(--docs-border-color); + margin: 1.5rem 0 0.5rem 0; +} + +#sidebar ul { + padding: 0; + margin: 0; +} + +#sidebar ul li { + list-style: none; + padding: 0; + margin: 0.125rem 0.5rem; +} + +#sidebar ul ul ul { + margin-left: 0.75rem; +} + +#sidebar ul li a { + line-height: 1.33; + color: inherit; + display: inline-block; + padding: 0; +} + +#sidebar ul li a:not(.active-link):hover { + color: var(--sl-color-primary-700); +} + +#sidebar nav .active-link { + color: var(--sl-color-primary-700); + border-bottom: dashed 1px var(--sl-color-primary-700); +} + +#sidebar > header img { + display: block; + width: 100%; + height: auto; + margin: 0 auto; +} + +@media screen and (max-width: 900px) { + #sidebar { + translate: -100%; + } + + .sidebar-open #sidebar { + translate: 0; + } +} + +.sidebar-version { + font-size: var(--sl-font-size-x-small); + color: var(--sl-color-neutral-500); + text-align: right; + margin-top: -0.5rem; + margin-right: 1rem; + margin-bottom: -0.5rem; +} + +.sidebar-buttons { + display: flex; + justify-content: space-between; +} + +/* Main content */ +main { + position: relative; + padding: var(--docs-content-vertical-spacing) var(--docs-content-padding) + calc(var(--docs-content-vertical-spacing) * 2) var(--docs-content-padding); + margin-left: var(--docs-sidebar-width); +} + +.sidebar-open .content { + margin-left: 0; +} + +.content__body > :last-child { + margin-bottom: 0; +} + +@media screen and (max-width: 900px) { + main { + margin-left: 0; + } +} + +/* Component layouts */ +.content { + display: grid; + grid-template-columns: 100%; + gap: 2rem; + position: relative; + max-width: var(--docs-content-max-width); + margin: 0 auto; +} + +.content--with-toc { + /* There's a 2rem gap, so we need to remove it from the column */ + grid-template-columns: calc(75% - 2rem) min(25%, var(--docs-content-toc-max-width)); + max-width: calc(var(--docs-content-max-width) + var(--docs-content-toc-max-width)); +} + +.content__body { + order: 1; + width: 100%; +} + +.content:not(.content--with-toc) .content__toc { + display: none; +} + +.content__toc { + order: 2; + display: flex; + flex-direction: column; + margin-top: 0; +} + +.content__toc ul { + position: sticky; + top: 5rem; + max-height: calc(100vh - 6rem); + font-size: var(--sl-font-size-small); + line-height: 1.33; + border-left: solid 1px var(--sl-color-neutral-200); + list-style: none; + padding: 1rem 0; + margin: 0; + padding-left: 1rem; + overflow-y: auto; +} + +.content__toc li { + padding: 0 0 0 0.5rem; + margin: 0; +} + +.content__toc li[data-level='3'] { + margin-left: 1rem; +} + +/* We don't use them, but just in case */ +.content__toc li[data-level='4'], +.content__toc li[data-level='5'], +.content__toc li[data-level='6'] { + margin-left: 2rem; +} + +.content__toc li:not(:last-of-type) { + margin-bottom: 0.6rem; +} + +.content__toc a { + color: var(--sl-color-neutral-700); + text-decoration: none; +} + +.content__toc a:hover { + color: var(--sl-color-primary-700); +} + +.content__toc a.active { + color: var(--sl-color-primary-700); + border-bottom: dashed 1px var(--sl-color-primary-700); +} + +.content__toc .top a { + font-weight: var(--sl-font-weight-semibold); + color: var(--sl-color-neutral-500); +} + +@media screen and (max-width: 1024px) { + .content { + grid-template-columns: 100%; + gap: 0; + } + + .content__toc { + position: relative; + order: 1; + } + + .content__toc ul { + display: flex; + justify-content: start; + gap: 1rem 1.5rem; + position: static; + border: none; + border-bottom: solid 1px var(--sl-color-neutral-200); + border-radius: 0; + padding: 1rem 1.5rem 1rem 0.5rem; /* extra right padding to hide the fade effect */ + margin-top: 1rem; + overflow-x: auto; + } + + .content__toc ul::after { + content: ''; + position: absolute; + top: 0; + bottom: 1rem; /* don't cover the scrollbar */ + right: 0; + width: 2rem; + background: linear-gradient(90deg, rgba(0 0 0 / 0) 0%, var(--sl-color-neutral-0) 100%); + } + + .content__toc li { + white-space: nowrap; + } + + .content__toc li:not(:last-of-type) { + margin-bottom: 0; + } + + .content__toc [data-level]:not([data-level='2']) { + display: none; + } + + .content__body { + order: 2; + } +} + +/* Menu toggle */ +#menu-toggle { + display: none; + position: fixed; + z-index: 30; + top: 0.25rem; + left: 0.25rem; + height: auto; + width: auto; + color: black; + border: none; + border-radius: 50%; + background: var(--sl-color-neutral-0); + padding: 0.5rem; + margin: 0; + cursor: pointer; + transition: 250ms scale ease, 250ms rotate ease; +} + +@media screen and (max-width: 900px) { + #menu-toggle { + display: flex; + } +} + +.sl-theme-dark #menu-toggle { + color: white; +} + +#menu-toggle:hover { + scale: 1.1; +} + +#menu-toggle svg { + width: 1.25rem; + height: 1.25rem; +} + +html.sidebar-open #menu-toggle { + rotate: 180deg; +} + +/* Skip to main content */ +#skip-to-main { + position: fixed; + top: 0.25rem; + left: calc(50% - var(--docs-skip-to-main-width) / 2); + z-index: 100; + width: var(--docs-skip-to-main-width); + text-align: center; + text-decoration: none; + border-radius: 9999px; + background: var(--sl-color-neutral-0); + color: var(--sl-color-neutral-1000); + padding: 0.5rem; +} + +/* Icon toolbar */ +#icon-toolbar { + display: flex; + position: fixed; + top: 0; + right: 1rem; + z-index: 10; + background: var(--sl-color-neutral-800); + border-bottom-left-radius: calc(var(--docs-border-radius) * 2); + border-bottom-right-radius: calc(var(--docs-border-radius) * 2); + padding: 0.125rem 0.25rem; +} + +#icon-toolbar button, +#icon-toolbar a { + flex: 0 0 auto; + display: inline-flex; + align-items: center; + width: auto; + height: auto; + background: transparent; + border: none; + border-radius: var(--docs-border-radius); + font-size: 1.25rem; + color: var(--sl-color-neutral-0); + text-decoration: none; + padding: 0.5rem; + margin: 0; + cursor: pointer; + transition: 250ms scale ease; +} + +#theme-selector:not(:defined) { + /* Hide when not defined to prevent extra wide icon toolbar while loading */ + display: none; +} + +#theme-selector sl-menu { + /* Set an initial size to prevent width being too small when first opening on small screen width */ + width: 140px; +} + +#theme-selector sl-button { + transition: 250ms scale ease; +} + +#theme-selector sl-button::part(base) { + color: var(--sl-color-neutral-0); +} + +#theme-selector sl-button::part(label) { + display: flex; + padding: 0.5rem; +} + +#theme-selector sl-icon { + font-size: 1.25rem; +} + +.sl-theme-dark #theme-selector sl-button::part(base) { + color: var(--sl-color-neutral-1000); +} + +.sl-theme-dark #icon-toolbar { + background: var(--sl-color-neutral-200); +} + +.sl-theme-dark #icon-toolbar button, +.sl-theme-dark #icon-toolbar a { + color: var(--sl-color-neutral-1000); +} + +#icon-toolbar button:hover, +#icon-toolbar a:hover, +#theme-selector sl-button:hover { + scale: 1.1; +} + +#icon-toolbar a:not(:last-child), +#icon-toolbar button:not(:last-child) { + margin-right: 0.25rem; +} + +@media screen and (max-width: 900px) { + #icon-toolbar { + right: 0; + border-bottom-right-radius: 0; + } + + #icon-toolbar button, + #icon-toolbar a { + font-size: 1rem; + padding: 0.5rem; + } + + #theme-selector sl-icon { + font-size: 1rem; + } +} + +/* Sidebar addons */ +#sidebar-addons:not(:empty) { + margin-bottom: var(--docs-content-vertical-spacing); +} + +/* Print styles */ +@media print { + a:not(.anchor-heading)[href]::after { + content: ' (' attr(href) ')'; + } + + details, + pre, + .callout { + border: solid var(--docs-border-width) var(--docs-border-color); + } + + details summary { + list-style: none; + } + + details summary span { + padding-left: 0; + } + + details summary::marker, + details summary::-webkit-details-marker { + display: none; + } + + .callout::before { + border: solid var(--docs-border-width) var(--docs-border-color); + } + + .component-page__navigation, + .copy-code-button, + .code-preview__buttons, + .code-preview__resizer { + display: none !important; + } + + .flavor-html .code-preview__source--html, + .flavor-react .code-preview__source--react { + display: block !important; + } + + .flavor-html .code-preview__source--html > pre, + .flavor-react .code-preview__source--react > pre { + border: none; + } + + .code-preview__source-group { + border-bottom: solid 1px var(--sl-color-neutral-200); + border-bottom-left-radius: var(--sl-border-radius-medium); + border-bottom-right-radius: var(--sl-border-radius-medium); + } + + #sidebar { + display: none; + } + + #content { + margin-left: 0; + } + + #menu-toggle, + #icon-toolbar, + .external-link__icon { + display: none; + } +} + +/* Splash */ +.splash { + display: flex; + padding-top: 2rem; +} + +.splash-start { + min-width: 420px; +} + +.splash-start h1 { + font-size: var(--sl-font-size-large); + font-weight: var(--sl-font-weight-normal); +} + +.splash li img { + width: 1em; + height: 1em; + vertical-align: -2px; +} + +.splash-end { + display: flex; + align-items: flex-end; + width: auto; + padding-left: 1rem; +} + +.splash-image { + width: 100%; + height: auto; +} + +.splash-logo { + max-width: 22rem; +} + +.splash-start h1:first-of-type { + font-size: var(--sl-font-size-large); + margin: 0 0 0.5rem 0; +} + +@media screen and (max-width: 1280px) { + .splash { + display: block; + } + + .splash-start { + min-width: 0; + padding-bottom: 1rem; + } + + .splash-end { + padding: 0; + } + + .splash-image { + display: block; + max-width: 400px; + } + + /* Shields */ + .splash + p { + margin-top: 2rem; + } +} + +/* Component headers */ +.component-header h1 { + margin-bottom: 0; +} + +.component-header__tag { + margin-top: -0.5rem; + margin-bottom: 0.5rem; +} + +.component-header__tag code { + background: none; + color: var(--sl-color-neutral-600); + font-size: var(--sl-font-size-large); + padding: 0; + margin: 0; +} + +.component-header__info { + margin-bottom: var(--sl-spacing-x-large); +} + +.component-summary { + font-size: var(--sl-font-size-large); + line-height: 1.6; + margin: 2rem 0; +} + +/* Repo buttons */ +.sidebar-buttons { + display: flex; + gap: 0.125rem; + justify-content: space-between; +} + +.sidebar-buttons .repo-button { + flex: 1 1 auto; +} + +.repo-button--github sl-icon { + color: var(--sl-color-neutral-700); +} + +.repo-button--star sl-icon { + color: var(--sl-color-yellow-500); +} + +.repo-button--twitter sl-icon { + color: var(--sl-color-sky-500); +} + +@media screen and (max-width: 400px) { + :not(.sidebar-buttons) > .repo-button { + width: 100%; + margin-bottom: 1rem; + } +} + +body[data-page^='/tokens/'] .table-wrapper td:first-child, +body[data-page^='/tokens/'] .table-wrapper td:first-child code { + white-space: nowrap; +} + +/* Border radius demo */ +.border-radius-demo { + width: 3rem; + height: 3rem; + background: var(--sl-color-primary-600); +} + +/* Transition demo */ +.transition-demo { + position: relative; + background: var(--sl-color-neutral-200); + width: 8rem; + height: 2rem; +} + +.transition-demo:after { + content: ''; + position: absolute; + background-color: var(--sl-color-primary-600); + top: 0; + left: 0; + width: 0; + height: 100%; + transition-duration: inherit; + transition-property: width; +} + +.transition-demo:hover:after { + width: 100%; +} + +/* Spacing demo */ +.spacing-demo { + width: 100px; + background: var(--sl-color-primary-600); +} + +/* Elevation demo */ +.elevation-demo { + background: transparent; + border-radius: 3px; + width: 4rem; + height: 4rem; + margin: 1rem; +} + +/* Color palettes */ +.color-palette { + display: grid; + grid-template-columns: 200px repeat(11, 1fr); + gap: 1rem var(--sl-spacing-2x-small); + margin: 2rem 0; +} + +.color-palette__name { + font-size: var(--sl-font-size-medium); + font-weight: var(--sl-font-weight-semibold); + grid-template-columns: repeat(11, 1fr); +} + +.color-palette__name code { + background: none; + font-size: var(--sl-font-size-x-small); +} + +.color-palette__example { + font-size: var(--sl-font-size-x-small); + text-align: center; +} + +.color-palette__swatch { + height: 3rem; + border-radius: var(--sl-border-radius-small); +} + +.color-palette__swatch--border { + box-shadow: inset 0 0 0 1px var(--sl-color-neutral-300); +} + +@media screen and (max-width: 1200px) { + .color-palette { + grid-template-columns: repeat(6, 1fr); + } + + .color-palette__name { + grid-column-start: span 6; + } +} diff --git a/doc/etemplate2/assets/styles/search.css b/doc/etemplate2/assets/styles/search.css new file mode 100644 index 0000000000..c5a7d17e56 --- /dev/null +++ b/doc/etemplate2/assets/styles/search.css @@ -0,0 +1,347 @@ +/* Search plugin */ +:root, +:root.sl-theme-dark { + --docs-search-box-background: var(--sl-color-neutral-0); + --docs-search-box-border-width: 1px; + --docs-search-box-border-color: var(--sl-color-neutral-300); + --docs-search-box-color: var(--sl-color-neutral-600); + --docs-search-dialog-background: var(--sl-color-neutral-0); + --docs-search-border-width: var(--docs-border-width); + --docs-search-border-color: var(--docs-border-color); + --docs-search-text-color: var(--sl-color-neutral-900); + --docs-search-text-color-muted: var(--sl-color-neutral-500); + --docs-search-font-weight-normal: var(--sl-font-weight-normal); + --docs-search-font-weight-semibold: var(--sl-font-weight-semibold); + --docs-search-border-radius: calc(2 * var(--docs-border-radius)); + --docs-search-accent-color: var(--sl-color-primary-600); + --docs-search-icon-color: var(--sl-color-neutral-500); + --docs-search-icon-color-active: var(--sl-color-neutral-600); + --docs-search-shadow: var(--docs-shadow-x-large); + --docs-search-result-background-hover: var(--sl-color-neutral-100); + --docs-search-result-color-hover: var(--sl-color-neutral-900); + --docs-search-result-background-active: var(--sl-color-primary-600); + --docs-search-result-color-active: var(--sl-color-neutral-0); + --docs-search-focus-ring: var(--sl-focus-ring); + --docs-search-overlay-background: rgb(0 0 0 / 0.33); +} + +:root.sl-theme-dark { + --docs-search-overlay-background: rgb(71 71 71 / 0.33); +} + +body.search-visible { + padding-right: var(--docs-search-scroll-lock-size) !important; + overflow: hidden !important; +} + +/* Search box */ +.search-box { + flex: 1 1 auto; + display: flex; + align-items: center; + width: 100%; + border: none; + border-radius: 9999px; + background: var(--docs-search-box-background); + border: solid var(--docs-search-box-border-width) var(--docs-search-box-border-color); + font: inherit; + color: var(--docs-search-box-color); + padding: 0.75rem 1rem; + margin: var(--sl-spacing-large) 0; + cursor: pointer; +} + +.search-box span { + flex: 1 1 auto; + width: 1rem; + height: 1rem; + text-align: left; + line-height: 1; + margin: 0 0.75rem; +} + +.search-box:focus { + outline: none; +} + +.search-box:focus-visible { + outline: var(--docs-search-focus-ring); +} + +/* Site search */ +.search { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 9999; +} + +.search[hidden] { + display: none; +} + +.search__overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--docs-search-overlay-background); + z-index: -1; +} + +.search__dialog { + width: 100%; + height: 100%; + max-width: none; + max-height: none; + background: transparent; + border: none; + padding: 0; + margin: 0; +} + +.search__dialog:focus { + outline: none; +} + +.search__dialog::backdrop { + display: none; +} + +/* Fixes an iOS Safari 16.4 bug that draws the parent element's border radius incorrectly when showing/hiding results */ +.search__header { + background-color: var(--docs-search-dialog-background); + border-radius: var(--docs-search-border-radius); +} + +.search--has-results .search__header { + border-top-left-radius: var(--docs-search-border-radius); + border-top-right-radius: var(--docs-search-border-radius); + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.search__content { + display: flex; + flex-direction: column; + width: 100%; + max-width: 500px; + max-height: calc(100vh - 20rem); + background-color: var(--docs-search-dialog-background); + border-radius: var(--docs-search-border-radius); + box-shadow: var(--docs-search-shadow); + padding: 0; + margin: 10rem auto; +} + +@media screen and (max-width: 900px) { + .search__content { + max-width: calc(100% - 2rem); + max-height: calc(90svh); + margin: 4vh 1rem; + } +} + +.search__input-wrapper { + display: flex; + align-items: center; +} + +.search__input-wrapper sl-icon { + width: 1.5rem; + height: 1.5rem; + flex: 0 0 auto; + color: var(--docs-search-icon-color); + margin: 0 1.5rem; +} + +.search__clear-button { + display: flex; + background: none; + border: none; + font: inherit; + padding: 0; + margin: 0; + cursor: pointer; +} + +.search__clear-button[hidden] { + display: none; +} + +.search__clear-button:active sl-icon { + color: var(--docs-search-icon-color-active); +} + +.search__input { + flex: 1 1 auto; + min-width: 0; + border: none; + font: inherit; + font-size: 1.5rem; + font-weight: var(--docs-search-font-weight-normal); + color: var(--docs-search-text-color); + background: transparent; + padding: 1rem 0; + margin: 0; +} + +.search__input::placeholder { + color: var(--docs-search-text-color-muted); +} + +.search__input::-webkit-search-decoration, +.search__input::-webkit-search-cancel-button, +.search__input::-webkit-search-results-button, +.search__input::-webkit-search-results-decoration { + display: none; +} + +.search__input:focus, +.search__input:focus-visible { + outline: none; +} + +.search__body { + flex: 1 1 auto; + overflow: auto; +} + +.search--has-results .search__body { + border-top: solid var(--docs-search-border-width) var(--docs-search-border-color); +} + +.search__results { + display: none; + line-height: 1.2; + list-style: none; + padding: 0.5rem 0; + margin: 0; +} + +.search--has-results .search__results { + display: block; +} + +.search__results a { + display: block; + text-decoration: none; + padding: 0.5rem 1.5rem; +} + +.search__results a:focus-visible { + outline: var(--docs-search-focus-ring); +} + +.search__results li a:hover, +.search__results li a:hover small { + background-color: var(--docs-search-result-background-hover); + color: var(--docs-search-result-color-hover); +} + +.search__results li[data-selected='true'] a, +.search__results li[data-selected='true'] a * { + outline: none; + background-color: var(--docs-search-result-background-active); + color: var(--docs-search-result-color-active); +} + +.search__results h3 { + font-weight: var(--docs-search-font-weight-semibold); + margin: 0; +} + +.search__results small { + display: block; + color: var(--docs-search-text-color-muted); +} + +.search__result { + padding: 0; + margin: 0; +} + +.search__result a { + display: flex; + align-items: center; + gap: 1rem; +} + +.search__result-icon { + flex: 0 0 auto; + display: flex; + color: var(--docs-search-text-color-muted); +} + +.search__result-icon sl-icon { + font-size: 1.5rem; +} + +.search__result__details { + width: calc(100% - 3rem); +} + +.search__result-title, +.search__result-description, +.search__result-url { + max-width: 400px; + line-height: 1.3; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.search__result-title { + font-size: 1.2rem; + font-weight: var(--docs-search-font-weight-semibold); + color: var(--docs-search-accent-color); +} + +.search__result-description { + font-size: 0.875rem; + color: var(--docs-search-text-color); +} + +.search__result-url { + font-size: 0.875rem; + color: var(--docs-search-text-color-muted); +} + +.search__empty { + display: none; + border-top: solid var(--docs-search-border-width) var(--docs-search-border-color); + text-align: center; + color: var(--docs-search-text-color-muted); + padding: 2rem; +} + +.search--no-results .search__empty { + display: block; +} + +.search__footer { + display: flex; + justify-content: center; + gap: 2rem; + border-top: solid var(--docs-search-border-width) var(--docs-search-border-color); + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + padding: 1rem; +} + +.search__footer small { + color: var(--docs-search-text-color-muted); +} + +.search__footer small kbd:last-of-type { + margin-right: 0.25rem; +} + +@media screen and (max-width: 900px) { + .search__footer { + display: none; + } +} diff --git a/doc/etemplate2/custom-elements-manifest.config.mjs b/doc/etemplate2/custom-elements-manifest.config.mjs new file mode 100644 index 0000000000..f9f541d3d1 --- /dev/null +++ b/doc/etemplate2/custom-elements-manifest.config.mjs @@ -0,0 +1,198 @@ +import * as path from 'path'; +//import {customElementJetBrainsPlugin} from 'custom-element-jet-brains-integration'; +//import {customElementVsCodePlugin} from 'custom-element-vs-code-integration'; +import {parse} from 'comment-parser'; +import {pascalCase} from 'pascal-case'; +import commandLineArgs from 'command-line-args'; +import fs from 'fs'; + +const packageData = JSON.parse(fs.readFileSync('package.json', 'utf8')); +const {name, description, version, author, homepage, license} = packageData; + + +function noDash(string) +{ + return string.replace(/^\s?-/, '').trim(); +} + +function replace(string, terms) +{ + terms.forEach(({from, to}) => + { + string = string?.replace(from, to); + }); + + return string; +} + +export default { + globs: ["api/js/etemplate/**/Et2*/*.ts"], + /** Globs to exclude */ + exclude: [],//, 'et2_*.ts', '**/test/*', '**/*.styles.ts', '**/*.test.ts'], + dev: false, + litelement: true, + plugins: [ + // Append package data + { + name: 'egroupware-package-data', + packageLinkPhase({customElementsManifest}) + { + customElementsManifest.package = {name, description, version, author, homepage, license}; + } + }, + + // Parse custom jsDoc tags + { + name: 'shoelace-custom-tags', + analyzePhase({ts, node, moduleDoc}) + { + switch (node.kind) + { + case ts.SyntaxKind.ClassDeclaration: + { + const className = node.name.getText(); + const classDoc = moduleDoc?.declarations?.find(declaration => declaration.name === className); + const customTags = ['animation', 'dependency', 'documentation', 'since', 'status', 'title']; + let customComments = '/**'; + + node.jsDoc?.forEach(jsDoc => + { + jsDoc?.tags?.forEach(tag => + { + const tagName = tag.tagName.getText(); + + if (customTags.includes(tagName)) + { + customComments += `\n * @${tagName} ${tag.comment}`; + } + }); + }); + + // This is what allows us to map JSDOC comments to ReactWrappers. + classDoc['jsDoc'] = node.jsDoc?.map(jsDoc => jsDoc.getFullText()).join('\n'); + +// const parsed = parse(`${customComments}\n */`); + /* + parsed[0].tags?.forEach(t => + { + switch (t.tag) + { + // Animations + case 'animation': + if (!Array.isArray(classDoc['animations'])) + { + classDoc['animations'] = []; + } + classDoc['animations'].push({ + name: t.name, + description: noDash(t.description) + }); + break; + + // Dependencies + case 'dependency': + if (!Array.isArray(classDoc['dependencies'])) + { + classDoc['dependencies'] = []; + } + classDoc['dependencies'].push(t.name); + break; + + // Value-only metadata tags + case 'documentation': + case 'since': + case 'status': + case 'title': + classDoc[t.tag] = t.name; + break; + + // All other tags + default: + if (!Array.isArray(classDoc[t.tag])) + { + classDoc[t.tag] = []; + } + + classDoc[t.tag].push({ + name: t.name, + description: t.description, + type: t.type || undefined + }); + } + }); + */ + } + } + } + }, + { + name: 'shoelace-translate-module-paths', + packageLinkPhase({customElementsManifest}) + { + customElementsManifest?.modules?.forEach(mod => + { + // + // CEM paths look like this: + // + // src/components/button/button.ts + // + // But we want them to look like this: + // + // components/button/button.js + // + const terms = [ + {from: /^src\//, to: ''}, // Strip the src/ prefix + {from: /\.component.(t|j)sx?$/, to: '.js'} // Convert .ts to .js + ]; + + mod.path = replace(mod.path, terms); + + for (const ex of mod.exports ?? []) + { + ex.declaration.module = replace(ex.declaration.module, terms); + } + + for (const dec of mod.declarations ?? []) + { + if (dec.kind === 'class') + { + for (const member of dec.members ?? []) + { + if (member.inheritedFrom) + { + member.inheritedFrom.module = replace(member.inheritedFrom.module, terms); + } + } + } + } + }); + } + }, + + // Generate custom VS Code data + /* + customElementVsCodePlugin({ + outdir, + cssFileName: null, + referencesTemplate: (_, tag) => [ + { + name: 'Documentation', + url: `https://shoelace.style/components/${tag.replace('sl-', '')}` + } + ] + }), + + customElementJetBrainsPlugin({ + excludeCss: true, + referencesTemplate: (_, tag) => + { + return { + name: 'Documentation', + url: `https://shoelace.style/components/${tag.replace('sl-', '')}` + }; + } + }) + + */ + ] +}; diff --git a/doc/etemplate2/eleventy.config.cjs b/doc/etemplate2/eleventy.config.cjs new file mode 100644 index 0000000000..7113072f27 --- /dev/null +++ b/doc/etemplate2/eleventy.config.cjs @@ -0,0 +1,291 @@ +/* eslint-disable no-invalid-this */ +const fs = require('fs'); +const path = require('path'); +const lunr = require('lunr'); +const {capitalCase} = require('change-case'); +const {JSDOM} = require('jsdom'); +const {customElementsManifest, getAllComponents, getShoelaceVersion} = require('./_utilities/cem.cjs'); +const egwFlavoredMarkdown = require('./_utilities/markdown.cjs'); +const activeLinks = require('./_utilities/active-links.cjs'); +const anchorHeadings = require('./_utilities/anchor-headings.cjs'); +const codePreviews = require('./_utilities/code-previews.cjs'); +const copyCodeButtons = require('./_utilities/copy-code-buttons.cjs'); +const externalLinks = require('./_utilities/external-links.cjs'); +const highlightCodeBlocks = require('./_utilities/highlight-code.cjs'); +const tableOfContents = require('./_utilities/table-of-contents.cjs'); +const prettier = require('./_utilities/prettier.cjs'); +const scrollingTables = require('./_utilities/scrolling-tables.cjs'); +const typography = require('./_utilities/typography.cjs'); +const replacer = require('./_utilities/replacer.cjs'); + +const assetsDir = 'assets'; +const cdndir = 'cdn'; +const npmdir = 'dist'; +const allComponents = getAllComponents(); +let hasBuiltSearchIndex = false; + +// Write component data to file, 11ty will pick it up and create pages - the name & location are important +fs.mkdirSync("_data"); +fs.writeFileSync("_data/components.json", JSON.stringify(allComponents)); + +// Put it here too, since addPassthroughCopy() ignores it +fs.copyFileSync("../dist/custom-elements.json", "assets/custom-elements.json"); + +module.exports = function (eleventyConfig) +{ + // + // Global data + // + eleventyConfig.addGlobalData('baseUrl', 'https://egroupware.org/'); // the production URL + eleventyConfig.addGlobalData('layout', 'default'); // make 'default' the default layout + eleventyConfig.addGlobalData('toc', true); // enable the table of contents + eleventyConfig.addGlobalData('meta', { + title: 'EGroupware', + description: '', + image: 'images/logo.svg', + version: customElementsManifest.package.version, + components: allComponents, + shoelaceVersion: getShoelaceVersion(), + cdndir, + npmdir + }); + + // + // Layout aliases + // + eleventyConfig.addLayoutAlias('default', 'default.njk'); + + // + // Copy EGw stuff in + // + // General assets + eleventyConfig.addPassthroughCopy({"../../api/templates/default/images/logo.svg": "assets/images/logo.svg"}); + eleventyConfig.addPassthroughCopy({"../../pixelegg/css/monochrome.css": "assets/styles/monochrome.css"}); + + // vendor requirements + eleventyConfig.addPassthroughCopy({ + "../../vendor/bower-asset/jquery/dist/jquery.min.js": "assets/scripts/vendor/bower-asset/jquery/dist/jquery.min.js", + "../../vendor/bower-asset/cropper/dist/cropper.min.js": "assets/scripts/vendor/bower-asset/cropper/dist/cropper.min.js", + "../../vendor/bower-asset/diff2html/dist/diff2html.min.js": "assets/scripts/vendor/bower-asset/diff2html/dist/diff2html.min.js", + "../../vendor/tinymce/tinymce/tinymce.min.js": "assets/scripts/vendor/tinymce/tinymce/tinymce.min.js", + }) + + // Etemplate2 + eleventyConfig.addPassthroughCopy({"../../chunks": "assets/scripts/chunks"}); + eleventyConfig.addPassthroughCopy({"../../api/js/etemplate/etemplate2.js": "assets/scripts/sub/dir/etemplate/etemplate2.js"}); + + //eleventyConfig.addPassthroughCopy({"../../vendor/**/*min.js": "assets/scripts/vendor/"}); + //eleventyConfig.addPassthroughCopy("../dist/etemplate2.js", "assets/scripts/etemplate2.js"); + + // Shoelace is done via CDN in default.njk + + // + // Copy assets + // + eleventyConfig.addPassthroughCopy(assetsDir); + + eleventyConfig.setServerPassthroughCopyBehavior('passthrough'); // emulates passthrough copy during --serve + + // + // Functions + // + + // Generates a URL relative to the site's root + eleventyConfig.addNunjucksGlobal('rootUrl', (value = '', absolute = false) => + { + value = path.join('/', value); + return absolute ? new URL(value, eleventyConfig.globalData.baseUrl).toString() : value; + }); + + // Generates a URL relative to the site's asset directory + eleventyConfig.addNunjucksGlobal('assetUrl', (value = '', absolute = false) => + { + value = path.join(`/${assetsDir}`, value); + return absolute ? new URL(value, eleventyConfig.globalData.baseUrl).toString() : value; + }); + + // Fetches a specific component's metadata + eleventyConfig.addNunjucksGlobal('getComponent', tagName => + { + const component = allComponents.find(c => c.tagName === tagName); + if (!component) + { + throw new Error( + `Unable to find a component called "${tagName}". Make sure the file name is the same as the component's tag ` + + `name (minus the sl- prefix).` + ); + } + return component; + }); + + // + // Custom markdown syntaxes + // + eleventyConfig.setLibrary('md', egwFlavoredMarkdown); + + // + // Filters + // + eleventyConfig.addFilter('markdown', content => + { + return egwFlavoredMarkdown.render(content); + }); + + eleventyConfig.addFilter('markdownInline', content => + { + return egwFlavoredMarkdown.renderInline(content); + }); + + eleventyConfig.addFilter('classNameToComponentName', className => + { + let name = capitalCase(className.replace(/^Et2/, '')); + if (name === 'Qr Code') + { + name = 'QR Code'; + } // manual override + return name; + }); + + eleventyConfig.addFilter('removeEt2Prefix', tagName => + { + return tagName.replace(/^et2-/, ''); + }); + + // + // Transforms + // + eleventyConfig.addTransform('html-transform', function (content) + { + // Parse the template and get a Document object + const doc = new JSDOM(content, { + // We must set a default URL so links are parsed with a hostname. Let's use a bogus TLD so we can easily + // identify which ones are internal and which ones are external. + url: `https://internal/` + }).window.document; + + // DOM transforms + activeLinks(doc, {pathname: this.page.url}); + anchorHeadings(doc, { + within: '#content .content__body', + levels: ['h2', 'h3', 'h4', 'h5'] + }); + tableOfContents(doc, { + levels: ['h2', 'h3'], + container: '#content .content__toc > ul', + within: '#content .content__body' + }); + codePreviews(doc); + externalLinks(doc, {target: '_blank'}); + highlightCodeBlocks(doc); + scrollingTables(doc); + copyCodeButtons(doc); // must be after codePreviews + highlightCodeBlocks + typography(doc, '#content'); + replacer(doc, [ + {pattern: '%VERSION%', replacement: customElementsManifest.package.version}, + {pattern: '%CDNDIR%', replacement: cdndir}, + {pattern: '%NPMDIR%', replacement: npmdir} + ]); + + // Serialize the Document object to an HTML string and prepend the doctype + content = `\n${doc.documentElement.outerHTML}`; + + // String transforms + content = prettier(content); + + return content; + }); + + // + // Build a search index + // + eleventyConfig.on('eleventy.after', ({results}) => + { + // We only want to build the search index on the first run so all pages get indexed. + if (hasBuiltSearchIndex) + { + return; + } + + const map = {}; + const searchIndexFilename = path.join(eleventyConfig.dir.output, assetsDir, 'search.json'); + const lunrInput = path.resolve('../../node_modules/lunr/lunr.min.js'); + const lunrOutput = path.join(eleventyConfig.dir.output, assetsDir, 'scripts/lunr.js'); + const searchIndex = lunr(function () + { + // The search index uses these field names extensively, so shortening them can save some serious bytes. The + // initial index file went from 468 KB => 401 KB by using single-character names! + this.ref('id'); // id + this.field('t', {boost: 50}); // title + this.field('h', {boost: 25}); // headings + this.field('c'); // content + + results.forEach((result, index) => + { + const url = path + .join('/', path.relative(eleventyConfig.dir.output, result.outputPath)) + .replace(/\\/g, '/') // convert backslashes to forward slashes + .replace(/\/index.html$/, '/'); // convert trailing /index.html to / + const doc = new JSDOM(result.content, { + // We must set a default URL so links are parsed with a hostname. Let's use a bogus TLD so we can easily + // identify which ones are internal and which ones are external. + url: `https://internal/` + }).window.document; + const content = doc.querySelector('#content'); + + // Get title and headings + const title = (doc.querySelector('title')?.textContent || path.basename(result.outputPath)).trim(); + const headings = [...content.querySelectorAll('h1, h2, h3, h4')] + .map(heading => heading.textContent) + .join(' ') + .replace(/\s+/g, ' ') + .trim(); + + // Remove code blocks and whitespace from content + [...content.querySelectorAll('code[class|=language]')].forEach(code => code.remove()); + const textContent = content.textContent.replace(/\s+/g, ' ').trim(); + + // Update the index and map + this.add({id: index, t: title, h: headings, c: textContent}); + map[index] = {title, url}; + }); + }); + + // Copy the Lunr search client and write the index + fs.mkdirSync(path.dirname(lunrOutput), {recursive: true}); + fs.copyFileSync(lunrInput, lunrOutput); + fs.writeFileSync(searchIndexFilename, JSON.stringify({searchIndex, map}), 'utf-8'); + + hasBuiltSearchIndex = true; + }); + + // + // Send a signal to stdout that let's the build know we've reached this point + // + eleventyConfig.on('eleventy.after', () => + { + console.log('[eleventy.after]'); + }); + + // + // Dev server options (see https://www.11ty.dev/docs/dev-server/#options) + // + eleventyConfig.setServerOptions({ + domDiff: false, // disable dom diffing so custom elements don't break on reload, + port: 4000, // if port 4000 is taken, 11ty will use the next one available + watch: ['cdn/**/*'] // additional files to watch that will trigger server updates (array of paths or globs) + }); + + // + // 11ty config + // + return { + dir: { + input: 'pages', + output: '../dist/site', + includes: '../_includes', // resolved relative to the input dir + data: '../_data' + }, + markdownTemplateEngine: 'njk', // use Nunjucks instead of Liquid for markdown files + templateEngineOverride: ['njk'] // just Nunjucks and then markdown + }; +}; diff --git a/doc/etemplate2/pages/components/default_component.njk b/doc/etemplate2/pages/components/default_component.njk new file mode 100644 index 0000000000..b97e7827fb --- /dev/null +++ b/doc/etemplate2/pages/components/default_component.njk @@ -0,0 +1,8 @@ +--- +pagination: + data: components + size: 1 + alias: component +permalink: "components/{{component.tagName | slugify}}/" +layout: component.njk +--- diff --git a/doc/etemplate2/pages/components/sandbox.md b/doc/etemplate2/pages/components/sandbox.md new file mode 100644 index 0000000000..f95778a111 --- /dev/null +++ b/doc/etemplate2/pages/components/sandbox.md @@ -0,0 +1,6 @@ +## Widget Sandbox + +You can see and play with the widgets, once they're loaded. +Maybe this should go on each page, limited to just that widget. + + \ No newline at end of file diff --git a/doc/etemplate2/pages/getting-started/styling.md b/doc/etemplate2/pages/getting-started/styling.md new file mode 100644 index 0000000000..145933961c --- /dev/null +++ b/doc/etemplate2/pages/getting-started/styling.md @@ -0,0 +1,52 @@ +# Styling + +Our overall styling is a combination of our site-wide style (pixelegg), etemplate2.css +and [Shoelace](https://shoelace.style/) styles + +Some handy excerpts: + +## Global CSS variables + +```css +:root { + --primary-background-color: #4177a2; + --highlight-background-color: rgba(153, 204, 255, .4); + + --label-color: #000000; + /* For fixed width labels - use class 'et2-label-fixed'*/ + --label-width: 8em; + + --input-border-color: #E6E6E6; + --input-text-color: #26537C; + + --warning-color: rgba(255, 204, 0, .5); + --error-color: rgba(204, 0, 51, .5); + +} +``` + +## Useful CSS classes + +### hide + +Hides the element using css```display: none``` + +### hideme + +Hides the element using css```display: none !important;``` + +### et2-label-fixed + +Use on a widget to force its label to have a fixed width. This helps line up labels and widgets into columns without +having to use a grid, which allows them to reflow if needed. Set the CSS variable ```--label_width``` to change how much +space the labels get. + +These widgets are in an et2-vbox: + +| ![fixed label example #1](/assets/images/styling_et2-label-fixed_2.png ) | +|:-------------------------------------------------------------------------------------------------------:| +| *Without et2-label-fixed class* | +| ![fixed label example #2](/assets/images/styling_et2-label-fixed_1.png) | +| *Fixed width labels using et2-label-fixed* | +| ![fixed label example #3](/assets/images/styling_et2-label-fixed_3.png) | +| *--label_width CSS variable changed for more space*
      Note how 'Responsible' widget wraps | \ No newline at end of file diff --git a/doc/etemplate2/pages/getting-started/widgets.md b/doc/etemplate2/pages/getting-started/widgets.md new file mode 100644 index 0000000000..3a1054d54e --- /dev/null +++ b/doc/etemplate2/pages/getting-started/widgets.md @@ -0,0 +1,24 @@ +## Widgets + +Widgets are the building blocks of our UI. +We are currently making all our +widgets [WebComponents](https://developer.mozilla.org/en-US/docs/Web/API/Web_components) +based on [Lit](https://lit.dev/docs/). Many of our widgets use [Shoelace](https://shoelace.style) components as building +blocks. + +If you just want to use existing widgets, you can put them in your .xet template file: + +```xml + + + + + +``` + +Rendered example template \ No newline at end of file diff --git a/doc/etemplate2/pages/index.md b/doc/etemplate2/pages/index.md new file mode 100644 index 0000000000..0ab24f0e0e --- /dev/null +++ b/doc/etemplate2/pages/index.md @@ -0,0 +1,18 @@ +--- +meta: + title: 'EGroupware' + description: Web based groupware server +toc: false +--- + +EGroupware Etemplate development docs + +## Quick Start + +EGroupware UI is created from templates stored in <app>/templates/default/*.xet files. +The templates are composed of widget tags. +If this works, here is a box: + +```html:preview +Box content +``` \ No newline at end of file diff --git a/doc/etemplate2/pages/tutorials/automatic-testing.md b/doc/etemplate2/pages/tutorials/automatic-testing.md new file mode 100644 index 0000000000..6dbd93d9ac --- /dev/null +++ b/doc/etemplate2/pages/tutorials/automatic-testing.md @@ -0,0 +1,69 @@ +## Automatic testing + +Automatic tests go in the `test/` subfolder of your component's directory. They will be found and run by +“web-test-runner”. +Tests are written using + +* Mocha (https://mochajs.org/) & Chai Assertion Library (https://www.chaijs.com/api/assert/) +* Playwright (https://playwright.dev/docs/intro) runs the tests in actual browsers. + +Here's a simple example: + +```ts +/** + * Test file for Etemplate webComponent Textbox + */ +import {assert, fixture, html} from '@open-wc/testing'; +import {Et2Textbox} from "../Et2Textbox"; +import {inputBasicTests} from "../../Et2InputWidget/test/InputBasicTests"; + +// Reference to component under test +let element : Et2Textbox; + +async function before() +{ + // Create an element to test with, and wait until it's ready + element = await fixture(html` + + `); + return element; +} + +describe("Textbox widget", () => +{ + // Setup run before each test + beforeEach(before); + + it('is defined', () => + { + assert.instanceOf(element, Et2Textbox); + }); + + it('has a label', () => + { + element.set_label("Yay label"); + assert.isEmpty(element.shadowRoot.querySelectorAll('.et2_label')); + }) +}); + +// Run some common, basic tests for inputs (readonly, value, etc.) +inputBasicTests(before, "I'm a good test value", "input"); +``` + +This verifies that the component can be loaded and created. `inputBasicTests()` checks readonly and in/out values. + +### What to test + +#### Can the component be loaded and created? + +Quite often components get accidental dependencies that complicate things, but sometimes they just break. + +#### Value in = value out + +Many of our components do correction and coercion on bad data or invalid values, but you should test that values out +match +the values going in. How to do this, and what to do with bad values, depends on the component. + +### Test tips + +* Always use `this.egw()`. It can be easily stubbed for your test. Global `egw` cannot. \ No newline at end of file diff --git a/doc/etemplate2/pages/tutorials/creating-a-widget.md b/doc/etemplate2/pages/tutorials/creating-a-widget.md new file mode 100644 index 0000000000..51ee7dd065 --- /dev/null +++ b/doc/etemplate2/pages/tutorials/creating-a-widget.md @@ -0,0 +1,39 @@ +## Creating a component + +ETemplate components are [LitElements](https://lit.dev/docs/) that are wrapped with +our [Et2Widget](https://github.com/EGroupware/egroupware/blob/master/api/js/etemplate/Et2Widget/Et2Widget.ts) mixin, +which adds properties and methods to support loading from our template files and returning values to the server. They +should (relatively) stand-alone. + +Common components are in `api/js/etemplate/`. You can add application specific components in `/js/`. + +### Create the files + +``` +myapp/ + js/ + MyWidget/ + test/ + MyWidget.ts + +``` + +You should have [automatic tests](/tutorials/automatic-testing) to verify your component and avoid regressions +in `test/`. + +### Get it loaded + +To have EGroupware load your component, it must be included somewhere. +Add your component to the `include` block at the top of `/api/js/etemplate/etemplate2.js`. If you have an application +specific component, include at the top of your `app.js`. + +```typescript +... +import './MyWidget/MyWidget.ts'; + +... +``` + +### Load and return + +### AJAX data diff --git a/doc/scripts/build.mjs b/doc/scripts/build.mjs new file mode 100644 index 0000000000..19cf0ef834 --- /dev/null +++ b/doc/scripts/build.mjs @@ -0,0 +1,407 @@ +import {deleteAsync} from 'del'; +import {exec, spawn} from 'child_process'; +import {globby} from 'globby'; +import browserSync from 'browser-sync'; +import chalk from 'chalk'; +import commandLineArgs from 'command-line-args'; +import copy from 'recursive-copy'; +import esbuild from 'esbuild'; +import fs from 'fs/promises'; +import getPort, {portNumbers} from 'get-port'; +import ora from 'ora'; +import util from 'util'; +import * as path from 'path'; +import {readFileSync} from 'fs'; +import {replace} from 'esbuild-plugin-replace'; + +const {serve, dev} = commandLineArgs([ + {name: 'serve', type: Boolean}, + {name: 'dev', type: Boolean} +]); +const outdir = 'doc/dist'; +const cdndir = 'cdn'; +const sitedir = 'doc/dist/site'; +const spinner = ora({hideCursor: false}).start(); +const execPromise = util.promisify(exec); +let childProcess; +let buildResults; + +const bundleDirectories = [outdir]; +let packageData = JSON.parse(readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8')); +const egwVersion = JSON.stringify(packageData.version.toString()); + +// +// Runs 11ty and builds the docs. The returned promise resolves after the initial publish has completed. The child +// process and an array of strings containing any output are included in the resolved promise. +// +// To debug: +// > DEBUG=Eleventy* npx @11ty/eleventy +// +async function buildTheDocs(watch = false) +{ + return new Promise(async (resolve, reject) => + { + const afterSignal = '[eleventy.after]'; + const args = ['@11ty/eleventy', '--quiet']; + const output = []; + + if (watch) + { + args.push('--watch'); + args.push('--incremental'); + } + + // To debug use this in terminal: DEBUG=Eleventy* npx @11ty/eleventy + const child = spawn('npx', args, { + stdio: 'pipe', + cwd: 'doc/etemplate2', + shell: true // for Windows + }); + + child.stdout.on('data', data => + { + if (data.includes(afterSignal)) + { + return; + } // don't log the signal + output.push(data.toString()); + }); + + if (watch) + { + // The process doesn't terminate in watch mode so, before resolving, we listen for a known signal in stdout that + // tells us when the first build completes. + child.stdout.on('data', data => + { + if (data.includes(afterSignal)) + { + resolve({child, output}); + } + }); + } + else + { + child.on('close', () => + { + resolve({child, output}); + }); + } + }); +} + +// +// Builds the source with esbuild. +// +async function buildTheSource() +{ + const alwaysExternal = [/*'@lit',*/ 'jquery']; + + const cdnConfig = { + format: 'esm', + target: 'es2017', + entryPoints: [ + // + // NOTE: Entry points must be mapped in package.json > exports, otherwise users won't be able to import them! + // + // The whole shebang + './api/js/etemplate/etemplate2.ts', + // The auto-loader + //'./src/shoelace-autoloader.ts', + // Components + //...(await globby('./src/components/**/!(*.(style|test)).ts')), + // Translations + //...(await globby('./src/translations/**/*.ts')), + // Public utilities + //...(await globby('./src/utilities/**/!(*.(style|test)).ts')), + // Theme stylesheets + //...(await globby('./src/themes/**/!(*.test).ts')), + // React wrappers + //...(await globby('./src/react/**/*.ts')) + ], + outdir: sitedir + '/assets/scripts', + chunkNames: 'chunks/[name].[hash]', + define: { + // Floating UI requires this to be set + 'process.env.NODE_ENV': '"production"' + }, + bundle: true, + // + // We don't bundle certain dependencies in the unbundled build. This ensures we ship bare module specifiers, + // allowing end users to better optimize when using a bundler. (Only packages that ship ESM can be external.) + // + // We never bundle React or @lit-labs/react though! + // + external: alwaysExternal, + splitting: true, + plugins: [ + replace({ + __EGROUPWARE_VERSION__: egwVersion + }) + ] + }; + + const npmConfig = { + ...cdnConfig, + external: undefined, + minify: false, + packages: 'external', + outdir + }; + + if (serve) + { + // Use the context API to allow incremental dev builds + const contexts = await Promise.all([esbuild.context(cdnConfig), esbuild.context(npmConfig)]); + await Promise.all(contexts.map(context => context.rebuild())); + return contexts; + } + else + { + // Use the standard API for production builds + return await Promise.all([esbuild.build(cdnConfig), esbuild.build(npmConfig)]); + } +} + +async function rollup(watch = false) +{ + return new Promise(async (resolve, reject) => + { + const afterSignal = '[rollup.after]'; + const args = ['--silent']; + const output = []; + + if (watch) + { + args.push('--watch'); + args.push('--incremental'); + } + + // To debug use this in terminal: DEBUG=Eleventy* npx @11ty/eleventy + const child = spawn('rollup', args, { + stdio: 'pipe', + cwd: '.', + shell: true // for Windows + }); + + child.stdout.on('data', data => + { + if (data.includes(afterSignal)) + { + return; + } // don't log the signal + output.push(data.toString()); + }); + + // Not even waiting + resolve({child, output}); + }); +} + +// +// Called on SIGINT or SIGTERM to cleanup the build and child processes. +// +function handleCleanup() +{ + buildResults.forEach(result => result.dispose()); + + if (childProcess) + { + childProcess.kill('SIGINT'); + } + + process.exit(); +} + +// +// Helper function to draw a spinner while tasks run. +// +async function nextTask(label, action) +{ + spinner.text = label; + spinner.start(); + + try + { + await action(); + spinner.stop(); + console.log(`${chalk.green('✔')} ${label}`); + } + catch (err) + { + spinner.stop(); + console.error(`${chalk.red('✘')} ${err}`); + if (err.stdout) + { + console.error(chalk.red(err.stdout)); + } + if (err.stderr) + { + console.error(chalk.red(err.stderr)); + } + process.exit(1); + } +} + +await nextTask('Cleaning up the previous build', async () => +{ + await Promise.all([deleteAsync(sitedir), ...bundleDirectories.map(dir => deleteAsync(dir))]); + await fs.mkdir(outdir, {recursive: true}); +}); + +await nextTask('Generating component metadata', () => +{ + return Promise.all( + bundleDirectories.map(dir => + { + return execPromise(`node doc/scripts/metadata.mjs --outdir "${dir}"`, {stdio: 'inherit'}); + }) + ); +}); +/* +await nextTask('Generating themes', () => +{ + return execPromise(`node scripts/make-themes.js --outdir "${outdir}"`, {stdio: 'inherit'}); +}); +*/ +/* We don't do these +await nextTask('Running the TypeScript compiler', () => +{ + return execPromise(`tsc --project ./tsconfig.json --outdir "${outdir}"`, {stdio: 'inherit'}); +}); +await nextTask('Building source files', async () => +{ + buildResults = await buildTheSource(); +}); +*/ + +// EGroupware way of packaging +// We can't watch +await nextTask('Rolling up', async () => +{ + await rollup(dev); +}); + + +// Launch the dev server +if (serve) +{ + let result; + + // Spin up Eleventy and Wait for the search index to appear before proceeding. The search index is generated during + // eleventy.after, so it appears after the docs are fully published. This is kinda hacky, but here we are. + // Kick off the Eleventy dev server with --watch and --incremental + await nextTask('Building docs', async () => + { + result = await buildTheDocs(true); + }); + + const bs = browserSync.create(); + const port = await getPort({port: portNumbers(4000, 4999)}); + const browserSyncConfig = { + startPath: '/', + port, + logLevel: 'silent', + logPrefix: '[egw]', + logFileChanges: true, + notify: false, + single: false, + ghostMode: false, + server: { + baseDir: sitedir, + routes: { + '/dist': './cdn' + } + } + }; + + // Launch browser sync + bs.init(browserSyncConfig, () => + { + const url = `http://localhost:${port}`; + console.log(chalk.cyan(`\n🥾 The dev server is available at ${url}`)); + + // Log deferred output + if (result.output.length > 0) + { + console.log('\n' + result.output.join('\n')); + } + + // Log output that comes later on + result.child.stdout.on('data', data => + { + console.log(data.toString()); + }); + }); + + // Rebuild and reload when source files change + bs.watch('src/**/!(*.test).*').on('change', async filename => + { + console.log('[build] File changed: ', filename); + + try + { + const isTheme = /^src\/themes/.test(filename); + const isStylesheet = /(\.css|\.styles\.ts)$/.test(filename); + + // Rebuild the source + const rebuildResults = buildResults.map(result => result.rebuild()); + await Promise.all(rebuildResults); + + // Rebuild stylesheets when a theme file changes + if (isTheme) + { + await Promise.all( + bundleDirectories.map(dir => + { + execPromise(`node scripts/make-themes.js --outdir "${dir}"`, {stdio: 'inherit'}); + }) + ); + } + + // Rebuild metadata (but not when styles are changed) + if (!isStylesheet) + { + await Promise.all( + bundleDirectories.map(dir => + { + return execPromise(`node scripts/make-metadata.js --outdir "${dir}"`, {stdio: 'inherit'}); + }) + ); + } + + bs.reload(); + } + catch (err) + { + console.error(chalk.red(err)); + } + }); + + // Reload without rebuilding when the docs change + bs.watch([`${sitedir}/**/*.*`]).on('change', filename => + { + bs.reload(); + }); +} + + +// Build for production +if (!serve) +{ + let result; + + await nextTask('Building the docs', async () => + { + result = await buildTheDocs(); + }); + + // Log deferred output + if (result.output.length > 0) + { + console.log('\n' + result.output.join('\n')); + } +} + +// Cleanup on exit +process.on('SIGINT', handleCleanup); +process.on('SIGTERM', handleCleanup); diff --git a/doc/scripts/metadata.mjs b/doc/scripts/metadata.mjs new file mode 100644 index 0000000000..f0da7aecbb --- /dev/null +++ b/doc/scripts/metadata.mjs @@ -0,0 +1,14 @@ +// +// This script runs the Custom Elements Manifest analyzer to generate custom-elements.json +// + +import {execSync} from 'child_process'; +import commandLineArgs from 'command-line-args'; + +const {outdir} = commandLineArgs([ + {name: 'outdir', type: String}, + {name: 'watch', type: Boolean} +]); + +execSync(`cem analyze --config "doc/etemplate2/custom-elements-manifest.config.mjs" --outdir "${outdir}"`, {stdio: 'inherit'}); +//execSync(`cem analyze --globs "api/js/etemplate/Et2Widget" --outdir "${outdir}"`, {stdio: 'inherit'}); diff --git a/filemanager/inc/class.filemanager_hooks.inc.php b/filemanager/inc/class.filemanager_hooks.inc.php index bf82474bae..dbc3cafac1 100644 --- a/filemanager/inc/class.filemanager_hooks.inc.php +++ b/filemanager/inc/class.filemanager_hooks.inc.php @@ -96,14 +96,15 @@ class filemanager_hooks $file = array( //'Site Configuration' => Egw::link('/index.php','menuaction=admin.admin_config.index&appname='.self::$appname.'&ajax=true'), - 'Custom fields' => Egw::link('/index.php', 'menuaction=admin.admin_customfields.index&appname=' . self::$appname . '&ajax=true'), - 'Check virtual filesystem' => Egw::link('/index.php', 'menuaction=filemanager.filemanager_admin.fsck'), - 'Quota' => Egw::link('/index.php', 'menuaction=filemanager.filemanager_admin.quota&ajax=true'), 'VFS mounts and versioning' => Egw::link('/index.php', 'menuaction=filemanager.filemanager_admin.index&ajax=true'), + 'Check virtual filesystem' => Egw::link('/index.php', 'menuaction=filemanager.filemanager_admin.fsck'), + 'Custom fields' => Egw::link('/index.php', 'menuaction=admin.admin_customfields.index&appname=' . self::$appname . '&ajax=true'), + 'Quota' => Egw::link('/index.php', 'menuaction=filemanager.filemanager_admin.quota&ajax=true'), ); - if($GLOBALS['egw_info']['user']['apps']['stylite']) + if (!empty($GLOBALS['egw_info']['user']['apps']['stylite'])) { $file['Sharing'] = Egw::link('/index.php', 'menuaction=filemanager.filemanager_shares.index&admin=true&ajax=true'); + $file['S3 configuration'] = Egw::link('/index.php', 'menuaction=stylite.'.EGroupware\Stylite\Vfs\S3\StreamWrapper::class.'.config&ajax=true'); } if ($location == 'admin') { @@ -469,4 +470,4 @@ class filemanager_hooks ); } -} +} \ No newline at end of file diff --git a/filemanager/js/filemanager.ts b/filemanager/js/filemanager.ts index d75302512d..e3d26ee831 100644 --- a/filemanager/js/filemanager.ts +++ b/filemanager/js/filemanager.ts @@ -824,7 +824,6 @@ export class filemanagerAPP extends EgwApp */ _do_action_callback(_data) { - if(typeof _data.action == "undefined") return; if(this.egw.pushAvailable()) { // No need to refresh, push will handle it diff --git a/filemanager/templates/default/images/goup.svg b/filemanager/templates/default/images/goup.svg index 905dcdb7cd..0ff1dfaaaa 100644 --- a/filemanager/templates/default/images/goup.svg +++ b/filemanager/templates/default/images/goup.svg @@ -1,12 +1,4 @@ - - - - - - - + + + diff --git a/home/js/app.ts b/home/js/app.ts index 5f8565bf9b..edf6ee8d0d 100644 --- a/home/js/app.ts +++ b/home/js/app.ts @@ -18,7 +18,7 @@ import "./Et2PortletLink"; import "./Et2PortletList"; import "./Et2PortletNote"; import './Et2PortletWeather'; -import "../../calendar/js/Et2PortletCalendar" +import "../../calendar/js/Et2PortletCalendar"; import Sortable from "sortablejs/modular/sortable.complete.esm.js"; /** diff --git a/importexport/inc/class.importexport_definitions_ui.inc.php b/importexport/inc/class.importexport_definitions_ui.inc.php index aa59985820..6e8e33cc89 100644 --- a/importexport/inc/class.importexport_definitions_ui.inc.php +++ b/importexport/inc/class.importexport_definitions_ui.inc.php @@ -51,6 +51,10 @@ class importexport_definitions_ui * @var object */ var $plugin; + private Etemplate $etpl; + private string $clock; + private array $steps; + private $wizard_content_template; function __construct() { @@ -60,7 +64,7 @@ class importexport_definitions_ui $GLOBALS['egw_info']['flags']['currentapp'] = self::_appname; $this->etpl = new Etemplate(); - $this->clock = Api\Html::image(self::_appname,'clock'); + $this->clock = Api\Html::image(self::_appname, 'clock'); $this->steps = array( 'wizard_step10' => lang('Choose an application'), 'wizard_step20' => lang('Choose a plugin'), diff --git a/importexport/inc/class.importexport_export_csv.inc.php b/importexport/inc/class.importexport_export_csv.inc.php index 578048197e..ad89472b10 100644 --- a/importexport/inc/class.importexport_export_csv.inc.php +++ b/importexport/inc/class.importexport_export_csv.inc.php @@ -351,7 +351,24 @@ class importexport_export_csv implements importexport_iface_export_record $names = array(); foreach($record->$name as $_name) { - $option = $selects[$name][$_name]; + $select_options = $selects[$name] ?? []; + $option = ''; + foreach($select_options as $key => $select_option) + { + if(is_array($select_option) && isset($select_option['value']) && $select_option['value'] == $name && isset($select_option['label'])) + { + $option = $select_option['label']; + break; + } + else + { + if($key == $_name && !is_array($select_option)) + { + $option = $select_option; + break; + } + } + } $names[] = lang(is_array($option) && $option['label'] ? $option['label'] : $option); } $record->$name = implode(', ', $names); diff --git a/importexport/inc/class.importexport_export_ui.inc.php b/importexport/inc/class.importexport_export_ui.inc.php index aa99a70f8b..6e4abaeb7d 100644 --- a/importexport/inc/class.importexport_export_ui.inc.php +++ b/importexport/inc/class.importexport_export_ui.inc.php @@ -286,9 +286,15 @@ class importexport_export_ui { { unset($filter[$key]); } + // Format for date from/to + $date_format = 'ts'; + if($key[0] == Api\Storage::CF_PREFIX && ($cf = (Api\Storage\Customfields::get($_appname) ?: [])[substr($key, 1)])) + { + $date_format = $cf['values']['format'] ?? ($cf['type'] == 'date' ? 'Y-m-d' : "Y-m-d H:i:s"); + } if(is_array($value) && array_key_exists('from', $value) && $value['from']) { - $filter[$key]['from'] = Api\DateTime::to($value['from'],'ts'); + $filter[$key]['from'] = Api\DateTime::to($value['from'], $date_format); } // If user selects an end date, they most likely want entries including that date if(is_array($value) && array_key_exists('to',$value) && $value['to'] ) @@ -296,7 +302,7 @@ class importexport_export_ui { // Adjust time to 23:59:59 $filter[$key]['to'] = new Api\DateTime($value['to']); $filter[$key]['to']->setTime(23,59,59); - $filter[$key]['to'] = $filter[$key]['to']->format('ts'); + $filter[$key]['to'] = $filter[$key]['to']->format($date_format); } } } diff --git a/infolog/inc/class.infolog_bo.inc.php b/infolog/inc/class.infolog_bo.inc.php index bccfaf8f30..d3108d11cb 100644 --- a/infolog/inc/class.infolog_bo.inc.php +++ b/infolog/inc/class.infolog_bo.inc.php @@ -1432,7 +1432,9 @@ class infolog_bo array( 'email' => $mailadr, 'email_home' => $mailadr - ),True,'','','',false,'OR',false,null,'',false)); + ), ['id', 'account_id'], '', '', '', false, 'OR', false, null, '', false + ) + ); } if (!$contacts || !is_array($contacts) || !is_array($contacts[0])) { @@ -1444,10 +1446,13 @@ class infolog_bo // create the first address as info_contact $contact = array_shift($contacts); $info['info_contact'] = 'addressbook:'.$contact['id']; - // create the rest a "ordinary" links + // create the rest as "ordinary" links, skipping accounts foreach ($contacts as $contact) { - Link::link('infolog',$info['link_to']['to_id'],'addressbook',$contact['id']); + if(empty($contact['account_id'])) + { + Link::link('infolog', $info['link_to']['to_id'], 'addressbook', $contact['id']); + } } } if (is_array($_attachments)) diff --git a/infolog/inc/class.infolog_widget.inc.php b/infolog/inc/class.infolog_widget.inc.php index 87dfb68285..0600123395 100644 --- a/infolog/inc/class.infolog_widget.inc.php +++ b/infolog/inc/class.infolog_widget.inc.php @@ -168,4 +168,4 @@ class infolog_widget extends Etemplate\Widget\Entry } // register widgets for etemplate2 -Etemplate\Widget::registerWidget('infolog_widget',array('infolog-value', 'infolog-fields')); +Etemplate\Widget::registerWidget('infolog_widget',array('infolog-value', 'infolog-fields')); \ No newline at end of file diff --git a/infolog/templates/default/images/done_all.svg b/infolog/templates/default/images/done_all.svg new file mode 100644 index 0000000000..e9197361ce --- /dev/null +++ b/infolog/templates/default/images/done_all.svg @@ -0,0 +1,4 @@ + + + + diff --git a/infolog/templates/default/images/note.svg b/infolog/templates/default/images/note.svg new file mode 100644 index 0000000000..82012efb8e --- /dev/null +++ b/infolog/templates/default/images/note.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mail/inc/class.mail_ui.inc.php b/mail/inc/class.mail_ui.inc.php index 0c91a850be..54008d67e5 100644 --- a/mail/inc/class.mail_ui.inc.php +++ b/mail/inc/class.mail_ui.inc.php @@ -5282,7 +5282,13 @@ $filter['before']= date("d-M-Y", $cutoffdate2); } else { - $response->call('egw.message',lang('flagged %1 messages as %2 in %3',(isset($_messageList['all']) && $_messageList['all']?lang('all'):count($_messageList['msg'])),lang(($flag[$_flag]?$flag[$_flag]:$_flag)),lang($folder))); + $response->call( + 'egw.refresh', + lang('flagged %1 messages as %2 in %3', (isset($_messageList['all']) && $_messageList['all'] ? lang('all') : count($_messageList['msg'])), lang(($flag[$_flag] ? $flag[$_flag] : $_flag)), lang($folder)), + 'mail', + $_messageList['msg'], + 'update-in-place' + ); } } } diff --git a/mail/js/app.js b/mail/js/app.js index 876e6b4919..833751a773 100644 --- a/mail/js/app.js +++ b/mail/js/app.js @@ -23,8 +23,7 @@ import { egw_keycode_makeValid, egw_keyHandler } from "../../api/js/egw_action/egw_keymanager"; -import {Et2UrlEmailReadonly} from "../../api/js/etemplate/Et2Url/Et2UrlEmailReadonly"; -import {Et2SelectEmail} from "../../api/js/etemplate/Et2Select/Et2SelectEmail"; +import {initMailTree} from "../../api/js/etemplate/Et2TreeWidget/MailTree"; /* required dependency, commented out because no module, but egw:uses is no longer parsed */ @@ -397,8 +396,6 @@ app.classes.mail = AppJS.extend( return false; } }); - // Init key handler - this.init_keyHandler(); // Set focus on To/body field // depending on To field value @@ -5076,31 +5073,6 @@ app.classes.mail = AppJS.extend( }, - /** - * Keyhandler for compose window - * Use this one so we can handle keys even on inputs - */ - init_keyHandler: function() - { - jQuery(document).on('keydown', function(e) { - // Translate the given key code and make it valid - var keyCode = e.which; - keyCode = egw_keycode_translation_function(keyCode); - keyCode = egw_keycode_makeValid(keyCode); - - // Only go on if this is a valid key code - call the key handler - if (keyCode != -1) - { - if (egw_keyHandler(keyCode, e.shiftKey, e.ctrlKey || e.metaKey, e.altKey)) - { - // If the key handler successfully passed the key event to some - // sub component, prevent the default action - e.preventDefault(); - } - } - }); - }, - /** * Check sharing mode and disable not available options * diff --git a/mail/templates/default/app.css b/mail/templates/default/app.css index a6fa3a13b6..b127b6ebfe 100644 --- a/mail/templates/default/app.css +++ b/mail/templates/default/app.css @@ -283,7 +283,8 @@ pre { word-wrap: break-word; } #mail-index { - position: relative + position: relative; + --size: 2.75em } /*Keeps the scrollbar in the window in Firefox*/ #mail-index table.egwGridView_outer { @@ -1070,7 +1071,8 @@ div#mail-index_nm.splitter-pane {min-height: 100px;} min-width: 7em; color: darkgrey; } -.mailPreviewHeaders et2-select-email::part(control) { + +.mailPreviewHeaders et2-select-email::part(combobox) { border: none; } #popupMainDiv {height: 100%} @@ -1141,4 +1143,13 @@ et2-split#mail-index_mailSplitter.squeezed .mail-index_quotabox{ et2-details.mail-index_datefilter::part(base) { height: var(--sl-input-height-medium); border-radius: var(--sl-border-radius-small); +} + +/* Give DnD helper more height to show from + subject, but less gap */ +table.et2_egw_action_ddHelper_row .innerContainer { + max-height: 2.5em; +} + +.et2_egw_action_ddHelper_row et2-vbox::part(base) { + gap: 1px; } \ No newline at end of file diff --git a/mail/templates/default/display.xet b/mail/templates/default/display.xet index 70ea9eab99..68a1d5f4d8 100644 --- a/mail/templates/default/display.xet +++ b/mail/templates/default/display.xet @@ -83,19 +83,19 @@ - + - + - + - + diff --git a/mail/templates/default/images/htmlmode.svg b/mail/templates/default/images/htmlmode.svg new file mode 100644 index 0000000000..d75de63c08 --- /dev/null +++ b/mail/templates/default/images/htmlmode.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mail/templates/default/images/prio_high.svg b/mail/templates/default/images/prio_high.svg index 2d0d4e5b21..e11e74cf3d 100644 --- a/mail/templates/default/images/prio_high.svg +++ b/mail/templates/default/images/prio_high.svg @@ -1,17 +1,4 @@ - - - - - - - - + + + diff --git a/mail/templates/default/images/source.svg b/mail/templates/default/images/source.svg index f018bbc1a4..8ca7d1ca01 100644 --- a/mail/templates/default/images/source.svg +++ b/mail/templates/default/images/source.svg @@ -1,12 +1,4 @@ - - - - - - - - - + + + diff --git a/mail/templates/default/images/tag_message.svg b/mail/templates/default/images/tag_message.svg new file mode 100644 index 0000000000..d916e8351a --- /dev/null +++ b/mail/templates/default/images/tag_message.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mail/templates/default/images/textmode.svg b/mail/templates/default/images/textmode.svg new file mode 100644 index 0000000000..f2eefede78 --- /dev/null +++ b/mail/templates/default/images/textmode.svg @@ -0,0 +1,4 @@ + + + + diff --git a/mail/templates/default/index.rows.horizental.xet b/mail/templates/default/index.rows.horizental.xet index 9be4b40254..ca4a59f6c3 100644 --- a/mail/templates/default/index.rows.horizental.xet +++ b/mail/templates/default/index.rows.horizental.xet @@ -32,7 +32,7 @@ + lname="$row_cont[lavatar][lname]" shape="rounded"> diff --git a/mail/templates/default/index.rows.vertical.xet b/mail/templates/default/index.rows.vertical.xet index 369fb5b030..cce48ef684 100644 --- a/mail/templates/default/index.rows.vertical.xet +++ b/mail/templates/default/index.rows.vertical.xet @@ -15,7 +15,7 @@ + lname="$row_cont[lavatar][lname]" shape="rounded"> diff --git a/package-lock.json b/package-lock.json index 6ff8a555e2..f45e15aeeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "EGroupware", "version": "23.1.20230228", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -10,28 +10,27 @@ "license": "GPL-2.0", "dependencies": { "@bundled-es-modules/pdfjs-dist": "^2.5.207-rc1", - "@lion/button": "^0.16.0", - "@lion/combobox": "^0.9.0", "@lion/core": "^0.21.1", - "@lion/dialog": "^0.14.0", "@lion/form-core": "^0.16.0", - "@lion/input": "^0.16.0", - "@lion/listbox": "^0.12.0", - "@lion/select": "^0.15.0", - "@lion/textarea": "^0.14.0", "@rollup/plugin-commonjs": "^24.0.1", - "@shoelace-style/shoelace": "2.0.0-beta.81", + "@shoelace-style/shoelace": "2.8.0", "blueimp-gallery": "^3.4.0", "colortranslator": "^1.9.2", "core-js": "^3.29.1", + "dexie": "^3.2.4", + "lit": "^2.7.5", "lit-flatpickr": "^0.3.0", "shortcut-buttons-flatpickr": "^0.4.0", "sortablejs": "^1.14.0" }, "devDependencies": { + "@11ty/eleventy": "^2.0.1", "@babel/core": "^7.14.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-decorators": "^7.22.10", "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.14.5", + "@custom-elements-manifest/analyzer": "^0.8.4", "@interactjs/interactjs": "^1.10.11", "@open-wc/testing": "^3.0.3", "@rollup/plugin-babel": "^5.3.0", @@ -39,16 +38,38 @@ "@rollup/plugin-typescript": "^8.2.1", "@types/chai": "^4.2.21", "@types/mocha": "^8.2.3", - "@web/dev-server-esbuild": "^0.2.14", + "@web/dev-server-esbuild": "^0.4.1", "@web/dev-server-rollup": "^0.3.9", "@web/test-runner": "^0.13.16", "@web/test-runner-playwright": "^0.8.8", + "browser-sync": "^2.29.3", + "cem": "^1.0.4", + "change-case": "^4.1.2", + "custom-element-jet-brains-integration": "^1.2.1", + "custom-element-vs-code-integration": "^1.2.1", + "del": "^7.1.0", + "esbuild": "^0.19.3", + "esbuild-plugin-replace": "^1.4.0", + "get-port": "^7.0.0", + "globby": "^13.2.2", "grunt": "^1.5.3", "grunt-contrib-cssmin": "^2.2.1", + "jsdom": "^22.1.0", + "lunr": "^2.3.9", + "markdown-it": "^13.0.1", + "markdown-it-container": "^3.0.0", + "markdown-it-ins": "^3.0.1", + "markdown-it-kbd": "^2.2.2", + "markdown-it-mark": "^3.0.1", + "markdown-it-replace-it": "^1.0.0", + "ora": "^7.0.1", + "prettier": "^3.0.3", + "prismjs": "^1.29.0", "rimraf": "^3.0.2", "rollup": "^2.79.1", "rollup-plugin-terser": "^7.0.2", "sinon": "^11.1.2", + "smartquotes": "^2.3.2", "terser": "^4.8.1", "typescript": "^3.9.7" }, @@ -56,6 +77,259 @@ "node": ">=14.0.0" } }, + "node_modules/@11ty/dependency-tree": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz", + "integrity": "sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==", + "dev": true + }, + "node_modules/@11ty/eleventy": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-2.0.1.tgz", + "integrity": "sha512-t8XVUbCJByhVEa1RzO0zS2QzbL3wPY8ot1yUw9noqiSHxJWUwv6jiwm1/MZDPTYtkZH2ZHvdQIRQ5/SjG9XmLw==", + "dev": true, + "dependencies": { + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-dev-server": "^1.0.4", + "@11ty/eleventy-utils": "^1.0.1", + "@11ty/lodash-custom": "^4.17.21", + "@iarna/toml": "^2.2.5", + "@sindresorhus/slugify": "^1.1.2", + "bcp-47-normalize": "^1.1.1", + "chokidar": "^3.5.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "dependency-graph": "^0.11.0", + "ejs": "^3.1.9", + "fast-glob": "^3.2.12", + "graceful-fs": "^4.2.11", + "gray-matter": "^4.0.3", + "hamljs": "^0.6.2", + "handlebars": "^4.7.7", + "is-glob": "^4.0.3", + "iso-639-1": "^2.1.15", + "kleur": "^4.1.5", + "liquidjs": "^10.7.0", + "luxon": "^3.3.0", + "markdown-it": "^13.0.1", + "micromatch": "^4.0.5", + "minimist": "^1.2.8", + "moo": "^0.5.2", + "multimatch": "^5.0.0", + "mustache": "^4.2.0", + "normalize-path": "^3.0.0", + "nunjucks": "^3.2.3", + "path-to-regexp": "^6.2.1", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.6", + "posthtml-urls": "^1.0.0", + "pug": "^3.0.2", + "recursive-copy": "^2.0.14", + "semver": "^7.3.8", + "slugify": "^1.6.6" + }, + "bin": { + "eleventy": "cmd.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-1.0.4.tgz", + "integrity": "sha512-qVBmV2G1KF/0o5B/3fITlrrDHy4bONUI2YuN3/WJ3BNw4NU1d/we8XhKrlgq13nNvHoBx5czYp3LZt8qRG53Fg==", + "dev": true, + "dependencies": { + "@11ty/eleventy-utils": "^1.0.1", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "dev-ip": "^1.0.1", + "finalhandler": "^1.2.0", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.0", + "please-upgrade-node": "^3.2.0", + "ssri": "^8.0.1", + "ws": "^8.13.0" + }, + "bin": { + "eleventy-dev-server": "cmd.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@11ty/eleventy-dev-server/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@11ty/eleventy-dev-server/node_modules/ws": { + "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" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@11ty/eleventy-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.2.tgz", + "integrity": "sha512-Zy2leMK1DQR6Q6ZPSagv7QpJaAz9uVbb+RmVetYFp3foMeQtOSZx7w2u5daRFmP+PeNq9vO9H4xtBToYFWZwHA==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@11ty/eleventy/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@11ty/eleventy/node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/@11ty/eleventy/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@11ty/lodash-custom": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", + "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", @@ -660,6 +934,7 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -678,6 +953,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -694,6 +970,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -707,10 +984,127 @@ "@babel/core": "^7.12.0" } }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.10.tgz", + "integrity": "sha512-KxN6TqZzcFi4uD3UifqXElBTBNLAEH1l3vzMQj6JwJZbL2sZlThxSViOKCYY+4Ah4V4JhQ95IVB7s/Y6SJSlMQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", + "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/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==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators/node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -727,6 +1121,7 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", @@ -743,6 +1138,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -759,6 +1155,7 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -775,6 +1172,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -791,6 +1189,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -807,6 +1206,7 @@ "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.5", @@ -826,6 +1226,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -842,6 +1243,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -859,6 +1261,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -875,6 +1278,7 @@ "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -893,6 +1297,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -944,6 +1349,30 @@ "@babel/core": "^7.0.0-0" } }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -995,6 +1424,30 @@ "@babel/core": "^7.0.0-0" } }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -1481,6 +1934,134 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", @@ -1741,6 +2322,44 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-react": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", + "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/preset-react/node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/preset-typescript": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", @@ -1835,6 +2454,469 @@ "resolved": "https://registry.npmjs.org/@bundled-es-modules/pdfjs-dist/-/pdfjs-dist-2.5.207-rc1.tgz", "integrity": "sha512-e/UVP1g6dwjQLnu4MPf/mlESCIvyr/KgpoMUyxGcv4evCIuJwKR/fcfhG3p1NYo+49gJsd0hL2yz9kzhkCZ32A==" }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@custom-elements-manifest/analyzer": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@custom-elements-manifest/analyzer/-/analyzer-0.8.4.tgz", + "integrity": "sha512-hibYFNoqPc/xSH9ySuotOllz3UtQnnbG912oC0RtRwHGilnOVT5zeL3Ip26swCjiuFAp8Y0uLN5DwnMpa/xXYQ==", + "dev": true, + "dependencies": { + "@custom-elements-manifest/find-dependencies": "^0.0.5", + "@github/catalyst": "^1.6.0", + "@web/config-loader": "0.1.3", + "chokidar": "3.5.2", + "command-line-args": "5.1.2", + "comment-parser": "1.2.4", + "custom-elements-manifest": "1.0.0", + "debounce": "1.2.1", + "globby": "11.0.4", + "typescript": "~4.3.2" + }, + "bin": { + "cem": "cem.js", + "custom-elements-manifest": "cem.js" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/command-line-args": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.2.tgz", + "integrity": "sha512-fytTsbndLbl+pPWtS0CxLV3BEWw9wJayB8NnU2cbQqVPsNdYezQeT+uIQv009m+GShnMNyuoBrRo8DTmuTfSCA==", + "dev": true, + "dependencies": { + "array-back": "^6.1.2", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@custom-elements-manifest/find-dependencies": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@custom-elements-manifest/find-dependencies/-/find-dependencies-0.0.5.tgz", + "integrity": "sha512-fKIMMZCDFSoL2ySUoz8knWgpV4jpb0lUXgLOvdZQMQFHxgxz1PqOJpUIypwvEVyKk3nEHRY4f10gNol02HjeCg==", + "dev": true, + "dependencies": { + "es-module-lexer": "^0.9.3" + } + }, + "node_modules/@custom-elements-manifest/find-dependencies/node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.3.tgz", + "integrity": "sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz", + "integrity": "sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.3.tgz", + "integrity": "sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz", + "integrity": "sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz", + "integrity": "sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz", + "integrity": "sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz", + "integrity": "sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz", + "integrity": "sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz", + "integrity": "sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz", + "integrity": "sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz", + "integrity": "sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz", + "integrity": "sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz", + "integrity": "sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz", + "integrity": "sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz", + "integrity": "sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz", + "integrity": "sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz", + "integrity": "sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz", + "integrity": "sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz", + "integrity": "sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz", + "integrity": "sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz", + "integrity": "sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz", + "integrity": "sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esm-bundle/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4.tgz", @@ -1845,18 +2927,39 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz", - "integrity": "sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } }, "node_modules/@floating-ui/dom": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.0.tgz", - "integrity": "sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", "dependencies": { - "@floating-ui/core": "^1.0.5" + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" } }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" + }, + "node_modules/@github/catalyst": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.6.0.tgz", + "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ==", + "dev": true + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, "node_modules/@interactjs/actions": { "version": "1.10.11", "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.10.11.tgz", @@ -2101,24 +3204,11 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/@lion/button": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lion/button/-/button-0.16.0.tgz", - "integrity": "sha512-9HspdzHo4oKel8Zx/lIU1QfhMGsOn3FWskQZdSL6EHAD9yuxuVCIHjCdxzX9wP5zTfDrE23f35g6mOM9FAzp2w==", - "dependencies": { - "@lion/core": "^0.21.0" - } - }, - "node_modules/@lion/combobox": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@lion/combobox/-/combobox-0.9.0.tgz", - "integrity": "sha512-FEOnuH+s9NSFZTcCEYvLIy6IWz4c8qUgGhackcXEGjDf5/Z8VItbhWdfPZ0WrA1bFnR+S0n4vovJWsYWSFovzw==", - "dependencies": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0", - "@lion/listbox": "^0.12.0", - "@lion/overlays": "^0.31.0" - } + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true }, "node_modules/@lion/core": { "version": "0.21.1", @@ -2130,15 +3220,6 @@ "lit": "^2.0.2" } }, - "node_modules/@lion/dialog": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@lion/dialog/-/dialog-0.14.0.tgz", - "integrity": "sha512-YU8A693un6BxiACOInEp+a1YFLB2/wapoYlAfpli2LfWPuM3e7WSGrEn8d8nn75/A3LBPza1PhrZyJ16AWxG1A==", - "dependencies": { - "@lion/core": "^0.21.0", - "@lion/overlays": "^0.31.0" - } - }, "node_modules/@lion/form-core": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/@lion/form-core/-/form-core-0.16.0.tgz", @@ -2148,23 +3229,6 @@ "@lion/localize": "^0.23.0" } }, - "node_modules/@lion/input": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lion/input/-/input-0.16.0.tgz", - "integrity": "sha512-AmhMkM1MUqu3aju0BJ5QINkSAbuLlYiK/pQqjvEX4T2+GQJPAl4Do5u4Ks2zLY3RgOzIsfg8cOjTJDlum93mNA==", - "dependencies": { - "@lion/form-core": "^0.16.0" - } - }, - "node_modules/@lion/listbox": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@lion/listbox/-/listbox-0.12.0.tgz", - "integrity": "sha512-RupZ6KIsZk7D62ZrSmk0WXt5W0d86ynzUyzPAOGW3tby58LmpKEjt3NwyhMCrCpjpH6Ib7sPsy0/46wVk4ynRw==", - "dependencies": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0" - } - }, "node_modules/@lion/localize": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@lion/localize/-/localize-0.23.0.tgz", @@ -2175,40 +3239,13 @@ "singleton-manager": "^1.4.3" } }, - "node_modules/@lion/overlays": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@lion/overlays/-/overlays-0.31.0.tgz", - "integrity": "sha512-4jCoan6QjUARx7UddsZogqgQAVyacu82JaR8raMzIb1eZWo3m8w/hxDCssdYrsDbXJCiOgwgAfE0Kd929GBUpw==", - "dependencies": { - "@lion/core": "^0.21.0", - "@popperjs/core": "^2.5.4", - "singleton-manager": "^1.4.3" - } - }, - "node_modules/@lion/select": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@lion/select/-/select-0.15.0.tgz", - "integrity": "sha512-cnwSJALSQdqpN9BNYrogq5L4lp7QjvgLgZ20kDNn4xPyzMbRe/NDumHPgAr/YiP9op5AlYFN9jfG8wnd5q7tvA==", - "dependencies": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0" - } - }, - "node_modules/@lion/textarea": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@lion/textarea/-/textarea-0.14.0.tgz", - "integrity": "sha512-Ldj2EUtaKEiA0XyZVFH65C7IiGdKrUPU7X6t8RSfzt4PAWXJKWTzt9498k8nJdWZmTuFtV9E5SZyQsZO/OPGTQ==", - "dependencies": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0", - "@types/autosize": "^3.0.7", - "autosize": "4.0.2" - } - }, "node_modules/@lit-labs/react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lit-labs/react/-/react-1.1.1.tgz", - "integrity": "sha512-9TC+/ZWb6BJlWCyUr14FKFlaGnyKpeEDorufXozQgke/VoVrslUQNaL7nBmrAWdNrmzx5jWgi8lFmWwrxMjnlA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lit-labs/react/-/react-2.0.1.tgz", + "integrity": "sha512-Nj+XB3HamqaWefN91lpFPJaqjJ78XzGkPWCedB4jyH22GBFEenpE9A/h8B/2dnIGXtNtd9D/RFpUdQ/dBtWFqA==", + "peerDependencies": { + "@types/react": "17 || 18" + } }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.0.0", @@ -2331,15 +3368,6 @@ "lit": "^2.0.0" } }, - "node_modules/@popperjs/core": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", - "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -2559,21 +3587,22 @@ } }, "node_modules/@shoelace-style/localize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.0.4.tgz", - "integrity": "sha512-HFY90KD+b1Td2otSBryCOpQjBEArIwlV6Tv4J4rC/E/D5wof2eLF6JUVrbiRNn8GRmwATe4YDAEK7NUD08xO1w==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.1.1.tgz", + "integrity": "sha512-NkM/hj3Js6yXCU9WxhsyxRUdyqUUUl/BSvIluUMptQteUWGOJaoyP1iMbOMqO544DYMzBfnoCw66ZHkGuTdKgA==" }, "node_modules/@shoelace-style/shoelace": { - "version": "2.0.0-beta.81", - "resolved": "https://registry.npmjs.org/@shoelace-style/shoelace/-/shoelace-2.0.0-beta.81.tgz", - "integrity": "sha512-mHxE450EiPnZeDGwJ8Dn0pXUz9U5nkjHJhXZ6REewq4RFeRFadaxlc7j/ic076U7Vdx/0PXWeubZOnWWXrMw4w==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@shoelace-style/shoelace/-/shoelace-2.8.0.tgz", + "integrity": "sha512-WigVUaW+MptefOW4zUlZaq+zn0n2hP+I4/mztoeJii5u3ex1CGexfQGcdw2gx6d7P7LAa6/NW0TlgAELzJQnCA==", "dependencies": { - "@floating-ui/dom": "^1.0.1", - "@lit-labs/react": "^1.0.7", + "@ctrl/tinycolor": "^3.5.0", + "@floating-ui/dom": "^1.2.1", + "@lit-labs/react": "^2.0.1", "@shoelace-style/animations": "^1.1.0", - "@shoelace-style/localize": "^3.0.1", - "color": "4.2", - "lit": "^2.2.8", + "@shoelace-style/localize": "^3.1.1", + "composed-offset-position": "^0.0.4", + "lit": "^2.7.5", "qr-creator": "^1.0.0" }, "engines": { @@ -2584,6 +3613,59 @@ "url": "https://github.com/sponsors/claviska" } }, + "node_modules/@sindresorhus/slugify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", + "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "dev": true, + "dependencies": { + "@sindresorhus/transliterate": "^0.1.1", + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", + "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0", + "lodash.deburr": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -2619,6 +3701,12 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, "node_modules/@types/accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", @@ -2628,14 +3716,6 @@ "@types/node": "*" } }, - "node_modules/@types/autosize": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/autosize/-/autosize-3.0.7.tgz", - "integrity": "sha512-D46m3aBNg81QKk9ZigmDFuhXUkD4IpBSrkGUKpYo2QBETbUjqEe8msXNCcECaXLXv1O4ppdMpizgFRzpfrgOxA==", - "dependencies": { - "@types/jquery": "*" - } - }, "node_modules/@types/babel__code-frame": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz", @@ -2652,6 +3732,15 @@ "@types/node": "*" } }, + "node_modules/@types/bonjour": { + "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/chai": { "version": "4.2.21", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.21.tgz", @@ -2692,6 +3781,16 @@ "@types/node": "*" } }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", @@ -2704,6 +3803,12 @@ "integrity": "sha512-tHs++ZeXer40kCF2JpE51Hg7t4HPa18B1b1Dzy96S0eCw8QKECNMYMfwa1edK/x8yCN0r4e6ewvLcc5CsVGkdg==", "dev": true }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, "node_modules/@types/cookies": { "version": "0.7.7", "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", @@ -2716,12 +3821,41 @@ "@types/node": "*" } }, + "node_modules/@types/cors": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", + "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debounce": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.0.tgz", "integrity": "sha512-bWG5wapaWgbss9E238T0R6bfo5Fh3OkeoSt245CM7JJwVwpw6MEBCbIxLq5z8KzsE3uJhzcIuQkyiZmzV3M/Dw==", "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==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "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==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", @@ -2762,6 +3896,15 @@ "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==", "dev": true }, + "node_modules/@types/http-proxy": { + "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": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -2786,13 +3929,11 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jquery": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz", - "integrity": "sha512-6RXU9Xzpc6vxNrS6FPPapN1SxSHgQ336WC6Jj/N8q30OiaBZ00l1GBgeP7usjVZPivSkGUfL1z/WW6TX989M+w==", - "dependencies": { - "@types/sizzle": "*" - } + "node_modules/@types/json-schema": { + "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/keygrip": { "version": "1.0.2", @@ -2831,6 +3972,12 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, "node_modules/@types/mocha": { "version": "8.2.3", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", @@ -2849,6 +3996,12 @@ "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.6", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.6.tgz", + "integrity": "sha512-RK/kBbYOQQHLYj9Z95eh7S6t7gq4Ojt/NT8HTk8bWVhA5DaF+5SMnxHKkP4gPNN3wAZkKP+VjAf0ebtYzf+fxg==", + "peer": true + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -2861,6 +4014,17 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/react": { + "version": "18.2.22", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", + "integrity": "sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA==", + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -2870,6 +4034,27 @@ "@types/node": "*" } }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "peer": true + }, + "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==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -2899,15 +4084,19 @@ "@types/sinon": "*" } }, - "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "node_modules/@types/uuid": { "version": "8.3.1", @@ -3033,19 +4222,477 @@ } }, "node_modules/@web/dev-server-esbuild": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.2.14.tgz", - "integrity": "sha512-28nGCnVIRNXIlptBrnuhEIRCwimeLhz3RkQpPct2yX9k4rfuUPH+WQYfVcp3rEozj0cG13zrwZONaCw8SuEZRw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.4.1.tgz", + "integrity": "sha512-oUrxo7ggxeaWuQafu5bgiAJFatA+YEeYhgkUMB2CHq/SVleKgyPgQCqx42eVBJ2uWMyI1YWSpKtNueCmocwQzw==", "dev": true, "dependencies": { "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.3.10", - "esbuild": "^0.12.21", + "@web/dev-server-core": "^0.5.1", + "esbuild": "^0.16 || ^0.17", "parse5": "^6.0.1", - "ua-parser-js": "^0.7.23" + "ua-parser-js": "^1.0.33" }, "engines": { - "node": ">=10.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@web/dev-server-core": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.5.2.tgz", + "integrity": "sha512-7YjWmwzM+K5fPvBCXldUIMTK4EnEufi1aWQWinQE81oW1CqzEwmyUNCtnWV9fcPA4kJC4qrpcjWNGF4YDWxuSg==", + "dev": true, + "dependencies": { + "@types/koa": "^2.11.6", + "@types/ws": "^7.4.0", + "@web/parse5-utils": "^2.0.0", + "chokidar": "^3.4.3", + "clone": "^2.1.2", + "es-module-lexer": "^1.0.0", + "get-stream": "^6.0.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^5.0.0", + "koa": "^2.13.0", + "koa-etag": "^4.0.0", + "koa-send": "^5.0.1", + "koa-static": "^5.0.0", + "lru-cache": "^8.0.4", + "mime-types": "^2.1.27", + "parse5": "^6.0.1", + "picomatch": "^2.2.2", + "ws": "^7.4.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/@web/parse5-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-2.0.1.tgz", + "integrity": "sha512-FQI72BU5CXhpp7gLRskOQGGCcwvagLZnMnDwAfjrxo3pm1KOQzr8Vl+438IGpHV62xvjNdF1pjXwXcf7eekWGw==", + "dev": true, + "dependencies": { + "@types/parse5": "^6.0.1", + "parse5": "^6.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@web/dev-server-esbuild/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==", + "dev": true + }, + "node_modules/@web/dev-server-esbuild/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/isbinaryfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@web/dev-server-esbuild/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "dev": true, + "engines": { + "node": ">=16.14" } }, "node_modules/@web/dev-server-rollup": { @@ -3328,6 +4975,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@web/test-runner-core/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@web/test-runner-core/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@web/test-runner-core/node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -3422,6 +5098,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@web/test-runner/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@web/test-runner/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@web/test-runner/node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -3443,11 +5148,181 @@ "node": ">=8" } }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@webcomponents/scoped-custom-element-registry": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@webcomponents/scoped-custom-element-registry/-/scoped-custom-element-registry-0.0.3.tgz", "integrity": "sha512-lpSzgDCGbM99dytb3+J3Suo4+Bk1E13MPnWB42JK8GwxSAxFz+tC7TTv2hhDSIE2IirGNKNKCf3m08ecu6eAsQ==" }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3479,6 +5354,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -3491,6 +5375,86 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3506,6 +5470,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -3561,6 +5537,15 @@ "node": ">=6" } }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -3570,6 +5555,12 @@ "node": ">=0.10.0" } }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, "node_modules/array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -3588,6 +5579,36 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", + "dev": true + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3603,10 +5624,20 @@ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, - "node_modules/autosize": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.2.tgz", - "integrity": "sha512-jnSyH2d+qdfPGpWlcuhGiHmqBJ6g3X+8T+iRwFrHPLVcdoGJE/x6Qicm6aDHfTsbgZKxyV8UU/YB2p4cjKDRRA==" + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/axe-core": { "version": "4.3.5", @@ -3617,6 +5648,34 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", @@ -3656,6 +5715,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3681,6 +5752,69 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcp-47": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", + "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", + "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz", + "integrity": "sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==", + "dev": true, + "dependencies": { + "bcp-47": "^1.0.0", + "bcp-47-match": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3706,6 +5840,143 @@ "resolved": "https://registry.npmjs.org/blueimp-gallery/-/blueimp-gallery-3.4.0.tgz", "integrity": "sha512-t4zQ8XSlE3IuJK72gd6hnexHMUpndUZYRKcAYv+24TpYGom5YtP5yizWdH2cGwyb0MOTKojkwSWVweTo1rbDEw==" }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3728,6 +5999,290 @@ "node": ">=8" } }, + "node_modules/browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/browser-sync-ui/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/browser-sync/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/browser-sync/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/browser-sync/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/browser-sync/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/browser-sync/node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/browser-sync/node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/browser-sync/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/browser-sync/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -3756,6 +6311,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -3842,6 +6403,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camel-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", @@ -3855,9 +6432,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001460", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz", + "integrity": "sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==", "dev": true, "funding": [ { @@ -3870,6 +6447,268 @@ } ] }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/capital-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/cem": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cem/-/cem-1.0.4.tgz", + "integrity": "sha512-ps76x5/E22QnW7oEBUjJ2ddVyFkkUddlOhUFoZ9iQRyoZyUzbfbq39RqWc4H/ru5jm7GjY6FuSMka/Vghj6Ocw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.18.13", + "@babel/preset-env": "^7.18.10", + "@babel/preset-react": "^7.18.6", + "babel-loader": "^8.2.5", + "path": "^0.12.7", + "webpack": "^5.74.0", + "webpack-dev-server": "^4.10.0" + } + }, + "node_modules/cem/node_modules/@babel/compat-data": { + "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/cem/node_modules/@babel/core": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", + "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.20", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.20", + "@babel/types": "^7.22.19", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/cem/node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/helper-module-transforms": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", + "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, + "dependencies": { + "@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.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/cem/node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/helpers": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/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==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/cem/node_modules/caniuse-lite": { + "version": "1.0.30001538", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", + "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cem/node_modules/electron-to-chromium": { + "version": "1.4.526", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.526.tgz", + "integrity": "sha512-tjjTMjmZAx1g6COrintLTa2/jcafYKxKoiEkdQOrVdbLaHh2wCt2nsAF8ZHweezkrP+dl/VG9T5nabcYoo0U5Q==", + "dev": true + }, + "node_modules/cem/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/cem/node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/cem/node_modules/update-browserslist-db": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/cem/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/chai-a11y-axe": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.3.2.tgz", @@ -3895,6 +6734,41 @@ "node": ">=0.10.0" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/change-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "dependencies": { + "is-regex": "^1.0.3" + } + }, "node_modules/chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -3949,6 +6823,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/clean-css": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", @@ -3961,6 +6844,33 @@ "node": ">= 4.0" } }, + "node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3973,6 +6883,85 @@ "node": ">=8" } }, + "node_modules/cli-spinners": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -4004,22 +6993,11 @@ "type-is": "^1.6.16" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4030,16 +7008,14 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, "node_modules/colors": { "version": "1.1.2", @@ -4055,6 +7031,18 @@ "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-1.9.2.tgz", "integrity": "sha512-Hr1qCLwL/5gbGhcRwfhl1+JbvHmybTGbecpbhyzn3IyizgYFxMpLpX8OGhAcvSPB0+K2bwrAcFIbeF60wqOJLg==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/command-line-args": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", @@ -4171,17 +7159,178 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/comment-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz", + "integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/composed-offset-position": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.4.tgz", + "integrity": "sha512-vMlvu1RuNegVE0YsCDSV/X4X10j56mq7PCIyOKK74FxkXzGLwhOUmdkJLSdOBOMwWycobGUMgft2lp+YgTe8hw==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/constant-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -4212,6 +7361,21 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, "node_modules/cookies": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", @@ -4248,6 +7412,168 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", + "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "peer": true + }, + "node_modules/custom-element-jet-brains-integration": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/custom-element-jet-brains-integration/-/custom-element-jet-brains-integration-1.2.1.tgz", + "integrity": "sha512-PepVXf0KiaG5HTASBYt89E9KPMC/l/I4ZPd8D8mYyBtUCVCPvYjqQG9zLjvY/d62iELK6B5R1XGaoNjZtfpMGA==", + "dev": true, + "dependencies": { + "prettier": "^2.8.0" + } + }, + "node_modules/custom-element-jet-brains-integration/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/custom-element-vs-code-integration": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/custom-element-vs-code-integration/-/custom-element-vs-code-integration-1.2.1.tgz", + "integrity": "sha512-eIQabFnx0AU0FqwOSxSqv0qRB1ZBaPC/5eeTbvjvrdmKWKck58rcmycL0ia65nrfg7s0GJcrJsQAAuiXdTzpiw==", + "dev": true, + "dependencies": { + "prettier": "^2.7.1" + } + }, + "node_modules/custom-element-vs-code-integration/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/custom-elements-manifest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/custom-elements-manifest/-/custom-elements-manifest-1.0.0.tgz", + "integrity": "sha512-j59k0ExGCKA8T6Mzaq+7axc+KVHwpEphEERU7VZ99260npu/p/9kd+Db+I3cGKxHkM5y6q5gnlXn00mzRQkX2A==", + "dev": true + }, + "node_modules/data-urls": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", + "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/data-urls/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -4264,9 +7590,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -4280,6 +7606,12 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -4304,6 +7636,18 @@ "node": ">=0.10.0" } }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -4313,6 +7657,93 @@ "node": ">=8" } }, + "node_modules/del": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", + "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", + "dev": true, + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/del/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -4352,12 +7783,38 @@ "node": ">=0.10.0" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/devtools-protocol": { "version": "0.0.869402", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.869402.tgz", "integrity": "sha512-VvlVYY+VDJe639yHs5PHISzdWTLL3Aw8rO4cvUtwvoxFd6FHbE4OpHHcde52M6096uYYazAmd4l0o5VuFRO2WA==", "dev": true }, + "node_modules/dexie": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.4.tgz", + "integrity": "sha512-VKoTQRSv7+RnffpOJ3Dh6ozknBqzWw/F3iqMdsZg958R0AS8AnY9x9d1lbwENr0gzeGJHXKcGhAMRaqys6SxqA==", + "engines": { + "node": ">=6.0" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -4379,18 +7836,231 @@ "node": ">=8" } }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dev": true, + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.317", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz", @@ -4403,6 +8073,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -4421,6 +8100,137 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.2.tgz", + "integrity": "sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, "node_modules/errorstacks": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.3.2.tgz", @@ -4434,13 +8244,58 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.12.22", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.22.tgz", - "integrity": "sha512-yWCr9RoFehpqoe/+MwZXJpYOEIt7KOEvNnjIeMZpMSyQt+KCBASM3y7yViiN5dJRphf1wGdUz1+M4rTtWd/ulA==", + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.3.tgz", + "integrity": "sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.3", + "@esbuild/android-arm64": "0.19.3", + "@esbuild/android-x64": "0.19.3", + "@esbuild/darwin-arm64": "0.19.3", + "@esbuild/darwin-x64": "0.19.3", + "@esbuild/freebsd-arm64": "0.19.3", + "@esbuild/freebsd-x64": "0.19.3", + "@esbuild/linux-arm": "0.19.3", + "@esbuild/linux-arm64": "0.19.3", + "@esbuild/linux-ia32": "0.19.3", + "@esbuild/linux-loong64": "0.19.3", + "@esbuild/linux-mips64el": "0.19.3", + "@esbuild/linux-ppc64": "0.19.3", + "@esbuild/linux-riscv64": "0.19.3", + "@esbuild/linux-s390x": "0.19.3", + "@esbuild/linux-x64": "0.19.3", + "@esbuild/netbsd-x64": "0.19.3", + "@esbuild/openbsd-x64": "0.19.3", + "@esbuild/sunos-x64": "0.19.3", + "@esbuild/win32-arm64": "0.19.3", + "@esbuild/win32-ia32": "0.19.3", + "@esbuild/win32-x64": "0.19.3" + } + }, + "node_modules/esbuild-plugin-replace": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-replace/-/esbuild-plugin-replace-1.4.0.tgz", + "integrity": "sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==", + "dev": true, + "dependencies": { + "magic-string": "^0.25.7" + } + }, + "node_modules/esbuild-plugin-replace/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, "node_modules/escalade": { @@ -4467,6 +8322,19 @@ "node": ">=0.8.0" } }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -4480,6 +8348,36 @@ "node": ">=4" } }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", @@ -4510,6 +8408,44 @@ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", "dev": true }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -4531,12 +8467,220 @@ "node": ">=0.10.0" } }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -4572,10 +8716,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4585,9 +8735,15 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, "node_modules/fastq": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", @@ -4597,6 +8753,18 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -4619,6 +8787,36 @@ "node": ">=0.10.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4631,6 +8829,77 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", @@ -4714,6 +8983,26 @@ "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4735,6 +9024,15 @@ "node": ">=0.10.0" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4750,15 +9048,41 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "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==", + "dev": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -4784,6 +9108,15 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -4798,6 +9131,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-port": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.0.0.tgz", + "integrity": "sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -4851,6 +9196,12 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "node_modules/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -4903,31 +9254,45 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, "node_modules/grunt": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", @@ -5113,6 +9478,48 @@ "node": ">=0.12.0" } }, + "node_modules/hamljs": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/hamljs/-/hamljs-0.6.2.tgz", + "integrity": "sha512-/chXRp4WpL47I+HX1vCCdSbEXAljEG2FBMmgO7Am0bYsqgnEjreeWzUdX1onXqwZtcfgxbCg5WtEYYvuZ5muBg==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5173,6 +9580,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/header-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -5194,12 +9617,101 @@ "node": "*" } }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, "node_modules/http-assert": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", @@ -5213,6 +9725,21 @@ "node": ">= 0.8" } }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-equiv-refresh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-1.0.0.tgz", + "integrity": "sha512-TScO04soylRN9i/QdOdgZyhydXg9z6XdaGzEyOgDKycePeDeTT4KvigjBcI+tgfTlieLWauGORMq5F1eIDa+1w==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -5238,6 +9765,50 @@ "node": ">= 0.6" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -5251,6 +9822,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5284,14 +9864,35 @@ ] }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inflation": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", @@ -5333,6 +9934,15 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -5346,10 +9956,29 @@ "node": ">=0.10.0" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5375,6 +10004,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -5390,10 +10029,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5424,9 +10094,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -5435,6 +10105,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -5450,6 +10138,51 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5462,6 +10195,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -5470,6 +10215,22 @@ "@types/estree": "*" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -5506,6 +10267,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5551,6 +10324,15 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/iso-639-1": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-2.1.15.tgz", + "integrity": "sha512-7c7mBznZu2ktfvyT582E2msM+Udc1EjOyhVRE/0ZsjD9LBtWSm23h3PtiRh2a35XoUsTQQjJXaJzuLjXsOdFDg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -5608,6 +10390,79 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -5640,6 +10495,12 @@ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", "dev": true }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5659,6 +10520,201 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", + "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/jsdom/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dev": true, + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jsdom/node_modules/tr46/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", + "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "dev": true, + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jsdom/node_modules/ws": { + "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" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5671,6 +10727,18 @@ "node": ">=4" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -5683,6 +10751,34 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -5701,6 +10797,24 @@ "node": ">= 0.6" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/koa": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", @@ -5823,6 +10937,16 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, "node_modules/liftup": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", @@ -5882,25 +11006,81 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/liquidjs": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.9.2.tgz", + "integrity": "sha512-ygPCgYyiFKQNyRi/CK3s3U5RimosBtrIq7TaMYK5ek93mUl9CZ6xxqw2T+1G4kVc9dAmwI71bWLQNKRToV8SsQ==", + "dev": true, + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/liquidjs/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/list-to-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", + "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", + "dev": true + }, "node_modules/lit": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.6.1.tgz", - "integrity": "sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", + "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", "dependencies": { "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.2.0", - "lit-html": "^2.6.0" + "lit-element": "^3.3.0", + "lit-html": "^2.8.0" } }, "node_modules/lit-element": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.0.tgz", - "integrity": "sha512-HbE7yt2SnUtg5DCrWt028oaU4D5F4k/1cntAFHTkzY8ZIa8N0Wmu92PxSxucsQSOXlODFrICkQ5x/tEshKi13g==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" + "lit-html": "^2.8.0" } }, + "node_modules/lit-element/node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", + "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + }, "node_modules/lit-flatpickr": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/lit-flatpickr/-/lit-flatpickr-0.3.0.tgz", @@ -5912,13 +11092,162 @@ } }, "node_modules/lit-html": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.6.1.tgz", - "integrity": "sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", "dependencies": { "@types/trusted-types": "^2.0.2" } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/localtunnel/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -5949,12 +11278,52 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==", + "dev": true + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", @@ -5973,6 +11342,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5985,6 +11369,21 @@ "node": ">=10" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/magic-string": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", @@ -6041,12 +11440,103 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-container": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-3.0.0.tgz", + "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==", + "dev": true + }, + "node_modules/markdown-it-ins": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-3.0.1.tgz", + "integrity": "sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==", + "dev": true + }, + "node_modules/markdown-it-kbd": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/markdown-it-kbd/-/markdown-it-kbd-2.2.2.tgz", + "integrity": "sha512-J5qVHtLuxh1HTJcl5xhopiFpf6fnHIBY0OO1akGHf2KW0VwQLYhsip/bkiTJFoEZqhssxQuUBY1LO5/SbCrB6g==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/markdown-it-mark": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz", + "integrity": "sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==", + "dev": true + }, + "node_modules/markdown-it-replace-it": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-replace-it/-/markdown-it-replace-it-1.0.0.tgz", + "integrity": "sha512-ptuVIgKz5lJWUUA6zCcAD/ckNL92xMQjbBkcLhpkC2mIGXvqmmXv7PIGOm9I0wp0WIqI14wKfcAmcHPf2TpEXg==", + "dev": true + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/marky": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz", "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==", "dev": true }, + "node_modules/maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maximatch/node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maximatch/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/maxmin": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", @@ -6062,6 +11552,12 @@ "node": ">=0.12" } }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6071,6 +11567,24 @@ "node": ">= 0.6" } }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6086,14 +11600,23 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" @@ -6141,6 +11664,12 @@ "node": ">=6" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, "node_modules/minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", @@ -6154,9 +11683,30 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", "dev": true }, "node_modules/mkdirp": { @@ -6177,12 +11727,74 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "dev": true + }, + "node_modules/morphdom": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.0.tgz", + "integrity": "sha512-8L8DwbdjjWwM/aNqj7BSoSn4G7SQLNiDcxCnMWbf506jojR6lNQ5YOmQqXEIE8u3C492UlkN4d0hQwz97+M1oQ==", + "dev": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -6192,6 +11804,12 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node_modules/nise": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", @@ -6205,6 +11823,22 @@ "path-to-regexp": "^1.7.0" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -6247,6 +11881,15 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", @@ -6274,6 +11917,18 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6283,6 +11938,46 @@ "node": ">=0.10.0" } }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "dev": true, + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6341,6 +12036,12 @@ "node": ">=0.10.0" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -6353,6 +12054,15 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6399,6 +12109,149 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "dev": true + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -6454,6 +12307,43 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6463,6 +12353,22 @@ "node": ">=6" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/param-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -6486,6 +12392,12 @@ "node": ">=0.10.0" } }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "dev": true + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -6501,6 +12413,48 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dev": true, + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6519,6 +12473,15 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -6587,6 +12550,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -6637,6 +12609,15 @@ "node": ">= 6" } }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "dependencies": { + "semver-compare": "^1.0.0" + } + }, "node_modules/pngjs": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", @@ -6690,6 +12671,96 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/posthtml-urls/-/posthtml-urls-1.0.0.tgz", + "integrity": "sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w==", + "dev": true, + "dependencies": { + "http-equiv-refresh": "^1.0.0", + "list-to-array": "^1.1.0", + "parse-srcset": "^1.0.2", + "promise-each": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "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==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-bytes": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", @@ -6702,6 +12773,30 @@ "node": ">=0.10.0" } }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6711,6 +12806,30 @@ "node": ">=0.4.0" } }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-each": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/promise-each/-/promise-each-2.2.0.tgz", + "integrity": "sha512-67roqt1k3QDA41DZ8xi0V+rF3GoaMiX7QilbXu0vXimut+9RcKBNZ/t60xCRgcsihmNUsEjh48xLfNqOrKblUg==", + "dev": true, + "dependencies": { + "any-promise": "^0.1.0" + } + }, + "node_modules/promise-each/node_modules/any-promise": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz", + "integrity": "sha512-lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g==", + "dev": true + }, "node_modules/proper-lockfile": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", @@ -6722,12 +12841,170 @@ "signal-exit": "^3.0.2" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pug": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", + "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "dev": true, + "dependencies": { + "pug-code-gen": "^3.0.2", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", + "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", + "dev": true + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6790,6 +13067,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6819,6 +13102,15 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/raw-body": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", @@ -6872,6 +13164,56 @@ "node": ">= 0.10" } }, + "node_modules/recursive-copy": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.14.tgz", + "integrity": "sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog==", + "dev": true, + "dependencies": { + "errno": "^0.1.2", + "graceful-fs": "^4.1.4", + "junk": "^1.0.1", + "maximatch": "^0.1.0", + "mkdirp": "^0.5.1", + "pify": "^2.3.0", + "promise": "^7.0.1", + "rimraf": "^2.7.1", + "slash": "^1.0.0" + } + }, + "node_modules/recursive-copy/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/recursive-copy/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/recursive-copy/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", @@ -6952,6 +13294,30 @@ "jsesc": "bin/jsesc" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -7031,6 +13397,34 @@ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -7097,6 +13491,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -7126,6 +13521,12 @@ "node": ">=10" } }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "dev": true + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7149,6 +13550,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -7161,6 +13568,67 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -7170,6 +13638,148 @@ "semver": "bin/semver.js" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/sentence-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", @@ -7179,12 +13789,132 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/shortcut-buttons-flatpickr": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/shortcut-buttons-flatpickr/-/shortcut-buttons-flatpickr-0.4.0.tgz", @@ -7210,14 +13940,6 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/singleton-manager": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/singleton-manager/-/singleton-manager-1.4.3.tgz", @@ -7254,12 +13976,15 @@ } }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { @@ -7294,6 +14019,127 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/smartquotes": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/smartquotes/-/smartquotes-2.3.2.tgz", + "integrity": "sha512-0R6YJ5hLpDH4mZR7N5eZ12oCMLspvGOHL9A9SEm2e3b/CQmQidekW4SWSKEmor/3x6m3NCBBEqLzikcZC9VJNQ==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snake-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, "node_modules/sortablejs": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", @@ -7327,12 +14173,61 @@ "node": ">=0.10.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", @@ -7363,6 +14258,72 @@ "node": ">= 0.6" } }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/stdin-discarder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7393,14 +14354,14 @@ ] }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -7439,6 +14400,24 @@ "node": ">=0.10.0" } }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -7460,6 +14439,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/table-layout": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", @@ -7493,6 +14478,15 @@ "node": ">=8" } }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -7538,6 +14532,136 @@ "node": ">=6.0.0" } }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/terser-webpack-plugin/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "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", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7553,6 +14677,12 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7583,6 +14713,12 @@ "node": ">=0.6" } }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", + "dev": true + }, "node_modules/tr46": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", @@ -7666,9 +14802,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", + "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", "dev": true, "funding": [ { @@ -7678,12 +14814,35 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "engines": { "node": "*" } }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -7756,6 +14915,15 @@ "node": ">=4" } }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7791,12 +14959,85 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/upper-case/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -7850,6 +15091,49 @@ "node": ">= 0.8" } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -7859,6 +15143,405 @@ "node": ">=10.4" } }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/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==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "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" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/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==", + "dev": true + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", @@ -7887,6 +15570,27 @@ "node": ">= 8" } }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", @@ -7985,12 +15689,72 @@ } } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -8019,6073 +15783,5 @@ "node": ">= 4.0.0" } } - }, - "dependencies": { - "@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==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "dev": true - }, - "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "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 - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "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, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@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==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "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 - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dev": true, - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@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==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "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.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@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", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@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.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@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.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bundled-es-modules/message-format": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/message-format/-/message-format-6.0.4.tgz", - "integrity": "sha512-NGUoPxqsBzDwvRhY3A3L/AhS1hzS9OWappfyDOyCwE7G3W4ua28gau7QwvJz7QzA6ArbAdeb8c1mLjvd1WUFAA==" - }, - "@bundled-es-modules/pdfjs-dist": { - "version": "2.5.207-rc1", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/pdfjs-dist/-/pdfjs-dist-2.5.207-rc1.tgz", - "integrity": "sha512-e/UVP1g6dwjQLnu4MPf/mlESCIvyr/KgpoMUyxGcv4evCIuJwKR/fcfhG3p1NYo+49gJsd0hL2yz9kzhkCZ32A==" - }, - "@esm-bundle/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-6Tx35wWiNw7X0nLY9RMx8v3EL8SacCFW+eEZOE9Hc+XxmU5HFE2AFEg+GehUZpiyDGwVvPH75ckGlqC7coIPnA==", - "dev": true, - "requires": { - "@types/chai": "^4.2.12" - } - }, - "@floating-ui/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz", - "integrity": "sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ==" - }, - "@floating-ui/dom": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.0.tgz", - "integrity": "sha512-TSogMPVxbRe77QCj1dt8NmRiJasPvuc+eT5jnJ6YpLqgOD2zXc5UA3S1qwybN+GVCDNdKfpKy1oj8RpzLJvh6A==", - "requires": { - "@floating-ui/core": "^1.0.5" - } - }, - "@interactjs/actions": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.10.11.tgz", - "integrity": "sha512-P39zeefr4hkmKx+5nZ+mrH1s0l2YJ3gIHrthXmE81n6MlMa42m0WtHcTms4C5JTTNBP2EEDY+KGgGxSnmJKvUw==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/auto-scroll": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/auto-scroll/-/auto-scroll-1.10.11.tgz", - "integrity": "sha512-feHNjhi0EMNLV2nQcEgjYPz2mI54aeSW2RiaoNtFLyBvtXKp0b4DmluwDv6DvuXmUpDwD5g/Hk1gGM2rgl7iqQ==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/auto-start": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/auto-start/-/auto-start-1.10.11.tgz", - "integrity": "sha512-cIg5CcalCPtC6AiGq6j/0hKUtL2MweEpvw12FuB19sz2Q9Dye0J4GliHKhOYvtumNinnvfVAZ4FZMqZEuX7YZA==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/core": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.10.11.tgz", - "integrity": "sha512-aJ50ccVeszpJt7wPH7Yfqm7f1aG1SA94qd90P0NaESh5/QUXn4CESO6igobo4DFHQ5z+1Rfdl8aphP4JxlH4gw==", - "dev": true, - "requires": {} - }, - "@interactjs/dev-tools": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/dev-tools/-/dev-tools-1.10.11.tgz", - "integrity": "sha512-BP2FNfMbF7zLuOAUGMkDhCo1e1B0fnqyb9ih/Y8yAIJuoLrZxP/9htbsS1vZOIVZ4UgtrId4cYOwfcAZBMQtmw==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/inertia": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/inertia/-/inertia-1.10.11.tgz", - "integrity": "sha512-h+sknCzRqBSyHy4ctPNsq56mxkAMMdwHWD6en7rDEw899gdGKYaXVDVdv1jMfiwNRw0eRFBNoCiol8r3a/a3Jw==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11", - "@interactjs/offset": "1.10.11" - } - }, - "@interactjs/interact": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/interact/-/interact-1.10.11.tgz", - "integrity": "sha512-0iZJ9l547JuBA/lKxK4ARGYVmMqRSsAdA8gXL1zWe51qEIQq8PyWmMipoi8JbDaL7exC2THKwkXu5uq5ndT+iA==", - "dev": true, - "requires": { - "@interactjs/core": "1.10.11", - "@interactjs/types": "1.10.11", - "@interactjs/utils": "1.10.11" - } - }, - "@interactjs/interactjs": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/interactjs/-/interactjs-1.10.11.tgz", - "integrity": "sha512-cGOxf6rp3Y8/sk88LhIT0XDn4gCiCzAnUG5Kkj9SAqiUO6BK/9+Wbp1IBkNaPgl/8uG8gNHh/dXBrlBBNcqJAg==", - "dev": true, - "requires": { - "@interactjs/actions": "1.10.11", - "@interactjs/auto-scroll": "1.10.11", - "@interactjs/auto-start": "1.10.11", - "@interactjs/core": "1.10.11", - "@interactjs/dev-tools": "1.10.11", - "@interactjs/inertia": "1.10.11", - "@interactjs/interact": "1.10.11", - "@interactjs/modifiers": "1.10.11", - "@interactjs/offset": "1.10.11", - "@interactjs/pointer-events": "1.10.11", - "@interactjs/reflow": "1.10.11", - "@interactjs/utils": "1.10.11" - } - }, - "@interactjs/modifiers": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/modifiers/-/modifiers-1.10.11.tgz", - "integrity": "sha512-ltqX1RSqeAIikixlQBlyEUdclT5+rbfIGi3sIdLLYaIZQnltYkWqL9MHKx/w5b+hV+Mc0p5MLUFWJbTdkSCZ9g==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11", - "@interactjs/snappers": "1.10.11" - } - }, - "@interactjs/offset": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/offset/-/offset-1.10.11.tgz", - "integrity": "sha512-mBT7eIfy5ivofECiv+VwtEwwIMLV54fT9ujSMWJPduxdSYIHepUWgEf/3zjJknFh6jQc7pqz9dtjvVvyzRCLlQ==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/pointer-events": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/pointer-events/-/pointer-events-1.10.11.tgz", - "integrity": "sha512-yBT8JJVMZ+MgBay5l1WAHnL8ch/mZsRfaFahti+QFYeQyRloDtsWmEMDSYI/Onyy9+hS3gN/ge77ArGciZZ0Ow==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/reflow": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/reflow/-/reflow-1.10.11.tgz", - "integrity": "sha512-NSCtcCkjImOYSbxzzv2kFqR9t49J8KlhEr9UoePc7GyLbNXsiv3WQ3n0ehZd7CgZXQDiVXnP2UnmIOv5Zd4HQg==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/snappers": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/snappers/-/snappers-1.10.11.tgz", - "integrity": "sha512-yYtOMUZ7aFUZ1IYheq9Tj5hZ4J1r5dnaXhLF44WsI/awQ5L0DjZf07GPWof0B+7rZHEVudxyQNbPfFmb+1K94Q==", - "dev": true, - "requires": { - "@interactjs/interact": "1.10.11" - } - }, - "@interactjs/types": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.11.tgz", - "integrity": "sha512-YRsVFWjL8Gkkvlx3qnjeaxW4fnibSJ9791g8BA7Pv5ANByI64WmtR1vU7A2rXcrOn8XvyCEfY0ss1s8NhZP+MA==", - "dev": true - }, - "@interactjs/utils": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@interactjs/utils/-/utils-1.10.11.tgz", - "integrity": "sha512-410ZoxKF+r1roeSelL+WHXfdryUMg5iykC1XwQ3l6XqNw43IMACzyvTH6k6Pwxj7w7x42nce0Qdn1GQ3Y8xyCw==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@lion/button": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lion/button/-/button-0.16.0.tgz", - "integrity": "sha512-9HspdzHo4oKel8Zx/lIU1QfhMGsOn3FWskQZdSL6EHAD9yuxuVCIHjCdxzX9wP5zTfDrE23f35g6mOM9FAzp2w==", - "requires": { - "@lion/core": "^0.21.0" - } - }, - "@lion/combobox": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@lion/combobox/-/combobox-0.9.0.tgz", - "integrity": "sha512-FEOnuH+s9NSFZTcCEYvLIy6IWz4c8qUgGhackcXEGjDf5/Z8VItbhWdfPZ0WrA1bFnR+S0n4vovJWsYWSFovzw==", - "requires": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0", - "@lion/listbox": "^0.12.0", - "@lion/overlays": "^0.31.0" - } - }, - "@lion/core": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@lion/core/-/core-0.21.1.tgz", - "integrity": "sha512-6lCJ7ZLHQBcsZu/XBOEePG4KxxNFI1OD+1wSA4f9KMyHJVA4+FXZEv1mYniWVsfdPXyyAgKnmfB23xD4Z3kwng==", - "requires": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@open-wc/scoped-elements": "^2.0.1", - "lit": "^2.0.2" - } - }, - "@lion/dialog": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@lion/dialog/-/dialog-0.14.0.tgz", - "integrity": "sha512-YU8A693un6BxiACOInEp+a1YFLB2/wapoYlAfpli2LfWPuM3e7WSGrEn8d8nn75/A3LBPza1PhrZyJ16AWxG1A==", - "requires": { - "@lion/core": "^0.21.0", - "@lion/overlays": "^0.31.0" - } - }, - "@lion/form-core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lion/form-core/-/form-core-0.16.0.tgz", - "integrity": "sha512-b3Tw0y/5eoIkfowJUqH4JIPvleFOsN09MM6Pb8j7QIyweRk/YlSMbirAlEYmdeTo8aOgGRJhbmrOKmukpsPA/g==", - "requires": { - "@lion/core": "^0.21.0", - "@lion/localize": "^0.23.0" - } - }, - "@lion/input": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@lion/input/-/input-0.16.0.tgz", - "integrity": "sha512-AmhMkM1MUqu3aju0BJ5QINkSAbuLlYiK/pQqjvEX4T2+GQJPAl4Do5u4Ks2zLY3RgOzIsfg8cOjTJDlum93mNA==", - "requires": { - "@lion/form-core": "^0.16.0" - } - }, - "@lion/listbox": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@lion/listbox/-/listbox-0.12.0.tgz", - "integrity": "sha512-RupZ6KIsZk7D62ZrSmk0WXt5W0d86ynzUyzPAOGW3tby58LmpKEjt3NwyhMCrCpjpH6Ib7sPsy0/46wVk4ynRw==", - "requires": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0" - } - }, - "@lion/localize": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@lion/localize/-/localize-0.23.0.tgz", - "integrity": "sha512-pGN2JzEPukvgtB3+BpeT13KZnI7mCqyq7m/a+A973XFhH1PJlAyEXdkv3bVJsIpNolqXRVP0lU4vgisMsO8IkQ==", - "requires": { - "@bundled-es-modules/message-format": "6.0.4", - "@lion/core": "^0.21.0", - "singleton-manager": "^1.4.3" - } - }, - "@lion/overlays": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@lion/overlays/-/overlays-0.31.0.tgz", - "integrity": "sha512-4jCoan6QjUARx7UddsZogqgQAVyacu82JaR8raMzIb1eZWo3m8w/hxDCssdYrsDbXJCiOgwgAfE0Kd929GBUpw==", - "requires": { - "@lion/core": "^0.21.0", - "@popperjs/core": "^2.5.4", - "singleton-manager": "^1.4.3" - } - }, - "@lion/select": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@lion/select/-/select-0.15.0.tgz", - "integrity": "sha512-cnwSJALSQdqpN9BNYrogq5L4lp7QjvgLgZ20kDNn4xPyzMbRe/NDumHPgAr/YiP9op5AlYFN9jfG8wnd5q7tvA==", - "requires": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0" - } - }, - "@lion/textarea": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@lion/textarea/-/textarea-0.14.0.tgz", - "integrity": "sha512-Ldj2EUtaKEiA0XyZVFH65C7IiGdKrUPU7X6t8RSfzt4PAWXJKWTzt9498k8nJdWZmTuFtV9E5SZyQsZO/OPGTQ==", - "requires": { - "@lion/core": "^0.21.0", - "@lion/form-core": "^0.16.0", - "@types/autosize": "^3.0.7", - "autosize": "4.0.2" - } - }, - "@lit-labs/react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@lit-labs/react/-/react-1.1.1.tgz", - "integrity": "sha512-9TC+/ZWb6BJlWCyUr14FKFlaGnyKpeEDorufXozQgke/VoVrslUQNaL7nBmrAWdNrmzx5jWgi8lFmWwrxMjnlA==" - }, - "@lit-labs/ssr-dom-shim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.0.0.tgz", - "integrity": "sha512-ic93MBXfApIFTrup4a70M/+ddD8xdt2zxxj9sRwHQzhS9ag/syqkD8JPdTXsc1gUy2K8TTirhlCqyTEM/sifNw==" - }, - "@lit/reactive-element": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz", - "integrity": "sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.0.0" - } - }, - "@mdn/browser-compat-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.0.0.tgz", - "integrity": "sha512-Yn5Xf+LyH+KZ0wz0XXzD1C7uGKF29RMrcXLaRHwzH3Uo5fRtnPTdWJIyT8kCrvxt8Wq8MQpMDByk/AufmPWL1A==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@open-wc/chai-dom-equals": { - "version": "0.12.36", - "resolved": "https://registry.npmjs.org/@open-wc/chai-dom-equals/-/chai-dom-equals-0.12.36.tgz", - "integrity": "sha512-Gt1fa37h4rtWPQGETSU4n1L678NmMi9KwHM1sH+JCGcz45rs8DBPx7MUVeGZ+HxRlbEI5t9LU2RGGv6xT2OlyA==", - "dev": true, - "requires": { - "@open-wc/semantic-dom-diff": "^0.13.16", - "@types/chai": "^4.1.7" - }, - "dependencies": { - "@open-wc/semantic-dom-diff": { - "version": "0.13.21", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz", - "integrity": "sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg==", - "dev": true - } - } - }, - "@open-wc/dedupe-mixin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.3.0.tgz", - "integrity": "sha512-UfdK1MPnR6T7f3svzzYBfu3qBkkZ/KsPhcpc3JYhsUY4hbpwNF9wEQtD4Z+/mRqMTJrKg++YSxIxE0FBhY3RIw==" - }, - "@open-wc/scoped-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-2.0.1.tgz", - "integrity": "sha512-JS6ozxUFwFX3+Er91v9yQzNIaFn7OnE0iESKTbFvkkKdNwvAPtp1fpckBKIvWk8Ae9ZcoI9DYZuT2DDbMPcadA==", - "requires": { - "@lit/reactive-element": "^1.0.0", - "@open-wc/dedupe-mixin": "^1.3.0", - "@webcomponents/scoped-custom-element-registry": "^0.0.3" - } - }, - "@open-wc/semantic-dom-diff": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.5.tgz", - "integrity": "sha512-Wi0Fuj3dzqlWClU0y+J4k/nqTcH0uwgOWxZXPyeyG3DdvuyyjgiT4L4I/s6iVShWQvvEsyXnj7yVvixAo3CZvg==", - "dev": true, - "requires": { - "@types/chai": "^4.2.11", - "@web/test-runner-commands": "^0.5.7" - } - }, - "@open-wc/testing": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-3.0.3.tgz", - "integrity": "sha512-xJYckO8X9yfWc+ltPlDZjHGTh4ldNmnYsnxNriuUUEEhV5ASdsc+5WEsIS2+9m4lQELj89rNQ7YvhYhawDorhg==", - "dev": true, - "requires": { - "@esm-bundle/chai": "^4.3.4", - "@open-wc/chai-dom-equals": "^0.12.36", - "@open-wc/semantic-dom-diff": "^0.19.5", - "@open-wc/testing-helpers": "^2.0.2", - "@types/chai": "^4.2.11", - "@types/chai-dom": "^0.0.9", - "@types/sinon-chai": "^3.2.3", - "chai-a11y-axe": "^1.3.2" - } - }, - "@open-wc/testing-helpers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-2.0.2.tgz", - "integrity": "sha512-wJlvDmWo+fIbgykRP21YSP9I9Pf/fo2+dZGaWG77Hw0sIuyB+7sNUDJDkL6kMkyyRecPV6dVRmbLt6HuOwvZ1w==", - "dev": true, - "requires": { - "@open-wc/scoped-elements": "^2.0.1", - "lit": "^2.0.0" - } - }, - "@popperjs/core": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", - "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" - }, - "@rollup/plugin-babel": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", - "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - } - } - }, - "@rollup/plugin-commonjs": { - "version": "24.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", - "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", - "requires": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.27.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.1.3.tgz", - "integrity": "sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - } - } - }, - "@rollup/plugin-typescript": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.1.tgz", - "integrity": "sha512-Qd2E1pleDR4bwyFxqbjt4eJf+wB0UKVMLc7/BAFDGVdAXQMCsD4DUv5/7/ww47BZCYxWtJqe1Lo0KVNswBJlRw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" - }, - "dependencies": { - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - } - } - }, - "@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "dependencies": { - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - } - } - }, - "@shoelace-style/animations": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@shoelace-style/animations/-/animations-1.1.0.tgz", - "integrity": "sha512-Be+cahtZyI2dPKRm8EZSx3YJQ+jLvEcn3xzRP7tM4tqBnvd/eW/64Xh0iOf0t2w5P8iJKfdBbpVNE9naCaOf2g==" - }, - "@shoelace-style/localize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.0.4.tgz", - "integrity": "sha512-HFY90KD+b1Td2otSBryCOpQjBEArIwlV6Tv4J4rC/E/D5wof2eLF6JUVrbiRNn8GRmwATe4YDAEK7NUD08xO1w==" - }, - "@shoelace-style/shoelace": { - "version": "2.0.0-beta.81", - "resolved": "https://registry.npmjs.org/@shoelace-style/shoelace/-/shoelace-2.0.0-beta.81.tgz", - "integrity": "sha512-mHxE450EiPnZeDGwJ8Dn0pXUz9U5nkjHJhXZ6REewq4RFeRFadaxlc7j/ic076U7Vdx/0PXWeubZOnWWXrMw4w==", - "requires": { - "@floating-ui/dom": "^1.0.1", - "@lit-labs/react": "^1.0.7", - "@shoelace-style/animations": "^1.1.0", - "@shoelace-style/localize": "^3.0.1", - "color": "4.2", - "lit": "^2.2.8", - "qr-creator": "^1.0.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/autosize": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/autosize/-/autosize-3.0.7.tgz", - "integrity": "sha512-D46m3aBNg81QKk9ZigmDFuhXUkD4IpBSrkGUKpYo2QBETbUjqEe8msXNCcECaXLXv1O4ppdMpizgFRzpfrgOxA==", - "requires": { - "@types/jquery": "*" - } - }, - "@types/babel__code-frame": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz", - "integrity": "sha512-2TN6oiwtNjOezilFVl77zwdNPwQWaDBBCCWWxyo1ctiO3vAtd7H/aB/CBJdw9+kqq3+latD0SXoedIuHySSZWw==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.21.tgz", - "integrity": "sha512-yd+9qKmJxm496BOV9CMNaey8TWsikaZOwMRwPHQIjcOJM9oV+fi9ZMNw3JsVnbEEbo2gRTDnGEBv8pjyn67hNg==", - "dev": true - }, - "@types/chai-dom": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-0.0.9.tgz", - "integrity": "sha512-jj4F2NJog2/GBYsyJ8+NvhnWUBbPY4MUAKLdPJE6+568rw12GGXvj0ycUuP5nndVrnJgozmJAoMTvxvjJATXWw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*" - } - }, - "@types/command-line-args": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", - "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==", - "dev": true - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==", - "dev": true - }, - "@types/convert-source-map": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-1.5.2.tgz", - "integrity": "sha512-tHs++ZeXer40kCF2JpE51Hg7t4HPa18B1b1Dzy96S0eCw8QKECNMYMfwa1edK/x8yCN0r4e6ewvLcc5CsVGkdg==", - "dev": true - }, - "@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "@types/debounce": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.0.tgz", - "integrity": "sha512-bWG5wapaWgbss9E238T0R6bfo5Fh3OkeoSt245CM7JJwVwpw6MEBCbIxLq5z8KzsE3uJhzcIuQkyiZmzV3M/Dw==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/http-assert": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.2.tgz", - "integrity": "sha512-Ddzuzv/bB2prZnJKlS1sEYhaeT50wfJjhcTTTQLjEsEZJlk3XB4Xohieyq+P4VXIzg7lrQ1Spd/PfRnBpQsdqA==", - "dev": true - }, - "@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jquery": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz", - "integrity": "sha512-6RXU9Xzpc6vxNrS6FPPapN1SxSHgQ336WC6Jj/N8q30OiaBZ00l1GBgeP7usjVZPivSkGUfL1z/WW6TX989M+w==", - "requires": { - "@types/sizzle": "*" - } - }, - "@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==", - "dev": true - }, - "@types/koa": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", - "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", - "dev": true, - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - }, - "@types/node": { - "version": "15.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", - "dev": true - }, - "@types/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz", - "integrity": "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==", - "dev": true, - "requires": { - "@sinonjs/fake-timers": "^7.1.0" - } - }, - "@types/sinon-chai": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.5.tgz", - "integrity": "sha512-bKQqIpew7mmIGNRlxW6Zli/QVyc3zikpGzCa797B/tRnD9OtHvZ/ts8sYXV+Ilj9u3QRaUEM8xrjgd1gwm1BpQ==", - "dev": true, - "requires": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" - }, - "@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==" - }, - "@types/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", - "dev": true - }, - "@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@web/browser-logs": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.4.tgz", - "integrity": "sha512-11DAAv8ZqbO267dwBLXtvmDoJXXucG5n+i9oQQEEVgbgXKOvK/7eqGhrSDKuZ7TTTkSci9fW7ZcuKFtaKskAIA==", - "dev": true, - "requires": { - "errorstacks": "^2.2.0" - } - }, - "@web/config-loader": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz", - "integrity": "sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==", - "dev": true, - "requires": { - "semver": "^7.3.4" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@web/dev-server": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.22.tgz", - "integrity": "sha512-8PZxz2PGK9Ndr0C2LtWHrTzPKkDYTP/IvEMs9nrIebQWxvVjxI/HpvNfli3ivvCtvvcJFI26FvfWaAWDq14GgQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@rollup/plugin-node-resolve": "^11.0.1", - "@types/command-line-args": "^5.0.0", - "@web/config-loader": "^0.1.3", - "@web/dev-server-core": "^0.3.14", - "@web/dev-server-rollup": "^0.3.9", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "ip": "^1.1.5", - "open": "^8.0.2", - "portfinder": "^1.0.28" - }, - "dependencies": { - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@web/dev-server-core": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.14.tgz", - "integrity": "sha512-QHWGbkLI7qZVkELd6a7R4llRF9zydwbZagAeiJRvOIIiDhG5Uu9DfAWAQL+RSCb2hqBlEnaVAK4keNffKol4rQ==", - "dev": true, - "requires": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.2.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^0.7.1", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.6", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - } - }, - "@web/dev-server-esbuild": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.2.14.tgz", - "integrity": "sha512-28nGCnVIRNXIlptBrnuhEIRCwimeLhz3RkQpPct2yX9k4rfuUPH+WQYfVcp3rEozj0cG13zrwZONaCw8SuEZRw==", - "dev": true, - "requires": { - "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.3.10", - "esbuild": "^0.12.21", - "parse5": "^6.0.1", - "ua-parser-js": "^0.7.23" - } - }, - "@web/dev-server-rollup": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.9.tgz", - "integrity": "sha512-8NOV8GxcDXk9u+hsVYllGiMhcORYMFK+LtLT4HIg3+emW64j0MynttowBoOFpgwv7YOuVQ6lWe1kmJxiI+TRdg==", - "dev": true, - "requires": { - "@web/dev-server-core": "^0.3.3", - "chalk": "^4.1.0", - "parse5": "^6.0.1", - "rollup": "^2.56.2", - "whatwg-url": "^9.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@web/parse5-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.0.tgz", - "integrity": "sha512-Pgkx3ECc8EgXSlS5EyrgzSOoUbM6P8OKS471HLAyvOBcP1NCBn0to4RN/OaKASGq8qa3j+lPX9H14uA5AHEnQg==", - "dev": true, - "requires": { - "@types/parse5": "^6.0.1", - "parse5": "^6.0.1" - } - }, - "@web/test-runner": { - "version": "0.13.16", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.13.16.tgz", - "integrity": "sha512-eFPxxuqgLzyAOa7WEYTMi+DXWrqxU3tpuH4bCiTfDDx7uRRF/tbKA0PrQ1zv2BfSyZP1tQ+nfc6ehJQrBPUBNQ==", - "dev": true, - "requires": { - "@web/browser-logs": "^0.2.2", - "@web/config-loader": "^0.1.3", - "@web/dev-server": "^0.1.17", - "@web/test-runner-chrome": "^0.10.2", - "@web/test-runner-commands": "^0.5.10", - "@web/test-runner-core": "^0.10.20", - "@web/test-runner-mocha": "^0.7.4", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", - "convert-source-map": "^1.7.0", - "diff": "^5.0.0", - "globby": "^11.0.1", - "portfinder": "^1.0.28", - "source-map": "^0.7.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@web/test-runner-chrome": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.10.2.tgz", - "integrity": "sha512-Casm5au6/bYa8iA87Zw93r5PkfEhDYRVRKB15HjkmTHGRNYZ5054QzANUpk6c8b8NV9Wd6gXqsZs7rdcdDdFmw==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.20", - "@web/test-runner-coverage-v8": "^0.4.8", - "chrome-launcher": "^0.14.0", - "puppeteer-core": "^9.1.0" - } - }, - "@web/test-runner-commands": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.5.11.tgz", - "integrity": "sha512-2b4XnqwiTG/ZeXMiqtoKUCa7pggrTNiq6vI2y8sIDVtqoZ4JpTs3NAdwrsKfop+JhdeE7lSQohyrT/HF5H7tqQ==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.20", - "mkdirp": "^1.0.4" - } - }, - "@web/test-runner-core": { - "version": "0.10.20", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.20.tgz", - "integrity": "sha512-zUU8YxVMCAfYrsK3YPR6EIA5CWBrGUGUd/fNgEu4iCYsSxHFWpZsHNMOuNZS0/ssKbHJLvdDjpZ6T6EuqJT69Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^1.5.1", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@types/uuid": "^8.3.0", - "@web/browser-logs": "^0.2.1", - "@web/dev-server-core": "^0.3.12", - "chalk": "^4.1.0", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^1.7.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3", - "uuid": "^8.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@web/test-runner-coverage-v8": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.4.8.tgz", - "integrity": "sha512-Ib0AscR8Xf9E/V7rf3XOVQTe4vKIbwSTupxV1xGgzj3x4RKUuMUg9FLz9EigZ5iN0mOzZKDllyRS523hbdhDtA==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.20", - "istanbul-lib-coverage": "^3.0.0", - "picomatch": "^2.2.2", - "v8-to-istanbul": "^8.0.0" - } - }, - "@web/test-runner-mocha": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.7.4.tgz", - "integrity": "sha512-EvAz6eCyBpVyXUq/bTSYpSwcSd/jH8XY+vAwS/xprWNo2WFY0LW0FcwcuWdq4LckDxTZVXaGb1dj3lDfEsOeVw==", - "dev": true, - "requires": { - "@types/mocha": "^8.2.0", - "@web/test-runner-core": "^0.10.20" - } - }, - "@web/test-runner-playwright": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@web/test-runner-playwright/-/test-runner-playwright-0.8.8.tgz", - "integrity": "sha512-bhb0QVldfDoPJqOj5mm1hpE6FReyddc/iIuAkVf/kbJvgggTCT2bWGxUvXJlGzf+4epmDhU+hSTfEoLL9R2vGw==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.20", - "@web/test-runner-coverage-v8": "^0.4.8", - "playwright": "^1.14.0" - } - }, - "@webcomponents/scoped-custom-element-registry": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@webcomponents/scoped-custom-element-registry/-/scoped-custom-element-registry-0.0.3.tgz", - "integrity": "sha512-lpSzgDCGbM99dytb3+J3Suo4+Bk1E13MPnWB42JK8GwxSAxFz+tC7TTv2hhDSIE2IirGNKNKCf3m08ecu6eAsQ==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, - "autosize": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.2.tgz", - "integrity": "sha512-jnSyH2d+qdfPGpWlcuhGiHmqBJ6g3X+8T+iRwFrHPLVcdoGJE/x6Qicm6aDHfTsbgZKxyV8UU/YB2p4cjKDRRA==" - }, - "axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", - "dev": true - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "blueimp-gallery": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/blueimp-gallery/-/blueimp-gallery-3.4.0.tgz", - "integrity": "sha512-t4zQ8XSlE3IuJK72gd6hnexHMUpndUZYRKcAYv+24TpYGom5YtP5yizWdH2cGwyb0MOTKojkwSWVweTo1rbDEw==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "builtin-modules": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", - "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "requires": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", - "dev": true - }, - "chai-a11y-axe": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.3.2.tgz", - "integrity": "sha512-/jYczmhGUoCfEcsrkJwjecy3PJ31T9FxFdu2BDlAwR/sX1nN3L2XmuPP3tw8iYk6LPqdF7K11wwFr3yUZMv5MA==", - "dev": true, - "requires": { - "axe-core": "^4.3.3" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-launcher": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.14.0.tgz", - "integrity": "sha512-W//HpflaW6qBGrmuskup7g+XJZN6w03ko9QSIe5CtcTal2u0up5SeReK3Ll1Why4Ey8dPkv8XSodZyHPnGbVHQ==", - "dev": true, - "requires": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - } - } - }, - "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", - "dev": true, - "requires": { - "source-map": "0.5.x" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", - "dev": true, - "requires": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - } - }, - "color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "colortranslator": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-1.9.2.tgz", - "integrity": "sha512-Hr1qCLwL/5gbGhcRwfhl1+JbvHmybTGbecpbhyzn3IyizgYFxMpLpX8OGhAcvSPB0+K2bwrAcFIbeF60wqOJLg==" - }, - "command-line-args": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.0.tgz", - "integrity": "sha512-4zqtU1hYsSJzcJBOcNZIbW5Fbk9BkjCp1pZVhQKoRaWL5J7N4XphDLwo8aWwdQpTugxwu+jf9u2ZhkXiqp5Z6A==", - "dev": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "dev": true, - "requires": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - } - }, - "core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==" - }, - "core-js-compat": { - "version": "3.29.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.0.tgz", - "integrity": "sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==", - "dev": true, - "requires": { - "browserslist": "^4.21.5" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "devtools-protocol": { - "version": "0.0.869402", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.869402.tgz", - "integrity": "sha512-VvlVYY+VDJe639yHs5PHISzdWTLL3Aw8rO4cvUtwvoxFd6FHbE4OpHHcde52M6096uYYazAmd4l0o5VuFRO2WA==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.317", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.317.tgz", - "integrity": "sha512-JhCRm9v30FMNzQSsjl4kXaygU+qHBD0Yh7mKxyjmF0V8VwYVB6qpBRX28GyAucrM9wDCpSUctT6FpMUQxbyKuA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "errorstacks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.3.2.tgz", - "integrity": "sha512-cJp8qf5t2cXmVZJjZVrcU4ODFJeQOcUyjJEtPFtWO+3N6JPM6vCe4Sfv3cwIs/qS7gnUo/fvKX/mDCVQZq+P7A==", - "dev": true - }, - "es-module-lexer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", - "dev": true - }, - "esbuild": { - "version": "0.12.22", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.22.tgz", - "integrity": "sha512-yWCr9RoFehpqoe/+MwZXJpYOEIt7KOEvNnjIeMZpMSyQt+KCBASM3y7yViiN5dJRphf1wGdUz1+M4rTtWd/ulA==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "requires": { - "array-back": "^3.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flatpickr": { - "version": "4.6.9", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", - "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "getobject": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.1.tgz", - "integrity": "sha512-tj18lLe+917AACr6BdVoUuHnBPTVd9BEJp1vxnMZ58ztNvuxz9Ufa+wf3g37tlGITH35jggwZ2d9lcgHJJgXfQ==", - "dev": true - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "grunt": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", - "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", - "dev": true, - "requires": { - "dateformat": "~3.0.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~0.3.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "mkdirp": "~1.0.4", - "nopt": "~3.0.6", - "rimraf": "~3.0.2" - } - }, - "grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", - "dev": true, - "requires": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, - "grunt-contrib-cssmin": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz", - "integrity": "sha512-IXNomhQ5ekVZbDbj/ik5YccoD9khU6LT2fDXqO1+/Txjq8cp0tQKjVS8i8EAbHOrSDkL7/UD6A7b+xj98gqh9w==", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "clean-css": "~4.1.1", - "maxmin": "^2.1.0" - } - }, - "grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true - }, - "grunt-legacy-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", - "dev": true, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" - } - }, - "grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", - "dev": true, - "requires": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", - "dev": true, - "requires": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - } - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "dev": true, - "requires": { - "duplexer": "^0.1.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", - "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "http-errors": "~1.7.2" - } - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - } - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "requires": { - "@types/estree": "*" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", - "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "requires": { - "tsscmp": "1.0.6" - } - }, - "koa": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", - "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", - "dev": true, - "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "~3.1.0", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^1.2.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "koa-convert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", - "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", - "dev": true, - "requires": { - "co": "^4.6.0", - "koa-compose": "^3.0.0" - }, - "dependencies": { - "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "dev": true, - "requires": { - "any-promise": "^1.1.0" - } - } - } - }, - "koa-etag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz", - "integrity": "sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==", - "dev": true, - "requires": { - "etag": "^1.8.1" - } - }, - "koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - } - }, - "koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", - "dev": true, - "requires": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" - }, - "dependencies": { - "findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - } - } - } - }, - "lighthouse-logger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz", - "integrity": "sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "marky": "^1.2.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "lit": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.6.1.tgz", - "integrity": "sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw==", - "requires": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.2.0", - "lit-html": "^2.6.0" - } - }, - "lit-element": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.2.0.tgz", - "integrity": "sha512-HbE7yt2SnUtg5DCrWt028oaU4D5F4k/1cntAFHTkzY8ZIa8N0Wmu92PxSxucsQSOXlODFrICkQ5x/tEshKi13g==", - "requires": { - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.2.0" - } - }, - "lit-flatpickr": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/lit-flatpickr/-/lit-flatpickr-0.3.0.tgz", - "integrity": "sha512-s33WHwde161X0vIc1XBbr3yOK/+zQXizA6Fo65fbHnM/IQfUcUZb8ainc7dnfp6qrIYyc/El7FzplVJLjUI+Xw==", - "requires": { - "flatpickr": "^4.6.9", - "lit": "^2.0.0", - "tslib": "^1.11.0" - } - }, - "lit-html": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.6.1.tgz", - "integrity": "sha512-Z3iw+E+3KKFn9t2YKNjsXNEu/LRLI98mtH/C6lnFg7kvaqPIzPn124Yd4eT/43lyqrejpc5Wb6BHq3fdv4S8Rw==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "marky": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz", - "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==", - "dev": true - }, - "maxmin": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", - "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^3.0.0", - "pretty-bytes": "^3.0.0" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "dev": true - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "dev": true, - "requires": { - "mime-db": "1.49.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=", - "dev": true - }, - "open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "playwright": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.14.0.tgz", - "integrity": "sha512-aR5oZ1iVsjQkGfYCjgYAmyMAVu0MQ0i8MgdnfdqDu9EVLfbnpuuFmTv/Rb7/Yjno1kOrDUP9+RyNC+zfG3wozA==", - "dev": true, - "requires": { - "commander": "^6.1.0", - "debug": "^4.1.1", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.2", - "mime": "^2.4.6", - "pngjs": "^5.0.0", - "progress": "^2.0.3", - "proper-lockfile": "^4.1.1", - "proxy-from-env": "^1.1.0", - "rimraf": "^3.0.2", - "stack-utils": "^2.0.3", - "ws": "^7.4.6", - "yazl": "^2.5.1" - }, - "dependencies": { - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - } - } - }, - "pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "dev": true - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "puppeteer-core": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-9.1.1.tgz", - "integrity": "sha512-zbedbitVIGhmgz0nt7eIdLsnaoVZSlNJfBivqm2w67T8LR2bU1dvnruDZ8nQO0zn++Iet7zHbAOdnuS5+H2E7A==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.869402", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.1.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" - } - }, - "qr-creator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/qr-creator/-/qr-creator-1.0.0.tgz", - "integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", - "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", - "dev": true, - "requires": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "devOptional": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "shortcut-buttons-flatpickr": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/shortcut-buttons-flatpickr/-/shortcut-buttons-flatpickr-0.4.0.tgz", - "integrity": "sha512-JKmT4my3Hm1e18OvG4Q6RcFhN4WRqqpTMkHrvZ7fup/dp6aTIWGVCHdRYtASkp/FCzDlJh6iCLQ/VcwwNpAMoQ==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "singleton-manager": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/singleton-manager/-/singleton-manager-1.4.3.tgz", - "integrity": "sha512-Jy1Ib9cO9xCQ6UZ/vyFOqqWMnSpfZ8/Sc2vme944aWsCLO+lMPiFG9kGZGpyiRT9maYeI0JyZH1CGgjmkSN8VA==" - }, - "sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - } - } - }, - "sortablejs": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", - "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", - "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", - "dev": true - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.33.tgz", - "integrity": "sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==", - "dev": true - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "dev": true, - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", - "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-url": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", - "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==", - "dev": true, - "requires": { - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "dev": true, - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, - "ylru": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", - "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", - "dev": true - } } } diff --git a/package.json b/package.json index f5b0bc74bc..ae51768880 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,18 @@ "scripts": { "build": "rollup -c", "build:watch": "rollup -cw", + "build:dev": "node doc/scripts/build.mjs --dev --serve", "jstest": "tsc &> /dev/null; web-test-runner", "jstest:watch": "web-test-runner --watch" }, "devDependencies": { + "@11ty/eleventy": "^2.0.1", "@babel/core": "^7.14.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-decorators": "^7.22.10", "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.14.5", + "@custom-elements-manifest/analyzer": "^0.8.4", "@interactjs/interactjs": "^1.10.11", "@open-wc/testing": "^3.0.3", "@rollup/plugin-babel": "^5.3.0", @@ -21,16 +26,38 @@ "@rollup/plugin-typescript": "^8.2.1", "@types/chai": "^4.2.21", "@types/mocha": "^8.2.3", - "@web/dev-server-esbuild": "^0.2.14", + "@web/dev-server-esbuild": "^0.4.1", "@web/dev-server-rollup": "^0.3.9", "@web/test-runner": "^0.13.16", "@web/test-runner-playwright": "^0.8.8", + "browser-sync": "^2.29.3", + "cem": "^1.0.4", + "change-case": "^4.1.2", + "custom-element-jet-brains-integration": "^1.2.1", + "custom-element-vs-code-integration": "^1.2.1", + "del": "^7.1.0", + "esbuild": "^0.19.3", + "esbuild-plugin-replace": "^1.4.0", + "get-port": "^7.0.0", + "globby": "^13.2.2", "grunt": "^1.5.3", "grunt-contrib-cssmin": "^2.2.1", + "jsdom": "^22.1.0", + "lunr": "^2.3.9", + "markdown-it": "^13.0.1", + "markdown-it-container": "^3.0.0", + "markdown-it-ins": "^3.0.1", + "markdown-it-kbd": "^2.2.2", + "markdown-it-mark": "^3.0.1", + "markdown-it-replace-it": "^1.0.0", + "ora": "^7.0.1", + "prettier": "^3.0.3", + "prismjs": "^1.29.0", "rimraf": "^3.0.2", "rollup": "^2.79.1", "rollup-plugin-terser": "^7.0.2", "sinon": "^11.1.2", + "smartquotes": "^2.3.2", "terser": "^4.8.1", "typescript": "^3.9.7" }, @@ -54,20 +81,15 @@ }, "dependencies": { "@bundled-es-modules/pdfjs-dist": "^2.5.207-rc1", - "@lion/button": "^0.16.0", - "@lion/combobox": "^0.9.0", "@lion/core": "^0.21.1", - "@lion/dialog": "^0.14.0", "@lion/form-core": "^0.16.0", - "@lion/input": "^0.16.0", - "@lion/listbox": "^0.12.0", - "@lion/select": "^0.15.0", - "@lion/textarea": "^0.14.0", "@rollup/plugin-commonjs": "^24.0.1", - "@shoelace-style/shoelace": "2.0.0-beta.81", + "@shoelace-style/shoelace": "2.8.0", "blueimp-gallery": "^3.4.0", "colortranslator": "^1.9.2", "core-js": "^3.29.1", + "dexie": "^3.2.4", + "lit": "^2.7.5", "lit-flatpickr": "^0.3.0", "shortcut-buttons-flatpickr": "^0.4.0", "sortablejs": "^1.14.0" @@ -75,4 +97,4 @@ "engines": { "node": ">=14.0.0" } -} \ No newline at end of file +} diff --git a/pixelegg/css/mobile.css b/pixelegg/css/mobile.css index a5757d6c8d..87b72eadf4 100644 --- a/pixelegg/css/mobile.css +++ b/pixelegg/css/mobile.css @@ -4910,10 +4910,10 @@ span.overlayContainer img.overlay { border-bottom-width: 0px; margin-top: 4px; background-color: #0C5DA5; - color: #f2f2f2; } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h1, #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h2 { + color: #f2f2f2; background-image: url(../../api/templates/default/images/arrow_down.svg); line-height: 1em; font-size: 12px; @@ -5606,12 +5606,16 @@ div.timesheet_timer { height: 0px; float: left; display: inline-block; - /* do NOT show empty label */ } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-menu-item[value=""] { +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-option { + white-space: nowrap; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(emptyLabel), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(emptyLabel) { + /* do NOT show empty label, required for clearing value */ display: none; } #egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(form-control-input), @@ -5626,12 +5630,20 @@ div.timesheet_timer { #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(form-control) { margin-left: -3em; } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(menu), -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(menu), +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(menu), #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(menu) { max-height: 60vh; } +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox) { + float: right; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(combobox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(combobox) { + visibility: hidden; +} #egw_fw_topmenu_info_items img#topmenu_info_error { width: 16px; height: 16px; @@ -7782,4 +7794,4 @@ img.et2_button_icon[src*="svg"]:hover { body #mail-display .mailDisplayContainer { top: 140px; } -} +} \ No newline at end of file diff --git a/pixelegg/css/monochrome.css b/pixelegg/css/monochrome.css index fbd6cbd09f..ee8e9299a3 100644 --- a/pixelegg/css/monochrome.css +++ b/pixelegg/css/monochrome.css @@ -4890,10 +4890,10 @@ span.overlayContainer img.overlay { border-bottom-width: 0px; margin-top: 4px; background-color: #0C5DA5; - color: #f2f2f2; } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h1, #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h2 { + color: #f2f2f2; background-image: url(../../api/templates/default/images/arrow_down.svg); line-height: 1em; font-size: 12px; @@ -5586,12 +5586,16 @@ div.timesheet_timer { height: 0px; float: left; display: inline-block; - /* do NOT show empty label */ } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-menu-item[value=""] { +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-option { + white-space: nowrap; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(emptyLabel), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(emptyLabel) { + /* do NOT show empty label, required for clearing value */ display: none; } #egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(form-control-input), @@ -5606,12 +5610,20 @@ div.timesheet_timer { #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(form-control) { margin-left: -3em; } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(menu), -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(menu), +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(menu), #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(menu) { max-height: 60vh; } +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox) { + float: right; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(combobox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(combobox) { + visibility: hidden; +} #egw_fw_topmenu_info_items img#topmenu_info_error { width: 16px; height: 16px; @@ -6568,4 +6580,4 @@ span.egw_tutorial_title { /*@import "../less/layout_raster.less";*/ /*@import "../less/layout_nextmatch.less";*/ /*@import "../less/layout_footer.less";*/ -/*@import "../less/layout_dialog.less";*/ +/*@import "../less/layout_dialog.less";*/ \ No newline at end of file diff --git a/pixelegg/css/pixelegg.css b/pixelegg/css/pixelegg.css index ea21c1bbe2..7181f3dd77 100644 --- a/pixelegg/css/pixelegg.css +++ b/pixelegg/css/pixelegg.css @@ -4900,10 +4900,10 @@ span.overlayContainer img.overlay { border-bottom-width: 0px; margin-top: 4px; background-color: #0C5DA5; - color: #f2f2f2; } #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h1, #egw_fw_sidebar #egw_fw_sidemenu .egw_fw_ui_sidemenu_entry_content .egw_fw_ui_category_active h2 { + color: #f2f2f2; background-image: url(../../api/templates/default/images/arrow_down.svg); line-height: 1em; font-size: 12px; @@ -5596,12 +5596,16 @@ div.timesheet_timer { height: 0px; float: left; display: inline-block; - /* do NOT show empty label */ } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-menu-item[value=""] { +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-option { + white-space: nowrap; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(emptyLabel), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(emptyLabel) { + /* do NOT show empty label, required for clearing value */ display: none; } #egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(form-control-input), @@ -5616,12 +5620,20 @@ div.timesheet_timer { #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(form-control) { margin-left: -3em; } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(menu), -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(menu), +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(menu), #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(menu) { max-height: 60vh; } +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox) { + float: right; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(combobox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(combobox) { + visibility: hidden; +} #egw_fw_topmenu_info_items img#topmenu_info_error { width: 16px; height: 16px; @@ -7098,7 +7110,6 @@ table.egwGridView_grid img.et2_appicon { #egw_fw_header #egw_fw_topmenu #egw_fw_topmenu_items ul a#topmenu_calls { background-image: url(../../api/templates/default/images/phone.svg); background-repeat: no-repeat; - background-size: 20px; background-position-x: -2px; } div.dhtmlxMenu_egw_SubLevelArea_Polygon table.dhtmlxMebu_SubLevelArea_Tbl tr.sub_item td.sub_item_icon img[src*="svg"] { @@ -7141,4 +7152,4 @@ img.et2_button_icon[src*="svg"]:hover { } ::-ms-input-placeholder { color: #666666; -} +} \ No newline at end of file diff --git a/pixelegg/css/pixelegg.less b/pixelegg/css/pixelegg.less index 116e488d38..ccd17f5bd3 100644 --- a/pixelegg/css/pixelegg.less +++ b/pixelegg/css/pixelegg.less @@ -368,7 +368,6 @@ ul a#topmenu_calls { background-image: url(../../api/templates/default/images/phone.svg); background-repeat: no-repeat; - background-size: 20px; background-position-x: -2px; } } diff --git a/pixelegg/js/slider.js b/pixelegg/js/slider.js index d477cab7ba..b2eb3dcecc 100644 --- a/pixelegg/js/slider.js +++ b/pixelegg/js/slider.js @@ -19,13 +19,13 @@ egw_ready.then(function() // do NOT react on bubbeling events from contained selectbox var select = document.getElementById('quick_add_selectbox'); ev.stopImmediatePropagation(); - if (select.dropdown.open) + if (select.open) { - select.dropdown.hide(); + select.hide(); } else { - select.dropdown.show(); + select.show(); } } diff --git a/pixelegg/less/layout_raster_buttons.less b/pixelegg/less/layout_raster_buttons.less index fce28b85b0..a333da1e3a 100644 --- a/pixelegg/less/layout_raster_buttons.less +++ b/pixelegg/less/layout_raster_buttons.less @@ -288,25 +288,41 @@ div.timesheet_timer { // quick_add and timer selectbox / menu #topmenu_info_quick_add, #topmenu_info_timer { - #quick_add_selectbox, #timer_selectbox { - height: 0px; - float: left; - display: inline-block; - /* do NOT show empty label */ - sl-menu-item[value=""] { - display: none; - } + #quick_add_selectbox, #timer_selectbox { + height: 0px; + float: left; + display: inline-block; + + sl-option { + white-space: nowrap; } - #quick_add_selectbox::part(form-control-input), #timer_selectbox::part(form-control-input) { - border: none !important; - } - #quick_add_selectbox::part(form-control), #timer_selectbox::part(form-control) { - margin-left: -3em; - } - #quick_add_selectbox::part(menu), #timer_selectbox::part(menu) { - max-height: 60vh; - } - } + } + + #quick_add_selectbox::part(emptyLabel) { + /* do NOT show empty label, required for clearing value */ + display: none; + } + + #quick_add_selectbox::part(form-control-input), #timer_selectbox::part(form-control-input) { + border: none !important; + } + + #quick_add_selectbox::part(form-control), #timer_selectbox::part(form-control) { + margin-left: -3em; + } + + #quick_add_selectbox::part(listbox), #timer_selectbox::part(menu) { + max-height: 60vh; + } + + #quick_add_selectbox::part(listbox) { + float: right; + } + + #quick_add_selectbox::part(combobox) { + visibility: hidden; + } + } // ############################################################################## // JS ERROR BUTTON diff --git a/pixelegg/less/layout_raster_sidebar.less b/pixelegg/less/layout_raster_sidebar.less index 2fb4eb8ce1..ea692547f6 100644 --- a/pixelegg/less/layout_raster_sidebar.less +++ b/pixelegg/less/layout_raster_sidebar.less @@ -258,8 +258,8 @@ border-bottom-width: 0px; margin-top: 4px; background-color: @egw_color_2_a; - .color_5_gray; h1,h2 { + .color_5_gray; background-image:url(../../api/templates/default/images/arrow_down.svg); line-height: 1em; font-size: 12px; @@ -670,5 +670,4 @@ } -} // .egw_fw_ui_sidemenu_listitem - +} // .egw_fw_ui_sidemenu_listitem \ No newline at end of file diff --git a/pixelegg/mobile/fw_mobile.css b/pixelegg/mobile/fw_mobile.css index 9509250566..cbe710c50c 100644 --- a/pixelegg/mobile/fw_mobile.css +++ b/pixelegg/mobile/fw_mobile.css @@ -5617,12 +5617,16 @@ div.timesheet_timer { height: 0px; float: left; display: inline-block; - /* do NOT show empty label */ } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-menu-item[value=""], -#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-menu-item[value=""] { +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox sl-option, +#egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox sl-option { + white-space: nowrap; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(emptyLabel), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(emptyLabel) { + /* do NOT show empty label, required for clearing value */ display: none; } #egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(form-control-input), @@ -5637,12 +5641,20 @@ div.timesheet_timer { #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(form-control) { margin-left: -3em; } -#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(menu), -#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(menu), +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(menu), #egw_fw_topmenu_info_items #topmenu_info_timer #timer_selectbox::part(menu) { max-height: 60vh; } +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(listbox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(listbox) { + float: right; +} +#egw_fw_topmenu_info_items #topmenu_info_quick_add #quick_add_selectbox::part(combobox), +#egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(combobox) { + visibility: hidden; +} #egw_fw_topmenu_info_items img#topmenu_info_error { width: 16px; height: 16px; @@ -6916,7 +6928,6 @@ span.egw_tutorial_title { #egw_fw_header #egw_fw_topmenu #egw_fw_topmenu_items ul a#topmenu_calls { background-image: url(../../api/templates/default/images/phone.svg); background-repeat: no-repeat; - background-size: 20px; background-position-x: -2px; } div.dhtmlxMenu_egw_SubLevelArea_Polygon table.dhtmlxMebu_SubLevelArea_Tbl tr.sub_item td.sub_item_icon img[src*="svg"] { diff --git a/preferences/inc/class.preferences_hooks.inc.php b/preferences/inc/class.preferences_hooks.inc.php index e8c973a535..1f2ffbf5b8 100644 --- a/preferences/inc/class.preferences_hooks.inc.php +++ b/preferences/inc/class.preferences_hooks.inc.php @@ -105,6 +105,8 @@ class preferences_hooks 'all' => '['.lang('username').'] '.lang('Lastname').','.lang('Firstname'), 'firstgroup'=> lang('Firstname').' '.lang('Lastname').' ('.lang('primary group').')', 'lastgroup' => lang('Lastname').', '.lang('Firstname').' ('.lang('primary group').')', + 'firstemail' => lang('Firstname') . ' ' . lang('Lastname') . ' [' . lang('email') . ']', + 'lastemail' => lang('Lastname') . ', ' . lang('Firstname') . ' [' . lang('email') . ']', 'firstinital' => lang('Firstname').' '.lang('Initial'), 'firstid' => lang('Firstname').' ['.lang('ID').']', ); diff --git a/preferences/inc/class.preferences_settings.inc.php b/preferences/inc/class.preferences_settings.inc.php index 57303e9faa..49705e5c92 100644 --- a/preferences/inc/class.preferences_settings.inc.php +++ b/preferences/inc/class.preferences_settings.inc.php @@ -698,6 +698,10 @@ class preferences_settings $def = is_array($value[$def]) ? $value[$def]['label'] : $value[$def]; break; } + elseif(is_array($value) && isset($value['label']) && $value['value'] == $def) + { + $def = $value['label']; + } } } if ($lang) $def = lang($def); diff --git a/rollup.config.js b/rollup.config.js index 1af1c00cb0..57fbedc672 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -135,6 +135,10 @@ const config = { // plugins: stage3Syntax, errorRecovery: true }, + plugins: [ + ['@babel/plugin-proposal-decorators', {legacy: true}], + ['@babel/plugin-proposal-class-properties', {loose: false}] + ], presets: [ ['@babel/preset-typescript', { //onlyRemoveTypeImports: true // seems not necessary and generates a lot of warnings about not exported symbols diff --git a/setup/db_backup.php b/setup/db_backup.php index 75c6eb2e1e..b1afae7cc6 100644 --- a/setup/db_backup.php +++ b/setup/db_backup.php @@ -13,6 +13,7 @@ use EGroupware\Api; use EGroupware\Api\Framework; use EGroupware\Api\Egw; use EGroupware\Api\Vfs; +use EGroupware\Stylite\Vfs\S3; if (!is_object(@$GLOBALS['egw'])) // called from outside EGw ==> setup { @@ -34,23 +35,31 @@ if (!is_object(@$GLOBALS['egw'])) // called from outside EGw ==> setup $self = 'db_backup.php'; $is_setup = true; } -$db_backup = new Api\Db\Backup(); +if (class_exists(S3\Backup::class) && S3\Backup::available()) +{ + $db_backup = new S3\Backup(); +} +else +{ + $db_backup = new Api\Db\Backup(); +} $asyncservice = new Api\Asyncservice(); // download a backup, has to be before any output !!! if (!empty($_POST['download'])) { - $file = key($_POST['download']); - $file = $db_backup->backup_dir.'/'.basename($file); // basename to not allow to change the dir + $filename = $db_backup->backup_dir.'/'.key($_POST['download']); + $file = $db_backup->fopen_backup($filename, true, false); // FIRST: switch off zlib.output_compression, as this would limit downloads in size to memory_limit ini_set('zlib.output_compression',0); // SECOND: end all active output buffering while(ob_end_clean()) {} - Api\Header\Content::type(basename($file)); - readfile($file); - $db_backup->log($file, 'Downloaded'); + Api\Header\Content::type(basename($filename)); + fpassthru($file); + fclose($file); + $db_backup->log($filename, 'Downloaded'); exit; } $setup_tpl = new Framework\Template($tpl_root); @@ -100,7 +109,7 @@ if (!empty($_POST['save_backup_settings'])) $minCount = 0; $setup_tpl->set_var('error_msg',htmlspecialchars(lang("'%1' must be integer", lang("backup min count")))); } - $db_backup->saveConfig($minCount,$is_setup ? (boolean)$filesBackup : null); + $db_backup->saveConfig($minCount,!empty($is_setup) ? $filesBackup : null); if (is_int($minCount) && $minCount > 0) { @@ -126,12 +135,14 @@ if (!empty($_POST['mount'])) // create a backup now if (!empty($_POST['backup'])) { - if (is_resource($f = $db_backup->fopen_backup())) - { + try { + $f = $db_backup->fopen_backup(); $starttime = microtime(true); $db_backup->backup($f); if(is_resource($f)) + { fclose($f); + } $setup_tpl->set_var('error_msg', lang('backup finished').': '. number_format(microtime(true)-$starttime, 1).'s'); /* Remove old backups. */ @@ -142,9 +153,8 @@ if (!empty($_POST['backup'])) echo '
      '.lang('entry has been deleted sucessfully').': '.$file."
      \n"; } } - else - { - $setup_tpl->set_var('error_msg',$f); + catch (\Exception $e) { + $setup_tpl->set_var('error_msg', $e->getMessage()); } } $setup_tpl->set_var('backup_now_button',''); if (!empty($_POST['upload']) && is_array($_FILES['uploaded']) && !$_FILES['uploaded']['error'] && - is_uploaded_file($_FILES['uploaded']['tmp_name'])) + is_uploaded_file($_FILES['uploaded']['tmp_name']) && ($msg = $db_backup->upload($_FILES['uploaded']))) { - move_uploaded_file($_FILES['uploaded']['tmp_name'], $filename=$db_backup->backup_dir.'/'.$_FILES['uploaded']['name']); - - $md5 = ', md5='.md5_file($filename).', sha1='.sha1_file($filename); - - $setup_tpl->set_var('error_msg', ($msg=lang("succesfully uploaded file %1", $filename.', '. - sprintf('%3.1f MB (%d)',$_FILES['uploaded']['size']/(1024*1024),$_FILES['uploaded']['size']))).$md5); - $db_backup->log($filename, $msg); + $setup_tpl->set_var('error_msg', $msg); } // delete a backup -if (!empty($_POST['delete'])) +if (!empty($_POST['delete']) && ($msg = $db_backup->delete(key($_POST['delete'])))) { - $file = $db_backup->backup_dir.'/'.basename(key($_POST['delete'])); // basename to not allow to change the dir - $db_backup->log($file, lang("backup '%1' deleted", $file)); - - if (unlink($file)) $setup_tpl->set_var('error_msg',lang("backup '%1' deleted",$file)); + $setup_tpl->set_var('error_msg', $msg); } // rename a backup -if (!empty($_POST['rename'])) +if (!empty($file=$_POST['rename']) && !empty($_POST['new_name'][$file]) && + ($msg = $db_backup->rename($file, $_POST['new_name'][$file]))) { - $file = key($_POST['rename']); - $new_name = $_POST['new_name'][$file]; - if (!empty($new_name)) - { - list($ending) = array_reverse(explode('.', $file)); - list($new_ending, $has_ending) = array_reverse(explode('.', $new_name)); - if(!$has_ending || $new_ending != $ending) $new_name .= '.'.$ending; - $file = $db_backup->backup_dir.'/'.basename($file); // basename to not allow to change the dir - $ext = preg_match('/(\.gz|\.bz2)+$/i',$file,$matches) ? $matches[1] : ''; - $new_file = $db_backup->backup_dir.'/'.preg_replace('/(\.gz|\.bz2)+$/i','',basename($new_name)).$ext; - if (rename($file,$new_file)) - { - $setup_tpl->set_var('error_msg',lang("backup '%1' renamed to '%2'",basename($file),basename($new_file))); - $db_backup->log($new_file, lang("backup '%1' renamed to '%2'",basename($file),basename($new_file))); - } - } + $setup_tpl->set_var('error_msg', $msg); } // restore a backup if (!empty($_POST['restore'])) @@ -205,12 +192,12 @@ if (!empty($_POST['restore'])) $file = key($_POST['restore']); $file = $db_backup->backup_dir.'/'.basename($file); // basename to not allow to change the dir - if (is_resource($f = $db_backup->fopen_backup($file,true))) - { + try { + $f = $db_backup->fopen_backup($file,true); $start = time(); - $db_backup->restore($f, true, $file); // allways convert to current system charset on restore + $db_backup->restore($f, true, $file); // always convert to current system charset on restore $setup_tpl->set_var('error_msg',lang("backup '%1' restored",$file).' ('.(time()-$start).' s)'); - if ($run_in_egw) + if (isset($run_in_egw)) { // updating the backup $cmd = new setup_cmd_update($GLOBALS['egw']->session->account_domain, @@ -220,9 +207,9 @@ if (!empty($_POST['restore'])) echo '

      '.lang('You should %1log out%2 and in again, to update your current session!','','')."

      \n"; } } - else + catch (\Exception $e) { - $setup_tpl->set_var('error_msg',$f); + $setup_tpl->set_var('error_msg', $e->getMessage()); } } // create a new scheduled backup @@ -256,28 +243,16 @@ $setup_tpl->set_var('next_run',' '); $setup_tpl->set_var('actions',''); $setup_tpl->parse('schedule_rows','schedule_row',true); -// listing the availible backup sets +// listing the available backups $setup_tpl->set_var('backup_dir',$db_backup->backup_dir); $setup_tpl->set_var('set_rows',''); -$handle = @opendir($db_backup->backup_dir); -$files = array(); -while($handle && ($file = readdir($handle))) -{ - if ($file != '.' && $file != '..') - { - $files[$file] = filectime($db_backup->backup_dir.'/'.$file); - } -} -if ($handle) closedir($handle); -arsort($files); -foreach($files as $file => $ctime) +foreach($db_backup->index() as $file => $attrs) { - $size = filesize($db_backup->backup_dir.'/'.$file); $setup_tpl->set_var(array( 'filename' => $file, - 'mod' => date('Y-m-d H:i',$ctime), - 'size' => sprintf('%3.1f MB (%d)',$size/(1024*1024),$size), + 'mod' => date('Y-m-d H:i', $attrs['ctime']), + 'size' => sprintf('%3.1f MB (%d)',$attrs['size']/(1024*1024), $attrs['size']), 'actions' => ' '."\n". ($file === Api\Db\Backup::LOG_FILE ? '' : '