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 @@
-
- All users
-
+
+ All users
+
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.bodyTemplate()}
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()}
+ ${tagName}>
+ `;
}
- 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 added via a slot, render() would
- * put it inside the shadowDOM. That's fine, but then it doesn't get created until render(), and the parent
- * (LionField) can't find it when it looks for it before then.
- *
*/
// Export the Interface for TypeScript
type Constructor = new (...args : any[]) => T;
-export const Et2widgetWithSelectMixin = >(superclass : T) =>
+export const Et2WidgetWithSelectMixin = >(superclass : T) =>
{
class Et2WidgetWithSelect extends Et2InputWidget(superclass)
{
- static get properties()
- {
- return {
- ...super.properties,
- /**
- * Textual label for first row, eg: 'All' or 'None'. It's value will be ''
- */
- emptyLabel: String,
-
- /**
- * Select box options
- *
- * Will be found automatically based on ID and type, or can be set explicitly in the template using
- * children, or using widget.select_options = SelectOption[]
- */
- select_options: {type: Object, noAccessor: true},
-
- /**
- * Limit size
- */
- rows: {type: Number, noAccessor: true, reflect: true}
+ /**
+ * The current value of the select, submitted as a name/value pair with form data. When `multiple` is enabled, the
+ * value attribute will be a space-delimited list of values based on the options selected, and the value property will
+ * be an array.
+ *
+ @property({
+ noAccessor: true,
+ converter: {
+ fromAttribute: (value : string) => value.split(',')
}
- }
+ })
+ value : string | string[] = "";
+ */
+
+ /**
+ * Textual label for first row, eg: 'All' or 'None'. It's value will be ''
+ */
+ @property({type: String})
+ emptyLabel : String = "";
+
+ /**
+ * Limit size
+ */
+ @property({type: Number, noAccessor: true, reflect: true})
+
+
+ /**
+ * Internal list of possible select options
+ *
+ * This is where we keep options sent from the server. This is not always the complete list, as extending
+ * classes may have their own options to add in. For example, static options are kept separate, as are search
+ * results. The select_options getter should give the complete list.
+ */
+ private __select_options : SelectOption[] = [];
+
+ /**
+ * When we create the select option elements, it takes a while.
+ * If we don't wait for them, it causes issues in SlSelect
+ */
+ protected _optionRenderPromise : Promise = Promise.resolve();
/**
* Options found in the XML when reading the template
@@ -101,6 +110,13 @@ export const Et2widgetWithSelectMixin = >(supe
this.__select_options = [];
}
+ async getUpdateComplete() : Promise
+ {
+ const result = await super.getUpdateComplete();
+ await this._optionRenderPromise;
+ return result;
+ }
+
/** @param {import('@lion/core').PropertyValues } changedProperties */
updated(changedProperties : PropertyValues)
{
@@ -116,26 +132,48 @@ export const Et2widgetWithSelectMixin = >(supe
}
}
+ }
+
+ willUpdate(changedProperties : PropertyValues)
+ {
// Add in actual option tags to the DOM based on the new select_options
if(changedProperties.has('select_options') || changedProperties.has("emptyLabel"))
{
// Add in options as children to the target node
- this._renderOptions();
+ const optionPromise = this._renderOptions();
// This is needed to display initial load value in some cases, like infolog nm header filters
- if(this.handleMenuSlotChange && !this.hasUpdated)
+ if(typeof this.selectionChanged !== "undefined")
{
- this.handleMenuSlotChange();
+ optionPromise.then(async() =>
+ {
+ await this.updateComplete;
+ this.selectionChanged();
+ });
}
}
}
+ public getValueAsArray()
+ {
+ if(Array.isArray(this.value))
+ {
+ return this.value;
+ }
+ if(this.value == "null" || this.value == null || typeof this.value == "undefined" || !this.emptyLabel && this.value == "")
+ {
+ return [];
+ }
+ return [this.value];
+ }
+
/**
* Render select_options as child DOM Nodes
* @protected
*/
protected _renderOptions()
{
+ return Promise.resolve();
// Add in options as children to the target node
if(!this._optionTargetNode)
{
@@ -156,7 +194,7 @@ export const Et2widgetWithSelectMixin = >(supe
.map(this._groupTemplate.bind(this))}`;
render(options, temp_target);
- return Promise.all(([...temp_target.querySelectorAll(":scope > *")].map(item => item.render)))
+ this._optionRenderPromise = Promise.all(([...temp_target.querySelectorAll(":scope > *")].map(item => item.render)))
.then(() =>
{
this._optionTargetNode.replaceChildren(
@@ -168,23 +206,7 @@ export const Et2widgetWithSelectMixin = >(supe
this.handleMenuSlotChange();
}
});
-
- }
-
- /**
- * Overwritten as sometimes called before this._inputNode is available
- *
- * @param {*} v - modelValue: can be an Object, Number, String depending on the
- * input type(date, number, email etc)
- * @returns {string} formattedValue
- */
- formatter(v)
- {
- if (!this._inputNode)
- {
- return v;
- }
- return super.formatter(v);
+ return this._optionRenderPromise;
}
/**
@@ -212,6 +234,13 @@ export const Et2widgetWithSelectMixin = >(supe
this.select_options = new_options;
}
+ /**
+ * Select box options
+ *
+ * Will be found automatically based on ID and type, or can be set explicitly in the template using
+ * children, or using widget.select_options = SelectOption[]
+ */
+ @property({type: Object})
get select_options() : SelectOption[]
{
return this.__select_options;
@@ -262,7 +291,7 @@ export const Et2widgetWithSelectMixin = >(supe
* @param {SelectOption} option
* @returns {TemplateResult}
*/
- _optionTemplate(option : SelectOption) : TemplateResult
+ protected _optionTemplate(option : SelectOption) : TemplateResult
{
return html`
Override _optionTemplate(). ${option.value} => ${option.label} `;
@@ -276,7 +305,7 @@ export const Et2widgetWithSelectMixin = >(supe
}
return html`
- ${this.noLang ? option.label : this.egw().lang(option.label)}
+ ${this.noLang ? option.label : this.egw().lang(option.label)}
${option.value.map(this._optionTemplate.bind(this))}
`;
diff --git a/api/js/etemplate/Et2Select/FindSelectOptions.ts b/api/js/etemplate/Et2Select/FindSelectOptions.ts
index 0d1d69e8a1..cd9603ea7e 100644
--- a/api/js/etemplate/Et2Select/FindSelectOptions.ts
+++ b/api/js/etemplate/Et2Select/FindSelectOptions.ts
@@ -18,6 +18,9 @@ export interface SelectOption
// Show the option, but it is not selectable.
// If multiple=true and the option is in the value, it is not removable.
disabled? : boolean;
+ // If a search is in progress, does this option match.
+ // Automatically changed.
+ isMatch? : boolean;
}
/**
diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts
index 61c6d9815c..a8ad4dc6de 100644
--- a/api/js/etemplate/Et2Select/SearchMixin.ts
+++ b/api/js/etemplate/Et2Select/SearchMixin.ts
@@ -7,14 +7,15 @@
* @author Nathan Gray
*/
-
-import {css, html, LitElement, render, SlotMixin} from "@lion/core";
+import {css, CSSResultGroup, html, LitElement, nothing, TemplateResult} from "lit";
import {cleanSelectOptions, SelectOption} from "./FindSelectOptions";
import {Validator} from "@lion/form-core";
import {Et2Tag} from "./Tag/Et2Tag";
-import {SlMenuItem} from "@shoelace-style/shoelace";
-import {waitForEvent} from "@shoelace-style/shoelace/dist/internal/event";
import {StaticOptions} from "./StaticOptions";
+import {dedupeMixin} from "@open-wc/dedupe-mixin";
+import {SlOption} from "@shoelace-style/shoelace";
+import {Et2Textbox} from "../Et2Textbox/Et2Textbox";
+import {until} from "lit/directives/until.js";
// Otherwise import gets stripped
let keep_import : Et2Tag;
@@ -66,6 +67,12 @@ export declare class SearchMixinInterface
* Check a [local] item to see if it matches
*/
searchMatch(search : string, options : object, item : LitElement) : boolean
+
+ /**
+ * Additional customisation location, where we stick the search elements
+ *
+ * @type {TemplateResult}
+ */
}
/**
@@ -74,9 +81,9 @@ export declare class SearchMixinInterface
*
* Currently I assume we're extending an Et2Select, so changes may need to be made for better abstraction
*/
-export const Et2WithSearchMixin = >(superclass : T) =>
+export const Et2WithSearchMixin = dedupeMixin(>(superclass : T) =>
{
- class Et2WidgetWithSearch extends SlotMixin(superclass)
+ class Et2WidgetWithSearch extends superclass
{
static get properties()
{
@@ -105,54 +112,18 @@ export const Et2WithSearchMixin = >(superclass
}
}
- static get styles()
+ static get styles() : CSSResultGroup
{
return [
// @ts-ignore
...(super.styles ? (Symbol.iterator in Object(super.styles) ? super.styles : [super.styles]) : []),
css`
- /* Move the widget border
- .form-control-input {
- border: solid var(--sl-input-border-width) var(--sl-input-border-color);
- border-radius: var(--sl-input-border-radius-medium);
- }
- .form-control-input:hover {
- background-color: var(--sl-input-background-color-hover);
- border-color: var(--sl-input-border-color-hover);
- color: var(--sl-input-color-hover);
- }
- .select--standard .select__control {
- border-style: none;
- }
- /* Move focus highlight */
- .form-control-input:focus-within {
- box-shadow: var(--sl-focus-ring);
- }
- .select--standard.select--focused:not(.select--disabled) .select__control {
- box-shadow: initial;
- }
- /* Show / hide SlSelect icons - dropdown arrow, etc but not loading spinner */
- :host([allowFreeEntries]) ::slotted(sl-icon[slot="suffix"]) {
- display: none;
- }
- /* Make search textbox take full width */
- ::slotted(.search_input), ::slotted(.search_input) input, .search_input, .search_input input {
- width: 100%;
- }
- .search_input input {
- flex: 1 1 auto;
- width: 100%;
- }
+
/* Full width search textbox covers loading spinner, lift it up */
::slotted(sl-spinner) {
z-index: 2;
}
- /* Don't show the current value while searching for single, we want the space
- This lets the current value shrink to nothing so the input can expand
- */
- .select__label {
- flex: 1 15 auto;
- }
+
/* Show edit textbox only when editing */
.search_input #edit {
display: none;
@@ -163,43 +134,68 @@ export const Et2WithSearchMixin = >(superclass
.search_input.editing #edit {
display: initial;
}
- :host([search]:not([multiple])) .select--open .select__prefix {
+
+
+ :host([search]) sl-select[open]::part(prefix), :host([allowfreeentries]) sl-select[open]::part(prefix) {
+ order: 9;
flex: 2 1 auto;
+ flex-wrap: wrap;
width: 100%;
}
- :host([search]:not([multiple])) .select--open .select__label {
- margin: 0px;
- }
- :host([allowfreeentries]:not([multiple])) .select--standard.select--open:not(.select--disabled) .select__control .select__prefix {
- flex: 1 1 auto;
- }
- :host([allowfreeentries]:not([multiple])) .select--standard.select--open:not(.select--disabled) .select__control .select__label {
+
+ :host([search]) sl-select[open]::part(display-input), :host([allowfreeentries]) sl-select[open]::part(display-input) {
display: none;
}
-
- /* Search textbox general styling, starts hidden */
- .select__prefix ::slotted(.search_input),.search_input {
+
+ :host([search]) sl-select[open]::part(expand-icon) {
display: none;
+ }
+
+ :host([multiple]) sl-select[open]::part(tags) {
+ flex-basis: 100%;
+ }
+
+ :host([multiple]) sl-select[open]::part(combobox) {
+ flex-flow: wrap;
+ }
+
+
+ /* Search textbox general styling, starts hidden */
+
+ .search_input {
+ display: none;
+ /* See also etemplate2.css, searchbox border turned off in there */
+ border: none;
flex: 1 1 auto;
+ order: 2;
margin-left: 0px;
- width: 100%;
height: var(--sl-input-height-medium);
- position: absolute;
+ width: 100%;
background-color: white;
- z-index: 1;
- }
- /* Search UI active - show textbox & stuff */
- ::slotted(.search_input.active),.search_input.active,
- .search_input.editing{
+ z-index: var(--sl-z-index-dropdown);
+ }
+
+ :host([search]) et2-textbox::part(base) {
+ border: none;
+ box-shadow: none;
+ }
+
+ /* Search UI active - show textbox & stuff */
+
+ .search_input.active,
+ .search_input.editing {
display: flex;
- }
- /* If multiple and no value, overlap search onto widget instead of below */
- :host([multiple]) .search_input.active.novalue {
+ }
+
+ /* If multiple and no value, overlap search onto widget instead of below */
+
+ :host([multiple]) .search_input.active.novalue {
top: 0px;
- }
+ }
/* Hide options that do not match current search text */
- ::slotted(.no-match) {
+
+ [searching] .no-match {
display: none;
}
/* Different cursor for editable tags */
@@ -216,10 +212,6 @@ export const Et2WithSearchMixin = >(superclass
:host([readonly]) .form-control-input:focus-within {
box-shadow: none;
}
- /* no menu */
- :host([readonly]) sl-menu {
- display: none;
- }
/* normal cursor */
:host([readonly]) .select__control {
cursor: initial;
@@ -259,6 +251,11 @@ export const Et2WithSearchMixin = >(superclass
// Hold the original option data from earlier search results, since we discard on subsequent search
private _selected_remote = [];
+ // Hold current search results, selected or otherwise
+ private _remote_options = [];
+
+ private _total_result_count = 0;
+
/**
* These characters will end a free tag
* @type {string[]}
@@ -278,7 +275,7 @@ export const Et2WithSearchMixin = >(superclass
// Hiding the selected options from the dropdown means we can't un-select the tags
// hidden by the max limit. Prefer no limit.
- this.maxTagsVisible = -1;
+ this.maxOptionsVisible = -1;
this.validators = [];
/**
@@ -292,16 +289,19 @@ export const Et2WithSearchMixin = >(superclass
*/
this.defaultValidators = [];
- this.handleMenuSelect = this.handleMenuSelect.bind(this);
+ this.handleOptionClick = this.handleOptionClick.bind(this);
this._handleChange = this._handleChange.bind(this);
this.handleTagEdit = this.handleTagEdit.bind(this);
this._handleAfterShow = this._handleAfterShow.bind(this);
+ this._handleMenuHide = this._handleMenuHide.bind(this);
this._handleSearchBlur = this._handleSearchBlur.bind(this);
this._handleClear = this._handleClear.bind(this);
this._handleDoubleClick = this._handleDoubleClick.bind(this);
this._handleSearchAbort = this._handleSearchAbort.bind(this);
+ this._handleSearchClear = this._handleSearchClear.bind(this);
this._handleSearchChange = this._handleSearchChange.bind(this);
this._handleSearchKeyDown = this._handleSearchKeyDown.bind(this);
+ this._handleSearchMouseDown = this._handleSearchMouseDown.bind(this);
this._handleEditKeyDown = this._handleEditKeyDown.bind(this);
this._handlePaste = this._handlePaste.bind(this);
}
@@ -319,7 +319,6 @@ export const Et2WithSearchMixin = >(superclass
return;
}
- this._addNodes();
this._bindListeners();
}
@@ -329,6 +328,16 @@ export const Et2WithSearchMixin = >(superclass
this._unbindListeners();
}
+ async getUpdateComplete()
+ {
+ const result = super.getUpdateComplete();
+ if(this._searchInputNode)
+ {
+ await this._searchInputNode.updateComplete;
+ }
+ return result;
+ }
+
willUpdate(changedProperties)
{
super.willUpdate(changedProperties);
@@ -358,7 +367,7 @@ export const Et2WithSearchMixin = >(superclass
}
else if(this.allowFreeEntries && this.multiple)
{
- this.value.forEach((e) =>
+ this.getValueAsArray().forEach((e) =>
{
if(!this.select_options.find(o => o.value == e))
{
@@ -389,6 +398,7 @@ export const Et2WithSearchMixin = >(superclass
// One of the key properties has changed, need to add the needed nodes
if(changedProperties.has("search") || changedProperties.has("editModeEnabled") || changedProperties.has("allowFreeEntries"))
{
+ this._unbindListeners();
// Missing any of the required attributes? Now we need to take it out.
if(!this.searchEnabled && !this.editModeEnabled && !this.allowFreeEntries || this.readonly)
{
@@ -396,8 +406,8 @@ export const Et2WithSearchMixin = >(superclass
return;
}
- // Normally this should be handled in render(), but we have to add our nodes in
- this._addNodes();
+ // Listeners may have been skipped from connectedCallback()
+ this._bindListeners();
}
// Update any tags if edit mode changes
if(changedProperties.has("editModeEnabled") || changedProperties.has("readonly"))
@@ -408,57 +418,44 @@ export const Et2WithSearchMixin = >(superclass
tag.editable = this.editModeEnabled && !this.readonly;
tag.removable = !this.readonly;
});
+
+ if(this.readonly)
+ {
+ this._unbindListeners();
+ }
}
}
- /**
- * Add the nodes we need to search - adjust parent shadowDOM
- *
- * @protected
- */
- protected _addNodes()
+ protected _extraTemplate() : TemplateResult | typeof nothing
{
- if(this._activeControls)
+ if(!this.searchEnabled && !this.editModeEnabled && !this.allowFreeEntries || this.readonly)
{
- // Already there
- return;
+ return nothing;
}
- const div = document.createElement("div");
- div.classList.add("search_input");
- render(this._searchInputTemplate(), div);
- if(!super.multiple)
- {
- div.slot = "prefix";
- this.appendChild(div);
- return;
- }
-
- super.updateComplete.then(() =>
- {
- let control = this.shadowRoot.querySelector(".form-control-input");
- control.append(div);
- });
+ return html`
+ ${this._searchInputTemplate()}
+ ${until(this._moreResultsTemplate(), nothing)}
+ ${this._noResultsTemplate()}
+ `;
}
- /**
- * Customise how tags are rendered.
- * Override to add edit
- *
- * @param item
- * @protected
- */
- protected _createTagNode(item)
+ protected async _moreResultsTemplate()
{
- let tag = document.createElement(this.tagTag);
- tag.editable = this.editModeEnabled && !this.readonly;
+ await this.updateComplete;
+ const moreCount = this._total_result_count - this.select?.querySelectorAll("sl-option.match").length;
+ if(this._total_result_count == 0 || moreCount == 0 || !this.select)
+ {
+ return nothing;
+ }
+ const more = this.egw().lang("%1 more...", moreCount);
- return tag;
+ return html`${more} `;
}
protected _searchInputTemplate()
{
- let edit = null;
+ let edit = nothing;
if(this.editModeEnabled)
{
edit = html` >(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
+ 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
+ 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`
+
+ option label
+
+ `);
+
+ // 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`
+
+ One
+ Two
+ Three
+ Four
+ Five
+ Six
+ Seven
+
+ `);
+ 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`
find_select_options(this)[1]
+ }
+
+ static get properties()
+ {
+ return {
+ ...super.properties,
+ multiple: {
+ name: "",
+ type: Boolean,
+ default: false,
+ description: "Allow selecting multiple options"
+ },
+ selectOptions: {
+ type: "any",
+ name: "Select options",
+ default: {},
+ description: "Used to set the tree options."
+ },
+ onClick: {
+ name: "onClick",
+ type: "js",
+ description: "JS code which gets executed when clicks on text of a node"
+ },
+ onSelect: {
+ name: "onSelect",
+ type: "js",
+ default: et2_no_init,
+ description: "Javascript executed when user selects a node"
+ },
+ onCheck: {
+ name: "onCheck",
+ type: "js",
+ default: et2_no_init,
+ description: "Javascript executed when user checks a node"
+ },
+ // TODO do this : --> onChange event is mapped depending on multiple to onCheck or onSelect
+ onOpenStart: {
+ name: "onOpenStart",
+ type: "js",
+ default: et2_no_init,
+ description: "Javascript function executed when user opens a node: function(_id, _widget, _hasChildren) returning true to allow opening!"
+ },
+ onOpenEnd: {
+ name: "onOpenEnd",
+ type: "js",
+ default: et2_no_init,
+ description: "Javascript function executed when opening a node is finished: function(_id, _widget, _hasChildren)"
+ },
+ imagePath: {
+ name: "Image directory",
+ type: String,
+ default: egw().webserverUrl + "/api/templates/default/images/dhtmlxtree/",//TODO we will need a different path here! maybe just rename the path?
+ description: "Directory for tree structure images, set on server-side to 'dhtmlx' subdir of templates image-directory"
+ },
+ value: {
+ type: "any",
+ default: {}
+ },
+ actions: {
+ name: "Actions array",
+ type: "any",
+ default: et2_no_init,
+ description: "List of egw actions that can be done on the tree. This includes context menu, drag and drop. TODO: Link to action documentation"
+ },
+ autoLoading: {
+ name: "Auto loading",
+ type: String,
+ default: "",
+ description: "JSON URL or menuaction to be called for nodes marked with child=1, but not having children, GET parameter selected contains node-id"
+ },
+ stdImages: {
+ name: "Standard images",
+ type: String,
+ default: "",
+ description: "comma-separated names of icons for a leaf, closed and opened folder (default: leaf.png,folderClosed.png,folderOpen.png), images with extension get loaded from imagePath, just 'image' or 'appname/image' are allowed too"
+ },
+ multiMarking: {
+ name: "multi marking",
+ type: "any",
+ default: false,
+ description: "Allow marking multiple nodes, default is false which means disabled multiselection, true or 'strict' activates it and 'strict' makes it strict to only same level marking"
+ },
+ highlighting: {
+ name: "highlighting",
+ type: Boolean,
+ default: false,
+ description: "Add highlighting class on hovered over item, highlighting is disabled by default"
+ },
+ }
+ };
+
+ public set onOpenStart(_handler: Function)
+ {
+ this.installHandler("onOpenStart", _handler)
+ }
+
+ public set onChange(_handler: Function)
+ {
+ this.installHandler("onChange", _handler)
+ }
+
+ public set onClick(_handler: Function)
+ {
+ this.installHandler("onClick", _handler)
+ }
+
+ public set onSelect(_handler: Function)
+ {
+ this.installHandler("onSelect", _handler)
+ }
+
+ public set onOpenEnd(_handler: Function)
+ {
+ this.installHandler("onOpenEnd", _handler)
+ }
+
+
+ /**
+ * @deprecated assign to onOpenStart
+ * @param _handler
+ */
+ public set_onopenstart(_handler: Function)
+ {
+ this.installHandler("onOpenStart", _handler)
+ }
+
+ /**
+ * @deprecated assign to onChange
+ * @param _handler
+ */
+ public set_onchange(_handler: Function)
+ {
+ this.installHandler('onchange', _handler);
+ }
+
+ /**
+ * @deprecated assign to onClick
+ * @param _handler
+ */
+ public set_onclick(_handler: Function)
+ {
+ this.installHandler('onclick', _handler);
+ }
+
+ /**
+ * @deprecated assign to onSelect
+ * @param _handler
+ */
+ public set_onselect(_handler: Function)
+ {
+ this.installHandler('onselect', _handler);
+ }
+
+ /**
+ * @deprecated assign to onOpenEnd
+ * @param _handler
+ */
+ public set_onopenend(_handler: Function)
+ {
+ this.installHandler('onOpenEnd', _handler);
+ }
+
+
+ private installHandler(_name: String, _handler: Function)
+ {
+ if (this.input == null) this.createTree();
+ // automatic convert onChange event to oncheck or onSelect depending on multiple is used or not
+ // if (_name == "onchange") {
+ // _name = this.options.multiple ? "oncheck" : "onselect"
+ // }
+ // let handler = _handler;
+ // let widget = this;
+ // this.input.attachEvent(_name, function(_id){
+ // let args = jQuery.makeArray(arguments);
+ // // splice in widget as 2. parameter, 1. is new node-id, now 3. is old node id
+ // args.splice(1, 0, widget);
+ // // try to close mobile sidemenu after clicking on node
+ // if (egwIsMobile() && typeof args[2] == 'string') framework.toggleMenu('on');
+ // return handler.apply(this, args);
+ // });
+ }
+
+ private createTree()
+ {
+ // widget.input = document.querySelector("et2-tree");
+ // // Allow controlling icon size by CSS
+ // widget.input.def_img_x = "";
+ // widget.input.def_img_y = "";
+ //
+ // // to allow "," in value, eg. folder-names, IF value is specified as array
+ // widget.input.dlmtr = ':}-*(';
+ // @ts-ignore from static get properties
+ if (this.autoLoading)
+ {
+ // @ts-ignore from static get properties
+ let url = this.autoLoading;
+
+ if (url.charAt(0) != '/' && url.substr(0, 4) != 'http')
+ {
+ url = '/json.php?menuaction=' + url;
+ }
+ this.autoloading_url = url;
+ }
+ }
+
+ private handleLazyLoading(_item: TreeItem)
+ {
+ let sendOptions = {
+ num_rows: Et2Tree.RESULT_LIMIT,
+ }
+ return egw().request(egw().link(egw().ajaxUrl(egw().decodePath(this.autoloading_url)),
+ {
+ id: _item.id
+ }), [sendOptions])
+ .then((results) => {
+
+ // If results have a total included, pull it out.
+ // It will cause errors if left in the results
+ // this._total_result_count = results.length;
+ // if(typeof results.total !== "undefined")
+ // {
+ // this._total_result_count = results.total;
+ // delete results.total;
+ // }
+ // let entries = cleanSelectOptions(results);
+ // this.processRemoteResults(entries);
+ // return entries;
+ return results
+ });
+ }
+
+ //this.selectOptions = find_select_options(this)[1];
+ _optionTemplate(selectOption: TreeItem)
+ {
+ // @ts-ignore
+
+ //slot = expanded/collapsed instead of expand/collapse like it is in documentation
+ //selectOption.child === 1
+ return html`
+ this.handleLazyLoading(selectOption)}
+ >
+ ${selectOption.text}
+ ${repeat(selectOption.item, this._optionTemplate.bind(this))}
+ `
+ }
+
+ public render(): unknown
+ {
+ return html`
+
+ ${repeat(this.selectOptions, this._optionTemplate.bind(this))}
+
+ `;
+ }
+
+ protected remoteQuery(search: string, options: object): Promise
+ {
+ // Include a limit, even if options don't, to avoid massive lists breaking the UI
+ let sendOptions = {
+ num_rows: Et2Tree.RESULT_LIMIT,
+ ...options
+ }
+ return this.egw().request(this.egw().link(this.egw().ajaxUrl(this.egw().decodePath(this.searchUrl)),
+ {query: search, ...sendOptions}), [search, sendOptions]).then((results) => {
+ // If results have a total included, pull it out.
+ // It will cause errors if left in the results
+ this._total_result_count = results.length;
+ if (typeof results.total !== "undefined")
+ {
+ this._total_result_count = results.total;
+ delete results.total;
+ }
+ let entries = cleanSelectOptions(results);
+ this.processRemoteResults(entries);
+ return entries;
+ });
+ }
+}
+
+customElements.define("et2-tree", Et2Tree);
+
+
diff --git a/api/js/etemplate/Et2TreeWidget/MailTree.ts b/api/js/etemplate/Et2TreeWidget/MailTree.ts
new file mode 100644
index 0000000000..d12dd644ee
--- /dev/null
+++ b/api/js/etemplate/Et2TreeWidget/MailTree.ts
@@ -0,0 +1,12 @@
+import {Et2Tree} from "./Et2Tree";
+
+export function initMailTree(): Et2Tree {
+ const changeFunction = () => {
+ console.log("change"+tree)
+ }
+ const tree: Et2Tree = document.querySelector("et2-tree");
+ tree.selection = "single";
+ tree.addEventListener("sl-selection-change", (event)=>{console.log(event)})
+ return tree;
+}
+
diff --git a/api/js/etemplate/Et2TreeWidget/Tests/TreeTest.js b/api/js/etemplate/Et2TreeWidget/Tests/TreeTest.js
new file mode 100644
index 0000000000..b658178ac1
--- /dev/null
+++ b/api/js/etemplate/Et2TreeWidget/Tests/TreeTest.js
@@ -0,0 +1,7 @@
+const selectionMode = document.querySelector('#selection-mode');
+const tree = document.querySelector('.tree-selectable');
+
+selectionMode.addEventListener('sl-change', () => {
+ tree.querySelectorAll('sl-tree-item').forEach(item => (item.selected = false));
+ tree.selection = selectionMode.value;
+});
\ No newline at end of file
diff --git a/api/js/etemplate/Et2TreeWidget/Tests/TreeTestSite.html b/api/js/etemplate/Et2TreeWidget/Tests/TreeTestSite.html
new file mode 100644
index 0000000000..6e95ab2fe4
--- /dev/null
+++ b/api/js/etemplate/Et2TreeWidget/Tests/TreeTestSite.html
@@ -0,0 +1,26 @@
+
+
+
+
+ TestSite
+
+
+
+
+
+ Item 1
+
+ Item A
+ Item Z
+ Item Y
+ Item X
+
+ Item B
+ Item C
+
+ Item 2
+ Item 3
+
+
+
+
\ No newline at end of file
diff --git a/api/js/etemplate/Et2Url/Et2InvokerMixin.ts b/api/js/etemplate/Et2Url/Et2InvokerMixin.ts
index 811e76346a..eccfe96a54 100644
--- a/api/js/etemplate/Et2Url/Et2InvokerMixin.ts
+++ b/api/js/etemplate/Et2Url/Et2InvokerMixin.ts
@@ -8,7 +8,8 @@
*/
/* eslint-disable import/no-extraneous-dependencies */
-import {css, dedupeMixin, html, LitElement, SlotMixin} from '@lion/core';
+import {css, html, LitElement} from 'lit';
+import {dedupeMixin, SlotMixin} from '@lion/core';
import {Et2InputWidget, Et2InputWidgetInterface} from "../Et2InputWidget/Et2InputWidget";
import {colorsDefStyles} from "../Styles/colorsDefStyles";
diff --git a/api/js/etemplate/Et2Url/Et2Url.ts b/api/js/etemplate/Et2Url/Et2Url.ts
index 7f3f98d82b..4320510078 100644
--- a/api/js/etemplate/Et2Url/Et2Url.ts
+++ b/api/js/etemplate/Et2Url/Et2Url.ts
@@ -11,7 +11,7 @@
import {Et2InvokerMixin} from "./Et2InvokerMixin";
import {Et2Textbox} from "../Et2Textbox/Et2Textbox";
import {colorsDefStyles} from "../Styles/colorsDefStyles";
-import {css} from "@lion/core";
+import {css} from "lit";
import {egw} from "../../jsapi/egw_global";
/**
diff --git a/api/js/etemplate/Et2Url/Et2UrlEmail.ts b/api/js/etemplate/Et2Url/Et2UrlEmail.ts
index 9e2c527423..ab3d89a13c 100644
--- a/api/js/etemplate/Et2Url/Et2UrlEmail.ts
+++ b/api/js/etemplate/Et2Url/Et2UrlEmail.ts
@@ -12,7 +12,7 @@ import {Et2InvokerMixin} from "./Et2InvokerMixin";
import {IsEmail} from "../Validators/IsEmail";
import {Et2Textbox} from "../Et2Textbox/Et2Textbox";
import {colorsDefStyles} from "../Styles/colorsDefStyles";
-import {css} from "@lion/core";
+import {css} from "lit";
import {egw} from "../../jsapi/egw_global";
/**
diff --git a/api/js/etemplate/Et2Url/Et2UrlFax.ts b/api/js/etemplate/Et2Url/Et2UrlFax.ts
index cfa4bed99b..0566eb33e7 100644
--- a/api/js/etemplate/Et2Url/Et2UrlFax.ts
+++ b/api/js/etemplate/Et2Url/Et2UrlFax.ts
@@ -11,7 +11,7 @@
import {Et2UrlPhone} from "./Et2UrlPhone";
import {Et2UrlEmail} from "./Et2UrlEmail";
import {colorsDefStyles} from "../Styles/colorsDefStyles";
-import {css} from "@lion/core";
+import {css} from "lit";
/**
* @customElement et2-url-phone
diff --git a/api/js/etemplate/Et2Url/Et2UrlPhone.ts b/api/js/etemplate/Et2Url/Et2UrlPhone.ts
index 118e0fd8c1..719707e1fb 100644
--- a/api/js/etemplate/Et2Url/Et2UrlPhone.ts
+++ b/api/js/etemplate/Et2Url/Et2UrlPhone.ts
@@ -11,7 +11,7 @@
import {Et2InvokerMixin} from "./Et2InvokerMixin";
import {Et2Textbox} from "../Et2Textbox/Et2Textbox";
import {colorsDefStyles} from "../Styles/colorsDefStyles";
-import {css} from "@lion/core";
+import {css} from "lit";
/**
* @customElement et2-url-phone
diff --git a/api/js/etemplate/Et2Url/Et2UrlReadonly.ts b/api/js/etemplate/Et2Url/Et2UrlReadonly.ts
index 4f9c1a8a2a..f3ec0826cb 100644
--- a/api/js/etemplate/Et2Url/Et2UrlReadonly.ts
+++ b/api/js/etemplate/Et2Url/Et2UrlReadonly.ts
@@ -9,7 +9,7 @@
/* eslint-disable import/no-extraneous-dependencies */
import {Et2Description} from "../Et2Description/Et2Description";
-import {css, TemplateResult} from "@lion/core";
+import {css, TemplateResult} from "lit";
import {Et2Url} from "./Et2Url";
/**
diff --git a/api/js/etemplate/Et2Vfs/Et2VfsMime.ts b/api/js/etemplate/Et2Vfs/Et2VfsMime.ts
index a22efed82f..5dd8bc0bcb 100644
--- a/api/js/etemplate/Et2Vfs/Et2VfsMime.ts
+++ b/api/js/etemplate/Et2Vfs/Et2VfsMime.ts
@@ -1,7 +1,7 @@
import {ExposeValue} from "../Expose/ExposeMixin";
import {et2_vfsMode} from "../et2_widget_vfs";
import {Et2ImageExpose} from "../Expose/Et2ImageExpose";
-import {css, html} from "@lion/core";
+import {css, html} from "lit";
export class Et2VfsMime extends Et2ImageExpose
diff --git a/api/js/etemplate/Et2Vfs/Et2VfsUid.ts b/api/js/etemplate/Et2Vfs/Et2VfsUid.ts
index d6458a60f8..1ddb492341 100644
--- a/api/js/etemplate/Et2Vfs/Et2VfsUid.ts
+++ b/api/js/etemplate/Et2Vfs/Et2VfsUid.ts
@@ -7,7 +7,7 @@
* @author Ralf Becker
*/
-import {Et2SelectAccountReadonly} from "../Et2Select/Et2SelectReadonly";
+import {Et2SelectAccountReadonly} from "../Et2Select/Select/Et2SelectReadonly";
export class Et2VfsUid extends Et2SelectAccountReadonly
{
diff --git a/api/js/etemplate/Et2Widget/Et2Widget.ts b/api/js/etemplate/Et2Widget/Et2Widget.ts
index 708f476bc1..96eec296b3 100644
--- a/api/js/etemplate/Et2Widget/Et2Widget.ts
+++ b/api/js/etemplate/Et2Widget/Et2Widget.ts
@@ -8,7 +8,8 @@ import {et2_cloneObject, et2_csvSplit} from "../et2_core_common";
import type {IegwAppLocal} from "../../jsapi/egw_global";
import {egw} from "../../jsapi/egw_global";
import {ClassWithAttributes, ClassWithInterfaces} from "../et2_core_inheritance";
-import {css, dedupeMixin, LitElement, PropertyValues, unsafeCSS} from "@lion/core";
+import {css, LitElement, PropertyValues, unsafeCSS} from "lit";
+import {dedupeMixin} from "@lion/core";
import type {et2_container} from "../et2_core_baseWidget";
import type {et2_DOMWidget} from "../et2_core_DOMWidget";
@@ -47,15 +48,17 @@ const Et2WidgetMixin = (superClass : T) =>
protected _parent : Et2WidgetClass | et2_widget | null = null;
private _inst : etemplate2 | null = null;
- /** et2_widget compatability **/
- // @ts-ignore Some legacy widgets check their parent to see whats allowed
+ /**
+ * et2_widget compatability
+ * @deprecated Legacy compatability. Some legacy widgets check their parent to see whats allowed
+ **/
public supportedWidgetClasses = [];
/**
* If we put the widget somewhere other than as a child of its parent, we need to record that so
* we don't move it back to the parent.
* @type {Element}
- * @protected
+ * @internal
*/
protected _parent_node : Element;
/**
@@ -74,13 +77,26 @@ const Et2WidgetMixin = (superClass : T) =>
* Internal Properties - default values, and actually creating them as fields
* Do not include public property defined in properties()
*/
+
+ /**
+ * Internal widget ID
+ * @type {string}
+ * @internal
+ */
protected _widget_id : string = "";
+
+ /**
+ * Actual DOM ID, which is different from the widget ID
+ * @type {string}
+ * @internal
+ */
protected _dom_id : string = "";
/**
* TypeScript & LitElement ensure type correctness, so we can't have a string value like "$row_cont[disable_me]"
* as a boolean property so we store them here, and parse them when expanding. Strings do not have this problem,
* since $row_cont[disable_me] is still a valid string.
+ * @internal
*/
protected _deferred_properties : { [key : string] : string } = {};
@@ -102,6 +118,41 @@ const Et2WidgetMixin = (superClass : T) =>
:host([align="right"]) .input-group__input {
justify-content: flex-end;
}
+
+ /* Put widget label to the left of the widget */
+
+ ::part(form-control) {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ }
+
+ ::part(form-control-label) {
+ flex: 0 0 auto;
+ white-space: normal;
+ }
+
+ ::part(form-control-input) {
+ flex: 1 1 auto;
+ position: relative;
+ max-width: 100%;
+ }
+
+ ::part(form-control-help-text) {
+ flex-basis: 100%;
+ position: relative;
+ }
+
+ /* Use .et2-label-fixed class to give fixed label size */
+
+ :host(.et2-label-fixed)::part(form-control-label) {
+ width: initial;
+ width: var(--label-width, 8em);
+ }
+
+ :host(.et2-label-fixed)::part(form-control-help-text) {
+ left: calc(var(--sl-spacing-medium) + var(--label-width, 8em));
+ }
`];
}
@@ -125,14 +176,30 @@ const Et2WidgetMixin = (superClass : T) =>
class: {type: String, reflect: true},
/**
- * Defines whether this widget is visible.
- * Not to be confused with an input widget's HTML attribute 'disabled'.",
+ * Defines whether this widget is visibly disabled.
+ *
+ * The widget is still visible, but clearly cannot be interacted with. Widgets disabled in the template
+ * will not return a value to the application code, even if re-enabled via javascript before submitting.
+ * To allow a disabled widget to be re-enabled and return a value, disable via javascript in the app's
+ * et2_ready() instead of an attribute in the template file.
*/
disabled: {
type: Boolean,
reflect: true
},
+ /**
+ * The widget is not visible.
+ *
+ * As far as the user is concerned, the widget does not exist. Widgets hidden with an attribute in the
+ * template may not be created in the DOM, and will not return a value. Widgets can be hidden after creation,
+ * and they may return a value if hidden this way.
+ */
+ hidden: {
+ type: Boolean,
+ reflect: true
+ },
+
/**
* Accesskey provides a hint for generating a keyboard shortcut for the current element.
* The attribute value must consist of a single printable character.
@@ -198,8 +265,10 @@ const Et2WidgetMixin = (superClass : T) =>
/**
* List of properties that get translated
+ *
* Done separately to not interfere with properties - if we re-define label property,
* labels go missing.
+ * @internal
* @returns {{statustext : boolean, label : boolean}}
*/
static get translate()
@@ -314,12 +383,17 @@ const Et2WidgetMixin = (superClass : T) =>
/**
* Wrapper on this.disabled because legacy had it.
*
+ * @deprecated Use widget.disabled for visually disabled, widget.hidden for visually hidden.
+ * Widgets that are hidden from the server via attribute or $readonlys will not be created.
+ * Widgets that are disabled from the server will not return a value to the application code.
+ *
* @param {boolean} value
*/
set_disabled(value : boolean)
{
let oldValue = this.disabled;
this.disabled = value;
+ this.hidden = value;
this.requestUpdate("disabled", oldValue);
}
@@ -328,7 +402,7 @@ const Et2WidgetMixin = (superClass : T) =>
*
* @returns {string}
*/
- get dom_id()
+ get dom_id() : string
{
return this.getAttribute("id");
}
@@ -372,7 +446,7 @@ const Et2WidgetMixin = (superClass : T) =>
*
* @returns {string}
*/
- get id()
+ get id() : string
{
return this._widget_id;
}
@@ -443,6 +517,9 @@ const Et2WidgetMixin = (superClass : T) =>
/**
* Any attribute that refers to row content cannot be resolved immediately, but some like booleans cannot stay a
* string because it's a boolean attribute. We store them for later, and parse when they're fully in their row.
+ *
+ * If you are creating a widget that can go in a nextmatch row, and it has boolean attributes that can change
+ * for each row, add those attributes into deferredProperties
*/
get deferredProperties()
{
@@ -724,7 +801,7 @@ const Et2WidgetMixin = (superClass : T) =>
{
widget = loadWebComponent(_nodeName, _node, this);
- if(this.addChild)
+ if(this.addChild && widget)
{
// webcomponent going into old et2_widget
this.addChild(widget);
@@ -969,7 +1046,7 @@ const Et2WidgetMixin = (superClass : T) =>
/**
* Parent is different than what is specified in the template / hierarchy.
- * Find it and re-parent there.
+ * Widget ID of another node to insert this node into instead of the normal location
*
* @param {string} parent
*/
@@ -1398,6 +1475,13 @@ export function loadWebComponent(_nodeName : string, _template_node : Element|{[
throw Error("Unknown or unregistered WebComponent '" + _nodeName + "', could not find class. Also checked for " + tries.join(','));
}
}
+
+ // Don't need to create hidden elements
+ if(parent?.hidden || attrs["hidden"] && parent?.getArrayMgr("content") && parent.getArrayMgr("content").parseBoolExpression(attrs["hidden"]))
+ {
+ //return null;
+ }
+
const readonly = parent?.getArrayMgr("readonlys") ?
(parent.getArrayMgr("readonlys")).isReadOnly(
attrs["id"], attrs["readonly"],
@@ -1622,7 +1706,7 @@ function transformAttributes(widget, mgr : et2_arrayMgr, attributes)
*/
export function cssImage(image_name : string, app_name? : string)
{
- let url = egw?.image(image_name, app_name);
+ let url = egw?.image && egw?.image(image_name, app_name);
if(url)
{
return css`url(${unsafeCSS(url)})`;
diff --git a/api/js/etemplate/Expose/Et2DescriptionExpose.ts b/api/js/etemplate/Expose/Et2DescriptionExpose.ts
index 2331bf7e73..80560af7ff 100644
--- a/api/js/etemplate/Expose/Et2DescriptionExpose.ts
+++ b/api/js/etemplate/Expose/Et2DescriptionExpose.ts
@@ -12,7 +12,7 @@
import {ExposeMixin, ExposeValue, MediaValue} from "./ExposeMixin";
import {Et2Description} from "../Et2Description/Et2Description";
import {et2_IDetachedDOM} from "../et2_core_interfaces";
-import {html} from "@lion/core";
+import {html} from "lit";
/**
* Shows a description and if you click on it, it shows the file specified by href in gallery.
diff --git a/api/js/etemplate/Expose/ExposeMixin.ts b/api/js/etemplate/Expose/ExposeMixin.ts
index a18db22e60..7850759888 100644
--- a/api/js/etemplate/Expose/ExposeMixin.ts
+++ b/api/js/etemplate/Expose/ExposeMixin.ts
@@ -11,7 +11,7 @@
// Don't import this more than once
import "../../../../node_modules/blueimp-gallery/js/blueimp-gallery.min";
-import {css, html, LitElement, render} from "@lion/core";
+import {css, html, LitElement, render} from "lit";
import {et2_nextmatch} from "../et2_extension_nextmatch";
import {Et2Dialog} from "../Et2Dialog/Et2Dialog";
import {ET2_DATAVIEW_STEPSIZE} from "../et2_dataview_controller";
diff --git a/api/js/etemplate/Layout/Et2Box/Et2Box.ts b/api/js/etemplate/Layout/Et2Box/Et2Box.ts
index 48e1e8043d..25361335bf 100644
--- a/api/js/etemplate/Layout/Et2Box/Et2Box.ts
+++ b/api/js/etemplate/Layout/Et2Box/Et2Box.ts
@@ -9,10 +9,16 @@
*/
-import {classMap, css, html, LitElement} from "@lion/core";
+import {css, html, LitElement} from "lit";
+import {classMap} from "lit/directives/class-map.js";
import {Et2Widget} from "../../Et2Widget/Et2Widget";
import {et2_IDetachedDOM} from "../../et2_core_interfaces";
+/**
+ * @summary A basic wrapper to group other widgets
+ *
+ * @slot - Any other widget
+ */
export class Et2Box extends Et2Widget(LitElement) implements et2_IDetachedDOM
{
static get styles()
@@ -108,7 +114,7 @@ export class Et2Box extends Et2Widget(LitElement) implements et2_IDetachedDOM
*/
getDetachedAttributes(_attrs)
{
- _attrs.push('data');
+ _attrs.push('data', 'onclick');
}
getDetachedNodes()
@@ -143,6 +149,14 @@ export class Et2HBox extends Et2Box
customElements.define("et2-hbox", Et2HBox);
+/**
+ * @summary Vertically align child widgets
+ *
+ * This box includes styling to stop children from growing vertically.
+ * Set css```flex-grow: 1``` on the child to allow it to grow.
+ *
+ * @slot - Any other widget
+ */
export class Et2VBox extends Et2Box
{
static get styles()
diff --git a/api/js/etemplate/Layout/Et2Details/Et2Details.ts b/api/js/etemplate/Layout/Et2Details/Et2Details.ts
index e9ceaba950..5ad85ceeb0 100644
--- a/api/js/etemplate/Layout/Et2Details/Et2Details.ts
+++ b/api/js/etemplate/Layout/Et2Details/Et2Details.ts
@@ -8,7 +8,7 @@
*/
import {Et2Widget} from "../../Et2Widget/Et2Widget";
-import {css} from "@lion/core";
+import {css} from "lit";
import {SlDetails} from "@shoelace-style/shoelace";
import shoelace from "../../Styles/shoelace";
diff --git a/api/js/etemplate/Layout/Et2Split/Et2Split.ts b/api/js/etemplate/Layout/Et2Split/Et2Split.ts
index 64d497948a..d6c4c2ca42 100644
--- a/api/js/etemplate/Layout/Et2Split/Et2Split.ts
+++ b/api/js/etemplate/Layout/Et2Split/Et2Split.ts
@@ -12,7 +12,8 @@ import {cssImage, Et2Widget} from "../../Et2Widget/Et2Widget";
import {SlSplitPanel} from "@shoelace-style/shoelace";
import {et2_IDOMNode, et2_IResizeable} from "../../et2_core_interfaces";
import {et2_DOMWidget} from "../../et2_core_DOMWidget";
-import {css, html, SlotMixin} from "@lion/core";
+import {css, html} from "lit";
+import {SlotMixin} from "@lion/core";
import {colorsDefStyles} from "../../Styles/colorsDefStyles";
export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
@@ -132,8 +133,8 @@ export class Et2Split extends Et2Widget(SlotMixin(SlSplitPanel))
let outerNodetopOffset = widget.dynheight.outerNode.offset().top;
widget.dynheight.outerNode = {
// Random 3px deducted to make things fit better. Otherwise nm edges are hidden
- width: () => parseInt(getComputedStyle(this.shadowRoot.querySelector(".start")).width) - 3,
- height: () => parseInt(getComputedStyle(this.shadowRoot.querySelector(".start")).height) - 3,
+ width: () => parseInt(getComputedStyle(this.querySelector("[slot='start']")).width) - 3,
+ height: () => parseInt(getComputedStyle(this.querySelector("[slot='start']")).height) - 3,
offset: () => {return {top:outerNodetopOffset}}
};
widget.dynheight._collectBottomNodes = function()
diff --git a/api/js/etemplate/Layout/Et2Tabs/Et2Tab.ts b/api/js/etemplate/Layout/Et2Tabs/Et2Tab.ts
index 8446e60d03..bc2d4ca158 100644
--- a/api/js/etemplate/Layout/Et2Tabs/Et2Tab.ts
+++ b/api/js/etemplate/Layout/Et2Tabs/Et2Tab.ts
@@ -1,7 +1,7 @@
import {Et2Widget} from "../../Et2Widget/Et2Widget";
import {SlTab} from "@shoelace-style/shoelace";
import shoelace from "../../Styles/shoelace";
-import {css} from "@lion/core";
+import {css} from "lit";
export class Et2Tab extends Et2Widget(SlTab)
{
diff --git a/api/js/etemplate/Layout/Et2Tabs/Et2TabPanel.ts b/api/js/etemplate/Layout/Et2Tabs/Et2TabPanel.ts
index 08ccbc0b20..93ddc49ee3 100644
--- a/api/js/etemplate/Layout/Et2Tabs/Et2TabPanel.ts
+++ b/api/js/etemplate/Layout/Et2Tabs/Et2TabPanel.ts
@@ -1,7 +1,7 @@
import {Et2Widget} from "../../Et2Widget/Et2Widget";
import {SlTabPanel} from "@shoelace-style/shoelace";
import shoelace from "../../Styles/shoelace";
-import {css} from "@lion/core";
+import {css} from "lit";
export class Et2TabPanel extends Et2Widget(SlTabPanel)
{
diff --git a/api/js/etemplate/Layout/Et2Tabs/Et2Tabs.ts b/api/js/etemplate/Layout/Et2Tabs/Et2Tabs.ts
index 11b8e6dac9..fb5d4dbaa3 100644
--- a/api/js/etemplate/Layout/Et2Tabs/Et2Tabs.ts
+++ b/api/js/etemplate/Layout/Et2Tabs/Et2Tabs.ts
@@ -10,7 +10,7 @@
import {SlTab, SlTabGroup, SlTabPanel} from "@shoelace-style/shoelace";
import {loadWebComponent} from "../../Et2Widget/Et2Widget";
import {et2_directChildrenByTagName, et2_filteredNodeIterator, et2_readAttrWithDefault} from "../../et2_core_xml";
-import {css, PropertyValues} from "@lion/core";
+import {css, PropertyValues} from "lit";
import shoelace from "../../Styles/shoelace";
import {et2_createWidget} from "../../et2_core_widget";
import {colorsDefStyles} from "../../Styles/colorsDefStyles";
@@ -391,9 +391,14 @@ export class Et2Tabs extends Et2InputWidget(SlTabGroup) implements et2_IResizeab
});
}
+ /**
+ * Overridden to allow et2-tab-panel as well as sl-tab-panel
+ *
+ * @returns {[SlTabPanel]}
+ */
getAllPanels()
{
- const slot = this.body.querySelector('slot')!;
+ const slot = this.body!;
return [...slot.assignedElements()].filter(el => ['et2-tab-panel', 'sl-tab-panel'].indexOf(el.tagName.toLowerCase()) != -1) as [SlTabPanel];
}
diff --git a/api/js/etemplate/Layout/Et2Tabs/Et2TabsMobile.ts b/api/js/etemplate/Layout/Et2Tabs/Et2TabsMobile.ts
index 602266bbf9..8cd4f8c69c 100644
--- a/api/js/etemplate/Layout/Et2Tabs/Et2TabsMobile.ts
+++ b/api/js/etemplate/Layout/Et2Tabs/Et2TabsMobile.ts
@@ -1,5 +1,7 @@
import {Et2Tabs} from "./Et2Tabs";
-import {classMap, html, repeat, TemplateResult} from "@lion/core";
+import {html, TemplateResult} from "lit";
+import {classMap} from "lit/directives/class-map.js";
+import {repeat} from "lit/directives/repeat.js";
import {Et2Details} from "../Et2Details/Et2Details";
import {SlTab, SlTabPanel} from "@shoelace-style/shoelace";
diff --git a/api/js/etemplate/Layout/RowLimitedMixin.ts b/api/js/etemplate/Layout/RowLimitedMixin.ts
index 88e559d510..f2d26f95bd 100644
--- a/api/js/etemplate/Layout/RowLimitedMixin.ts
+++ b/api/js/etemplate/Layout/RowLimitedMixin.ts
@@ -1,5 +1,5 @@
// Export the Interface for TypeScript
-import {LitElement} from "@lion/core";
+import {LitElement} from "lit";
type Constructor = new (...args : any[]) => T;
diff --git a/api/js/etemplate/Styles/colorsDefStyles.ts b/api/js/etemplate/Styles/colorsDefStyles.ts
index 1c8f7d2909..422d11ecda 100644
--- a/api/js/etemplate/Styles/colorsDefStyles.ts
+++ b/api/js/etemplate/Styles/colorsDefStyles.ts
@@ -2,7 +2,7 @@
* Sharable colors definition styles constant
*/
-import {css} from "@lion/core";
+import {css} from "lit";
export const colorsDefStyles = css`
:host {
diff --git a/api/js/etemplate/Styles/shoelace.ts b/api/js/etemplate/Styles/shoelace.ts
index ccc8c4ce37..8d82d5d6e7 100644
--- a/api/js/etemplate/Styles/shoelace.ts
+++ b/api/js/etemplate/Styles/shoelace.ts
@@ -15,7 +15,7 @@ import {egw} from "../../jsapi/egw_global";
registerIconLibrary('default', {
resolver: name =>
{
- return typeof egw !== "undefined" ? `${egw.webserverUrl}/node_modules/@shoelace-style/shoelace/dist/assets/icons/${name}.svg` : ''
+ return typeof egw !== "undefined" ? `${egw.webserverUrl || ""}/node_modules/@shoelace-style/shoelace/dist/assets/icons/${name}.svg` : ''
},
});
@@ -24,12 +24,15 @@ registerIconLibrary('default', {
* @example
* @example
*/
-registerIconLibrary('egw', {
- resolver: name =>
- {
- return typeof egw !== "undefined" ? (egw.image(name) || '') : ''
- },
-});
+if(typeof egw !== "undefined" && typeof egw.image == "function")
+{
+ registerIconLibrary('egw', {
+ resolver: name =>
+ {
+ return (egw.image(name) || '');
+ },
+ });
+}
/**
* Customise shoelace styles to match our stuff
@@ -39,10 +42,10 @@ export default [sl_css, css`
:root,
:host,
.sl-theme-light {
- --sl-font-size-medium: ${typeof egw != "undefined" && egw.preference('textsize', 'common') != '12' ? parseInt(egw.preference('textsize', 'common')) : 12}px;
+ --sl-font-size-medium: ${typeof egw != "undefined" && egw.preference && egw.preference('textsize', 'common') != '12' ? parseInt(egw.preference('textsize', 'common')) : 12}px;
--sl-input-height-small: 24px;
--sl-input-height-medium: 32px;
- --sl-button-font-size-medium: ${typeof egw != "undefined" && egw.preference('textsize', 'common') != '12' ? parseInt(egw.preference('textsize', 'common')) : 12}px;
+ --sl-button-font-size-medium: ${typeof egw != "undefined" && egw.preference && egw.preference('textsize', 'common') != '12' ? parseInt(egw.preference('textsize', 'common')) : 12}px;
--sl-input-help-text-font-size-medium: var(--sl-font-size-medium);
--sl-spacing-small: 0.1rem;
--sl-spacing-medium: 0.5rem;
@@ -53,7 +56,7 @@ export default [sl_css, css`
--indicator-color: #696969;
--sl-input-focus-ring-color: #26537C;
--sl-focus-ring-width: 2px;
- --sl-color-gray-150: #f0f0f0;
+ --sl-color-gray-150: #f0f0f0;
}
.tab-group--top .tab-group__tabs {
diff --git a/api/js/etemplate/et2_core_arrayMgr.ts b/api/js/etemplate/et2_core_arrayMgr.ts
index 0736a1e2a8..1c161b0384 100644
--- a/api/js/etemplate/et2_core_arrayMgr.ts
+++ b/api/js/etemplate/et2_core_arrayMgr.ts
@@ -349,8 +349,13 @@ export class et2_arrayMgr
return _ident;
}
- parseBoolExpression(_expression : string)
+ parseBoolExpression(_expression : string|number|boolean|undefined)
{
+ if (typeof _expression === "boolean")
+ {
+ return _expression;
+ }
+
if(typeof _expression === "undefined" || _expression === null)
{
return false;
diff --git a/api/js/etemplate/et2_core_legacyJSFunctions.ts b/api/js/etemplate/et2_core_legacyJSFunctions.ts
index bcebaae590..4092b589cf 100644
--- a/api/js/etemplate/et2_core_legacyJSFunctions.ts
+++ b/api/js/etemplate/et2_core_legacyJSFunctions.ts
@@ -99,6 +99,11 @@ export function et2_compileLegacyJS(_code, _widget, _context)
}
// Code is app.appname.function, add the arguments so it can be executed
_code += '(ev,widget)';
+ // Return what the function returns
+ if(_code.indexOf("return") == -1)
+ {
+ _code = "return " + _code;
+ }
}
// use app object from etemplate2, which might be private and not just window.app
_code = _code.replace(/(window\.)?app\./, 'widget.getInstanceManager().app_obj.');
diff --git a/api/js/etemplate/et2_extension_customfields.ts b/api/js/etemplate/et2_extension_customfields.ts
index 58e4b467ae..a8a4360649 100644
--- a/api/js/etemplate/et2_extension_customfields.ts
+++ b/api/js/etemplate/et2_extension_customfields.ts
@@ -25,7 +25,7 @@ import {et2_IDetachedDOM, et2_IInput} from "./et2_core_interfaces";
import {et2_cloneObject, et2_no_init} from "./et2_core_common";
import {et2_DOMWidget} from "./et2_core_DOMWidget";
import {loadWebComponent} from "./Et2Widget/Et2Widget";
-import {LitElement} from "@lion/core";
+import {LitElement} from "lit";
export class et2_customfields_list extends et2_valueWidget implements et2_IDetachedDOM, et2_IInput
{
@@ -360,7 +360,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
// Add in settings that are objects
// Customized settings for this widget (unlikely)
- const data = this.getArrayMgr("modifications").getEntry(this.id) ?? {};
+ const data = this.id ? this.getArrayMgr("modifications").getEntry(this.id) ?? {} : {};
// Check for global settings
const global_data = this.getArrayMgr("modifications").getRoot().getEntry('~custom_fields~', true);
if(global_data)
diff --git a/api/js/etemplate/et2_extension_nextmatch.ts b/api/js/etemplate/et2_extension_nextmatch.ts
index 8b9e41dcec..22f588bfa8 100644
--- a/api/js/etemplate/et2_extension_nextmatch.ts
+++ b/api/js/etemplate/et2_extension_nextmatch.ts
@@ -73,9 +73,9 @@ import {Et2Dialog} from "./Et2Dialog/Et2Dialog";
import {Et2Select} from "./Et2Select/Et2Select";
import {loadWebComponent} from "./Et2Widget/Et2Widget";
import {Et2AccountFilterHeader} from "./Et2Nextmatch/Headers/AccountFilterHeader";
-import {Et2SelectCategory} from "./Et2Select/Et2SelectCategory";
+import {Et2SelectCategory} from "./Et2Select/Select/Et2SelectCategory";
import {Et2Searchbox} from "./Et2Textbox/Et2Searchbox";
-import {LitElement} from "@lion/core";
+import type {LitElement} from "lit";
//import {et2_selectAccount} from "./et2_widget_SelectAccount";
let keep_import : Et2AccountFilterHeader
@@ -1991,7 +1991,7 @@ export class et2_nextmatch extends et2_DOMWidget implements et2_IResizeable, et2
columns.push({
id: LETTERS,
caption: this.egw().lang('Search letter'),
- visibility: (this.header.lettersearch.is(':visible') ? et2_dataview_column.ET2_COL_VISIBILITY_VISIBLE : et2_dataview_column.ET2_COL_VISIBILITY_ALWAYS_NOSELECT)
+ visibility: (this.header.lettersearch.is(':visible') ? et2_dataview_column.ET2_COL_VISIBILITY_VISIBLE : et2_dataview_column.ET2_COL_VISIBILITY_INVISIBLE)
});
}
@@ -3481,7 +3481,6 @@ export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INext
this.category = this._build_select('cat_id', settings.cat_is_select ?
'et2-select' : 'et2-select-cat', settings.cat_id, settings.cat_is_select !== true, {
multiple: false,
- tags: true,
class: "select-cat",
value_class: settings.cat_id_class
});
@@ -3499,7 +3498,6 @@ export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INext
this.filter2 = this._build_select('filter2', 'et2-select', settings.filter2,
settings.filter2_no_lang, {
multiple: false,
- tags: settings.filter2_tags,
class: "select-cat",
value_class: settings.filter2_class
});
@@ -3706,7 +3704,7 @@ export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INext
// Not mail, since it needs to be different
&& !['mail'].includes(this.getInstanceManager().app))
{
- widget_options.empty_label = this.egw().lang('All categories');
+ widget_options.emptyLabel = this.egw().lang('All categories');
}
// Create widget
@@ -3758,11 +3756,11 @@ export class et2_nextmatch_header_bar extends et2_DOMWidget implements et2_INext
});
}
// Sometimes the filter does not display the current value
- // Call sync to try to get it to display
+ // Work-around: Request another update to get it to display
select.updateComplete.then(async() =>
{
await select.updateComplete;
- select.syncItemsFromValue();
+ select.requestUpdate("value");
})
return select;
}
diff --git a/api/js/etemplate/et2_extension_nextmatch_actions.js b/api/js/etemplate/et2_extension_nextmatch_actions.js
index f0fcfb8f46..0bcc5888a6 100644
--- a/api/js/etemplate/et2_extension_nextmatch_actions.js
+++ b/api/js/etemplate/et2_extension_nextmatch_actions.js
@@ -10,6 +10,7 @@
* @copyright EGroupware GmbH 2012-2021
*/
+import {EgwActionManager} from "../egw_action/EgwActionManager";
/**
* Default action for nextmatch rows, runs action specified _action.data.nm_action: see nextmatch_widget::egw_actions()
@@ -84,7 +85,7 @@ export function nm_action(_action, _senders, _target, _ids)
}
//console.log(_action); console.log(_senders);
- var mgr= _action.getManager();
+ let mgr = _action instanceof EgwActionManager ? _action : _action.getManager();
var url = '#';
if (typeof _action.data.url != 'undefined')
diff --git a/api/js/etemplate/et2_widget_ajaxSelect.ts b/api/js/etemplate/et2_widget_ajaxSelect.ts
index e6b9cc49bb..dd1dc56f2f 100644
--- a/api/js/etemplate/et2_widget_ajaxSelect.ts
+++ b/api/js/etemplate/et2_widget_ajaxSelect.ts
@@ -20,8 +20,8 @@ import {et2_register_widget, WidgetConfig} from "./et2_core_widget";
import {et2_inputWidget} from "./et2_core_inputWidget";
import {ClassWithAttributes} from "./et2_core_inheritance";
import {et2_valueWidget} from "./et2_core_valueWidget";
-import {et2_selectbox} from "./et2_widget_selectbox";
import {et2_IDetachedDOM} from "./et2_core_interfaces";
+import {find_select_options} from "./Et2Select/FindSelectOptions";
/**
* Using AJAX, this widget allows a type-ahead find similar to a ComboBox, where as the user enters information,
@@ -122,7 +122,7 @@ export class et2_ajaxSelect extends et2_inputWidget
delay: 100,
source: this.options.get_rows ?
this.options.get_rows :
- et2_selectbox.find_select_options(this, this.options.values),
+ find_select_options(this, this.options.values),
select: function(event, ui) {
widget.value = ui.item[widget.options.id_field];
if(widget.options.get_title)
diff --git a/api/js/etemplate/et2_widget_countdown.ts b/api/js/etemplate/et2_widget_countdown.ts
index c7458fed3f..0e8cc513fd 100644
--- a/api/js/etemplate/et2_widget_countdown.ts
+++ b/api/js/etemplate/et2_widget_countdown.ts
@@ -101,6 +101,12 @@ export class et2_countdown extends et2_valueWidget {
if (isNaN(_time)) return;
super.set_value(_time);
+
+ if(this.timer)
+ {
+ clearInterval(this.timer);
+ }
+
this.time = new Date();
this.time.setSeconds(this.time.getSeconds() + parseInt(_time));
diff --git a/api/js/etemplate/et2_widget_dialog.ts b/api/js/etemplate/et2_widget_dialog.ts
index b35f9be625..7fdf721b6e 100644
--- a/api/js/etemplate/et2_widget_dialog.ts
+++ b/api/js/etemplate/et2_widget_dialog.ts
@@ -106,16 +106,6 @@ export class et2_dialog extends Et2Dialog
}
}
- handleClose(ev : PointerEvent)
- {
- // revert the moved container back to its original position in order to be able to teardown the overlay properly
- if(this.appendTo)
- {
- document.getElementsByClassName('global-overlays__overlay-container')[0].appendChild(this);
- }
- super.handleClose(ev);
- }
-
/**
* @deprecated
* @returns {any}
diff --git a/api/js/etemplate/et2_widget_selectAccount.ts b/api/js/etemplate/et2_widget_selectAccount.ts
index 0569ea3c20..2cc11f682a 100644
--- a/api/js/etemplate/et2_widget_selectAccount.ts
+++ b/api/js/etemplate/et2_widget_selectAccount.ts
@@ -12,8 +12,8 @@
* @copyright Nathan Gray 2012
*/
-import type {Et2SelectAccountReadonly} from "./Et2Select/Et2SelectReadonly";
-import type {Et2SelectAccount} from "./Et2Select/Et2SelectAccount";
+import type {Et2SelectAccountReadonly} from "./Et2Select/Select/Et2SelectReadonly";
+import type {Et2SelectAccount} from "./Et2Select/Select/Et2SelectAccount";
/**
* @deprecated use Et2SelectAccount
diff --git a/api/js/etemplate/et2_widget_selectbox.ts b/api/js/etemplate/et2_widget_selectbox.ts
index 16a2e6487b..f0e131616a 100644
--- a/api/js/etemplate/et2_widget_selectbox.ts
+++ b/api/js/etemplate/et2_widget_selectbox.ts
@@ -11,7 +11,7 @@
*/
import {Et2Select} from "./Et2Select/Et2Select";
-import {Et2SelectReadonly} from "./Et2Select/Et2SelectReadonly";
+import {Et2SelectReadonly} from "./Et2Select/Select/Et2SelectReadonly";
/**
* @deprecated use Et2Select
diff --git a/api/js/etemplate/et2_widget_taglist.ts b/api/js/etemplate/et2_widget_taglist.ts
index e6638b05da..0f5511f93c 100644
--- a/api/js/etemplate/et2_widget_taglist.ts
+++ b/api/js/etemplate/et2_widget_taglist.ts
@@ -9,11 +9,13 @@
* @copyright Nathan Gray 2013
*/
-import type {Et2Select, Et2SelectState} from "./Et2Select/Et2Select";
-import type {Et2SelectAccount} from "./Et2Select/Et2SelectAccount";
-import type {Et2SelectEmail} from "./Et2Select/Et2SelectEmail";
-import type {Et2SelectCategory} from "./Et2Select/Et2SelectCategory";
-import type {Et2SelectThumbnail} from "./Et2Select/Et2SelectThumbnail";
+import type {Et2Select} from "./Et2Select/Et2Select";
+import type {Et2SelectAccount} from "./Et2Select/Select/Et2SelectAccount";
+import type {Et2SelectEmail} from "./Et2Select/Select/Et2SelectEmail";
+import type {Et2SelectCategory} from "./Et2Select/Select/Et2SelectCategory";
+import type {Et2SelectThumbnail} from "./Et2Select/Select/Et2SelectThumbnail";
+
+import {Et2SelectState} from "./Et2Select/Select/Et2SelectState";
/**
* @deprecated use Et2Select
diff --git a/api/js/etemplate/etemplate2.ts b/api/js/etemplate/etemplate2.ts
index 9876a4325c..0c002bf252 100644
--- a/api/js/etemplate/etemplate2.ts
+++ b/api/js/etemplate/etemplate2.ts
@@ -71,12 +71,7 @@ import './Et2Nextmatch/Headers/EntryHeader';
import './Et2Nextmatch/Headers/FilterHeader';
import './Et2Select/Et2Listbox';
import './Et2Select/Et2Select';
-import './Et2Select/Et2SelectAccount';
-import './Et2Select/Et2SelectCategory';
-import './Et2Select/Et2SelectCountry';
-import './Et2Select/Et2SelectEmail';
-import './Et2Select/Et2SelectReadonly';
-import './Et2Select/Et2SelectThumbnail'
+import './Et2Select/SelectTypes';
import './Et2Select/Tag/Et2Tag';
import './Et2Select/Tag/Et2CategoryTag';
import './Et2Select/Tag/Et2EmailTag';
@@ -104,6 +99,7 @@ import "./Et2Vfs/Et2VfsMime";
import "./Et2Vfs/Et2VfsUid";
import "./Et2Textbox/Et2Password";
import './Et2Textbox/Et2Searchbox';
+import "./Et2TreeWidget/Et2Tree";
/* Include all widget classes here, we only care about them registering, not importing anything*/
import './et2_widget_vfs'; // Vfs must be first (before et2_widget_file) due to import cycle
@@ -458,6 +454,10 @@ export class etemplate2
this.close_prompt = this._close_changed_prompt.bind(this);
window.addEventListener("beforeunload", this.close_prompt);
}
+ else if (window == egw_topWindow())
+ {
+ window.addEventListener("beforeunload", this.destroy_session);
+ }
if(this._etemplate_exec_id)
{
this.destroy_session = jQuery.proxy(function(ev)
diff --git a/api/js/jquery/jquery.noconflict.js b/api/js/jquery/jquery.noconflict.js
index e13c091795..a63129e50e 100644
--- a/api/js/jquery/jquery.noconflict.js
+++ b/api/js/jquery/jquery.noconflict.js
@@ -7,5 +7,6 @@
* @subpackage ajax
* @author Ralf Becker
*/
+import "../../../vendor/bower-asset/jquery/dist/jquery.min.js";
jQuery.noConflict();
\ No newline at end of file
diff --git a/api/js/jsapi/egw_calendar.js b/api/js/jsapi/egw_calendar.js
index 3e3e0cb858..e2e44f2f74 100644
--- a/api/js/jsapi/egw_calendar.js
+++ b/api/js/jsapi/egw_calendar.js
@@ -130,7 +130,7 @@ egw.extend('calendar', egw.MODULE_GLOBAL, function (_app, _wnd)
// No country selected causes error, so skip if it's missing
if (!egw || !egw.preference('country', 'common'))
{
- return {};
+ return Promise.resolve({});
}
if (typeof _holiday_cache[year] === 'undefined')
diff --git a/api/js/jsapi/egw_links.js b/api/js/jsapi/egw_links.js
index 4b1dd0bcc0..80930fecb2 100644
--- a/api/js/jsapi/egw_links.js
+++ b/api/js/jsapi/egw_links.js
@@ -506,40 +506,59 @@ egw.extend('links', egw.MODULE_GLOBAL, function()
link_quick_add: function(_parent)
{
// check if quick-add selectbox is already there, only create it again if not
- if (document.getElementById('quick_add_selectbox') || egwIsMobile()) return;
+ if (document.getElementById('quick_add_selectbox') || egwIsMobile())
+ {
+ return;
+ }
+ // Use node as the trigger
+ const parent = document.getElementById(_parent);
const select = document.createElement('et2-select');
select.setAttribute('id', 'quick_add_selectbox');
- document.getElementById(_parent).append(select);
+ // Empty label is required to clear value, but we hide it
+ select.emptyLabel = "Select";
+ select.placement = "bottom end";
+ parent.append(select);
+ const plus = parent.querySelector("span");
+ plus.addEventListener("click", () => {
+ select.show();
+ })
+
// bind change handler
select.addEventListener('change', () =>
{
- if (select.value) this.open('', select.value, 'add', {}, undefined, select.value, true);
+ if (select.value)
+ {
+ this.open('', select.value, 'add', {}, undefined, select.value, true);
+ }
select.value = '';
});
// need to load common translations for app-names
this.langRequire(window, [{app: 'common', lang: this.preference('lang')}], () =>
{
- let options = [{value:'', label: this.lang('Select one...')}];
+ let options = [];
const apps = this.link_app_list('add');
for(let app in apps)
{
- if(this.link_get_registry(app, 'no_quick_add'))
+ if (this.link_get_registry(app, 'no_quick_add'))
{
continue;
}
options.push({
- value:app,
- label:this.lang(this.link_get_registry(app,'entry') || apps[app]),
+ value: app,
+ label: this.lang(this.link_get_registry(app, 'entry') || apps[app]),
icon: this.image('navbar', app)
});
}
select.select_options = options;
+ /*
select.updateComplete.then(() =>
{
- select.dropdown.trigger.style.visibility = 'hidden';
- select.dropdown.trigger.style.height = '0px';
+ // Adjust popup positioning to account for hidden select parts
+ select.popup.distance = -32;
});
+
+ */
});
},
diff --git a/api/js/jsapi/egw_user.js b/api/js/jsapi/egw_user.js
index b1e7c3303e..cf49b6b924 100644
--- a/api/js/jsapi/egw_user.js
+++ b/api/js/jsapi/egw_user.js
@@ -117,7 +117,7 @@ egw.extend('user', egw.MODULE_GLOBAL, function()
{
if (typeof data[t] === "object")
{
- accountStore[t] = jQuery.extend(true, [], data[t] || []);
+ accountStore[t] = (Array.isArray(data[t]) ? data[t]:Object.values(data[t]) ?? []).map(a => {a.value = ""+a.value; return a});
}
}
}
diff --git a/api/setup/setup.inc.php b/api/setup/setup.inc.php
index e8ebe66570..c5531fc6a1 100644
--- a/api/setup/setup.inc.php
+++ b/api/setup/setup.inc.php
@@ -11,7 +11,7 @@
/* Basic information about this app */
$setup_info['api']['name'] = 'api';
$setup_info['api']['title'] = 'EGroupware API';
-$setup_info['api']['version'] = '23.1.004';
+$setup_info['api']['version'] = '23.1.005';
$setup_info['api']['versions']['current_header'] = '1.29';
// maintenance release in sync with changelog in doc/rpm-build/debian.changes
$setup_info['api']['versions']['maintenance_release'] = '23.1.20231110';
diff --git a/api/setup/tables_current.inc.php b/api/setup/tables_current.inc.php
index 8764ae01b5..82ecacb8bc 100644
--- a/api/setup/tables_current.inc.php
+++ b/api/setup/tables_current.inc.php
@@ -325,11 +325,13 @@ $phpgw_baseline = array(
'fs_modifier' => array('type' => 'int','meta' => 'user','precision' => '4'),
'fs_active' => array('type' => 'bool','nullable' => False,'default' => 't'),
'fs_content' => array('type' => 'blob'),
- 'fs_link' => array('type' => 'varchar','precision' => '255')
+ 'fs_link' => array('type' => 'varchar','precision' => '255'),
+ 'fs_s3_flags' => array('type' => 'int','precision' => '1','default' => '0'),
+ 'fs_aes_key' => array('type' => 'binary','precision' => '32')
),
'pk' => array('fs_id'),
'fk' => array(),
- 'ix' => array(array('fs_dir','fs_active','fs_name(16)')),
+ 'ix' => array('fs_s3_flags',array('fs_dir','fs_active')),
'uc' => array()
),
'egw_locks' => array(
@@ -397,12 +399,10 @@ $phpgw_baseline = array(
'share_writable' => array('type' => 'int','precision' => '1','nullable' => False,'default' => '0','comment' => '0=readable, 1=writable'),
'share_with' => array('type' => 'varchar','precision' => '4096','comment' => 'email addresses, comma seperated'),
'share_passwd' => array('type' => 'varchar','precision' => '128','comment' => 'optional password-hash'),
- 'share_pw_reversable' => array('type' => 'varchar', 'precision' => '128',
- 'comment' => 'optional reversible password'),
- 'share_encryption' => array('type' => 'int', 'nullable' => true,
- 'comment' => 'Type of encryption, user or system (See Credentials)'),
- 'share_modified' => array('type' => 'timestamp', 'precision' => '8', 'nullable' => False),
- 'share_modifier' => array('type' => 'int', 'meta' => 'user', 'precision' => '4'),
+ 'share_pw_reversable' => array('type' => 'varchar','precision' => '128','comment' => 'optional reversible password'),
+ 'share_encryption' => array('type' => 'int','nullable' => True,'comment' => 'Type of encryption, user or system (See Credentials)'),
+ 'share_modified' => array('type' => 'timestamp','precision' => '8','nullable' => False),
+ 'share_modifier' => array('type' => 'int','meta' => 'user','precision' => '4'),
'share_created' => array('type' => 'timestamp','nullable' => False,'comment' => 'creation date'),
'share_last_accessed' => array('type' => 'timestamp','comment' => 'last access of share')
),
@@ -552,4 +552,4 @@ $phpgw_baseline = array(
'ix' => array('account_id'),
'uc' => array()
)
-);
+);
\ No newline at end of file
diff --git a/api/setup/tables_update.inc.php b/api/setup/tables_update.inc.php
index a215b405e9..bb85341119 100644
--- a/api/setup/tables_update.inc.php
+++ b/api/setup/tables_update.inc.php
@@ -932,4 +932,26 @@ function api_upgrade23_1_003()
array('type' => 'int', 'meta' => 'user', 'precision' => '4')
);
return $GLOBALS['setup_info']['api']['currentver'] = '23.1.004';
+}
+
+/**
+ * Columns to support S3 storage for files
+ *
+ * @return string
+ */
+function api_upgrade23_1_004()
+{
+ $GLOBALS['egw_setup']->oProc->AddColumn('egw_sqlfs','fs_s3_flags',array(
+ 'type' => 'int',
+ 'precision' => '1',
+ 'default' => '0'
+ ));
+ $GLOBALS['egw_setup']->oProc->CreateIndex('egw_sqlfs', 'fs_s3_flags');
+
+ $GLOBALS['egw_setup']->oProc->AddColumn('egw_sqlfs','fs_aes_key',array(
+ 'type' => 'binary',
+ 'precision' => '32'
+ ));
+
+ return $GLOBALS['setup_info']['api']['currentver'] = '23.1.005';
}
\ No newline at end of file
diff --git a/api/src/Accounts.php b/api/src/Accounts.php
index 517ed968fd..15e54a29fb 100644
--- a/api/src/Accounts.php
+++ b/api/src/Accounts.php
@@ -394,11 +394,13 @@ class Accounts
case 'firstname':
case 'firstall':
case 'firstgroup':
+ case 'firstemail':
$order = 'account_firstname,account_lastname';
break;
case 'lastname':
case 'lastall':
case 'firstgroup':
+ case 'lastemail':
$order = 'account_lastname,account_firstname';
break;
default:
@@ -608,6 +610,14 @@ class Accounts
$group = Accounts::id2name($lid, 'account_primary_group');
$name = $lastname . $delimiter . $firstname . ($is_group ? '' : ' ('.Accounts::id2name($group).')');
break;
+ case 'firstemail':
+ $email = Accounts::id2name($lid, 'account_email');
+ $name = $firstname . ' ' . $lastname . ($email ? ' [' . $email . ']' : '');
+ break;
+ case 'lastemail':
+ $email = Accounts::id2name($lid, 'account_email');
+ $name = $lastname . $delimiter . $firstname . ($email ? ' [' . $email . ']' : '');
+ break;
case 'firstinital':
$name = $firstname.' '.mb_substr($lastname, 0, 1).'.';
break;
diff --git a/api/src/Accounts/Import.php b/api/src/Accounts/Import.php
index 13a8c96a3d..af1b790be7 100644
--- a/api/src/Accounts/Import.php
+++ b/api/src/Accounts/Import.php
@@ -273,7 +273,8 @@ class Import
$start = ['', 500, &$cookie]; // cookie must be a reference!
do
{
- foreach ($this->contacts->search('', false, '', 'account_lid', '', '', 'AND', $start, $filter) as $contact)
+ $contact = $reconnected = null;
+ foreach ($this->contacts->search('', false, '', ['account_lid', 'jpegphoto'], '', '', 'AND', $start, $filter) as $contact)
{
// if we have a regexp to filter the DN, continue on non-match
if (!empty($GLOBALS['egw_info']['server']['account_import_dn_regexp']) &&
@@ -287,7 +288,9 @@ class Import
$last_modified = $contact['modified'];
}
$account = $this->accounts->read($contact['account_id']);
- $this->logger(++$num.'. User: '.json_encode($contact + $account, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), 'debug');
+ // do NOT log binary content of image
+ $hide_binary = ['jpegphoto' => $contact['jpegphoto'] ? bytes($contact['jpegphoto']).' bytes binary data' : null];
+ $this->logger(++$num.'. User: '.json_encode($hide_binary + $contact + $account, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), 'debug');
// check if account exists in sql
if (!($account_id = $this->accounts_sql->name2id($account['account_lid'])))
{
@@ -542,8 +545,15 @@ class Import
// remember the users we imported, to be able to delete the ones we dont
unset($sql_users[$account_id]);
}
+ /* check if connection was somehow lost / timed out and reconnect
+ if ($initial_import && !isset($contact) && ldap_errno($this->contacts->ds) === -1)
+ {
+ $this->contacts->ds = $this->accounts->ldap_connection(true);
+ $reconnected = true;
+ $this->logger("Reconnected to LDAP server", 'info');
+ }*/
}
- while ($start[2] !== '');
+ while ($reconnected || $start[2] !== '');
if ($set_members)
{
diff --git a/api/src/CalDAV/IcalIterator.php b/api/src/CalDAV/IcalIterator.php
index ba519fbbaf..0abecbd40d 100644
--- a/api/src/CalDAV/IcalIterator.php
+++ b/api/src/CalDAV/IcalIterator.php
@@ -166,8 +166,29 @@ class IcalIterator extends Horde_Icalendar implements \Iterator
// check if end of container reached
if ($this->container && $line && substr($line,0,4+strlen($this->base)) === 'END:'.$this->base)
{
- $this->unread_line($line); // put back end-of-container, to continue to return false
- $line = false;
+ // But maybe there's another one after?
+ // Try to advance to beginning of next container
+ $just_checking = [];
+ while(($next_line = $this->read_line()) && substr($next_line, 0, 6 + strlen($this->base)) !== 'BEGIN:' . $this->base)
+ {
+ $just_checking[] = $next_line;
+ }
+ if(!$next_line)
+ {
+ // No containers after
+ $this->unread_line($line); // put back end-of-container, to continue to return false
+ foreach($just_checking as $check_line)
+ {
+ $this->unread_line($check_line);
+ }
+ return false;
+ }
+ // Found start of another container, quietly cross into it and advance
+ while(($line = $this->read_line()) && strcasecmp(substr($line, 0, 6), 'BEGIN:') !== 0)
+ {
+ // ignore it
+ }
+ return $line;
}
//error_log(__METHOD__."() returning ".($line === false ? 'FALSE' : "'$line'"));
diff --git a/api/src/Config.php b/api/src/Config.php
index b7809d5c6f..79ae07e0dd 100755
--- a/api/src/Config.php
+++ b/api/src/Config.php
@@ -322,8 +322,10 @@ class Config
/**
* Initialise class: reference to db and self::$configs cache
+ *
+ * @param bool $force_reload
*/
- public static function init_static()
+ public static function init_static(bool $force_reload=false)
{
// we use a reference here (no clone), as we no longer use Db::row() or Db::next_record()!
if (isset($GLOBALS['egw_setup']) && $GLOBALS['egw_setup']->db instanceof Db)
@@ -335,7 +337,7 @@ class Config
self::$db = $GLOBALS['egw']->db;
}
// if item is not cached or cache is not looking alright --> query config from database
- if (!(self::$configs = Cache::getInstance(__CLASS__, 'configs')) || !is_array(self::$configs['phpgwapi']))
+ if ($force_reload || !(self::$configs = Cache::getInstance(__CLASS__, 'configs')) || !is_array(self::$configs['phpgwapi']))
{
self::$configs = array();
foreach(self::$db->select(self::TABLE,'*',false,__LINE__,__FILE__) as $row)
diff --git a/api/src/Contacts/Ads.php b/api/src/Contacts/Ads.php
index b35e360116..f995f428bb 100644
--- a/api/src/Contacts/Ads.php
+++ b/api/src/Contacts/Ads.php
@@ -144,6 +144,7 @@ class Ads extends Ldap
$this->all_attributes = array_merge($this->all_attributes,array_values($attributes));
}
$this->all_attributes = array_values(array_unique($this->all_attributes));
+ $this->all_attributes[] = 'thumbnailphoto'; // read as alternative to jpegphoto
$this->charset = Api\Translation::charset();
}
@@ -226,7 +227,9 @@ class Ads extends Ldap
(isset ($_contact_id['id']) ? $_contact_id['id'] : $_contact_id['uid']);
try {
- $rows = $this->_searchLDAP($this->allContactsDN, $filter = $this->id_filter($contact_id), $this->all_attributes, Ldap::ALL);
+ $start = null;
+ $rows = $this->_searchLDAP($this->allContactsDN, $this->id_filter($contact_id), $this->all_attributes, Ldap::ALL,
+ null, null, $start, true);
}
catch (Api\Exception\AssertionFailed $e) {
$rows = null;
diff --git a/api/src/Contacts/Ldap.php b/api/src/Contacts/Ldap.php
index f8a850d7eb..ea3d222f06 100644
--- a/api/src/Contacts/Ldap.php
+++ b/api/src/Contacts/Ldap.php
@@ -516,8 +516,9 @@ class Ldap
if (is_array($contact_id)) $contact_id = isset ($contact_id['id']) ? $contact_id['id'] : $contact_id['uid'];
$filter = $this->id_filter($contact_id);
}
- $rows = $this->_searchLDAP($this->allContactsDN,
- $filter, $this->all_attributes, self::ALL, array('_posixaccount2egw'));
+ $start = null;
+ $rows = $this->_searchLDAP($this->allContactsDN, $filter, $this->all_attributes, self::ALL,
+ ['_posixaccount2egw'], null, $start, true);
return $rows ? $rows[0] : false;
}
@@ -821,7 +822,7 @@ class Ldap
function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false)
{
//error_log(__METHOD__."(".array2string($criteria).", ".array2string($only_keys).", '$order_by', ".array2string($extra_cols).", '$wildcard', '$empty', '$op', ".array2string($start).", ".array2string($filter).")");
- unset($only_keys, $extra_cols, $empty, $join, $need_full_no_count); // not used, but required by function signature
+ $read_photo = $extra_cols ? in_array('jpegphoto', is_array($extra_cols) ? $extra_cols : explode(',', $extra_cols)) : false;
if (is_array($filter['owner']))
{
@@ -955,7 +956,7 @@ class Ldap
$colFilter = $this->_colFilter($filter);
$ldapFilter = "(&$objectFilter$searchFilter$colFilter$datefilter)";
//error_log(__METHOD__."(".array2string($criteria).", ".array2string($only_keys).", '$order_by', ".array2string($extra_cols).", '$wildcard', '$empty', '$op', ".array2string($start).", ".array2string($filter).") --> ldapFilter='$ldapFilter'");
- if (!($rows = $this->_searchLDAP($searchDN, $ldapFilter, $this->all_attributes, $addressbookType, [], $order_by, $start)))
+ if (!($rows = $this->_searchLDAP($searchDN, $ldapFilter, $this->all_attributes, $addressbookType, [], $order_by, $start, $read_photo)))
{
return $rows;
}
@@ -1212,9 +1213,10 @@ class Ldap
* @param array $_skipPlugins =null schema-plugins to skip
* @param string $order_by sql order string eg. "contact_email ASC"
* @param null|int|array $start [$start, $num_rows], on return null, if result sorted and limited by server
+ * @param bool $read_photo true: return the binary content of the image, false: return true or false if there is an image or not
* @return array/boolean with eGW contacts or false on error
*/
- function _searchLDAP($_ldapContext, $_filter, $_attributes, $_addressbooktype, array $_skipPlugins=null, $order_by=null, &$start=null)
+ function _searchLDAP($_ldapContext, $_filter, $_attributes, $_addressbooktype, array $_skipPlugins=null, $order_by=null, &$start=null, bool $read_photo=false)
{
$_attributes[] = 'entryUUID';
$_attributes[] = 'objectClass';
@@ -1300,6 +1302,11 @@ class Ldap
{
if (!is_int($i)) continue; // eg. count
+ if ($read_photo)
+ {
+ $result_entry = $i ? ldap_next_entry($this->ds, $result_entry) : ldap_first_entry($this->ds, $result);
+ }
+
$contact = array(
'id' => $entry['uid'][0] ?? $entry['entryuuid'][0],
'dn' => $entry['dn'],
@@ -1329,15 +1336,23 @@ class Ldap
$this->$objectclass2egw($contact,$entry);
}
}
- // read binary jpegphoto only for one result == call by read
- if ($this->total == 1 && isset($entry['jpegphoto'][0]))
+ // read photos from both jpegphoto and thumbnailphoto
+ if (isset($entry[$photo='jpegphoto'][0]) || isset($entry[$photo='thumbnailphoto'][0]))
{
- $bin = ldap_get_values_len($this->ds,ldap_first_entry($this->ds,$result),'jpegphoto');
- $contact['jpegphoto'] = $bin[0];
+ // read binary jpegphoto only for one result == call by read
+ if ($read_photo)
+ {
+ $bin = ldap_get_values_len($this->ds, $result_entry, $photo);
+ $contact['jpegphoto'] = $bin[0];
+ }
+ else
+ {
+ $contact['jpegphoto'] = true;
+ }
}
else
{
- $contact['jpegphoto'] = isset($entry['jpegphoto'][0]);
+ $contact['jpegphoto'] = false;
}
$matches = null;
if(preg_match('/cn=([^,]+),'.preg_quote($this->personalContactsDN,'/').'$/i',$entry['dn'],$matches))
diff --git a/api/src/Db.php b/api/src/Db.php
index 8ffbd26677..1f15ef54ab 100644
--- a/api/src/Db.php
+++ b/api/src/Db.php
@@ -37,9 +37,9 @@ if(empty($GLOBALS['egw_info']['server']['db_type']))
* $cnt = $db->query("SELECT COUNT(*) FROM ...")->fetchColumn($column_num=0);
*
* To fetch a next (single) row, you can use:
- * $row = $db->query("SELECT COUNT(*) FROM ...")->fetch($fetchmod=null);
+ * $row = $db->query("SELECT * FROM ...")->fetch($fetchmod=null);
*
- * Api\Db allows to use exceptions to catch sql-erros, not existing tables or failure to connect to the database, eg.:
+ * Api\Db allows to use exceptions to catch sql-errors, not existing tables or failure to connect to the database, eg.:
* try {
* $this->db->connect();
* $num_config = $this->db->select(config::TABLE,'COUNT(config_name)',false,__LINE__,__FILE__)->fetchColumn();
@@ -1631,8 +1631,8 @@ class Db
// MySQL and MariaDB not 10.1 need 4-byte utf8 chars replaced with our default utf8 charset
// (MariaDB 10.1 does the replacement automatic, 10.0 cuts everything off behind and MySQL gives an error)
// (MariaDB 10.3 gives an error too: Incorrect string value: '\xF0\x9F\x98\x8A\x0AW...')
- // Changing charset to utf8mb4 requires schema update, shortening of some indexes and probably have negative impact on performace!
- if (isset($value) && substr($this->Type, 0, 5) === 'mysql')
+ // Changing charset to utf8mb4 requires schema update, shortening of some indexes and probably have negative impact on performance!
+ if (isset($value) && substr($this->Type, 0, 5) === 'mysql' && !in_array($type, ['binary', 'blob']))
{
$value = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $value);
}
diff --git a/api/src/Db/Backup.php b/api/src/Db/Backup.php
index c4b1a9983f..506f7fbd9c 100644
--- a/api/src/Db/Backup.php
+++ b/api/src/Db/Backup.php
@@ -31,25 +31,25 @@ class Backup
*
* @var Api\Db\Schema
*/
- var $schema_proc;
+ protected $schema_proc;
/**
* Reference to ADOdb (connection) object
*
* @var ADOConnection
*/
- var $adodb;
+ protected $adodb;
/**
* DB schemas, as array tablename => schema
*
* @var array
*/
- var $schemas = array();
+ protected $schemas = array();
/**
* Tables to exclude from the backup: sessions, diverse caches which get automatic rebuild
*
* @var array
*/
- var $exclude_tables = array(
+ public $exclude_tables = array(
'egw_sessions','egw_app_sessions','phpgw_sessions','phpgw_app_sessions', // eGW's session-tables
'phpgw_anglemail', // email's cache
'egw_felamimail_cache','egw_felamimail_folderstatus','phpgw_felamimail_cache','phpgw_felamimail_folderstatus', // felamimail's cache
@@ -60,13 +60,13 @@ class Backup
*
* @var string|boolean
*/
- var $system_tables = false;
+ public $system_tables = false;
/**
* Regular expression to identify eGW tables => if set only they are used
*
* @var string|boolean
*/
- var $egw_tables = false;
+ public $egw_tables = false;
/**
* Regular expression to identify a Guacamole table OR view
*/
@@ -76,25 +76,25 @@ class Backup
*
* @var string
*/
- var $backup_dir;
+ public $backup_dir;
/**
* Minimum number of backup files to keep. Zero for: Disable cleanup.
*
* @var integer
*/
- var $backup_mincount;
+ public $backup_mincount;
/**
* Backup Files config value, will be overwritten by the availability of the ZibArchive libraries
*
* @var boolean
*/
- var $backup_files = false ;
+ public $backup_files = false ;
/**
* Reference to schema_proc's Api\Db object
*
* @var Api\Db
*/
- var $db;
+ protected $db;
/**
* Constructor
@@ -127,7 +127,7 @@ class Backup
}
if (!($this->backup_dir = $this->db->query("SELECT config_value FROM {$GLOBALS['egw_setup']->config_table} WHERE config_app='phpgwapi' AND config_name='backup_dir'",__LINE__,__FILE__)->fetchColumn()))
{
- $this->backup_dir = $this->files_dir.'/db_backup';
+ $this->backup_dir = dirname($this->files_dir).'/backup';
}
$this->charset = $this->db->query("SELECT config_value FROM {$GLOBALS['egw_setup']->config_table} WHERE config_app='phpgwapi' AND config_name='system_charset'",__LINE__,__FILE__)->fetchColumn();
$this->api_version = $this->db->select($GLOBALS['egw_setup']->applications_table,'app_version',array('app_name'=>array('api','phpgwapi')),
@@ -143,7 +143,7 @@ class Backup
{
if (!($this->backup_dir = $GLOBALS['egw_info']['server']['backup_dir']))
{
- $this->backup_dir = $GLOBALS['egw_info']['server']['files_dir'].'/db_backup';
+ $this->backup_dir = dirname($GLOBALS['egw_info']['server']['files_dir']).'/backup';
}
$this->files_dir = $GLOBALS['egw_info']['server']['files_dir'];
$this->backup_mincount = $GLOBALS['egw_info']['server']['backup_mincount'];
@@ -179,65 +179,66 @@ class Backup
/**
* Opens the backup-file using the highest available compression
*
- * @param $name =false string/boolean filename to use, or false for the default one
- * @param $reading =false opening for reading ('rb') or writing ('wb')
- * @return string/resource/zip error-msg of file-handle
+ * @param ?string $name =false string/boolean filename to use, or false for the default one
+ * @param bool $reading =false opening for reading ('rb') or writing ('wb')
+ * @param bool $un_compress true: opening file with (un)compression wrapper, false: opening as it is for download
+ * @return resource file-handle
+ * @throws \Exception on error
*/
- function fopen_backup($name=false,$reading=false)
+ public function fopen_backup(string $name=null, bool $reading=false, bool $un_compress=true)
{
- //echo "function fopen_backup($name,$reading) "; // !
+ if ($name)
+ {
+ $name = $this->backup_dir.'/'.basename($name);
+ }
if (!$name)
{
- //echo '-> !$name '; // !
if (empty($this->backup_dir) || !is_writable($this->backup_dir))
{
$this->log($name, $reading, null, lang("backupdir '%1' is not writeable by the webserver", $this->backup_dir));
- return lang("backupdir '%1' is not writeable by the webserver",$this->backup_dir);
+ throw new Exception(lang("backupdir '%1' is not writeable by the webserver", $this->backup_dir));
}
$name = $this->backup_dir.'/db_backup-'.date('YmdHi');
}
- else // remove the extension, to use the correct wrapper based on the extension
+ // remove the extension, to use the correct wrapper based on the extension
+ elseif ($un_compress)
{
- //echo '-> else '; // !
$name = preg_replace('/\.(bz2|gz)$/i','',$name);
}
$mode = $reading ? 'rb' : 'wb';
- list( , $type) = explode('.', basename($name));
- if($type == 'zip' && $reading && $this->backup_files)
+ $lang_mode = $reading ? lang("reading") : lang("writing");
+ [, $type] = explode('.', basename($name));
+ if($un_compress && $type == 'zip' && $reading && $this->backup_files)
{
//echo '-> $type == "zip" && $reading '; // !
if(!class_exists('ZipArchive', false))
{
$this->backup_files = false;
$this->log($name, $reading, null, lang("Cant open %1, needs ZipArchive", $name));
- return lang("Cant open %1, needs ZipArchive", $name)." \n";
+ throw new \Exception(lang("Cant open %1, needs ZipArchive", $name));
}
if(!($f = fopen($path=$name, $mode)))
{
- //echo ' -> !($f = fopen($name, $mode)) '; // !
- $lang_mode = $reading ? lang("reading") : lang("writing");
$this->log($name, $reading, null, lang("Cant open '%1' for %2", $name, $lang_mode));
- return lang("Cant open '%1' for %2", $name, $lang_mode)." ";
+ throw new \Exception(lang("Cant open '%1' for %2", $name, $lang_mode));
}
}
- elseif (class_exists('ZipArchive', false) && !$reading && $this->backup_files)
+ elseif ($un_compress && class_exists('ZipArchive', false) && !$reading && $this->backup_files)
{
//echo '-> (new ZipArchive) != NULL && !$reading; '.$name.' '; // !
if (!($f = fopen($path=$name, $mode)))
{
- $lang_mode = $reading ? lang("reading") : lang("writing");
$this->log($name, $reading, null, lang("Cant open '%1' for %2", $name, $lang_mode));
- return lang("Cant open '%1' for %2", $name, $lang_mode)." ";
+ throw new \Exception(lang("Cant open '%1' for %2", $name, $lang_mode));
}
}
- elseif (!($f = fopen('compress.bzip2://'.($path=$name.'.bz2'), $mode)) &&
- !($f = fopen('compress.zlib://'.($path=$name.'.gz'),$mode)) &&
- !($f = fopen($path=$name,$mode))
- )
+ elseif (!($un_compress && (
+ ($f = fopen('compress.bzip2://'.($path=$name.'.bz2'), $mode)) ||
+ ($f = fopen('compress.zlib://'.($path=$name.'.gz'),$mode)))) &&
+ !($f = fopen($path=$name,$mode)))
{
- $lang_mode = $reading ? lang("reading") : lang("writing");
$this->log($name, $reading, null, lang("Cant open '%1' for %2", $name, $lang_mode));
- return lang("Cant open '%1' for %2", $name, $lang_mode)." ";
+ throw new \Exception(lang("Cant open '%1' for %2", $name, $lang_mode));
}
// Log start of backup/restore
@@ -334,7 +335,7 @@ class Backup
);
/**
- * Backup all data in the form of a (compressed) csv file
+ * Restore a backup
*
* @param resource $f file opened with fopen for reading
* @param boolean $convert_to_system_charset =true obsolet, it's now allways done
@@ -393,7 +394,7 @@ class Backup
// it could be an old backup
list( , $type) = explode('.', basename($filename));
$dir = $this->files_dir; // $GLOBALS['egw_info']['server']['files_dir'];
- // we may have to clean up old backup - left overs
+ // we may have to clean up old backup - leftovers
if (is_dir($dir.'/database_backup'))
{
self::remove_dir_content($dir.'/database_backup/');
@@ -593,7 +594,10 @@ class Backup
$blobs = array();
foreach($this->schemas[$table]['fd'] as $col => $data)
{
- if ($data['type'] == 'blob') $blobs[] = $col;
+ if (in_array($data['type'], ['blob', 'binary']))
+ {
+ $blobs[] = $col;
+ }
}
// check if we have an old PostgreSQL backup using 't'/'f' for bool values
// --> convert them to MySQL and our new PostgreSQL format of 1/0
@@ -865,6 +869,7 @@ class Backup
case 'timestamp':
break;
case 'blob':
+ case 'binary':
$data = base64_encode($data);
break;
case 'bool': // we use MySQL 0, 1 in csv, not PostgreSQL 't', 'f'
@@ -889,6 +894,7 @@ class Backup
* @param boolean $lock_table =null true: allways, false: never, null: if no primary key
* default of null limits memory usage if there is no primary key, by locking table and use ROW_CHUCK
* @param bool $skip_files_backup =false true: do not backup files, even if config / $this->backup_files is set (used by upgrade)
+ * @return string|true true: on success, string with error-message on failure
* @todo use https://github.com/maennchen/ZipStream-PHP to not assemble all files in memmory
*/
function backup($f, $lock_table=null, bool $skip_files_backup=false)
@@ -1181,7 +1187,7 @@ class Backup
* @param string $file filename
* @param bool|string $restore true: 'Restore', false: 'Backup', string with custom label
* @param bool $start true: start of operation, false: end, null: neither
- * @return void
+ * @param ?string $error_msg optional error-msg to log
*/
public function log(string $file, $restore, bool $start=null, string $error_msg=null)
{
@@ -1228,6 +1234,89 @@ class Backup
error_log("Could NOT open ".self::LOG_FILE.': '.$msg);
}
}
+
+ /**
+ * Move uploaded file to backup-directory
+ *
+ * @param array $file values for keys "tmp_name", "name", "size"
+ * @return ?string success message or null on error
+ */
+ public function upload(array $file) : ?string
+ {
+ if (move_uploaded_file($file['tmp_name'], $filename = $this->backup_dir . '/' . basename($file['name'])))
+ {
+ $msg = lang("succesfully uploaded file %1", $filename . ', ' .
+ sprintf('%3.1f MB (%d)', $file['size'] / (1024 * 1024), $file['size'])) .
+ ', md5=' . md5_file($file['tmp_name']) . ', sha1=' . sha1_file($file['tmp_name']);
+ $this->log($filename, $msg);
+ }
+ return $msg ?? null;
+ }
+
+ /**
+ * Delete a backup
+ *
+ * @param string $name filename
+ * @return string|null success message or null on error
+ */
+ public function delete(string $name) : ?string
+ {
+ if (unlink($file = $this->backup_dir.'/'.basename($name))) // basename to not allow to change the dir
+ {
+ $this->log($file, $msg = lang("backup '%1' deleted", $file));
+ }
+ return $msg ?? null;
+ }
+
+ /**
+ * Rename a backup
+ * @param string $file
+ * @param string $new_name
+ * @return string|null success message or null on error
+ */
+ public function rename(string $file, string $new_name) : ?string
+ {
+ [$ending] = array_reverse(explode('.', $file));
+ [$new_ending, $has_ending] = array_reverse(explode('.', $new_name));
+ if (!$has_ending || $new_ending != $ending)
+ {
+ $new_name .= '.' . $ending;
+ }
+ $file = $this->backup_dir.'/'.basename($file); // basename to not allow to change the dir
+ $ext = preg_match('/(\.gz|\.bz2)+$/i',$file,$matches) ? $matches[1] : '';
+ $new_file = $this->backup_dir.'/'.preg_replace('/(\.gz|\.bz2)+$/i','',basename($new_name)).$ext;
+ if (rename($file, $new_file))
+ {
+ $this->log($new_file, $msg=lang("backup '%1' renamed to '%2'", basename($file), basename($new_file)));
+ }
+ return $msg ?? null;
+ }
+
+ /**
+ * List available backups for restore
+ *
+ * @return array filename => [$ctime, $size] pairs
+ */
+ public function index() : array
+ {
+ $files = [];
+ if (($handle = opendir($this->backup_dir)))
+ {
+ while(($file = readdir($handle)))
+ {
+ if ($file != '.' && $file != '..')
+ {
+ $files[$file] = [
+ 'ctime' => filectime($this->backup_dir.'/'.$file),
+ 'size' => filesize($this->backup_dir.'/'.$file)
+ ];
+ }
+ }
+ closedir($handle);
+ }
+ arsort($files);
+ return $files;
+ }
}
/*
diff --git a/api/src/Db/Schema.php b/api/src/Db/Schema.php
index 9427a08ebb..a63ae5f7b3 100644
--- a/api/src/Db/Schema.php
+++ b/api/src/Db/Schema.php
@@ -130,6 +130,7 @@ class Schema
$this->max_varchar_length = 8000;
break;
case 'mysql':
+ case 'mysqli':
// since MySQL 5.0 65535, but with utf8 and row-size-limit of 64k:
// it's effective 65535/3 - size of other columns, so we use 20000 (mysql silently convert to text anyway)
if ((float)$this->m_odb->ServerInfo['version'] >= 5.0)
@@ -1251,7 +1252,7 @@ class Schema
* The definition might not be as accurate, depending on the DB!
*
* @param string $sTableName table-name
- * @return array|boolean table-defition, like $phpgw_baseline[$sTableName] after including tables_current, or false on error
+ * @return array|boolean table-definition, like $phpgw_baseline[$sTableName] after including tables_current, or false on error
*/
function GetTableDefinition($sTableName)
{
@@ -1307,9 +1308,17 @@ class Schema
}
break;
case 'C': case 'C2':
+ // (var)binary column --> binary
+ if ($column->binary || $column->type === 'varbinary')
+ {
+ $definition['fd'][$name]['type'] = 'binary';
+ }
// ascii columns are reported as varchar
- $definition['fd'][$name]['type'] = $this->m_odb->get_column_attribute($name, $sTableName, true, 'type') === 'ascii' ?
- 'ascii' : 'varchar';
+ else
+ {
+ $definition['fd'][$name]['type'] = $this->m_odb->get_column_attribute($name, $sTableName, true, 'type') === 'ascii' ?
+ 'ascii' : 'varchar';
+ }
$definition['fd'][$name]['precision'] = $column->max_length;
break;
case 'B':
diff --git a/api/src/Egw.php b/api/src/Egw.php
index 676ae161ce..5eb44f7e2d 100644
--- a/api/src/Egw.php
+++ b/api/src/Egw.php
@@ -550,9 +550,10 @@ class Egw extends Egw\Base
*/
public static function on_shutdown($callback, array $args=array())
{
+ //error_log(__METHOD__."(".(((array)$callback)[1]??$callback).", ".json_encode($args).")");
array_unshift($args, $callback);
- // prepend new callback, to run them in oposite order they are registered
+ // prepend new callback, to run them in opposite order they are registered
array_unshift(self::$shutdown_callbacks, $args);
}
@@ -575,12 +576,16 @@ class Egw extends Egw\Base
foreach(self::$shutdown_callbacks as $n => $data)
{
try {
- //error_log(__METHOD__."() running ".array2string($data));
$callback = array_shift($data);
- if (!is_array($callback) || strpos($callback[1], 'session') === false) continue;
+ if (!is_array($callback) || strpos($callback[1], 'session') === false)
+ {
+ //error_log(__METHOD__."() NOT (yet) running ".(((array)$callback)[1]??$callback).json_encode($data));
+ continue;
+ }
+ //error_log(__METHOD__."() running ".(((array)$callback)[1]??$callback).json_encode($data));
call_user_func_array($callback, $data);
}
- catch (\Exception $ex) {
+ catch (\Throwable $ex) {
_egw_log_exception($ex);
}
unset(self::$shutdown_callbacks[$n]);
@@ -607,7 +612,7 @@ class Egw extends Egw\Base
foreach(self::$shutdown_callbacks as $data)
{
try {
- //error_log(__METHOD__."() running ".array2string($data));
+ //error_log(__METHOD__."() running ".(((array)$callback)[1]??$callback).json_encode($data));
$callback = array_shift($data);
call_user_func_array($callback, $data);
}
diff --git a/api/src/Etemplate.php b/api/src/Etemplate.php
index 1eb6acee47..b9f09f373a 100644
--- a/api/src/Etemplate.php
+++ b/api/src/Etemplate.php
@@ -349,6 +349,13 @@ class Etemplate extends Etemplate\Widget\Template
return $sel_options;
}
+ /**
+ * Unvalidated content, use with caution!
+ *
+ * @var array
+ */
+ static public $contentUnvalidated;
+
/**
* Process via Ajax submitted content
*
@@ -388,7 +395,7 @@ class Etemplate extends Etemplate\Widget\Template
'cont' => &self::$request->content,
);
$template->run('validate', array('', $expand, $_content, &$validated), true); // $respect_disabled=true: do NOT validate disabled widgets and children
-
+ self::$contentUnvalidated = $_content;
if ($no_validation)
{
self::$validation_errors = array();
@@ -471,15 +478,18 @@ class Etemplate extends Etemplate\Widget\Template
/**
* Notify server that eT session/request is no longer needed, because user closed window
*
- * @param string $_exec_id
+ * @param string|string[] $_exec_id
*/
static public function ajax_destroy_session($_exec_id)
{
- //error_log(__METHOD__."('$_exec_id')");
- if (($request = Etemplate\Request::read($_exec_id, false)))
+ foreach((array)$_exec_id as $exec_id)
{
- $request->remove_if_not_modified();
- unset($request);
+ //error_log(__METHOD__."('$_exec_id')");
+ if (($request = Etemplate\Request::read($exec_id, false)))
+ {
+ $request->remove_if_not_modified();
+ unset($request);
+ }
}
}
diff --git a/api/src/Etemplate/Widget/Contact.php b/api/src/Etemplate/Widget/Contact.php
index 1b65a4b7cd..775a5c1718 100644
--- a/api/src/Etemplate/Widget/Contact.php
+++ b/api/src/Etemplate/Widget/Contact.php
@@ -78,13 +78,13 @@ class Contact extends Entry
'__default__' => array(
'options' => array(
'bday' => array('type' => 'date', 'options' => 'Y-m-d'),
- 'owner' => array('type' => 'select-account', 'options' => ''),
- 'modifier' => array('type' => 'select-account', 'options' => ''),
- 'creator' => array('type' => 'select-account', 'options' => ''),
- 'modifed' => array('type' => 'date-time', 'options' => ''),
- 'created' => array('type' => 'date-time', 'options' => ''),
- 'cat_id' => array('type' => 'select-cat', 'options' => ''),
- '__default__' => array('type' => 'label', 'options' => ''),
+ 'owner' => array('type' => 'select-account'),
+ 'modifier' => array('type' => 'select-account'),
+ 'creator' => array('type' => 'select-account'),
+ 'modifed' => array('type' => 'date-time'),
+ 'created' => array('type' => 'date-time'),
+ 'cat_id' => array('type' => 'select-cat'),
+ '__default__' => array('type' => 'label'),
),
'noLang' => true,
),
diff --git a/api/src/Etemplate/Widget/Customfields.php b/api/src/Etemplate/Widget/Customfields.php
index ed29a7847e..ba4153bcb1 100644
--- a/api/src/Etemplate/Widget/Customfields.php
+++ b/api/src/Etemplate/Widget/Customfields.php
@@ -273,7 +273,10 @@ class Customfields extends Transformer
// Re-format date custom fields from Y-m-d
$field_settings =& self::get_array(self::$request->modifications, "{$this->id}[customfields]",true);
- if (true) $field_settings = array();
+ if(!is_array($field_settings))
+ {
+ $field_settings = array();
+ }
$link_types = Api\Link::app_list();
foreach($fields as $fname => $field)
{
diff --git a/api/src/Etemplate/Widget/Date.php b/api/src/Etemplate/Widget/Date.php
index 5ae21494c4..709507be93 100644
--- a/api/src/Etemplate/Widget/Date.php
+++ b/api/src/Etemplate/Widget/Date.php
@@ -114,7 +114,7 @@ class Date extends Transformer
return $value;
} // otherwise we will get current date or 1970-01-01 instead of an empty value
- $format = $this->attrs['dataFormat'] ?? $this->attrs['data_format'];
+ $format = $this->attrs['dataFormat'] ?? $this->attrs['data_format'] ?? "";
// for DateTime objects (regular PHP and Api\DateTime ones), set user timezone
if($value instanceof \DateTime)
{
diff --git a/api/src/Etemplate/Widget/Entry.php b/api/src/Etemplate/Widget/Entry.php
index 1aa73d5217..130693e764 100644
--- a/api/src/Etemplate/Widget/Entry.php
+++ b/api/src/Etemplate/Widget/Entry.php
@@ -69,7 +69,7 @@ abstract class Entry extends Transformer
$form_name = self::form_name($cname, $this->id);
$prefixed_id = (substr($this->id, 0, 1) == self::ID_PREFIX ? $this->id : self::ID_PREFIX . $this->id);
- $data_id = $attrs['value'] ? self::form_name($cname, $attrs['value']) : self::form_name($cname, $prefixed_id);
+ $data_id = !empty($attrs['value']) ? self::form_name($cname, $attrs['value']) : self::form_name($cname, $prefixed_id);
// No need to proceed
if(!$data_id) return;
@@ -151,9 +151,9 @@ abstract class Entry extends Transformer
$value =& $data;
if(!is_array($value)) return $value;
- foreach(array($attrs['field']) + explode(':',$attrs['alternate_fields']) as $field)
+ foreach(array($attrs['field']) + explode(':', ($attrs['alternate_fields'] ?? '')) as $field)
{
- if($value[$field])
+ if(!empty($value[$field]))
{
return $value[$field];
}
@@ -175,12 +175,12 @@ abstract class Entry extends Transformer
*/
protected function customfield($attrs, &$data)
{
- list($app, $type) = explode('-',$attrs['type']);
- $data_id = $attrs['value'] ?: $attrs['id'];
+ list($app, $type) = explode('-', $attrs['type']);
+ $data_id = isset($attrs['value']) ? $attrs['value'] : $attrs['id'];
$id = is_array($data) ? static::get_array($data, $data_id) : $data;
- if(!$app || !$type || !$GLOBALS['egw_info']['apps'][$app] || !$id ||
+ if(!$app || !$type || !isset($GLOBALS['egw_info']['apps'][$app]) || !$id ||
// Simple CF, already there
- $data[$attrs['field']]
+ isset($data[$attrs['field']])
)
{
return;
@@ -194,7 +194,7 @@ abstract class Entry extends Transformer
$merge = new $classname();
$replacement_field = '$$'.$attrs['field'].'$$';
$replacements = $merge->get_app_replacements($app, $id, $replacement_field);
- $data[$attrs['field']] = $replacements[$replacement_field];
+ $data[$attrs['field']] = $replacements[$replacement_field] ?? '';
}
catch(\Exception $e)
{
@@ -212,7 +212,7 @@ abstract class Entry extends Transformer
protected function regex($attrs, &$data)
{
$value =& $this->get_data_field($attrs, $data);
- if(!$attrs['regex'] || !$value)
+ if(!isset($attrs['regex']) || !$value)
{
return;
}
diff --git a/api/src/Etemplate/Widget/Grid.php b/api/src/Etemplate/Widget/Grid.php
index 2b1f85b4b9..5ba49bd7e8 100644
--- a/api/src/Etemplate/Widget/Grid.php
+++ b/api/src/Etemplate/Widget/Grid.php
@@ -189,9 +189,9 @@ class Grid extends Box
foreach(array_merge(array($direct_child), $n ? array() : $direct_child->children) as $child)
{
$pat = $child->id;
- while(($patstr = strstr($pat, '$')))
+ while($pat && ($patstr = strstr($pat, '$')))
{
- $pat = substr($patstr,$patstr[1] == '{' ? 2 : 1);
+ $pat = substr($patstr, $patstr[1] == '{' ? 2 : 1);
switch ($this->type)
{
diff --git a/api/src/Etemplate/Widget/Nextmatch.php b/api/src/Etemplate/Widget/Nextmatch.php
index e370919795..1980c5bbc5 100644
--- a/api/src/Etemplate/Widget/Nextmatch.php
+++ b/api/src/Etemplate/Widget/Nextmatch.php
@@ -135,8 +135,8 @@ class Nextmatch extends Etemplate\Widget
list($app) = explode('.', $this->attrs['template']);
}
- // Check for sort preference. We only apply this on first load so it can be changed
- if($GLOBALS['egw_info']['user']['preferences'][$app][$this->attrs['template'] . "_sort"])
+ // Check for sort preference. We only apply this on first load, so it can be changed
+ if(array_key_exists($this->attrs['template'] . "_sort", $GLOBALS['egw_info']['user']['preferences'][$app] ?? []))
{
$send_value['sort'] = $GLOBALS['egw_info']['user']['preferences'][$app][$this->attrs['template'] . "_sort"];
}
diff --git a/api/src/Etemplate/Widget/Password.php b/api/src/Etemplate/Widget/Password.php
index 59145df095..07527c0cf6 100644
--- a/api/src/Etemplate/Widget/Password.php
+++ b/api/src/Etemplate/Widget/Password.php
@@ -61,8 +61,8 @@ class Password extends Etemplate\Widget\Textbox
// only send password (or hash) to client-side, if explicitly requested
if(!empty($value) && (!array_key_exists('viewable', $this->attrs) ||
!in_array($this->attrs['viewable'], ['1', 'true', true], true))
- && (!array_key_exists('passwordToggle', $this->attrs) ||
- !in_array($this->attrs['passwordToggle'], ['1', 'true', true], true)))
+ && (!array_key_exists('togglePassword', $this->attrs) ||
+ !in_array($this->attrs['togglePassword'], ['1', 'true', true], true)))
{
$value = str_repeat('*', strlen($preserv));
}
diff --git a/api/src/Etemplate/Widget/Select.php b/api/src/Etemplate/Widget/Select.php
index d4f62b54e1..cf84d78f4d 100644
--- a/api/src/Etemplate/Widget/Select.php
+++ b/api/src/Etemplate/Widget/Select.php
@@ -644,7 +644,7 @@ class Select extends Etemplate\Widget
}
// Legacy / static support
// Have to do this explicitly, since legacy options is not defined on class level
- $legacy_options = explode(',',$_legacy_options);
+ $legacy_options = explode(',', $_legacy_options ?? "");
foreach($legacy_options as &$field)
{
$field = self::expand_name($field, 0, 0,'','',self::$cont);
diff --git a/api/src/Etemplate/Widget/Transformer.php b/api/src/Etemplate/Widget/Transformer.php
index efd637f385..82eceebbd6 100644
--- a/api/src/Etemplate/Widget/Transformer.php
+++ b/api/src/Etemplate/Widget/Transformer.php
@@ -219,15 +219,18 @@ abstract class Transformer extends Etemplate\Widget
elseif(is_array($action))
{
// case matches --> run all actions
- if (isset($action[$attrs[$attr]]) || !isset($action[$attrs[$attr]]) && isset($action['__default__']))
+ if(isset($attrs[$attr]) && isset($action[$attrs[$attr]]) || (!isset($attrs[$attr]) || !isset($action[$attrs[$attr]])) && isset($action['__default__']))
{
- $actions = isset($action[$attrs[$attr]]) ? $action[$attrs[$attr]] : $action['__default__'];
+ $actions = isset($attrs[$attr]) && isset($action[$attrs[$attr]]) ? $action[$attrs[$attr]] : $action['__default__'];
if(!is_array($actions))
{
$attrs[$attr] = $actions;
$actions = array($attr => $actions);
}
- if (self::DEBUG) error_log(__METHOD__."(attr='$attr', action=".array2string($action).") attrs['$attr']=='{$attrs[$attr]}' --> running actions");
+ if(self::DEBUG)
+ {
+ error_log(__METHOD__ . "(attr='$attr', action=" . array2string($action) . ") attrs['$attr']=='{$attrs[$attr]}' --> running actions");
+ }
foreach($actions as $attr => $action)
{
$this->action($attr, $action, $attrs);
diff --git a/api/src/Framework.php b/api/src/Framework.php
index ddc07fd1fc..cbc19e2bc0 100644
--- a/api/src/Framework.php
+++ b/api/src/Framework.php
@@ -1680,7 +1680,6 @@ abstract class Framework extends Framework\Extra
$options = array('account_type' => $type, 'tag_list' => true) + $accounts;
$accounts = Accounts::link_query('', $options);
}
- unset($list["accounts"][9]);
// Make sure the user themselves is in there
if(!array_key_exists($GLOBALS['egw_info']['user']['account_id'], $list['accounts']))
{
diff --git a/api/src/Framework/Ajax.php b/api/src/Framework/Ajax.php
index b2ce428ffa..59a9199dd0 100755
--- a/api/src/Framework/Ajax.php
+++ b/api/src/Framework/Ajax.php
@@ -188,7 +188,7 @@ abstract class Ajax extends Api\Framework
ob_end_clean();
//error_log(__METHOD__.'('.array2string($extra).') called from:'.function_backtrace());
- // the instanciation of the template has to be here and not in the constructor,
+ // the instantiation of the template has to be here and not in the constructor,
// as the old template class has problems if restored from the session (php-restore)
// todo: check if this is still true
$this->tpl = new Template(EGW_SERVER_ROOT.$this->template_dir);
diff --git a/api/src/Framework/IncludeMgr.php b/api/src/Framework/IncludeMgr.php
index f50449b6a0..bc665ff07d 100644
--- a/api/src/Framework/IncludeMgr.php
+++ b/api/src/Framework/IncludeMgr.php
@@ -331,6 +331,7 @@ class IncludeMgr
// we will do no further processing but just include the file
// XXX: Is this case still used? If yes, it will not work with
// adding the ctime to all js files...
+ $args = '';
if (is_array($file))
{
foreach($file as $name => $val)
diff --git a/api/src/Header/Http.php b/api/src/Header/Http.php
index f561b57560..1742b64b58 100644
--- a/api/src/Header/Http.php
+++ b/api/src/Header/Http.php
@@ -60,10 +60,10 @@ class Http
static function schema()
{
return !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ||
- $_SERVER['SERVER_PORT'] == 443 ||
- !empty($GLOBALS['egw_info']['server']['enforce_ssl']) ||
- $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ?
- 'https' : 'http';
+ $_SERVER['SERVER_PORT'] == 443 ||
+ !empty($GLOBALS['egw_info']['server']['enforce_ssl']) ||
+ isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ?
+ 'https' : 'http';
}
/**
diff --git a/api/src/Hooks.php b/api/src/Hooks.php
index 6b0bca8a99..88c444b653 100644
--- a/api/src/Hooks.php
+++ b/api/src/Hooks.php
@@ -266,7 +266,7 @@ class Hooks
if (is_int($location))
{
$location = $methods;
- $methods = '/'.$appname.'/inc/hook_'.$methods.'.inc.php';
+ $methods = '/' . $appname . '/inc/hook_' . $methods . '.inc.php';
}
$locations[$location][$appname] = (array)$methods;
}
@@ -294,4 +294,4 @@ class Hooks
);
display_sidebox($appname, lang('PGP Encryption'), $file);
}
-}
+}
\ No newline at end of file
diff --git a/api/src/Storage.php b/api/src/Storage.php
index 15d11a604a..aded0a349b 100644
--- a/api/src/Storage.php
+++ b/api/src/Storage.php
@@ -550,7 +550,7 @@ class Storage extends Storage\Base
$extra_join_added = true;
}
$extra_columns = $this->db->get_table_definitions($this->app, $this->extra_table);
- if(is_string($name) && $extra_columns['fd'][array_search($name, $this->db_cols)] ?? null)
+ if(is_string($name) && !empty($extra_columns['fd'][array_search($name, $this->db_cols)]))
{
$criteria[] = $this->db->expression($this->table_name,$this->table_name.'.',array(
array_search($name, $this->db_cols) => $val,
diff --git a/api/src/Storage/Merge.php b/api/src/Storage/Merge.php
index e899156cc5..d480568617 100644
--- a/api/src/Storage/Merge.php
+++ b/api/src/Storage/Merge.php
@@ -1711,13 +1711,14 @@ abstract class Merge
{
if(str_starts_with($cf_sub, '#'))
{
- $expand_sub_cfs[$cf[$index]] .= '$$' . $cf_sub . '$$ ';
+ $expand_sub_cfs[$cf[$index]] = (isset($expand_sub_cfs[$cf[$index]]) ? $expand_sub_cfs[$cf[$index]] : '') .
+ '$$' . $cf_sub . '$$ ';
}
}
foreach($cf as $index => $field)
{
- if($cfs[$field])
+ if(isset($cfs[$field]))
{
if(in_array($cfs[$field]['type'], array_keys($GLOBALS['egw_info']['apps'])))
{
@@ -1747,18 +1748,18 @@ abstract class Merge
}
// Get replacements for that application
- if(!$app_replacements[$field])
+ if(!isset($app_replacements[$field]))
{
// If we send the real content it can result in infinite loop of lookups
// so we send only the used fields
$content = $expand_sub_cfs[$field] ?? $matches[0][$index];
$app_replacements[$field] = $this->get_app_replacements($field_app, $values['#' . $field], $content);
}
- $replacements[$placeholders[$index]] = $app_replacements[$field]['$$' . $sub[$index] . '$$'];
+ $replacements[$placeholders[$index]] = $app_replacements[$field]['$$' . $sub[$index] . '$$'] ?? '';
}
else
{
- if($cfs[$field]['type'] == 'date' || $cfs[$field]['type'] == 'date-time')
+ if(isset($cfs[$field]) && ($cfs[$field]['type'] == 'date' || $cfs[$field]['type'] == 'date-time'))
{
$this->date_fields[] = '#' . $field;
}
diff --git a/api/src/Translation.php b/api/src/Translation.php
index 27ed982fc3..7ba4deb5eb 100644
--- a/api/src/Translation.php
+++ b/api/src/Translation.php
@@ -1076,6 +1076,7 @@ class Translation
Cache::unsetCache(Cache::INSTANCE,__CLASS__,$app.':'.$key);
}
}
+ self::max_lang_time(time());
}
/**
diff --git a/api/src/Vfs/Base.php b/api/src/Vfs/Base.php
index 59e2232db2..ea61c6bf27 100644
--- a/api/src/Vfs/Base.php
+++ b/api/src/Vfs/Base.php
@@ -295,6 +295,16 @@ class Base
'host' => $GLOBALS['egw_info']['user']['domain'],
'home' => str_replace(array('\\\\', '\\'), array('', '/'), $GLOBALS['egw_info']['user']['homedirectory'] ?? ''),
);
+ // check if we have a (base64 encoded) fallback-auth GET parameter and need to use it
+ if (empty($GLOBALS['egw_info']['user']['passwd']) && strpos(($query=Vfs::parse_url($_path, PHP_URL_QUERY)), 'fallback-auth=') !== false)
+ {
+ parse_str($query, $query_params);
+ if (!empty($query_params['fallback-auth']) && ($raw = base64_decode($query_params['fallback-auth'])) && strpos($raw, ':') !== false)
+ {
+ list($defaults['user'], $defaults['pass']) = explode(':', $raw, 2);
+ $defaults['pass'] = urlencode($defaults['pass']);
+ }
+ }
$parts = array_merge(Vfs::parse_url($_path), Vfs::parse_url($path) ?: [], $defaults);
if(!$parts['host'])
{
diff --git a/api/src/Vfs/Sqlfs/StreamWrapper.php b/api/src/Vfs/Sqlfs/StreamWrapper.php
index 937f643990..418530573e 100644
--- a/api/src/Vfs/Sqlfs/StreamWrapper.php
+++ b/api/src/Vfs/Sqlfs/StreamWrapper.php
@@ -110,9 +110,9 @@ class StreamWrapper extends Api\Db\Pdo implements Vfs\StreamWrapperIface
*/
protected $opened_path;
/**
- * Mode of the file opened by stream_open
+ * Mode of the file opened by stream_open: "r", "r+", "w", ...
*
- * @var int
+ * @var string
*/
protected $opened_mode;
/**
@@ -1673,6 +1673,7 @@ GROUP BY A.fs_id';
{
$query = '/* '.__METHOD__.': '.__LINE__.' */ '.$query;
}
+ self::connection();
$stmt = self::$pdo->prepare($query);
$stmt->execute(array($fs_id));
diff --git a/api/src/Vfs/Sqlfs/Utils.php b/api/src/Vfs/Sqlfs/Utils.php
index f4084c5393..6a99831937 100644
--- a/api/src/Vfs/Sqlfs/Utils.php
+++ b/api/src/Vfs/Sqlfs/Utils.php
@@ -259,7 +259,8 @@ class Utils extends StreamWrapper
$limit = 500;
$offset = 0;
$select_stmt = self::$pdo->prepare('SELECT fs_id FROM '.self::TABLE.
- " WHERE fs_mime!='httpd/unix-directory' AND fs_content IS NULL AND fs_link IS NULL LIMIT $limit OFFSET :offset");
+ " WHERE fs_mime!='httpd/unix-directory' AND fs_content IS NULL AND fs_link IS NULL AND (fs_s3_flags&7)=0".
+ " LIMIT $limit OFFSET :offset");
$select_stmt->setFetchMode(PDO::FETCH_ASSOC);
do {
$num = 0;
diff --git a/api/src/Vfs/StreamWrapperIface.php b/api/src/Vfs/StreamWrapperIface.php
index 66bc5e27c2..a24a1349f6 100644
--- a/api/src/Vfs/StreamWrapperIface.php
+++ b/api/src/Vfs/StreamWrapperIface.php
@@ -18,147 +18,8 @@ namespace EGroupware\Api\Vfs;
*
* @link http://www.php.net/manual/en/function.stream-wrapper-register.php
*/
-interface StreamWrapperIface
+interface StreamWrapperIface extends StreamWrapperIfaceNoDir
{
- /**
- * optional context param when opening the stream, null if no context passed
- *
- * @var mixed
- */
- //var $context;
-
- /**
- * This method is called immediately after your stream object is created.
- *
- * @param string $path URL that was passed to fopen() and that this object is expected to retrieve
- * @param string $mode mode used to open the file, as detailed for fopen()
- * @param int $options additional flags set by the streams API (or'ed together):
- * - STREAM_USE_PATH If path is relative, search for the resource using the include_path.
- * - STREAM_REPORT_ERRORS If this flag is set, you are responsible for raising errors using trigger_error() during opening of the stream.
- * If this flag is not set, you should not raise any errors.
- * @param string $opened_path full path of the file/resource, if the open was successfull and STREAM_USE_PATH was set
- * @return boolean true if the ressource was opened successful, otherwise false
- */
- function stream_open ( $path, $mode, $options, &$opened_path );
-
- /**
- * This method is called when the stream is closed, using fclose().
- *
- * You must release any resources that were locked or allocated by the stream.
- */
- function stream_close ( );
-
- /**
- * This method is called in response to fread() and fgets() calls on the stream.
- *
- * You must return up-to count bytes of data from the current read/write position as a string.
- * If there are less than count bytes available, return as many as are available.
- * If no more data is available, return either FALSE or an empty string.
- * You must also update the read/write position of the stream by the number of bytes that were successfully read.
- *
- * @param int $count
- * @return string/false up to count bytes read or false on EOF
- */
- function stream_read ( $count );
-
- /**
- * This method is called in response to fwrite() calls on the stream.
- *
- * You should store data into the underlying storage used by your stream.
- * If there is not enough room, try to store as many bytes as possible.
- * You should return the number of bytes that were successfully stored in the stream, or 0 if none could be stored.
- * You must also update the read/write position of the stream by the number of bytes that were successfully written.
- *
- * @param string $data
- * @return integer
- */
- function stream_write ( $data );
-
- /**
- * This method is called in response to feof() calls on the stream.
- *
- * Important: PHP 5.0 introduced a bug that wasn't fixed until 5.1: the return value has to be the oposite!
- *
- * if(version_compare(PHP_VERSION,'5.0','>=') && version_compare(PHP_VERSION,'5.1','<'))
- * {
- * $eof = !$eof;
- * }
- *
- * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
- */
- function stream_eof ( );
-
- /**
- * This method is called in response to ftell() calls on the stream.
- *
- * @return integer current read/write position of the stream
- */
- function stream_tell ( );
-
- /**
- * This method is called in response to fseek() calls on the stream.
- *
- * You should update the read/write position of the stream according to offset and whence.
- * See fseek() for more information about these parameters.
- *
- * @param integer $offset
- * @param integer $whence SEEK_SET - Set position equal to offset bytes
- * SEEK_CUR - Set position to current location plus offset.
- * SEEK_END - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.)
- * @return boolean TRUE if the position was updated, FALSE otherwise.
- */
- function stream_seek ( $offset, $whence );
-
- /**
- * This method is called in response to fflush() calls on the stream.
- *
- * If you have cached data in your stream but not yet stored it into the underlying storage, you should do so now.
- *
- * @return boolean TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
- */
- function stream_flush ( );
-
- /**
- * This method is called in response to fstat() calls on the stream.
- *
- * If you plan to use your wrapper in a require_once you need to define stream_stat().
- * If you plan to allow any other tests like is_file()/is_dir(), you have to define url_stat().
- * stream_stat() must define the size of the file, or it will never be included.
- * url_stat() must define mode, or is_file()/is_dir()/is_executable(), and any of those functions affected by clearstatcache() simply won't work.
- * It's not documented, but directories must be a mode like 040777 (octal), and files a mode like 0100666.
- * If you wish the file to be executable, use 7s instead of 6s.
- * The last 3 digits are exactly the same thing as what you pass to chmod.
- * 040000 defines a directory, and 0100000 defines a file.
- *
- * @return array containing the same values as appropriate for the stream.
- */
- function stream_stat ( );
-
- /**
- * This method is called in response to unlink() calls on URL paths associated with the wrapper.
- *
- * It should attempt to delete the item specified by path.
- * In order for the appropriate error message to be returned, do not define this method if your wrapper does not support unlinking!
- *
- * @param string $path
- * @return boolean TRUE on success or FALSE on failure
- */
- function unlink ( $path );
-
- /**
- * This method is called in response to rename() calls on URL paths associated with the wrapper.
- *
- * It should attempt to rename the item specified by path_from to the specification given by path_to.
- * In order for the appropriate error message to be returned, do not define this method if your wrapper does not support renaming.
- *
- * The regular filesystem stream-wrapper returns an error, if $url_from and $url_to are not either both files or both dirs!
- *
- * @param string $path_from
- * @param string $path_to
- * @return boolean TRUE on success or FALSE on failure
- */
- function rename ( $path_from, $path_to );
-
/**
* This method is called in response to mkdir() calls on URL paths associated with the wrapper.
*
@@ -183,68 +44,4 @@ interface StreamWrapperIface
* @return boolean TRUE on success or FALSE on failure.
*/
function rmdir ( $path, $options );
-
- /**
- * This method is called immediately when your stream object is created for examining directory contents with opendir().
- *
- * @param string $path URL that was passed to opendir() and that this object is expected to explore.
- * @return boolean
- */
- function dir_opendir ( $path, $options );
-
- /**
- * This method is called in response to stat() calls on the URL paths associated with the wrapper.
- *
- * It should return as many elements in common with the system function as possible.
- * Unknown or unavailable values should be set to a rational value (usually 0).
- *
- * If you plan to use your wrapper in a require_once you need to define stream_stat().
- * If you plan to allow any other tests like is_file()/is_dir(), you have to define url_stat().
- * stream_stat() must define the size of the file, or it will never be included.
- * url_stat() must define mode, or is_file()/is_dir()/is_executable(), and any of those functions affected by clearstatcache() simply won't work.
- * It's not documented, but directories must be a mode like 040777 (octal), and files a mode like 0100666.
- * If you wish the file to be executable, use 7s instead of 6s.
- * The last 3 digits are exactly the same thing as what you pass to chmod.
- * 040000 defines a directory, and 0100000 defines a file.
- *
- * @param string $path
- * @param int $flags holds additional flags set by the streams API. It can hold one or more of the following values OR'd together:
- * - STREAM_URL_STAT_LINK For resources with the ability to link to other resource (such as an HTTP Location: forward,
- * or a filesystem symlink). This flag specified that only information about the link itself should be returned,
- * not the resource pointed to by the link.
- * This flag is set in response to calls to lstat(), is_link(), or filetype().
- * - STREAM_URL_STAT_QUIET If this flag is set, your wrapper should not raise any errors. If this flag is not set,
- * you are responsible for reporting errors using the trigger_error() function during stating of the path.
- * stat triggers it's own warning anyway, so it makes no sense to trigger one by our stream-wrapper!
- * @return array
- */
- function url_stat ( $path, $flags );
-
- /**
- * This method is called in response to readdir().
- *
- * It should return a string representing the next filename in the location opened by dir_opendir().
- *
- * @return string
- */
- function dir_readdir ( );
-
- /**
- * This method is called in response to rewinddir().
- *
- * It should reset the output generated by dir_readdir(). i.e.:
- * The next call to dir_readdir() should return the first entry in the location returned by dir_opendir().
- *
- * @return boolean
- */
- function dir_rewinddir ( );
-
- /**
- * This method is called in response to closedir().
- *
- * You should release any resources which were locked or allocated during the opening and use of the directory stream.
- *
- * @return boolean
- */
- function dir_closedir ( );
-}
+}
\ No newline at end of file
diff --git a/api/src/Vfs/StreamWrapperIfaceNoDir.php b/api/src/Vfs/StreamWrapperIfaceNoDir.php
new file mode 100644
index 0000000000..b6194a0a83
--- /dev/null
+++ b/api/src/Vfs/StreamWrapperIfaceNoDir.php
@@ -0,0 +1,225 @@
+=') && version_compare(PHP_VERSION,'5.1','<'))
+ * {
+ * $eof = !$eof;
+ * }
+ *
+ * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
+ */
+ function stream_eof ( );
+
+ /**
+ * This method is called in response to ftell() calls on the stream.
+ *
+ * @return integer current read/write position of the stream
+ */
+ function stream_tell ( );
+
+ /**
+ * This method is called in response to fseek() calls on the stream.
+ *
+ * You should update the read/write position of the stream according to offset and whence.
+ * See fseek() for more information about these parameters.
+ *
+ * @param integer $offset
+ * @param integer $whence SEEK_SET - Set position equal to offset bytes
+ * SEEK_CUR - Set position to current location plus offset.
+ * SEEK_END - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.)
+ * @return boolean TRUE if the position was updated, FALSE otherwise.
+ */
+ function stream_seek ( $offset, $whence );
+
+ /**
+ * This method is called in response to fflush() calls on the stream.
+ *
+ * If you have cached data in your stream but not yet stored it into the underlying storage, you should do so now.
+ *
+ * @return boolean TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
+ */
+ function stream_flush ( );
+
+ /**
+ * This method is called in response to fstat() calls on the stream.
+ *
+ * If you plan to use your wrapper in a require_once you need to define stream_stat().
+ * If you plan to allow any other tests like is_file()/is_dir(), you have to define url_stat().
+ * stream_stat() must define the size of the file, or it will never be included.
+ * url_stat() must define mode, or is_file()/is_dir()/is_executable(), and any of those functions affected by clearstatcache() simply won't work.
+ * It's not documented, but directories must be a mode like 040777 (octal), and files a mode like 0100666.
+ * If you wish the file to be executable, use 7s instead of 6s.
+ * The last 3 digits are exactly the same thing as what you pass to chmod.
+ * 040000 defines a directory, and 0100000 defines a file.
+ *
+ * @return array containing the same values as appropriate for the stream.
+ */
+ function stream_stat ( );
+
+ /**
+ * This method is called in response to unlink() calls on URL paths associated with the wrapper.
+ *
+ * It should attempt to delete the item specified by path.
+ * In order for the appropriate error message to be returned, do not define this method if your wrapper does not support unlinking!
+ *
+ * @param string $path
+ * @return boolean TRUE on success or FALSE on failure
+ */
+ function unlink ( $path );
+
+ /**
+ * This method is called in response to rename() calls on URL paths associated with the wrapper.
+ *
+ * It should attempt to rename the item specified by path_from to the specification given by path_to.
+ * In order for the appropriate error message to be returned, do not define this method if your wrapper does not support renaming.
+ *
+ * The regular filesystem stream-wrapper returns an error, if $url_from and $url_to are not either both files or both dirs!
+ *
+ * @param string $path_from
+ * @param string $path_to
+ * @return boolean TRUE on success or FALSE on failure
+ */
+ function rename ( $path_from, $path_to );
+
+ /**
+ * This method is called immediately when your stream object is created for examining directory contents with opendir().
+ *
+ * @param string $path URL that was passed to opendir() and that this object is expected to explore.
+ * @return boolean
+ */
+ function dir_opendir ( $path, $options );
+
+ /**
+ * This method is called in response to stat() calls on the URL paths associated with the wrapper.
+ *
+ * It should return as many elements in common with the system function as possible.
+ * Unknown or unavailable values should be set to a rational value (usually 0).
+ *
+ * If you plan to use your wrapper in a require_once you need to define stream_stat().
+ * If you plan to allow any other tests like is_file()/is_dir(), you have to define url_stat().
+ * stream_stat() must define the size of the file, or it will never be included.
+ * url_stat() must define mode, or is_file()/is_dir()/is_executable(), and any of those functions affected by clearstatcache() simply won't work.
+ * It's not documented, but directories must be a mode like 040777 (octal), and files a mode like 0100666.
+ * If you wish the file to be executable, use 7s instead of 6s.
+ * The last 3 digits are exactly the same thing as what you pass to chmod.
+ * 040000 defines a directory, and 0100000 defines a file.
+ *
+ * @param string $path
+ * @param int $flags holds additional flags set by the streams API. It can hold one or more of the following values OR'd together:
+ * - STREAM_URL_STAT_LINK For resources with the ability to link to other resource (such as an HTTP Location: forward,
+ * or a filesystem symlink). This flag specified that only information about the link itself should be returned,
+ * not the resource pointed to by the link.
+ * This flag is set in response to calls to lstat(), is_link(), or filetype().
+ * - STREAM_URL_STAT_QUIET If this flag is set, your wrapper should not raise any errors. If this flag is not set,
+ * you are responsible for reporting errors using the trigger_error() function during stating of the path.
+ * stat triggers it's own warning anyway, so it makes no sense to trigger one by our stream-wrapper!
+ * @return array
+ */
+ function url_stat ( $path, $flags );
+
+ /**
+ * This method is called in response to readdir().
+ *
+ * It should return a string representing the next filename in the location opened by dir_opendir().
+ *
+ * @return string
+ */
+ function dir_readdir ( );
+
+ /**
+ * This method is called in response to rewinddir().
+ *
+ * It should reset the output generated by dir_readdir(). i.e.:
+ * The next call to dir_readdir() should return the first entry in the location returned by dir_opendir().
+ *
+ * @return boolean
+ */
+ function dir_rewinddir ( );
+
+ /**
+ * This method is called in response to closedir().
+ *
+ * You should release any resources which were locked or allocated during the opening and use of the directory stream.
+ *
+ * @return boolean
+ */
+ function dir_closedir ( );
+}
\ No newline at end of file
diff --git a/api/src/Vfs/UserContextTrait.php b/api/src/Vfs/UserContextTrait.php
index 5214961727..6f42e4f72e 100644
--- a/api/src/Vfs/UserContextTrait.php
+++ b/api/src/Vfs/UserContextTrait.php
@@ -32,7 +32,7 @@ trait UserContextTrait
public $context;
/**
- * Contructor to set context/user incl. from user in url or passed in context
+ * Constructor to set context/user incl. from user in url or passed in context
*
* @param resource|string|null $url_or_context url with user or context to set
*/
diff --git a/api/templates/default/css/flags.css b/api/templates/default/css/flags.css
index 24c66ce15f..8f446929b2 100644
--- a/api/templates/default/css/flags.css
+++ b/api/templates/default/css/flags.css
@@ -1,15 +1,15 @@
-et2-select-country sl-menu-item::part(prefix), et2-select-country .flag {
+et2-select-country:not([open])::part(prefix), et2-select-country::part(flag) {
position: relative;
background-image: url(../images/flags.png);
background-position: 0 100px; /* to NOT display a flag for every value not explict defined below */
background-repeat: no-repeat;
text-indent: 15px;
height: 10px;
- width: 20px;
+ min-width: 20px;
margin-right: 10px;
}
/* No country selected*/
-et2-select-country[value=""] .flag, et2-select-country [value=""]::part(prefix) {
+et2-select-country[value=""]::part(prefix), et2-select-country::part(emptyLabel) {
background-image: url(../images/internet.svg);
background-position: center;
background-size: 20px;
@@ -17,1312 +17,1312 @@ et2-select-country[value=""] .flag, et2-select-country [value=""]::part(prefix)
height: 20px;
}
/* First selector is for the current value, second for the option */
-et2-select-country[value="BE"] .flag, et2-select-country [value="BE"]::part(prefix) {
- width: 18px
+et2-select-country[value="BE"]::part(prefix), et2-select-country::part(country_BE_flag) {
+ min-width: 18px
}
-et2-select-country[value="CH"] .flag, et2-select-country [value="CH"]::part(prefix) {
- width: 15px
+et2-select-country[value="CH"]::part(prefix), et2-select-country::part(country_CH_flag) {
+ min-width: 15px
}
-et2-select-country[value="MC"] .flag, et2-select-country [value="MC"]::part(prefix) {
- width: 19px
+et2-select-country[value="MC"]::part(prefix), et2-select-country::part(country_MC_flag) {
+ min-width: 19px
}
-et2-select-country[value="NE"] .flag, et2-select-country [value="NE"]::part(prefix) {
- width: 18px
+et2-select-country[value="NE"]::part(prefix), et2-select-country::part(country_NE_flag) {
+ min-width: 18px
}
-et2-select-country[value="NP"] .flag, et2-select-country [value="NP"]::part(prefix) {
- width: 13px
+et2-select-country[value="NP"]::part(prefix), et2-select-country::part(country_NP_flag) {
+ min-width: 13px
}
-et2-select-country[value="VA"] .flag, et2-select-country [value="VA"]::part(prefix) {
- width: 15px
+et2-select-country[value="VA"]::part(prefix), et2-select-country::part(country_VA_flag) {
+ min-width: 15px
}
-et2-select-country[value="AC"] .flag, et2-select-country [value="AC"]::part(prefix) {
+et2-select-country[value="AC"]::part(prefix), et2-select-country::part(country_AC_flag) {
height: 10px;
background-position: 0px 0px
}
-et2-select-country[value="AD"] .flag, et2-select-country [value="AD"]::part(prefix) {
+et2-select-country[value="AD"]::part(prefix), et2-select-country::part(country_AD_flag) {
height: 14px;
background-position: -22px 0px
}
-et2-select-country[value="AE"] .flag, et2-select-country [value="AE"]::part(prefix) {
+et2-select-country[value="AE"]::part(prefix), et2-select-country::part(country_AE_flag) {
height: 10px;
background-position: -44px 0px
}
-et2-select-country[value="AF"] .flag, et2-select-country [value="AF"]::part(prefix) {
+et2-select-country[value="AF"]::part(prefix), et2-select-country::part(country_AF_flag) {
height: 14px;
background-position: -66px 0px
}
-et2-select-country[value="AG"] .flag, et2-select-country [value="AG"]::part(prefix) {
+et2-select-country[value="AG"]::part(prefix), et2-select-country::part(country_AG_flag) {
height: 14px;
background-position: -88px 0px
}
-et2-select-country[value="AI"] .flag, et2-select-country [value="AI"]::part(prefix) {
+et2-select-country[value="AI"]::part(prefix), et2-select-country::part(country_AI_flag) {
height: 10px;
background-position: -110px 0px
}
-et2-select-country[value="AL"] .flag, et2-select-country [value="AL"]::part(prefix) {
+et2-select-country[value="AL"]::part(prefix), et2-select-country::part(country_AL_flag) {
height: 15px;
background-position: -132px 0px
}
-et2-select-country[value="AM"] .flag, et2-select-country [value="AM"]::part(prefix) {
+et2-select-country[value="AM"]::part(prefix), et2-select-country::part(country_AM_flag) {
height: 10px;
background-position: -154px 0px
}
-et2-select-country[value="AO"] .flag, et2-select-country [value="AO"]::part(prefix) {
+et2-select-country[value="AO"]::part(prefix), et2-select-country::part(country_AO_flag) {
height: 14px;
background-position: -176px 0px
}
-et2-select-country[value="AQ"] .flag, et2-select-country [value="AQ"]::part(prefix) {
+et2-select-country[value="AQ"]::part(prefix), et2-select-country::part(country_AQ_flag) {
height: 14px;
background-position: -198px 0px
}
-et2-select-country[value="AR"] .flag, et2-select-country [value="AR"]::part(prefix) {
+et2-select-country[value="AR"]::part(prefix), et2-select-country::part(country_AR_flag) {
height: 13px;
background-position: -220px 0px
}
-et2-select-country[value="AS"] .flag, et2-select-country [value="AS"]::part(prefix) {
+et2-select-country[value="AS"]::part(prefix), et2-select-country::part(country_AS_flag) {
height: 10px;
background-position: -242px 0px
}
-et2-select-country[value="AT"] .flag, et2-select-country [value="AT"]::part(prefix) {
+et2-select-country[value="AT"]::part(prefix), et2-select-country::part(country_AT_flag) {
height: 14px;
background-position: -264px 0px
}
-et2-select-country[value="AU"] .flag, et2-select-country [value="AU"]::part(prefix) {
+et2-select-country[value="AU"]::part(prefix), et2-select-country::part(country_AU_flag) {
height: 10px;
background-position: -286px 0px
}
-et2-select-country[value="AW"] .flag, et2-select-country [value="AW"]::part(prefix) {
+et2-select-country[value="AW"]::part(prefix), et2-select-country::part(country_AW_flag) {
height: 14px;
background-position: -308px 0px
}
-et2-select-country[value="AX"] .flag, et2-select-country [value="AX"]::part(prefix) {
+et2-select-country[value="AX"]::part(prefix), et2-select-country::part(country_AX_flag) {
height: 13px;
background-position: -330px 0px
}
-et2-select-country[value="AZ"] .flag, et2-select-country [value="AZ"]::part(prefix) {
+et2-select-country[value="AZ"]::part(prefix), et2-select-country::part(country_AZ_flag) {
height: 10px;
background-position: -352px 0px
}
-et2-select-country[value="BA"] .flag, et2-select-country [value="BA"]::part(prefix) {
+et2-select-country[value="BA"]::part(prefix), et2-select-country::part(country_BA_flag) {
height: 10px;
background-position: -374px 0px
}
-et2-select-country[value="BB"] .flag, et2-select-country [value="BB"]::part(prefix) {
+et2-select-country[value="BB"]::part(prefix), et2-select-country::part(country_BB_flag) {
height: 14px;
background-position: -396px 0px
}
-et2-select-country[value="BD"] .flag, et2-select-country [value="BD"]::part(prefix) {
+et2-select-country[value="BD"]::part(prefix), et2-select-country::part(country_BD_flag) {
height: 12px;
background-position: -418px 0px
}
-et2-select-country[value="BE"] .flag, et2-select-country [value="BE"]::part(prefix) {
+et2-select-country[value="BE"]::part(prefix), et2-select-country::part(country_BE_flag) {
height: 15px;
background-position: -440px 0px
}
-et2-select-country[value="BF"] .flag, et2-select-country [value="BF"]::part(prefix) {
+et2-select-country[value="BF"]::part(prefix), et2-select-country::part(country_BF_flag) {
height: 14px;
background-position: -460px 0px
}
-et2-select-country[value="BG"] .flag, et2-select-country [value="BG"]::part(prefix) {
+et2-select-country[value="BG"]::part(prefix), et2-select-country::part(country_BG_flag) {
height: 12px;
background-position: -482px 0px
}
-et2-select-country[value="BH"] .flag, et2-select-country [value="BH"]::part(prefix) {
+et2-select-country[value="BH"]::part(prefix), et2-select-country::part(country_BH_flag) {
height: 12px;
background-position: -504px 0px
}
-et2-select-country[value="BI"] .flag, et2-select-country [value="BI"]::part(prefix) {
+et2-select-country[value="BI"]::part(prefix), et2-select-country::part(country_BI_flag) {
height: 12px;
background-position: -526px 0px
}
-et2-select-country[value="BJ"] .flag, et2-select-country [value="BJ"]::part(prefix) {
+et2-select-country[value="BJ"]::part(prefix), et2-select-country::part(country_BJ_flag) {
height: 14px;
background-position: -548px 0px
}
-et2-select-country[value="BL"] .flag, et2-select-country [value="BL"]::part(prefix) {
+et2-select-country[value="BL"]::part(prefix), et2-select-country::part(country_BL_flag) {
height: 14px;
background-position: -570px 0px
}
-et2-select-country[value="BM"] .flag, et2-select-country [value="BM"]::part(prefix) {
+et2-select-country[value="BM"]::part(prefix), et2-select-country::part(country_BM_flag) {
height: 10px;
background-position: -592px 0px
}
-et2-select-country[value="BN"] .flag, et2-select-country [value="BN"]::part(prefix) {
+et2-select-country[value="BN"]::part(prefix), et2-select-country::part(country_BN_flag) {
height: 10px;
background-position: -614px 0px
}
-et2-select-country[value="BO"] .flag, et2-select-country [value="BO"]::part(prefix) {
+et2-select-country[value="BO"]::part(prefix), et2-select-country::part(country_BO_flag) {
height: 14px;
background-position: -636px 0px
}
-et2-select-country[value="BQ"] .flag, et2-select-country [value="BQ"]::part(prefix) {
+et2-select-country[value="BQ"]::part(prefix), et2-select-country::part(country_BQ_flag) {
height: 14px;
background-position: -658px 0px
}
-et2-select-country[value="BR"] .flag, et2-select-country [value="BR"]::part(prefix) {
+et2-select-country[value="BR"]::part(prefix), et2-select-country::part(country_BR_flag) {
height: 14px;
background-position: -680px 0px
}
-et2-select-country[value="BS"] .flag, et2-select-country [value="BS"]::part(prefix) {
+et2-select-country[value="BS"]::part(prefix), et2-select-country::part(country_BS_flag) {
height: 10px;
background-position: -702px 0px
}
-et2-select-country[value="BT"] .flag, et2-select-country [value="BT"]::part(prefix) {
+et2-select-country[value="BT"]::part(prefix), et2-select-country::part(country_BT_flag) {
height: 14px;
background-position: -724px 0px
}
-et2-select-country[value="BV"] .flag, et2-select-country [value="BV"]::part(prefix) {
+et2-select-country[value="BV"]::part(prefix), et2-select-country::part(country_BV_flag) {
height: 15px;
background-position: -746px 0px
}
-et2-select-country[value="BW"] .flag, et2-select-country [value="BW"]::part(prefix) {
+et2-select-country[value="BW"]::part(prefix), et2-select-country::part(country_BW_flag) {
height: 14px;
background-position: -768px 0px
}
-et2-select-country[value="BY"] .flag, et2-select-country [value="BY"]::part(prefix) {
+et2-select-country[value="BY"]::part(prefix), et2-select-country::part(country_BY_flag) {
height: 10px;
background-position: -790px 0px
}
-et2-select-country[value="BZ"] .flag, et2-select-country [value="BZ"]::part(prefix) {
+et2-select-country[value="BZ"]::part(prefix), et2-select-country::part(country_BZ_flag) {
height: 14px;
background-position: -812px 0px
}
-et2-select-country[value="CA"] .flag, et2-select-country [value="CA"]::part(prefix) {
+et2-select-country[value="CA"]::part(prefix), et2-select-country::part(country_CA_flag) {
height: 10px;
background-position: -834px 0px
}
-et2-select-country[value="CC"] .flag, et2-select-country [value="CC"]::part(prefix) {
+et2-select-country[value="CC"]::part(prefix), et2-select-country::part(country_CC_flag) {
height: 10px;
background-position: -856px 0px
}
-et2-select-country[value="CD"] .flag, et2-select-country [value="CD"]::part(prefix) {
+et2-select-country[value="CD"]::part(prefix), et2-select-country::part(country_CD_flag) {
height: 15px;
background-position: -878px 0px
}
-et2-select-country[value="CF"] .flag, et2-select-country [value="CF"]::part(prefix) {
+et2-select-country[value="CF"]::part(prefix), et2-select-country::part(country_CF_flag) {
height: 14px;
background-position: -900px 0px
}
-et2-select-country[value="CG"] .flag, et2-select-country [value="CG"]::part(prefix) {
+et2-select-country[value="CG"]::part(prefix), et2-select-country::part(country_CG_flag) {
height: 14px;
background-position: -922px 0px
}
-et2-select-country[value="CH"] .flag, et2-select-country [value="CH"]::part(prefix) {
+et2-select-country[value="CH"]::part(prefix), et2-select-country::part(country_CH_flag) {
height: 15px;
background-position: -944px 0px
}
-et2-select-country[value="CI"] .flag, et2-select-country [value="CI"]::part(prefix) {
+et2-select-country[value="CI"]::part(prefix), et2-select-country::part(country_CI_flag) {
height: 14px;
background-position: -961px 0px
}
-et2-select-country[value="CK"] .flag, et2-select-country [value="CK"]::part(prefix) {
+et2-select-country[value="CK"]::part(prefix), et2-select-country::part(country_CK_flag) {
height: 10px;
background-position: -983px 0px
}
-et2-select-country[value="CL"] .flag, et2-select-country [value="CL"]::part(prefix) {
+et2-select-country[value="CL"]::part(prefix), et2-select-country::part(country_CL_flag) {
height: 14px;
background-position: -1005px 0px
}
-et2-select-country[value="CM"] .flag, et2-select-country [value="CM"]::part(prefix) {
+et2-select-country[value="CM"]::part(prefix), et2-select-country::part(country_CM_flag) {
height: 14px;
background-position: -1027px 0px
}
-et2-select-country[value="CN"] .flag, et2-select-country [value="CN"]::part(prefix) {
+et2-select-country[value="CN"]::part(prefix), et2-select-country::part(country_CN_flag) {
height: 14px;
background-position: -1049px 0px
}
-et2-select-country[value="CO"] .flag, et2-select-country [value="CO"]::part(prefix) {
+et2-select-country[value="CO"]::part(prefix), et2-select-country::part(country_CO_flag) {
height: 14px;
background-position: -1071px 0px
}
-et2-select-country[value="CP"] .flag, et2-select-country [value="CP"]::part(prefix) {
+et2-select-country[value="CP"]::part(prefix), et2-select-country::part(country_CP_flag) {
height: 14px;
background-position: -1093px 0px
}
-et2-select-country[value="CR"] .flag, et2-select-country [value="CR"]::part(prefix) {
+et2-select-country[value="CR"]::part(prefix), et2-select-country::part(country_CR_flag) {
height: 12px;
background-position: -1115px 0px
}
-et2-select-country[value="CU"] .flag, et2-select-country [value="CU"]::part(prefix) {
+et2-select-country[value="CU"]::part(prefix), et2-select-country::part(country_CU_flag) {
height: 10px;
background-position: -1137px 0px
}
-et2-select-country[value="CV"] .flag, et2-select-country [value="CV"]::part(prefix) {
+et2-select-country[value="CV"]::part(prefix), et2-select-country::part(country_CV_flag) {
height: 12px;
background-position: -1159px 0px
}
-et2-select-country[value="CW"] .flag, et2-select-country [value="CW"]::part(prefix) {
+et2-select-country[value="CW"]::part(prefix), et2-select-country::part(country_CW_flag) {
height: 14px;
background-position: -1181px 0px
}
-et2-select-country[value="CX"] .flag, et2-select-country [value="CX"]::part(prefix) {
+et2-select-country[value="CX"]::part(prefix), et2-select-country::part(country_CX_flag) {
height: 10px;
background-position: -1203px 0px
}
-et2-select-country[value="CY"] .flag, et2-select-country [value="CY"]::part(prefix) {
+et2-select-country[value="CY"]::part(prefix), et2-select-country::part(country_CY_flag) {
height: 13px;
background-position: -1225px 0px
}
-et2-select-country[value="CZ"] .flag, et2-select-country [value="CZ"]::part(prefix) {
+et2-select-country[value="CZ"]::part(prefix), et2-select-country::part(country_CZ_flag) {
height: 14px;
background-position: -1247px 0px
}
-et2-select-country[value="DE"] .flag, et2-select-country [value="DE"]::part(prefix) {
+et2-select-country[value="DE"]::part(prefix), et2-select-country::part(country_DE_flag) {
height: 12px;
background-position: -1269px 0px
}
-et2-select-country[value="DG"] .flag, et2-select-country [value="DG"]::part(prefix) {
+et2-select-country[value="DG"]::part(prefix), et2-select-country::part(country_DG_flag) {
height: 10px;
background-position: -1291px 0px
}
-et2-select-country[value="DJ"] .flag, et2-select-country [value="DJ"]::part(prefix) {
+et2-select-country[value="DJ"]::part(prefix), et2-select-country::part(country_DJ_flag) {
height: 14px;
background-position: -1313px 0px
}
-et2-select-country[value="DK"] .flag, et2-select-country [value="DK"]::part(prefix) {
+et2-select-country[value="DK"]::part(prefix), et2-select-country::part(country_DK_flag) {
height: 15px;
background-position: -1335px 0px
}
-et2-select-country[value="DM"] .flag, et2-select-country [value="DM"]::part(prefix) {
+et2-select-country[value="DM"]::part(prefix), et2-select-country::part(country_DM_flag) {
height: 10px;
background-position: -1357px 0px
}
-et2-select-country[value="DO"] .flag, et2-select-country [value="DO"]::part(prefix) {
+et2-select-country[value="DO"]::part(prefix), et2-select-country::part(country_DO_flag) {
height: 13px;
background-position: -1379px 0px
}
-et2-select-country[value="DZ"] .flag, et2-select-country [value="DZ"]::part(prefix) {
+et2-select-country[value="DZ"]::part(prefix), et2-select-country::part(country_DZ_flag) {
height: 14px;
background-position: -1401px 0px
}
-et2-select-country[value="EA"] .flag, et2-select-country [value="EA"]::part(prefix) {
+et2-select-country[value="EA"]::part(prefix), et2-select-country::part(country_EA_flag) {
height: 14px;
background-position: -1423px 0px
}
-et2-select-country[value="EC"] .flag, et2-select-country [value="EC"]::part(prefix) {
+et2-select-country[value="EC"]::part(prefix), et2-select-country::part(country_EC_flag) {
height: 14px;
background-position: -1445px 0px
}
-et2-select-country[value="EE"] .flag, et2-select-country [value="EE"]::part(prefix) {
+et2-select-country[value="EE"]::part(prefix), et2-select-country::part(country_EE_flag) {
height: 13px;
background-position: -1467px 0px
}
-et2-select-country[value="EG"] .flag, et2-select-country [value="EG"]::part(prefix) {
+et2-select-country[value="EG"]::part(prefix), et2-select-country::part(country_EG_flag) {
height: 14px;
background-position: -1489px 0px
}
-et2-select-country[value="EH"] .flag, et2-select-country [value="EH"]::part(prefix) {
+et2-select-country[value="EH"]::part(prefix), et2-select-country::part(country_EH_flag) {
height: 10px;
background-position: -1511px 0px
}
-et2-select-country[value="ER"] .flag, et2-select-country [value="ER"]::part(prefix) {
+et2-select-country[value="ER"]::part(prefix), et2-select-country::part(country_ER_flag) {
height: 10px;
background-position: -1533px 0px
}
-et2-select-country[value="ES"] .flag, et2-select-country [value="ES"]::part(prefix) {
+et2-select-country[value="ES"]::part(prefix), et2-select-country::part(country_ES_flag) {
height: 14px;
background-position: -1555px 0px
}
-et2-select-country[value="ET"] .flag, et2-select-country [value="ET"]::part(prefix) {
+et2-select-country[value="ET"]::part(prefix), et2-select-country::part(country_ET_flag) {
height: 10px;
background-position: -1577px 0px
}
-et2-select-country[value="EU"] .flag, et2-select-country [value="EU"]::part(prefix) {
+et2-select-country[value="EU"]::part(prefix), et2-select-country::part(country_EU_flag) {
height: 14px;
background-position: -1599px 0px
}
-et2-select-country[value="FI"] .flag, et2-select-country [value="FI"]::part(prefix) {
+et2-select-country[value="FI"]::part(prefix), et2-select-country::part(country_FI_flag) {
height: 12px;
background-position: -1621px 0px
}
-et2-select-country[value="FJ"] .flag, et2-select-country [value="FJ"]::part(prefix) {
+et2-select-country[value="FJ"]::part(prefix), et2-select-country::part(country_FJ_flag) {
height: 10px;
background-position: -1643px 0px
}
-et2-select-country[value="FK"] .flag, et2-select-country [value="FK"]::part(prefix) {
+et2-select-country[value="FK"]::part(prefix), et2-select-country::part(country_FK_flag) {
height: 10px;
background-position: -1665px 0px
}
-et2-select-country[value="FM"] .flag, et2-select-country [value="FM"]::part(prefix) {
+et2-select-country[value="FM"]::part(prefix), et2-select-country::part(country_FM_flag) {
height: 11px;
background-position: -1687px 0px
}
-et2-select-country[value="FO"] .flag, et2-select-country [value="FO"]::part(prefix) {
+et2-select-country[value="FO"]::part(prefix), et2-select-country::part(country_FO_flag) {
height: 15px;
background-position: -1709px 0px
}
-et2-select-country[value="FR"] .flag, et2-select-country [value="FR"]::part(prefix) {
+et2-select-country[value="FR"]::part(prefix), et2-select-country::part(country_FR_flag) {
height: 14px;
background-position: -1731px 0px
}
-et2-select-country[value="GA"] .flag, et2-select-country [value="GA"]::part(prefix) {
+et2-select-country[value="GA"]::part(prefix), et2-select-country::part(country_GA_flag) {
height: 15px;
background-position: -1753px 0px
}
-et2-select-country[value="GB"] .flag, et2-select-country [value="GB"]::part(prefix) {
+et2-select-country[value="GB"]::part(prefix), et2-select-country::part(country_GB_flag) {
height: 10px;
background-position: -1775px 0px
}
-et2-select-country[value="GD"] .flag, et2-select-country [value="GD"]::part(prefix) {
+et2-select-country[value="GD"]::part(prefix), et2-select-country::part(country_GD_flag) {
height: 12px;
background-position: -1797px 0px
}
-et2-select-country[value="GE"] .flag, et2-select-country [value="GE"]::part(prefix) {
+et2-select-country[value="GE"]::part(prefix), et2-select-country::part(country_GE_flag) {
height: 14px;
background-position: -1819px 0px
}
-et2-select-country[value="GF"] .flag, et2-select-country [value="GF"]::part(prefix) {
+et2-select-country[value="GF"]::part(prefix), et2-select-country::part(country_GF_flag) {
height: 14px;
background-position: -1841px 0px
}
-et2-select-country[value="GG"] .flag, et2-select-country [value="GG"]::part(prefix) {
+et2-select-country[value="GG"]::part(prefix), et2-select-country::part(country_GG_flag) {
height: 14px;
background-position: -1863px 0px
}
-et2-select-country[value="GH"] .flag, et2-select-country [value="GH"]::part(prefix) {
+et2-select-country[value="GH"]::part(prefix), et2-select-country::part(country_GH_flag) {
height: 14px;
background-position: -1885px 0px
}
-et2-select-country[value="GI"] .flag, et2-select-country [value="GI"]::part(prefix) {
+et2-select-country[value="GI"]::part(prefix), et2-select-country::part(country_GI_flag) {
height: 10px;
background-position: -1907px 0px
}
-et2-select-country[value="GL"] .flag, et2-select-country [value="GL"]::part(prefix) {
+et2-select-country[value="GL"]::part(prefix), et2-select-country::part(country_GL_flag) {
height: 14px;
background-position: -1929px 0px
}
-et2-select-country[value="GM"] .flag, et2-select-country [value="GM"]::part(prefix) {
+et2-select-country[value="GM"]::part(prefix), et2-select-country::part(country_GM_flag) {
height: 14px;
background-position: -1951px 0px
}
-et2-select-country[value="GN"] .flag, et2-select-country [value="GN"]::part(prefix) {
+et2-select-country[value="GN"]::part(prefix), et2-select-country::part(country_GN_flag) {
height: 14px;
background-position: -1973px 0px
}
-et2-select-country[value="GP"] .flag, et2-select-country [value="GP"]::part(prefix) {
+et2-select-country[value="GP"]::part(prefix), et2-select-country::part(country_GP_flag) {
height: 14px;
background-position: -1995px 0px
}
-et2-select-country[value="GQ"] .flag, et2-select-country [value="GQ"]::part(prefix) {
+et2-select-country[value="GQ"]::part(prefix), et2-select-country::part(country_GQ_flag) {
height: 14px;
background-position: -2017px 0px
}
-et2-select-country[value="GR"] .flag, et2-select-country [value="GR"]::part(prefix) {
+et2-select-country[value="GR"]::part(prefix), et2-select-country::part(country_GR_flag) {
height: 14px;
background-position: -2039px 0px
}
-et2-select-country[value="GS"] .flag, et2-select-country [value="GS"]::part(prefix) {
+et2-select-country[value="GS"]::part(prefix), et2-select-country::part(country_GS_flag) {
height: 10px;
background-position: -2061px 0px
}
-et2-select-country[value="GT"] .flag, et2-select-country [value="GT"]::part(prefix) {
+et2-select-country[value="GT"]::part(prefix), et2-select-country::part(country_GT_flag) {
height: 13px;
background-position: -2083px 0px
}
-et2-select-country[value="GU"] .flag, et2-select-country [value="GU"]::part(prefix) {
+et2-select-country[value="GU"]::part(prefix), et2-select-country::part(country_GU_flag) {
height: 11px;
background-position: -2105px 0px
}
-et2-select-country[value="GW"] .flag, et2-select-country [value="GW"]::part(prefix) {
+et2-select-country[value="GW"]::part(prefix), et2-select-country::part(country_GW_flag) {
height: 10px;
background-position: -2127px 0px
}
-et2-select-country[value="GY"] .flag, et2-select-country [value="GY"]::part(prefix) {
+et2-select-country[value="GY"]::part(prefix), et2-select-country::part(country_GY_flag) {
height: 12px;
background-position: -2149px 0px
}
-et2-select-country[value="HK"] .flag, et2-select-country [value="HK"]::part(prefix) {
+et2-select-country[value="HK"]::part(prefix), et2-select-country::part(country_HK_flag) {
height: 14px;
background-position: -2171px 0px
}
-et2-select-country[value="HM"] .flag, et2-select-country [value="HM"]::part(prefix) {
+et2-select-country[value="HM"]::part(prefix), et2-select-country::part(country_HM_flag) {
height: 10px;
background-position: -2193px 0px
}
-et2-select-country[value="HN"] .flag, et2-select-country [value="HN"]::part(prefix) {
+et2-select-country[value="HN"]::part(prefix), et2-select-country::part(country_HN_flag) {
height: 10px;
background-position: -2215px 0px
}
-et2-select-country[value="HR"] .flag, et2-select-country [value="HR"]::part(prefix) {
+et2-select-country[value="HR"]::part(prefix), et2-select-country::part(country_HR_flag) {
height: 10px;
background-position: -2237px 0px
}
-et2-select-country[value="HT"] .flag, et2-select-country [value="HT"]::part(prefix) {
+et2-select-country[value="HT"]::part(prefix), et2-select-country::part(country_HT_flag) {
height: 12px;
background-position: -2259px 0px
}
-et2-select-country[value="HU"] .flag, et2-select-country [value="HU"]::part(prefix) {
+et2-select-country[value="HU"]::part(prefix), et2-select-country::part(country_HU_flag) {
height: 10px;
background-position: -2281px 0px
}
-et2-select-country[value="IC"] .flag, et2-select-country [value="IC"]::part(prefix) {
+et2-select-country[value="IC"]::part(prefix), et2-select-country::part(country_IC_flag) {
height: 14px;
background-position: -2303px 0px
}
-et2-select-country[value="ID"] .flag, et2-select-country [value="ID"]::part(prefix) {
+et2-select-country[value="ID"]::part(prefix), et2-select-country::part(country_ID_flag) {
height: 14px;
background-position: -2325px 0px
}
-et2-select-country[value="IE"] .flag, et2-select-country [value="IE"]::part(prefix) {
+et2-select-country[value="IE"]::part(prefix), et2-select-country::part(country_IE_flag) {
height: 10px;
background-position: -2347px 0px
}
-et2-select-country[value="IL"] .flag, et2-select-country [value="IL"]::part(prefix) {
+et2-select-country[value="IL"]::part(prefix), et2-select-country::part(country_IL_flag) {
height: 15px;
background-position: -2369px 0px
}
-et2-select-country[value="IM"] .flag, et2-select-country [value="IM"]::part(prefix) {
+et2-select-country[value="IM"]::part(prefix), et2-select-country::part(country_IM_flag) {
height: 10px;
background-position: -2391px 0px
}
-et2-select-country[value="IN"] .flag, et2-select-country [value="IN"]::part(prefix) {
+et2-select-country[value="IN"]::part(prefix), et2-select-country::part(country_IN_flag) {
height: 14px;
background-position: -2413px 0px
}
-et2-select-country[value="IO"] .flag, et2-select-country [value="IO"]::part(prefix) {
+et2-select-country[value="IO"]::part(prefix), et2-select-country::part(country_IO_flag) {
height: 10px;
background-position: -2435px 0px
}
-et2-select-country[value="IQ"] .flag, et2-select-country [value="IQ"]::part(prefix) {
+et2-select-country[value="IQ"]::part(prefix), et2-select-country::part(country_IQ_flag) {
height: 14px;
background-position: -2457px 0px
}
-et2-select-country[value="IR"] .flag, et2-select-country [value="IR"]::part(prefix) {
+et2-select-country[value="IR"]::part(prefix), et2-select-country::part(country_IR_flag) {
height: 12px;
background-position: -2479px 0px
}
-et2-select-country[value="IS"] .flag, et2-select-country [value="IS"]::part(prefix) {
+et2-select-country[value="IS"]::part(prefix), et2-select-country::part(country_IS_flag) {
height: 15px;
background-position: -2501px 0px
}
-et2-select-country[value="IT"] .flag, et2-select-country [value="IT"]::part(prefix) {
+et2-select-country[value="IT"]::part(prefix), et2-select-country::part(country_IT_flag) {
height: 14px;
background-position: -2523px 0px
}
-et2-select-country[value="JE"] .flag, et2-select-country [value="JE"]::part(prefix) {
+et2-select-country[value="JE"]::part(prefix), et2-select-country::part(country_JE_flag) {
height: 12px;
background-position: -2545px 0px
}
-et2-select-country[value="JM"] .flag, et2-select-country [value="JM"]::part(prefix) {
+et2-select-country[value="JM"]::part(prefix), et2-select-country::part(country_JM_flag) {
height: 10px;
background-position: -2567px 0px
}
-et2-select-country[value="JO"] .flag, et2-select-country [value="JO"]::part(prefix) {
+et2-select-country[value="JO"]::part(prefix), et2-select-country::part(country_JO_flag) {
height: 10px;
background-position: -2589px 0px
}
-et2-select-country[value="JP"] .flag, et2-select-country [value="JP"]::part(prefix) {
+et2-select-country[value="JP"]::part(prefix), et2-select-country::part(country_JP_flag) {
height: 14px;
background-position: -2611px 0px
}
-et2-select-country[value="KE"] .flag, et2-select-country [value="KE"]::part(prefix) {
+et2-select-country[value="KE"]::part(prefix), et2-select-country::part(country_KE_flag) {
height: 14px;
background-position: -2633px 0px
}
-et2-select-country[value="KG"] .flag, et2-select-country [value="KG"]::part(prefix) {
+et2-select-country[value="KG"]::part(prefix), et2-select-country::part(country_KG_flag) {
height: 12px;
background-position: -2655px 0px
}
-et2-select-country[value="KH"] .flag, et2-select-country [value="KH"]::part(prefix) {
+et2-select-country[value="KH"]::part(prefix), et2-select-country::part(country_KH_flag) {
height: 13px;
background-position: -2677px 0px
}
-et2-select-country[value="KI"] .flag, et2-select-country [value="KI"]::part(prefix) {
+et2-select-country[value="KI"]::part(prefix), et2-select-country::part(country_KI_flag) {
height: 10px;
background-position: -2699px 0px
}
-et2-select-country[value="KM"] .flag, et2-select-country [value="KM"]::part(prefix) {
+et2-select-country[value="KM"]::part(prefix), et2-select-country::part(country_KM_flag) {
height: 12px;
background-position: -2721px 0px
}
-et2-select-country[value="KN"] .flag, et2-select-country [value="KN"]::part(prefix) {
+et2-select-country[value="KN"]::part(prefix), et2-select-country::part(country_KN_flag) {
height: 14px;
background-position: -2743px 0px
}
-et2-select-country[value="KP"] .flag, et2-select-country [value="KP"]::part(prefix) {
+et2-select-country[value="KP"]::part(prefix), et2-select-country::part(country_KP_flag) {
height: 10px;
background-position: -2765px 0px
}
-et2-select-country[value="KR"] .flag, et2-select-country [value="KR"]::part(prefix) {
+et2-select-country[value="KR"]::part(prefix), et2-select-country::part(country_KR_flag) {
height: 14px;
background-position: -2787px 0px
}
-et2-select-country[value="KW"] .flag, et2-select-country [value="KW"]::part(prefix) {
+et2-select-country[value="KW"]::part(prefix), et2-select-country::part(country_KW_flag) {
height: 10px;
background-position: -2809px 0px
}
-et2-select-country[value="KY"] .flag, et2-select-country [value="KY"]::part(prefix) {
+et2-select-country[value="KY"]::part(prefix), et2-select-country::part(country_KY_flag) {
height: 10px;
background-position: -2831px 0px
}
-et2-select-country[value="KZ"] .flag, et2-select-country [value="KZ"]::part(prefix) {
+et2-select-country[value="KZ"]::part(prefix), et2-select-country::part(country_KZ_flag) {
height: 10px;
background-position: -2853px 0px
}
-et2-select-country[value="LA"] .flag, et2-select-country [value="LA"]::part(prefix) {
+et2-select-country[value="LA"]::part(prefix), et2-select-country::part(country_LA_flag) {
height: 14px;
background-position: -2875px 0px
}
-et2-select-country[value="LB"] .flag, et2-select-country [value="LB"]::part(prefix) {
+et2-select-country[value="LB"]::part(prefix), et2-select-country::part(country_LB_flag) {
height: 14px;
background-position: -2897px 0px
}
-et2-select-country[value="LC"] .flag, et2-select-country [value="LC"]::part(prefix) {
+et2-select-country[value="LC"]::part(prefix), et2-select-country::part(country_LC_flag) {
height: 10px;
background-position: -2919px 0px
}
-et2-select-country[value="LI"] .flag, et2-select-country [value="LI"]::part(prefix) {
+et2-select-country[value="LI"]::part(prefix), et2-select-country::part(country_LI_flag) {
height: 12px;
background-position: -2941px 0px
}
-et2-select-country[value="LK"] .flag, et2-select-country [value="LK"]::part(prefix) {
+et2-select-country[value="LK"]::part(prefix), et2-select-country::part(country_LK_flag) {
height: 10px;
background-position: -2963px 0px
}
-et2-select-country[value="LR"] .flag, et2-select-country [value="LR"]::part(prefix) {
+et2-select-country[value="LR"]::part(prefix), et2-select-country::part(country_LR_flag) {
height: 11px;
background-position: -2985px 0px
}
-et2-select-country[value="LS"] .flag, et2-select-country [value="LS"]::part(prefix) {
+et2-select-country[value="LS"]::part(prefix), et2-select-country::part(country_LS_flag) {
height: 14px;
background-position: -3007px 0px
}
-et2-select-country[value="LT"] .flag, et2-select-country [value="LT"]::part(prefix) {
+et2-select-country[value="LT"]::part(prefix), et2-select-country::part(country_LT_flag) {
height: 12px;
background-position: -3029px 0px
}
-et2-select-country[value="LU"] .flag, et2-select-country [value="LU"]::part(prefix) {
+et2-select-country[value="LU"]::part(prefix), et2-select-country::part(country_LU_flag) {
height: 12px;
background-position: -3051px 0px
}
-et2-select-country[value="LV"] .flag, et2-select-country [value="LV"]::part(prefix) {
+et2-select-country[value="LV"]::part(prefix), et2-select-country::part(country_LV_flag) {
height: 10px;
background-position: -3073px 0px
}
-et2-select-country[value="LY"] .flag, et2-select-country [value="LY"]::part(prefix) {
+et2-select-country[value="LY"]::part(prefix), et2-select-country::part(country_LY_flag) {
height: 10px;
background-position: -3095px 0px
}
-et2-select-country[value="MA"] .flag, et2-select-country [value="MA"]::part(prefix) {
+et2-select-country[value="MA"]::part(prefix), et2-select-country::part(country_MA_flag) {
height: 14px;
background-position: -3117px 0px
}
-et2-select-country[value="MC"] .flag, et2-select-country [value="MC"]::part(prefix) {
+et2-select-country[value="MC"]::part(prefix), et2-select-country::part(country_MC_flag) {
height: 15px;
background-position: -3139px 0px
}
-et2-select-country[value="MD"] .flag, et2-select-country [value="MD"]::part(prefix) {
+et2-select-country[value="MD"]::part(prefix), et2-select-country::part(country_MD_flag) {
height: 10px;
background-position: -3160px 0px
}
-et2-select-country[value="ME"] .flag, et2-select-country [value="ME"]::part(prefix) {
+et2-select-country[value="ME"]::part(prefix), et2-select-country::part(country_ME_flag) {
height: 10px;
background-position: -3182px 0px
}
-et2-select-country[value="MF"] .flag, et2-select-country [value="MF"]::part(prefix) {
+et2-select-country[value="MF"]::part(prefix), et2-select-country::part(country_MF_flag) {
height: 14px;
background-position: -3204px 0px
}
-et2-select-country[value="MG"] .flag, et2-select-country [value="MG"]::part(prefix) {
+et2-select-country[value="MG"]::part(prefix), et2-select-country::part(country_MG_flag) {
height: 14px;
background-position: -3226px 0px
}
-et2-select-country[value="MH"] .flag, et2-select-country [value="MH"]::part(prefix) {
+et2-select-country[value="MH"]::part(prefix), et2-select-country::part(country_MH_flag) {
height: 11px;
background-position: -3248px 0px
}
-et2-select-country[value="MK"] .flag, et2-select-country [value="MK"]::part(prefix) {
+et2-select-country[value="MK"]::part(prefix), et2-select-country::part(country_MK_flag) {
height: 10px;
background-position: -3270px 0px
}
-et2-select-country[value="ML"] .flag, et2-select-country [value="ML"]::part(prefix) {
+et2-select-country[value="ML"]::part(prefix), et2-select-country::part(country_ML_flag) {
height: 14px;
background-position: -3292px 0px
}
-et2-select-country[value="MM"] .flag, et2-select-country [value="MM"]::part(prefix) {
+et2-select-country[value="MM"]::part(prefix), et2-select-country::part(country_MM_flag) {
height: 14px;
background-position: -3314px 0px
}
-et2-select-country[value="MN"] .flag, et2-select-country [value="MN"]::part(prefix) {
+et2-select-country[value="MN"]::part(prefix), et2-select-country::part(country_MN_flag) {
height: 10px;
background-position: -3336px 0px
}
-et2-select-country[value="MO"] .flag, et2-select-country [value="MO"]::part(prefix) {
+et2-select-country[value="MO"]::part(prefix), et2-select-country::part(country_MO_flag) {
height: 14px;
background-position: -3358px 0px
}
-et2-select-country[value="MP"] .flag, et2-select-country [value="MP"]::part(prefix) {
+et2-select-country[value="MP"]::part(prefix), et2-select-country::part(country_MP_flag) {
height: 10px;
background-position: -3380px 0px
}
-et2-select-country[value="MQ"] .flag, et2-select-country [value="MQ"]::part(prefix) {
+et2-select-country[value="MQ"]::part(prefix), et2-select-country::part(country_MQ_flag) {
height: 14px;
background-position: -3402px 0px
}
-et2-select-country[value="MR"] .flag, et2-select-country [value="MR"]::part(prefix) {
+et2-select-country[value="MR"]::part(prefix), et2-select-country::part(country_MR_flag) {
height: 14px;
background-position: -3424px 0px
}
-et2-select-country[value="MS"] .flag, et2-select-country [value="MS"]::part(prefix) {
+et2-select-country[value="MS"]::part(prefix), et2-select-country::part(country_MS_flag) {
height: 10px;
background-position: -3446px 0px
}
-et2-select-country[value="MT"] .flag, et2-select-country [value="MT"]::part(prefix) {
+et2-select-country[value="MT"]::part(prefix), et2-select-country::part(country_MT_flag) {
height: 14px;
background-position: -3468px 0px
}
-et2-select-country[value="MU"] .flag, et2-select-country [value="MU"]::part(prefix) {
+et2-select-country[value="MU"]::part(prefix), et2-select-country::part(country_MU_flag) {
height: 14px;
background-position: -3490px 0px
}
-et2-select-country[value="MV"] .flag, et2-select-country [value="MV"]::part(prefix) {
+et2-select-country[value="MV"]::part(prefix), et2-select-country::part(country_MV_flag) {
height: 14px;
background-position: -3512px 0px
}
-et2-select-country[value="MW"] .flag, et2-select-country [value="MW"]::part(prefix) {
+et2-select-country[value="MW"]::part(prefix), et2-select-country::part(country_MW_flag) {
height: 14px;
background-position: -3534px 0px
}
-et2-select-country[value="MX"] .flag, et2-select-country [value="MX"]::part(prefix) {
+et2-select-country[value="MX"]::part(prefix), et2-select-country::part(country_MX_flag) {
height: 12px;
background-position: -3556px 0px
}
-et2-select-country[value="MY"] .flag, et2-select-country [value="MY"]::part(prefix) {
+et2-select-country[value="MY"]::part(prefix), et2-select-country::part(country_MY_flag) {
height: 10px;
background-position: -3578px 0px
}
-et2-select-country[value="MZ"] .flag, et2-select-country [value="MZ"]::part(prefix) {
+et2-select-country[value="MZ"]::part(prefix), et2-select-country::part(country_MZ_flag) {
height: 14px;
background-position: -3600px 0px
}
-et2-select-country[value="NA"] .flag, et2-select-country [value="NA"]::part(prefix) {
+et2-select-country[value="NA"]::part(prefix), et2-select-country::part(country_NA_flag) {
height: 14px;
background-position: -3622px 0px
}
-et2-select-country[value="NC"] .flag, et2-select-country [value="NC"]::part(prefix) {
+et2-select-country[value="NC"]::part(prefix), et2-select-country::part(country_NC_flag) {
height: 10px;
background-position: -3644px 0px
}
-et2-select-country[value="NE"] .flag, et2-select-country [value="NE"]::part(prefix) {
+et2-select-country[value="NE"]::part(prefix), et2-select-country::part(country_NE_flag) {
height: 15px;
background-position: -3666px 0px
}
-et2-select-country[value="NF"] .flag, et2-select-country [value="NF"]::part(prefix) {
+et2-select-country[value="NF"]::part(prefix), et2-select-country::part(country_NF_flag) {
height: 10px;
background-position: -3686px 0px
}
-et2-select-country[value="NG"] .flag, et2-select-country [value="NG"]::part(prefix) {
+et2-select-country[value="NG"]::part(prefix), et2-select-country::part(country_NG_flag) {
height: 10px;
background-position: -3708px 0px
}
-et2-select-country[value="NI"] .flag, et2-select-country [value="NI"]::part(prefix) {
+et2-select-country[value="NI"]::part(prefix), et2-select-country::part(country_NI_flag) {
height: 12px;
background-position: -3730px 0px
}
-et2-select-country[value="NL"] .flag, et2-select-country [value="NL"]::part(prefix) {
+et2-select-country[value="NL"]::part(prefix), et2-select-country::part(country_NL_flag) {
height: 14px;
background-position: -3752px 0px
}
-et2-select-country[value="NO"] .flag, et2-select-country [value="NO"]::part(prefix) {
+et2-select-country[value="NO"]::part(prefix), et2-select-country::part(country_NO_flag) {
height: 15px;
background-position: -3774px 0px
}
-et2-select-country[value="NP"] .flag, et2-select-country [value="NP"]::part(prefix) {
+et2-select-country[value="NP"]::part(prefix), et2-select-country::part(country_NP_flag) {
height: 15px;
background-position: -3796px 0px;
background-color: transparent
}
-et2-select-country[value="NR"] .flag, et2-select-country [value="NR"]::part(prefix) {
+et2-select-country[value="NR"]::part(prefix), et2-select-country::part(country_NR_flag) {
height: 10px;
background-position: -3811px 0px
}
-et2-select-country[value="NU"] .flag, et2-select-country [value="NU"]::part(prefix) {
+et2-select-country[value="NU"]::part(prefix), et2-select-country::part(country_NU_flag) {
height: 10px;
background-position: -3833px 0px
}
-et2-select-country[value="NZ"] .flag, et2-select-country [value="NZ"]::part(prefix) {
+et2-select-country[value="NZ"]::part(prefix), et2-select-country::part(country_NZ_flag) {
height: 10px;
background-position: -3855px 0px
}
-et2-select-country[value="OM"] .flag, et2-select-country [value="OM"]::part(prefix) {
+et2-select-country[value="OM"]::part(prefix), et2-select-country::part(country_OM_flag) {
height: 10px;
background-position: -3877px 0px
}
-et2-select-country[value="PA"] .flag, et2-select-country [value="PA"]::part(prefix) {
+et2-select-country[value="PA"]::part(prefix), et2-select-country::part(country_PA_flag) {
height: 14px;
background-position: -3899px 0px
}
-et2-select-country[value="PE"] .flag, et2-select-country [value="PE"]::part(prefix) {
+et2-select-country[value="PE"]::part(prefix), et2-select-country::part(country_PE_flag) {
height: 14px;
background-position: -3921px 0px
}
-et2-select-country[value="PF"] .flag, et2-select-country [value="PF"]::part(prefix) {
+et2-select-country[value="PF"]::part(prefix), et2-select-country::part(country_PF_flag) {
height: 14px;
background-position: -3943px 0px
}
-et2-select-country[value="PG"] .flag, et2-select-country [value="PG"]::part(prefix) {
+et2-select-country[value="PG"]::part(prefix), et2-select-country::part(country_PG_flag) {
height: 15px;
background-position: -3965px 0px
}
-et2-select-country[value="PH"] .flag, et2-select-country [value="PH"]::part(prefix) {
+et2-select-country[value="PH"]::part(prefix), et2-select-country::part(country_PH_flag) {
height: 10px;
background-position: -3987px 0px
}
-et2-select-country[value="PK"] .flag, et2-select-country [value="PK"]::part(prefix) {
+et2-select-country[value="PK"]::part(prefix), et2-select-country::part(country_PK_flag) {
height: 14px;
background-position: -4009px 0px
}
-et2-select-country[value="PL"] .flag, et2-select-country [value="PL"]::part(prefix) {
+et2-select-country[value="PL"]::part(prefix), et2-select-country::part(country_PL_flag) {
height: 13px;
background-position: -4031px 0px
}
-et2-select-country[value="PM"] .flag, et2-select-country [value="PM"]::part(prefix) {
+et2-select-country[value="PM"]::part(prefix), et2-select-country::part(country_PM_flag) {
height: 14px;
background-position: -4053px 0px
}
-et2-select-country[value="PN"] .flag, et2-select-country [value="PN"]::part(prefix) {
+et2-select-country[value="PN"]::part(prefix), et2-select-country::part(country_PN_flag) {
height: 10px;
background-position: -4075px 0px
}
-et2-select-country[value="PR"] .flag, et2-select-country [value="PR"]::part(prefix) {
+et2-select-country[value="PR"]::part(prefix), et2-select-country::part(country_PR_flag) {
height: 14px;
background-position: -4097px 0px
}
-et2-select-country[value="PS"] .flag, et2-select-country [value="PS"]::part(prefix) {
+et2-select-country[value="PS"]::part(prefix), et2-select-country::part(country_PS_flag) {
height: 10px;
background-position: -4119px 0px
}
-et2-select-country[value="PT"] .flag, et2-select-country [value="PT"]::part(prefix) {
+et2-select-country[value="PT"]::part(prefix), et2-select-country::part(country_PT_flag) {
height: 14px;
background-position: -4141px 0px
}
-et2-select-country[value="PW"] .flag, et2-select-country [value="PW"]::part(prefix) {
+et2-select-country[value="PW"]::part(prefix), et2-select-country::part(country_PW_flag) {
height: 13px;
background-position: -4163px 0px
}
-et2-select-country[value="PY"] .flag, et2-select-country [value="PY"]::part(prefix) {
+et2-select-country[value="PY"]::part(prefix), et2-select-country::part(country_PY_flag) {
height: 11px;
background-position: -4185px 0px
}
-et2-select-country[value="QA"] .flag, et2-select-country [value="QA"]::part(prefix) {
+et2-select-country[value="QA"]::part(prefix), et2-select-country::part(country_QA_flag) {
height: 8px;
background-position: -4207px 0px
}
-et2-select-country[value="RE"] .flag, et2-select-country [value="RE"]::part(prefix) {
+et2-select-country[value="RE"]::part(prefix), et2-select-country::part(country_RE_flag) {
height: 14px;
background-position: -4229px 0px
}
-et2-select-country[value="RO"] .flag, et2-select-country [value="RO"]::part(prefix) {
+et2-select-country[value="RO"]::part(prefix), et2-select-country::part(country_RO_flag) {
height: 14px;
background-position: -4251px 0px
}
-et2-select-country[value="RS"] .flag, et2-select-country [value="RS"]::part(prefix) {
+et2-select-country[value="RS"]::part(prefix), et2-select-country::part(country_RS_flag) {
height: 14px;
background-position: -4273px 0px
}
-et2-select-country[value="RU"] .flag, et2-select-country [value="RU"]::part(prefix) {
+et2-select-country[value="RU"]::part(prefix), et2-select-country::part(country_RU_flag) {
height: 14px;
background-position: -4295px 0px
}
-et2-select-country[value="RW"] .flag, et2-select-country [value="RW"]::part(prefix) {
+et2-select-country[value="RW"]::part(prefix), et2-select-country::part(country_RW_flag) {
height: 14px;
background-position: -4317px 0px
}
-et2-select-country[value="SA"] .flag, et2-select-country [value="SA"]::part(prefix) {
+et2-select-country[value="SA"]::part(prefix), et2-select-country::part(country_SA_flag) {
height: 14px;
background-position: -4339px 0px
}
-et2-select-country[value="SB"] .flag, et2-select-country [value="SB"]::part(prefix) {
+et2-select-country[value="SB"]::part(prefix), et2-select-country::part(country_SB_flag) {
height: 10px;
background-position: -4361px 0px
}
-et2-select-country[value="SC"] .flag, et2-select-country [value="SC"]::part(prefix) {
+et2-select-country[value="SC"]::part(prefix), et2-select-country::part(country_SC_flag) {
height: 10px;
background-position: -4383px 0px
}
-et2-select-country[value="SD"] .flag, et2-select-country [value="SD"]::part(prefix) {
+et2-select-country[value="SD"]::part(prefix), et2-select-country::part(country_SD_flag) {
height: 10px;
background-position: -4405px 0px
}
-et2-select-country[value="SE"] .flag, et2-select-country [value="SE"]::part(prefix) {
+et2-select-country[value="SE"]::part(prefix), et2-select-country::part(country_SE_flag) {
height: 13px;
background-position: -4427px 0px
}
-et2-select-country[value="SG"] .flag, et2-select-country [value="SG"]::part(prefix) {
+et2-select-country[value="SG"]::part(prefix), et2-select-country::part(country_SG_flag) {
height: 14px;
background-position: -4449px 0px
}
-et2-select-country[value="SH"] .flag, et2-select-country [value="SH"]::part(prefix) {
+et2-select-country[value="SH"]::part(prefix), et2-select-country::part(country_SH_flag) {
height: 10px;
background-position: -4471px 0px
}
-et2-select-country[value="SI"] .flag, et2-select-country [value="SI"]::part(prefix) {
+et2-select-country[value="SI"]::part(prefix), et2-select-country::part(country_SI_flag) {
height: 10px;
background-position: -4493px 0px
}
-et2-select-country[value="SJ"] .flag, et2-select-country [value="SJ"]::part(prefix) {
+et2-select-country[value="SJ"]::part(prefix), et2-select-country::part(country_SJ_flag) {
height: 15px;
background-position: -4515px 0px
}
-et2-select-country[value="SK"] .flag, et2-select-country [value="SK"]::part(prefix) {
+et2-select-country[value="SK"]::part(prefix), et2-select-country::part(country_SK_flag) {
height: 14px;
background-position: -4537px 0px
}
-et2-select-country[value="SL"] .flag, et2-select-country [value="SL"]::part(prefix) {
+et2-select-country[value="SL"]::part(prefix), et2-select-country::part(country_SL_flag) {
height: 14px;
background-position: -4559px 0px
}
-et2-select-country[value="SM"] .flag, et2-select-country [value="SM"]::part(prefix) {
+et2-select-country[value="SM"]::part(prefix), et2-select-country::part(country_SM_flag) {
height: 15px;
background-position: -4581px 0px
}
-et2-select-country[value="SN"] .flag, et2-select-country [value="SN"]::part(prefix) {
+et2-select-country[value="SN"]::part(prefix), et2-select-country::part(country_SN_flag) {
height: 14px;
background-position: -4603px 0px
}
-et2-select-country[value="SO"] .flag, et2-select-country [value="SO"]::part(prefix) {
+et2-select-country[value="SO"]::part(prefix), et2-select-country::part(country_SO_flag) {
height: 14px;
background-position: -4625px 0px
}
-et2-select-country[value="SR"] .flag, et2-select-country [value="SR"]::part(prefix) {
+et2-select-country[value="SR"]::part(prefix), et2-select-country::part(country_SR_flag) {
height: 14px;
background-position: -4647px 0px
}
-et2-select-country[value="SS"] .flag, et2-select-country [value="SS"]::part(prefix) {
+et2-select-country[value="SS"]::part(prefix), et2-select-country::part(country_SS_flag) {
height: 10px;
background-position: -4669px 0px
}
-et2-select-country[value="ST"] .flag, et2-select-country [value="ST"]::part(prefix) {
+et2-select-country[value="ST"]::part(prefix), et2-select-country::part(country_ST_flag) {
height: 10px;
background-position: -4691px 0px
}
-et2-select-country[value="SV"] .flag, et2-select-country [value="SV"]::part(prefix) {
+et2-select-country[value="SV"]::part(prefix), et2-select-country::part(country_SV_flag) {
height: 12px;
background-position: -4713px 0px
}
-et2-select-country[value="SX"] .flag, et2-select-country [value="SX"]::part(prefix) {
+et2-select-country[value="SX"]::part(prefix), et2-select-country::part(country_SX_flag) {
height: 14px;
background-position: -4735px 0px
}
-et2-select-country[value="SY"] .flag, et2-select-country [value="SY"]::part(prefix) {
+et2-select-country[value="SY"]::part(prefix), et2-select-country::part(country_SY_flag) {
height: 14px;
background-position: -4757px 0px
}
-et2-select-country[value="SZ"] .flag, et2-select-country [value="SZ"]::part(prefix) {
+et2-select-country[value="SZ"]::part(prefix), et2-select-country::part(country_SZ_flag) {
height: 14px;
background-position: -4779px 0px
}
-et2-select-country[value="TA"] .flag, et2-select-country [value="TA"]::part(prefix) {
+et2-select-country[value="TA"]::part(prefix), et2-select-country::part(country_TA_flag) {
height: 10px;
background-position: -4801px 0px
}
-et2-select-country[value="TC"] .flag, et2-select-country [value="TC"]::part(prefix) {
+et2-select-country[value="TC"]::part(prefix), et2-select-country::part(country_TC_flag) {
height: 10px;
background-position: -4823px 0px
}
-et2-select-country[value="TD"] .flag, et2-select-country [value="TD"]::part(prefix) {
+et2-select-country[value="TD"]::part(prefix), et2-select-country::part(country_TD_flag) {
height: 14px;
background-position: -4845px 0px
}
-et2-select-country[value="TF"] .flag, et2-select-country [value="TF"]::part(prefix) {
+et2-select-country[value="TF"]::part(prefix), et2-select-country::part(country_TF_flag) {
height: 14px;
background-position: -4867px 0px
}
-et2-select-country[value="TG"] .flag, et2-select-country [value="TG"]::part(prefix) {
+et2-select-country[value="TG"]::part(prefix), et2-select-country::part(country_TG_flag) {
height: 13px;
background-position: -4889px 0px
}
-et2-select-country[value="TH"] .flag, et2-select-country [value="TH"]::part(prefix) {
+et2-select-country[value="TH"]::part(prefix), et2-select-country::part(country_TH_flag) {
height: 14px;
background-position: -4911px 0px
}
-et2-select-country[value="TJ"] .flag, et2-select-country [value="TJ"]::part(prefix) {
+et2-select-country[value="TJ"]::part(prefix), et2-select-country::part(country_TJ_flag) {
height: 10px;
background-position: -4933px 0px
}
-et2-select-country[value="TK"] .flag, et2-select-country [value="TK"]::part(prefix) {
+et2-select-country[value="TK"]::part(prefix), et2-select-country::part(country_TK_flag) {
height: 10px;
background-position: -4955px 0px
}
-et2-select-country[value="TL"] .flag, et2-select-country [value="TL"]::part(prefix) {
+et2-select-country[value="TL"]::part(prefix), et2-select-country::part(country_TL_flag) {
height: 10px;
background-position: -4977px 0px
}
-et2-select-country[value="TM"] .flag, et2-select-country [value="TM"]::part(prefix) {
+et2-select-country[value="TM"]::part(prefix), et2-select-country::part(country_TM_flag) {
height: 14px;
background-position: -4999px 0px
}
-et2-select-country[value="TN"] .flag, et2-select-country [value="TN"]::part(prefix) {
+et2-select-country[value="TN"]::part(prefix), et2-select-country::part(country_TN_flag) {
height: 14px;
background-position: -5021px 0px
}
-et2-select-country[value="TO"] .flag, et2-select-country [value="TO"]::part(prefix) {
+et2-select-country[value="TO"]::part(prefix), et2-select-country::part(country_TO_flag) {
height: 10px;
background-position: -5043px 0px
}
-et2-select-country[value="TR"] .flag, et2-select-country [value="TR"]::part(prefix) {
+et2-select-country[value="TR"]::part(prefix), et2-select-country::part(country_TR_flag) {
height: 14px;
background-position: -5065px 0px
}
-et2-select-country[value="TT"] .flag, et2-select-country [value="TT"]::part(prefix) {
+et2-select-country[value="TT"]::part(prefix), et2-select-country::part(country_TT_flag) {
height: 12px;
background-position: -5087px 0px
}
-et2-select-country[value="TV"] .flag, et2-select-country [value="TV"]::part(prefix) {
+et2-select-country[value="TV"]::part(prefix), et2-select-country::part(country_TV_flag) {
height: 10px;
background-position: -5109px 0px
}
-et2-select-country[value="TW"] .flag, et2-select-country [value="TW"]::part(prefix) {
+et2-select-country[value="TW"]::part(prefix), et2-select-country::part(country_TW_flag) {
height: 14px;
background-position: -5131px 0px
}
-et2-select-country[value="TZ"] .flag, et2-select-country [value="TZ"]::part(prefix) {
+et2-select-country[value="TZ"]::part(prefix), et2-select-country::part(country_TZ_flag) {
height: 14px;
background-position: -5153px 0px
}
-et2-select-country[value="UA"] .flag, et2-select-country [value="UA"]::part(prefix) {
+et2-select-country[value="UA"]::part(prefix), et2-select-country::part(country_UA_flag) {
height: 14px;
background-position: -5175px 0px
}
-et2-select-country[value="UG"] .flag, et2-select-country [value="UG"]::part(prefix) {
+et2-select-country[value="UG"]::part(prefix), et2-select-country::part(country_UG_flag) {
height: 14px;
background-position: -5197px 0px
}
-et2-select-country[value="UM"] .flag, et2-select-country [value="UM"]::part(prefix) {
+et2-select-country[value="UM"]::part(prefix), et2-select-country::part(country_UM_flag) {
height: 11px;
background-position: -5219px 0px
}
-et2-select-country[value="US"] .flag, et2-select-country [value="US"]::part(prefix) {
+et2-select-country[value="US"]::part(prefix), et2-select-country::part(country_US_flag) {
height: 11px;
background-position: -5241px 0px
}
-et2-select-country[value="UY"] .flag, et2-select-country [value="UY"]::part(prefix) {
+et2-select-country[value="UY"]::part(prefix), et2-select-country::part(country_UY_flag) {
height: 14px;
background-position: -5263px 0px
}
-et2-select-country[value="UZ"] .flag, et2-select-country [value="UZ"]::part(prefix) {
+et2-select-country[value="UZ"]::part(prefix), et2-select-country::part(country_UZ_flag) {
height: 10px;
background-position: -5285px 0px
}
-et2-select-country[value="VA"] .flag, et2-select-country [value="VA"]::part(prefix) {
+et2-select-country[value="VA"]::part(prefix), et2-select-country::part(country_VA_flag) {
height: 15px;
background-position: -5307px 0px
}
-et2-select-country[value="VC"] .flag, et2-select-country [value="VC"]::part(prefix) {
+et2-select-country[value="VC"]::part(prefix), et2-select-country::part(country_VC_flag) {
height: 14px;
background-position: -5324px 0px
}
-et2-select-country[value="VE"] .flag, et2-select-country [value="VE"]::part(prefix) {
+et2-select-country[value="VE"]::part(prefix), et2-select-country::part(country_VE_flag) {
height: 14px;
background-position: -5346px 0px
}
-et2-select-country[value="VG"] .flag, et2-select-country [value="VG"]::part(prefix) {
+et2-select-country[value="VG"]::part(prefix), et2-select-country::part(country_VG_flag) {
height: 10px;
background-position: -5368px 0px
}
-et2-select-country[value="VI"] .flag, et2-select-country [value="VI"]::part(prefix) {
+et2-select-country[value="VI"]::part(prefix), et2-select-country::part(country_VI_flag) {
height: 14px;
background-position: -5390px 0px
}
-et2-select-country[value="VN"] .flag, et2-select-country [value="VN"]::part(prefix) {
+et2-select-country[value="VN"]::part(prefix), et2-select-country::part(country_VN_flag) {
height: 14px;
background-position: -5412px 0px
}
-et2-select-country[value="VU"] .flag, et2-select-country [value="VU"]::part(prefix) {
+et2-select-country[value="VU"]::part(prefix), et2-select-country::part(country_VU_flag) {
height: 12px;
background-position: -5434px 0px
}
-et2-select-country[value="WF"] .flag, et2-select-country [value="WF"]::part(prefix) {
+et2-select-country[value="WF"]::part(prefix), et2-select-country::part(country_WF_flag) {
height: 14px;
background-position: -5456px 0px
}
-et2-select-country[value="WS"] .flag, et2-select-country [value="WS"]::part(prefix) {
+et2-select-country[value="WS"]::part(prefix), et2-select-country::part(country_WS_flag) {
height: 10px;
background-position: -5478px 0px
}
-et2-select-country[value="XK"] .flag, et2-select-country [value="XK"]::part(prefix) {
+et2-select-country[value="XK"]::part(prefix), et2-select-country::part(country_XK_flag) {
height: 15px;
background-position: -5500px 0px
}
-et2-select-country[value="YE"] .flag, et2-select-country [value="YE"]::part(prefix) {
+et2-select-country[value="YE"]::part(prefix), et2-select-country::part(country_YE_flag) {
height: 14px;
background-position: -5522px 0px
}
-et2-select-country[value="YT"] .flag, et2-select-country [value="YT"]::part(prefix) {
+et2-select-country[value="YT"]::part(prefix), et2-select-country::part(country_YT_flag) {
height: 14px;
background-position: -5544px 0px
}
-et2-select-country[value="ZA"] .flag, et2-select-country [value="ZA"]::part(prefix) {
+et2-select-country[value="ZA"]::part(prefix), et2-select-country::part(country_ZA_flag) {
height: 14px;
background-position: -5566px 0px
}
-et2-select-country[value="ZM"] .flag, et2-select-country [value="ZM"]::part(prefix) {
+et2-select-country[value="ZM"]::part(prefix), et2-select-country::part(country_ZM_flag) {
height: 14px;
background-position: -5588px 0px
}
-et2-select-country[value="ZW"] .flag, et2-select-country [value="ZW"]::part(prefix) {
+et2-select-country[value="ZW"]::part(prefix), et2-select-country::part(country_ZW_flag) {
height: 10px;
background-position: -5610px 0px
}
\ No newline at end of file
diff --git a/api/templates/default/etemplate2.css b/api/templates/default/etemplate2.css
index 25ec88990b..fe24f73aba 100644
--- a/api/templates/default/etemplate2.css
+++ b/api/templates/default/etemplate2.css
@@ -78,36 +78,8 @@
display: none;
}
-/* Put widget label to the left of the widget, with fixed width */
-::part(form-control) {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
-}
-
-::part(form-control-label) {
- flex: 0 0 auto;
- white-space: normal;
-}
-
-::part(form-control-input) {
- flex: 1 1 auto;
- position: relative;
- max-width: 100%;
-}
-
-::part(form-control-help-text) {
- flex-basis: 100%;
- position: relative;
-}
-
-/* Use .et2-label-fixed class to give fixed label size */
-.et2-label-fixed::part(form-control-label) {
- width: initial;
- width: var(--label-width, 8em);
-}
-.et2-label-fixed::part(form-control-help-text) {
- left: calc(var(--sl-spacing-medium) + var(--label-width,8em));
+*[hidden] {
+ display: none !important;
}
/**
@@ -544,6 +516,14 @@ textarea.et2_textbox_ro {
/**
* Multi-select widget
*/
+[search][open] et2-textbox::part(base) {
+ border: none;
+ box-shadow: none;
+}
+
+[search][open]::part(combobox) {
+ flex-flow: wrap;
+}
button.et2_selectbox_expand {
width: 16px;
display: inline-block;
@@ -1451,15 +1431,15 @@ div.et2_vfsPath li img {
}
/* Category indents in select options */
-sl-menu-item.cat_level1::part(label) {
+sl-option.cat_level1::part(label) {
padding-left: var(--sl-spacing-medium, 1em);
}
-sl-menu-item.cat_level2::part(label) {
+sl-option.cat_level2::part(label) {
padding-left: calc(2 * var(--sl-spacing-medium, 1em));
}
-sl-menu-item.cat_level3::part(label) {
+sl-option.cat_level3::part(label) {
padding-left: calc(3 * var(--sl-spacing-medium, 1em));
}
@@ -3489,6 +3469,7 @@ div.et2_image_tooltipPopup {
div.et2_egw_action_ddHelper {
z-index: -100;
position: relative;
+ max-width: fit-content;
}
/* The last div which shows Ctrl tip to user*/
@@ -3509,17 +3490,22 @@ div.et2_egw_action_ddHelper table.et2_egw_action_ddHelper_row {
background-color: rgba(255, 194, 0, 0.70);
box-shadow: 6px 6px 8px gray;
border: 1px solid black;
+ max-width: 400px;
}
+div.et2_egw_action_ddHelper et2-avatar, div.et2_egw_action_ddHelper et2-lavatar {
+ flex-grow: 0;
+ --size: 2em;
+}
table.et2_egw_action_ddHelper_row tr {
background: none;
max-height: 20px;
}
-/* Apply to all displaied rows in order to get same result*/
-table.et2_egw_action_ddHelper_row * {
+/* Apply to all displayed rows in order to get same result*/
+table.et2_egw_action_ddHelper_row > *, table.et2_egw_action_ddHelper_row .innerContainer {
white-space: nowrap !important;
- max-height: 15px;
+ max-height: 2em;
overflow: hidden;
text-overflow: ellipsis;
max-width: 400px;
@@ -3753,6 +3739,10 @@ td.avatar {
box-shadow: none;
}
+et2-avatar, et2-lavatar {
+ --size: 2.7em;
+}
+
.et2_searchbox {
position: relative;
padding: 0;
diff --git a/api/templates/default/images/dhtmlxtree/folderClosed.svg b/api/templates/default/images/dhtmlxtree/folderClosed.svg
index 24d3d5558f..4378507e80 100644
--- a/api/templates/default/images/dhtmlxtree/folderClosed.svg
+++ b/api/templates/default/images/dhtmlxtree/folderClosed.svg
@@ -1,4 +1,4 @@
-
+
diff --git a/api/templates/default/images/dhtmlxtree/folderNoSelectClosed.svg b/api/templates/default/images/dhtmlxtree/folderNoSelectClosed.svg
new file mode 100644
index 0000000000..23968cc12e
--- /dev/null
+++ b/api/templates/default/images/dhtmlxtree/folderNoSelectClosed.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/api/templates/default/images/ical.svg b/api/templates/default/images/ical.svg
new file mode 100644
index 0000000000..f83a793967
--- /dev/null
+++ b/api/templates/default/images/ical.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/api/templates/default/images/timesheet.svg b/api/templates/default/images/timesheet.svg
index 71d0462ea0..bbc2641912 100644
--- a/api/templates/default/images/timesheet.svg
+++ b/api/templates/default/images/timesheet.svg
@@ -1,20 +1,4 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/api/templates/test/customfields_test.xet b/api/templates/test/customfields_test.xet
new file mode 100644
index 0000000000..be37ffdffc
--- /dev/null
+++ b/api/templates/test/customfields_test.xet
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api/tests/Etemplate/Widget/CustomfieldsTest.php b/api/tests/Etemplate/Widget/CustomfieldsTest.php
new file mode 100644
index 0000000000..d746055547
--- /dev/null
+++ b/api/tests/Etemplate/Widget/CustomfieldsTest.php
@@ -0,0 +1,216 @@
+ array(
+ 'id' => '1',
+ 'app' => 'infolog',
+ 'name' => 'text',
+ 'label' => 'text',
+ 'type' => 'text',
+ 'needed' => false,
+ 'private' => [],
+ ),
+ 'required' => array(
+ 'id' => '2',
+ 'app' => 'infolog',
+ 'name' => 'required',
+ 'label' => 'required',
+ 'type' => 'text',
+ 'needed' => true,
+ 'private' => [],
+ ),
+ 'private' => array(
+ 'id' => '3',
+ 'app' => 'infolog',
+ 'name' => 'private',
+ 'label' => 'private',
+ 'type' => 'text',
+ 'needed' => false,
+ 'private' => ['-1'],
+ ),
+ 'type_limited' => array(
+ 'id' => '4',
+ 'app' => 'infolog',
+ 'name' => 'type_limited',
+ 'label' => 'type limited',
+ 'type' => 'text',
+ 'type2' => ['subtype'],
+ 'needed' => false,
+ )
+ ];
+
+ /**
+ * Test the widget's basic functionality - we put data in, it comes back
+ * unchanged.
+ *
+ * @dataProvider validProvider
+ */
+ public function testBasic($content)
+ {
+ // Instanciate the template
+ $etemplate = new Etemplate();
+ $etemplate->read(static::TEST_TEMPLATE, 'test');
+
+ // Set CFs
+ $etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
+
+ // Send it around
+ $result = $this->mockedRoundTrip($etemplate, array('widget' => $content));
+
+ // Test it
+ $this->validateTest($result, array('widget' => $content));
+ }
+
+ /**
+ * Test that the widget does not return a value if readonly
+ *
+ * @dataProvider validProvider
+ *
+ * It's the client that removes them here, so we can't really test without.
+ *
+ * public function testReadonly($content)
+ * {
+ * // Instanciate the template
+ * $etemplate = new Etemplate();
+ * $etemplate->read(static::TEST_TEMPLATE, 'test');
+ *
+ * // Set CFs
+ * $etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
+ *
+ * // Exec
+ * $result = $this->mockedRoundTrip($etemplate, ['widget' => $content], array(), array('widget' => true));
+ *
+ * // Check
+ * $this->assertEquals(array(), $result);
+ * }
+ */
+
+ /**
+ * @dataProvider validProvider
+ * @return void
+ * @throws \Exception
+ */
+ public function testPrivateFilter($content)
+ {
+ // Instanciate the template
+ $etemplate = new Etemplate();
+ $etemplate->read(static::TEST_TEMPLATE, 'test');
+
+ // Set CFs
+ $etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
+
+ // Exec
+ $result = $this->mockedRoundTrip($etemplate, ['private' => true, 'widget' => $content]);
+
+ // Check for only the private field
+ $this->assertSame(['widget' => ['#private' => 'private']], $result);
+
+
+ // Now the opposite, only non-private
+ unset($content['#private']);
+ // Exec
+ $etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
+ $result = $this->mockedRoundTrip($etemplate, ['private' => '0', 'widget' => $content]);
+
+ // Check for all but the private field
+ $this->assertSame(['widget' => $content], $result);
+ }
+
+ /**
+ * Check field filtering
+ *
+ * @param type $content
+ * @param type $validation_errors
+ *
+ * @dataProvider fieldFilterProvider
+ */
+ public function testFieldFilter($content, $fields, $expected)
+ {
+ // Instanciate the template
+ $etemplate = new Etemplate();
+ $etemplate->read(static::TEST_TEMPLATE, 'test');
+
+ // Set CFs
+ $etemplate->setElementAttribute('widget', 'customfields', self::cf_list);
+
+ // Filter
+ $etemplate->setElementAttribute('widget', 'fields', $fields);
+
+ $content = array('widget' => $content);
+ $result = $this->mockedExec($etemplate, $content);
+
+ // Check for the load
+ $data = array();
+ foreach($result as $command)
+ {
+ if($command['type'] == 'et2_load')
+ {
+ $data = $command['data'];
+ break;
+ }
+ }
+
+ // Make sure we're sending what is expected
+ $this->assertContains(key($expected), array_keys($data['data']['content']['widget']), "Filtered field missing");
+ $this->assertEquals(current($expected), $data['data']['content']['widget'][key($expected)], "Filtered field's value missing");
+ }
+
+ /**
+ * These are all valid, since fields are all text.
+ * The individual widgets to their own type validation.
+ */
+ public static function validProvider()
+ {
+ return array(
+ [['#text' => 'text', '#required' => 'required', '#private' => 'private', '#type_limited' => 'type_limited']]
+ );
+ }
+
+ /**
+ * Check filtering each field individually, then filtering to allow all fields
+ */
+ public function fieldFilterProvider()
+ {
+ $field_values = CustomfieldsTest::validProvider()[0][0];
+ $field_filters = array();
+ foreach(CustomfieldsTest::cf_list as $field_name => $field)
+ {
+ $field_filters[] = array(
+ $field_values,
+ $field_name,
+ ['#' . $field_name => $field_values['#' . $field_name]]
+ );
+ }
+ $field_filters[] = array(
+ $field_values,
+ array_keys(CustomfieldsTest::cf_list),
+ $field_values
+ );
+ return $field_filters;
+ }
+}
diff --git a/calendar/freebusy.php b/calendar/freebusy.php
index ebaf512589..df89edce17 100644
--- a/calendar/freebusy.php
+++ b/calendar/freebusy.php
@@ -32,11 +32,16 @@ $GLOBALS['egw_info'] = array(
require_once __DIR__.'/../api/src/autoload.php';
if (!($logged_in = !empty(Api\Session::get_sessionid())))
{
- // support basic auth for regular user-credentials
- if (!empty($_SERVER['PHP_AUTH_PW']) || !empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
+ // support basic auth and $_GET[cred] for regular user-credentials
+ if (!empty($_SERVER['PHP_AUTH_PW']) || !empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) || !empty($_GET['cred']))
{
$GLOBALS['egw_info']['flags']['autocreate_session_callback'] = Api\Header\Authenticate::class.'::autocreate_session_callback';
$logged_in = true; // header sends 401, if not authenticated
+ // make $_GET[cred] work by using REDIRECT_HTTP_AUTHORIZATION
+ if (!empty($_GET['cred']))
+ {
+ $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] = 'Basic '.$_GET['cred'];
+ }
}
else
{
@@ -54,7 +59,7 @@ if (!$logged_in)
// fix for SOGo connector, which does not decode the = in our f/b url
if (strpos($_SERVER['QUERY_STRING'],'=3D') !== false && substr($_GET['user'],0,2) == '3D')
{
- foreach(['user', 'email', 'password', 'cred'] as $name)
+ foreach(['user', 'email', 'password'] as $name)
{
if (isset($_GET[$name])) $_GET[$name] = substr($_GET[$name],2);
}
@@ -79,43 +84,14 @@ if ($user === false || !($username = $GLOBALS['egw']->accounts->id2name($user)))
}
if (!$logged_in)
{
- if (empty($_GET['cred']))
- {
- $GLOBALS['egw_info']['user']['account_id'] = $user;
- $GLOBALS['egw_info']['user']['account_lid'] = $username;
- $GLOBALS['egw']->preferences->account_id = $user;
- $GLOBALS['egw_info']['user']['preferences'] = $GLOBALS['egw']->preferences->read_repository();
- $cal_prefs = &$GLOBALS['egw_info']['user']['preferences']['calendar'];
- $logged_in = !empty($cal_prefs['freebusy']) &&
- (empty($cal_prefs['freebusy_pw']) || $cal_prefs['freebusy_pw'] == $_GET['password']);
- }
- else
- {
- $credentials = base64_decode($_GET['cred']);
- list($authuser, $password) = explode(':', $credentials, 2);
- if (strpos($authuser, '@') === false)
- {
- $domain = $GLOBALS['egw_info']['server']['default_domain'];
- $authuser .= '@' . $domain;
- }
- else
- {
- list(, $domain) = explode('@',$authuser, 2);
- }
- if (array_key_exists($domain, $GLOBALS['egw_domain']))
- {
- $_POST['login'] = $authuser;
- $_REQUEST['domain'] = $domain;
- $GLOBALS['egw_info']['server']['default_domain'] = $domain;
- $GLOBALS['egw_info']['user']['domain'] = $domain;
- $GLOBALS['egw_info']['flags']['currentapp'] = 'login';
- $GLOBALS['egw_info']['flags']['noapi'] = false;
- $logged_in = $GLOBALS['egw']->session->create($authuser, $password, 'text');
- session_unset();
- session_destroy();
- }
- }
- if (!$logged_in)
+ $GLOBALS['egw_info']['user']['account_id'] = $user;
+ $GLOBALS['egw_info']['user']['account_lid'] = $username;
+ $GLOBALS['egw']->preferences->account_id = $user;
+ $GLOBALS['egw_info']['user']['preferences'] = $GLOBALS['egw']->preferences->read_repository();
+ $cal_prefs = &$GLOBALS['egw_info']['user']['preferences']['calendar'];
+
+ if (!($logged_in = !empty($cal_prefs['freebusy']) &&
+ (empty($cal_prefs['freebusy_pw']) || $cal_prefs['freebusy_pw'] == $_GET['password'])))
{
throw new Api\Exception\NoPermission\AuthenticationRequired(lang("freebusy: unknown user '%1', or not available for unauthenticated users!", $_GET['user']));
}
@@ -126,7 +102,7 @@ if ($_GET['debug'])
}
else
{
- Api\Header\Content::type('freebusy.ifb','text/calendar');
+ Api\Header\Content::type('freebusy.vfb','text/calendar');
}
$ical = new calendar_ical();
echo $ical->freebusy($user, $_GET['end']);
\ No newline at end of file
diff --git a/calendar/inc/class.calendar_boupdate.inc.php b/calendar/inc/class.calendar_boupdate.inc.php
index c3b44743ab..d561726dbd 100644
--- a/calendar/inc/class.calendar_boupdate.inc.php
+++ b/calendar/inc/class.calendar_boupdate.inc.php
@@ -1573,7 +1573,7 @@ class calendar_boupdate extends calendar_bo
$event['created'] = $save_event['created'] = $this->now;
$event['creator'] = $save_event['creator'] = $this->user;
}
- $set_recurrences = $old_event ? abs(Api\DateTime::to($event['recur_enddate']??null, 'utc') - Api\DateTime::to($old_event['recur_enddate']??null, 'utc')) > 1 : false;
+ $set_recurrences = $old_event ? abs(Api\DateTime::to($event['recur_enddate'] ?? null, 'utc') - Api\DateTime::to($old_event['recur_enddate'] ?? null, 'utc')) > 1 || count($old_event['recur_exception']) != count($event['recur_exception']) : false;
$set_recurrences_start = 0;
if (($cal_id = $this->so->save($event,$set_recurrences,$set_recurrences_start,0,$event['etag'])) && $set_recurrences && $event['recur_type'] != MCAL_RECUR_NONE)
{
@@ -2931,7 +2931,7 @@ class calendar_boupdate extends calendar_bo
* the corresponding series master event array
* NOTE: this param is false if event is of type SERIES-MASTER
*/
- function get_event_info($event)
+ function get_event_info(&$event)
{
$type = 'SINGLE'; // default
$master_event = false; //default
@@ -3008,7 +3008,8 @@ class calendar_boupdate extends calendar_bo
else
{
// try to find a suitable pseudo exception date
- $egw_rrule = calendar_rrule::event2rrule($master_event, false);
+ // Checks are all in server time
+ $egw_rrule = calendar_rrule::event2rrule($master_event, false, $GLOBALS['egw_info']['server']['server_timezone']);
$egw_rrule->current = clone $egw_rrule->time;
while ($egw_rrule->valid())
{
@@ -3023,7 +3024,8 @@ class calendar_boupdate extends calendar_bo
{
$type = 'SERIES-PSEUDO-EXCEPTION'; // let's try a pseudo exception
$recurrence_event = $master_event;
- $recurrence_event['start'] = $occurrence;
+ // Update the event's recurrence too
+ $recurrence_event['start'] = $event['recurrence'] = $occurrence;
$recurrence_event['end'] -= $master_event['start'] - $occurrence;
break 2;
}
diff --git a/calendar/inc/class.calendar_holidays.inc.php b/calendar/inc/class.calendar_holidays.inc.php
index a18e74a282..be0902799c 100644
--- a/calendar/inc/class.calendar_holidays.inc.php
+++ b/calendar/inc/class.calendar_holidays.inc.php
@@ -134,7 +134,7 @@ class calendar_holidays
{
ksort($data);
}
- error_log(__METHOD__."('$country', $year, $end_year) took ". number_format(microtime(true)-$starttime, 3).'s to fetch '.count(call_user_func_array('array_merge', $years)).' events');
+ //error_log(__METHOD__."('$country', $year, $end_year) took ". number_format(microtime(true)-$starttime, 3).'s to fetch '.count(call_user_func_array('array_merge', $years)).' events');
unset($starttime);
return $until_year ? $years : $years[$year];
diff --git a/calendar/inc/class.calendar_owner_etemplate_widget.inc.php b/calendar/inc/class.calendar_owner_etemplate_widget.inc.php
index 82096b7686..65a83f7a85 100644
--- a/calendar/inc/class.calendar_owner_etemplate_widget.inc.php
+++ b/calendar/inc/class.calendar_owner_etemplate_widget.inc.php
@@ -300,7 +300,7 @@ class calendar_owner_etemplate_widget extends Etemplate\Widget\Taglist
continue;
}
- foreach(array_unique($_results, SORT_REGULAR) as $id => $title)
+ foreach($_results as $id => $title)
{
if($id && $title)
{
@@ -309,7 +309,11 @@ class calendar_owner_etemplate_widget extends Etemplate\Widget\Taglist
}
if(count($mapped))
{
- $results = array_merge($results, $mapped);
+ $results[] = [
+ 'label' => $data['app'],
+ 'value' => $mapped,
+ 'icon' => $data['icon'] ?? Link::get_registry($data['app'], 'icon')
+ ];
}
}
if($total)
@@ -370,7 +374,7 @@ class calendar_owner_etemplate_widget extends Etemplate\Widget\Taglist
{
$value = array_merge($value, $value['label']);
}
- if($data['resources'])
+ if(!empty($data['resources']))
{
$value['resources'] = $data['resources'];
}
@@ -411,6 +415,9 @@ class calendar_owner_etemplate_widget extends Etemplate\Widget\Taglist
default :
// do nothing
}
+ // Make sure ID (value) is string
+ $value['value'] = (string)$value['value'];
+
return $value;
}
diff --git a/calendar/inc/class.calendar_ui.inc.php b/calendar/inc/class.calendar_ui.inc.php
index 45eab2d6b0..43b1f4aa32 100644
--- a/calendar/inc/class.calendar_ui.inc.php
+++ b/calendar/inc/class.calendar_ui.inc.php
@@ -787,7 +787,7 @@ class calendar_ui
$event['non_blocking'] = (bool)$event['non_blocking'];
$matches = null;
- if(!(int)$event['id'] && preg_match('/^([a-z_-]+)([0-9]+)$/i',$event['id'],$matches))
+ if(!(int)$event['id'] && preg_match('/^([a-z_-]+)([0-9]+)([:-].+)?$/i', $event['id'], $matches))
{
$app = $matches[1];
$app_id = $matches[2];
diff --git a/calendar/inc/class.calendar_uilist.inc.php b/calendar/inc/class.calendar_uilist.inc.php
index b2e3952f39..aab5d15171 100644
--- a/calendar/inc/class.calendar_uilist.inc.php
+++ b/calendar/inc/class.calendar_uilist.inc.php
@@ -456,7 +456,7 @@ class calendar_uilist extends calendar_ui
}
$matches = null;
- if(!(int)$event['id'] && preg_match('/^([a-z_-]+)([0-9]+)$/i',$event['id'],$matches))
+ if(!(int)$event['id'] && preg_match('/^([a-z_-]+)([0-9]+)([:-].+)?$/i', $event['id'], $matches))
{
$app = $matches[1];
$app_id = $matches[2];
@@ -474,14 +474,14 @@ class calendar_uilist extends calendar_ui
else
{
$is_private = !$this->bo->check_perms(Acl::READ,$event);
+ $event['app'] = 'calendar';
+ $event['app_id'] = $event['id'];
}
if ($is_private)
{
$event['class'] .= 'rowNoView ';
}
- $event['app'] = 'calendar';
- $event['app_id'] = $event['id'];
// Edit link
if($app && $app_id)
diff --git a/calendar/js/CalendarOwner.ts b/calendar/js/CalendarOwner.ts
index c0b771c37a..fa3c252876 100644
--- a/calendar/js/CalendarOwner.ts
+++ b/calendar/js/CalendarOwner.ts
@@ -13,6 +13,7 @@ import {css, html, nothing, TemplateResult} from "@lion/core";
import {IsEmail} from "../../api/js/etemplate/Validators/IsEmail";
import {SelectOption} from "../../api/js/etemplate/Et2Select/FindSelectOptions";
import {Et2StaticSelectMixin} from "../../api/js/etemplate/Et2Select/StaticOptions";
+import {classMap} from "lit/directives/class-map.js";
/**
* Select widget customised for calendar owner, which can be a user
@@ -31,6 +32,10 @@ export class CalendarOwner extends Et2StaticSelectMixin(Et2Select)
.select__tags {
max-height: 10em;
}
+
+ .title {
+ float: right;
+ }
`
];
}
@@ -56,34 +61,35 @@ export class CalendarOwner extends Et2StaticSelectMixin(Et2Select)
*/
_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
+ // 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``;
+ }
+
+ 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}
+ .getTextLabel=${() => {return option.label ?? option.value}}
>
${this._iconTemplate(option)}
${this.noLang ? option.label : this.egw().lang(option.label)}
- ${option.title}
- `;
- }
-
- /**
- * Customise how tags are rendered. Overridden from parent to add email to title for hover
- *
- * @param item
- * @protected
- */
- protected _createTagNode(item)
- {
- const tag = super._createTagNode(item);
- if(item.title)
- {
- tag.title = item.title;
- }
- return tag;
+ ${option.title}
+ `;
}
/**
@@ -102,9 +108,18 @@ export class CalendarOwner extends Et2StaticSelectMixin(Et2Select)
let missing_labels = [];
this.updateComplete.then(() =>
{
+ // find that can handle option groups
+ const find = (option) =>
+ {
+ if(Array.isArray(option.value))
+ {
+ return option.value.find(find);
+ }
+ return option.value == this.value[i];
+ }
for(var i = 0; i < this.value.length; i++)
{
- if(!this.select_options.find(o => o.value == this.value[i]))
+ if(!this.select_options.find(find))
{
missing_labels.push(this.value[i]);
}
@@ -133,7 +148,6 @@ export class CalendarOwner extends Et2StaticSelectMixin(Et2Select)
}
}
this.requestUpdate("select_options");
- this.updateComplete.then(() => {this.syncItemsFromValue();});
}, this, true, this).sendRequest();
}
});
@@ -158,7 +172,7 @@ export class CalendarOwner extends Et2StaticSelectMixin(Et2Select)
* @param option
* @protected
*/
- protected _iconTemplate(option)
+ protected _iconTemplate(option : SelectOption)
{
// Not a user / contact, no icon - use app image
if(!option.fname && !option.lname && !option.icon && option.app)
diff --git a/calendar/js/app.ts b/calendar/js/app.ts
index 35deea11d1..dc2acad1d1 100644
--- a/calendar/js/app.ts
+++ b/calendar/js/app.ts
@@ -4360,7 +4360,7 @@ export class CalendarApp extends EgwApp
( typeof _data.start != "string" ? _data.start.toJSON() : _data.start).slice(0,-1),
( typeof _data.end != "string" ? _data.end.toJSON() : _data.end).slice(0,-1),
{
- participants:Object.keys(_data.participants).filter(v => {return v.match(/^[0-9|e|c]/)})
+ participants: Object.keys(_data.participants ?? []).filter(v => {return v.match(/^[0-9|e|c]/)})
}], function(_value){
if (_value)
{
diff --git a/calendar/js/et2_widget_daycol.ts b/calendar/js/et2_widget_daycol.ts
index 04f48446a6..c599018704 100644
--- a/calendar/js/et2_widget_daycol.ts
+++ b/calendar/js/et2_widget_daycol.ts
@@ -744,22 +744,20 @@ export class et2_calendar_daycol extends et2_valueWidget implements et2_IDetache
});
event.body.css({
'padding-top': timegrid.scrolling.scrollTop() - event.div.position().top + title_height,
- 'margin-top' : -title_height
+ 'margin-top': -title_height
});
}
// Too many in gridlist view, show indicator
else if (this.display_settings.granularity === 0 && hidden)
{
- if(jQuery('.hiddenEventAfter',this.div).length == 0)
+ if(jQuery('.hiddenEventAfter', this.div).length == 0)
{
- this.event_wrapper.css('overflow','hidden');
+ this.event_wrapper.css('overflow', 'hidden');
}
- this._hidden_indicator(event, false, function() {
+ this._hidden_indicator(event, false, function()
+ {
app.calendar.update_state({view: 'day', date: day.date});
});
- // Avoid partially visible events
- // We need to hide all, or the next row will be visible
- event.div.hide(0);
}
// Completely out of view, show indicator
else if (hidden.completely)
@@ -859,8 +857,8 @@ export class et2_calendar_daycol extends et2_valueWidget implements et2_IDetache
indicator.attr('data-hidden_count', count);
if(this.display_settings.granularity === 0)
{
- indicator.append(event.div.clone());
- indicator.attr('data-hidden_label', day.egw().lang('%1 event(s) %2',indicator.attr('data-hidden_count'),''));
+ indicator.append(event.div);
+ indicator.attr('data-hidden_label', day.egw().lang('%1 event(s) %2', indicator.attr('data-hidden_count'), ''));
}
else if (!fixed_height)
{
diff --git a/calendar/js/et2_widget_event.ts b/calendar/js/et2_widget_event.ts
index 9b5a1cb7c5..12c4260ad0 100644
--- a/calendar/js/et2_widget_event.ts
+++ b/calendar/js/et2_widget_event.ts
@@ -554,10 +554,11 @@ export class et2_calendar_event extends et2_valueWidget implements et2_IDetached
{
// Click handler is set in _bind_videoconference()
location += (this.options.value.location.trim() ? ' ' : '') +
- '' +
- this.egw().lang('Video conference') +
+ '' +
+ this.egw().lang('Video conference') +
' ';
this._bind_videoconference();
}
@@ -726,8 +727,8 @@ export class et2_calendar_event extends et2_valueWidget implements et2_IDetached
jQuery('body').off(vc_event)
.on(vc_event, '[data-videoconference]', function (event)
{
- let data = egw.dataGetUIDdata("calendar::" + this.dataset.id);
- app.calendar.joinVideoConference(this.dataset.videoconference, data.data || this.dataset);
+ let data = egw.dataGetUIDdata("calendar::" + this.dataset.app_id);
+ app.calendar.joinVideoConference(this.dataset.videoconference, data?.data || this.dataset);
});
}
diff --git a/calendar/js/et2_widget_planner.ts b/calendar/js/et2_widget_planner.ts
index 230d636a20..a29c8b7ad1 100644
--- a/calendar/js/et2_widget_planner.ts
+++ b/calendar/js/et2_widget_planner.ts
@@ -1962,7 +1962,7 @@ export class et2_calendar_planner extends et2_calendar_view implements et2_IDeta
}
}
}
- if(waitForGroups.length == 0)
+ if(!data || data.length == 0)
{
return;
}
diff --git a/calendar/templates/default/app.css b/calendar/templates/default/app.css
index 27832a2374..3a4d1cf167 100644
--- a/calendar/templates/default/app.css
+++ b/calendar/templates/default/app.css
@@ -99,7 +99,7 @@
box-shadow: none;
}
/* Hide email in sidebox */
-#calendar-sidebox_owner .title {
+#calendar-sidebox_owner::part(tag__suffix) {
display: none;
}
diff --git a/calendar/templates/default/edit.xet b/calendar/templates/default/edit.xet
index a76bb650eb..67464dac8f 100644
--- a/calendar/templates/default/edit.xet
+++ b/calendar/templates/default/edit.xet
@@ -48,7 +48,7 @@
diff --git a/calendar/templates/default/sidebox.xet b/calendar/templates/default/sidebox.xet
index 77ae090e78..f7a40644ed 100644
--- a/calendar/templates/default/sidebox.xet
+++ b/calendar/templates/default/sidebox.xet
@@ -21,7 +21,7 @@ Egroupware
-
+
diff --git a/calendar/templates/mobile/app.css b/calendar/templates/mobile/app.css
index 93f76d17a1..98e692218f 100644
--- a/calendar/templates/mobile/app.css
+++ b/calendar/templates/mobile/app.css
@@ -115,7 +115,7 @@
box-shadow: none;
}
/* Hide email in sidebox */
-#calendar-sidebox_owner .title {
+#calendar-sidebox_owner sl-option::part(suffix) {
display: none;
}
/* Conflict display */
diff --git a/calendar/templates/pixelegg/app.css b/calendar/templates/pixelegg/app.css
index 7d4ab3d635..3b6d205684 100755
--- a/calendar/templates/pixelegg/app.css
+++ b/calendar/templates/pixelegg/app.css
@@ -103,7 +103,7 @@
box-shadow: none;
}
/* Hide email in sidebox */
-#calendar-sidebox_owner .title {
+#calendar-sidebox_owner sl-option::part(suffix) {
display: none;
}
/* Conflict display */
diff --git a/composer.json b/composer.json
index 60dce7d651..65924a69f2 100644
--- a/composer.json
+++ b/composer.json
@@ -72,12 +72,14 @@
"ext-xml": "*",
"ext-xsl": "*",
"adldap2/adldap2": "=4.0.4",
+ "async-aws/s3": "^2.0",
"bigbluebutton/bigbluebutton-api-php": "^2.0",
"bower-asset/cropper": "2.3.*",
"bower-asset/diff2html": "^2.7",
"bower-asset/jquery": "^1.12.4",
+ "defuse/php-encryption": "^2.4",
"egroupware/activesync": "self.version",
- "egroupware/adodb-php": "^5.20.8",
+ "egroupware/adodb-php": "^5.20.9",
"egroupware/bookmarks": "self.version",
"egroupware/collabora": "self.version",
"egroupware/compress": "^2.3.0",
@@ -87,7 +89,7 @@
"egroupware/exception": "^2.1.0",
"egroupware/hstream": "^1.7.0",
"egroupware/http": "^2.2.0",
- "egroupware/icalendar": "^2.2.0",
+ "egroupware/icalendar": "^2.2.1",
"egroupware/idna": "^1.2.0",
"egroupware/imap-client": "^2.31.0",
"egroupware/listheaders": "^1.3.0",
diff --git a/composer.lock b/composer.lock
index 109c011aeb..f6b30d918d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "807d6ff7e5369918e76a6e8b42a7d045",
+ "content-hash": "971a88d5fd5c10e1e1ed5524d2cb5095",
"packages": [
{
"name": "adldap2/adldap2",
@@ -56,6 +56,134 @@
],
"time": "2016-07-14T18:11:24+00:00"
},
+ {
+ "name": "async-aws/core",
+ "version": "1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/async-aws/core.git",
+ "reference": "e7a42c5cd0af44c4f3df0c4d228fe574c8ae4b68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/async-aws/core/zipball/e7a42c5cd0af44c4f3df0c4d228fe574c8ae4b68",
+ "reference": "e7a42c5cd0af44c4f3df0c4d228fe574c8ae4b68",
+ "shasum": ""
+ },
+ "require": {
+ "ext-hash": "*",
+ "ext-json": "*",
+ "ext-simplexml": "*",
+ "php": "^7.2.5 || ^8.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/http-client": "^4.4.16 || ^5.1.7 || ^6.0 || ^7.0",
+ "symfony/http-client-contracts": "^1.1.8 || ^2.0 || ^3.0",
+ "symfony/service-contracts": "^1.0 || ^2.0 || ^3.0"
+ },
+ "conflict": {
+ "async-aws/s3": "<1.1",
+ "symfony/http-client": "5.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.20-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "AsyncAws\\Core\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Core package to integrate with AWS. This is a lightweight AWS SDK provider by AsyncAws.",
+ "keywords": [
+ "amazon",
+ "async-aws",
+ "aws",
+ "sdk",
+ "sts"
+ ],
+ "support": {
+ "source": "https://github.com/async-aws/core/tree/1.20.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/jderusse",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-07T20:00:50+00:00"
+ },
+ {
+ "name": "async-aws/s3",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/async-aws/s3.git",
+ "reference": "1486ae6592a8f870da60dfc29bfc98390c7b9092"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/async-aws/s3/zipball/1486ae6592a8f870da60dfc29bfc98390c7b9092",
+ "reference": "1486ae6592a8f870da60dfc29bfc98390c7b9092",
+ "shasum": ""
+ },
+ "require": {
+ "async-aws/core": "^1.9",
+ "ext-dom": "*",
+ "ext-filter": "*",
+ "ext-hash": "*",
+ "ext-simplexml": "*",
+ "php": "^7.2.5 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.15-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "AsyncAws\\S3\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "S3 client, part of the AWS SDK provided by AsyncAws.",
+ "keywords": [
+ "amazon",
+ "async-aws",
+ "aws",
+ "s3",
+ "sdk"
+ ],
+ "support": {
+ "source": "https://github.com/async-aws/s3/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/jderusse",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-07T20:00:50+00:00"
+ },
{
"name": "bacon/bacon-qr-code",
"version": "2.0.7",
@@ -104,10 +232,6 @@
],
"description": "BaconQrCode is a QR code generator for PHP.",
"homepage": "https://github.com/Bacon/BaconQrCode",
- "support": {
- "issues": "https://github.com/Bacon/BaconQrCode/issues",
- "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.7"
- },
"time": "2022-03-14T02:02:36+00:00"
},
{
@@ -223,48 +347,9 @@
"url": "https://api.github.com/repos/fengyuanchen/cropper/zipball/30c58b29ee21010e17e58ebab165fbd84285c685",
"reference": "30c58b29ee21010e17e58ebab165fbd84285c685"
},
- "type": "bower-asset-library",
- "extra": {
- "bower-asset-main": [
- "dist/cropper.js",
- "dist/cropper.css"
- ],
- "bower-asset-ignore": [
- "**/.*",
- "node_modules",
- "bower_components",
- "tests",
- "test",
- "examples",
- "assets",
- "demo",
- "docs",
- "gulpfile.js",
- "CONTRIBUTING.md",
- "ISSUE_TEMPLATE.md"
- ]
- },
+ "type": "bower-asset",
"license": [
"MIT"
- ],
- "description": "A simple jQuery image cropping plugin.",
- "keywords": [
- "crop",
- "cropper",
- "cropping",
- "css",
- "development",
- "front-end",
- "html",
- "image",
- "javascript",
- "jquery",
- "move",
- "plugin",
- "rotate",
- "scale",
- "web",
- "zoom"
]
},
{
@@ -280,7 +365,7 @@
"url": "https://api.github.com/repos/rtfpessoa/diff2html/zipball/4c15a9ca93e50c78f8d02e37273076994888d499",
"reference": "4c15a9ca93e50c78f8d02e37273076994888d499"
},
- "type": "bower-asset-library"
+ "type": "bower-asset"
},
{
"name": "bower-asset/jquery",
@@ -295,21 +380,9 @@
"url": "https://api.github.com/repos/jquery/jquery-dist/zipball/5e89585e0121e72ff47de177c5ef604f3089a53d",
"reference": "5e89585e0121e72ff47de177c5ef604f3089a53d"
},
- "type": "bower-asset-library",
- "extra": {
- "bower-asset-main": "dist/jquery.js",
- "bower-asset-ignore": [
- "package.json"
- ]
- },
+ "type": "bower-asset",
"license": [
"MIT"
- ],
- "keywords": [
- "browser",
- "javascript",
- "jquery",
- "library"
]
},
{
@@ -351,10 +424,6 @@
"keywords": [
"LTI"
],
- "support": {
- "issues": "https://github.com/celtic-project/LTI-PHP/issues",
- "source": "https://github.com/celtic-project/LTI-PHP/tree/v4.10.1"
- },
"time": "2022-11-27T20:07:55+00:00"
},
{
@@ -481,10 +550,6 @@
"zend",
"zikula"
],
- "support": {
- "issues": "https://github.com/composer/installers/issues",
- "source": "https://github.com/composer/installers/tree/v2.1.0"
- },
"funding": [
{
"url": "https://packagist.com",
@@ -574,34 +639,30 @@
"enum",
"map"
],
- "support": {
- "issues": "https://github.com/DASPRiD/Enum/issues",
- "source": "https://github.com/DASPRiD/Enum/tree/1.0.3"
- },
"time": "2020-10-02T16:03:48+00:00"
},
{
"name": "defuse/php-encryption",
- "version": "v2.2.1",
+ "version": "v2.4.0",
"source": {
"type": "git",
"url": "https://github.com/defuse/php-encryption.git",
- "reference": "0f407c43b953d571421e0020ba92082ed5fb7620"
+ "reference": "f53396c2d34225064647a05ca76c1da9d99e5828"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620",
- "reference": "0f407c43b953d571421e0020ba92082ed5fb7620",
+ "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828",
+ "reference": "f53396c2d34225064647a05ca76c1da9d99e5828",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"paragonie/random_compat": ">= 2",
- "php": ">=5.4.0"
+ "php": ">=5.6.0"
},
"require-dev": {
- "nikic/php-parser": "^2.0|^3.0|^4.0",
- "phpunit/phpunit": "^4|^5"
+ "phpunit/phpunit": "^5|^6|^7|^8|^9|^10",
+ "yoast/phpunit-polyfills": "^2.0.0"
},
"bin": [
"bin/generate-defuse-key"
@@ -641,7 +702,11 @@
"security",
"symmetric key cryptography"
],
- "time": "2018-07-24T23:27:56+00:00"
+ "support": {
+ "issues": "https://github.com/defuse/php-encryption/issues",
+ "source": "https://github.com/defuse/php-encryption/tree/v2.4.0"
+ },
+ "time": "2023-06-19T06:10:36+00:00"
},
{
"name": "easyswoole/memcache",
@@ -765,23 +830,20 @@
],
"description": "EGroupware support for ActiveSync protocol using z-Push",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/activesync/tree/master"
- },
"time": "2023-02-28T07:49:35+00:00"
},
{
"name": "egroupware/adodb-php",
- "version": "5.20.8",
+ "version": "5.20.9",
"source": {
"type": "git",
"url": "https://github.com/EGroupware/ADOdb.git",
- "reference": "7c926a1e8435a172a0947bbd54dd33c6388ee3ba"
+ "reference": "695e4d98fd18869056aa06be14eb9ed248580d1b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/ADOdb/zipball/7c926a1e8435a172a0947bbd54dd33c6388ee3ba",
- "reference": "7c926a1e8435a172a0947bbd54dd33c6388ee3ba",
+ "url": "https://api.github.com/repos/EGroupware/ADOdb/zipball/695e4d98fd18869056aa06be14eb9ed248580d1b",
+ "reference": "695e4d98fd18869056aa06be14eb9ed248580d1b",
"shasum": ""
},
"require": {
@@ -826,7 +888,7 @@
"issues": "https://github.com/ADOdb/ADOdb/issues",
"source": "https://github.com/ADOdb/ADOdb"
},
- "time": "2023-01-30T18:10:47+00:00"
+ "time": "2023-10-30T11:00:40+00:00"
},
{
"name": "egroupware/bookmarks",
@@ -855,9 +917,6 @@
],
"description": "EGroupware app to manage bookmarks",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/bookmarks/tree/master"
- },
"time": "2023-02-28T07:49:35+00:00"
},
{
@@ -866,12 +925,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/collabora.git",
- "reference": "300ea706c2dec155cd116d8c6aa86b9d7f35e987"
+ "reference": "c04d84ef4bf4817f8bf1455011432bceb91248a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/collabora/zipball/300ea706c2dec155cd116d8c6aa86b9d7f35e987",
- "reference": "300ea706c2dec155cd116d8c6aa86b9d7f35e987",
+ "url": "https://api.github.com/repos/EGroupware/collabora/zipball/c04d84ef4bf4817f8bf1455011432bceb91248a1",
+ "reference": "c04d84ef4bf4817f8bf1455011432bceb91248a1",
"shasum": ""
},
"type": "egroupware-app",
@@ -895,10 +954,7 @@
],
"description": "EGroupware integration for Collabora Online Office",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/collabora/tree/23.1"
- },
- "time": "2023-03-31T16:45:23+00:00"
+ "time": "2023-03-30T16:19:54+00:00"
},
{
"name": "egroupware/compress",
@@ -967,9 +1023,6 @@
],
"description": "Compression library",
"homepage": "https://www.horde.org/libraries/Horde_Compress",
- "support": {
- "source": "https://github.com/EGroupware/Compress/tree/2.3.0"
- },
"time": "2020-03-11T00:00:00+00:00"
},
{
@@ -1030,9 +1083,6 @@
],
"description": "Cryptography library",
"homepage": "https://www.horde.org/libraries/Horde_Crypt",
- "support": {
- "source": "https://github.com/EGroupware/Crypt/tree/2.8.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1082,9 +1132,6 @@
],
"description": "Blowfish encryption library",
"homepage": "https://www.horde.org/libraries/Horde_Crypt_Blowfish",
- "support": {
- "source": "https://github.com/EGroupware/Crypt_Blowfish/tree/1.2.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1140,9 +1187,6 @@
],
"description": "Date library",
"homepage": "https://www.horde.org/libraries/Horde_Date",
- "support": {
- "source": "https://github.com/EGroupware/Date/tree/2.5.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1199,9 +1243,6 @@
],
"description": "Exception handler library",
"homepage": "https://www.horde.org/libraries/Horde_Exception",
- "support": {
- "source": "https://github.com/EGroupware/Exception/tree/2.1.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1250,9 +1291,6 @@
],
"description": "PHP streams library",
"homepage": "https://www.horde.org/libraries/Horde_Stream",
- "support": {
- "source": "https://github.com/EGroupware/HStream/tree/1.7.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1307,23 +1345,20 @@
],
"description": "HTTP client library",
"homepage": "https://www.horde.org/libraries/Horde_Http",
- "support": {
- "source": "https://github.com/EGroupware/Http/tree/2.2.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
"name": "egroupware/icalendar",
- "version": "2.2.0",
+ "version": "2.2.1",
"source": {
"type": "git",
"url": "https://github.com/EGroupware/Icalendar.git",
- "reference": "317865f044a2303dd6e547f455123cc8df4c0e4f"
+ "reference": "cdcd9580952b8424f5ef85f3f51eb78f81cd6e1e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/Icalendar/zipball/317865f044a2303dd6e547f455123cc8df4c0e4f",
- "reference": "317865f044a2303dd6e547f455123cc8df4c0e4f",
+ "url": "https://api.github.com/repos/EGroupware/Icalendar/zipball/cdcd9580952b8424f5ef85f3f51eb78f81cd6e1e",
+ "reference": "cdcd9580952b8424f5ef85f3f51eb78f81cd6e1e",
"shasum": ""
},
"require": {
@@ -1372,7 +1407,7 @@
"description": "iCalendar and vCard library",
"homepage": "https://www.horde.org/libraries/Horde_Icalendar",
"support": {
- "source": "https://github.com/EGroupware/Icalendar/tree/2.2.0"
+ "source": "https://github.com/EGroupware/Icalendar/tree/2.2.1"
},
"time": "2019-02-09T00:00:00+00:00"
},
@@ -1421,9 +1456,6 @@
],
"description": "IDNA normalization library",
"homepage": "https://www.horde.org",
- "support": {
- "source": "https://github.com/EGroupware/Idna/tree/1.2.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1491,9 +1523,6 @@
],
"description": "IMAP client library",
"homepage": "https://www.horde.org/libraries/Horde_Imap_Client",
- "support": {
- "source": "https://github.com/EGroupware/Imap_Client/tree/2.31.2"
- },
"time": "2019-09-29T00:00:00+00:00"
},
{
@@ -1543,9 +1572,6 @@
],
"description": "List headers parsing library",
"homepage": "https://www.horde.org/libraries/Horde_ListHeaders",
- "support": {
- "source": "https://github.com/EGroupware/ListHeaders/tree/1.3.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1601,9 +1627,6 @@
],
"description": "Mail library",
"homepage": "https://www.horde.org/libraries/Horde_Mail",
- "support": {
- "source": "https://github.com/EGroupware/Mail/tree/2.7.1"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1652,9 +1675,6 @@
],
"description": "ManageSieve client library",
"homepage": "https://www.horde.org",
- "support": {
- "source": "https://github.com/EGroupware/ManageSieve/tree/1.1.0"
- },
"time": "2021-02-17T00:00:00+00:00"
},
{
@@ -1699,9 +1719,6 @@
],
"description": "MAPI utility library",
"homepage": "https://www.horde.org",
- "support": {
- "source": "https://github.com/EGroupware/Mapi/tree/1.1.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1766,9 +1783,6 @@
],
"description": "MIME library",
"homepage": "https://www.horde.org/libraries/Horde_Mime",
- "support": {
- "source": "https://github.com/EGroupware/Mime/tree/2.13.1"
- },
"time": "2018-01-14T00:00:00+00:00"
},
{
@@ -1777,12 +1791,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/news_admin.git",
- "reference": "f0e87c7cb25d1e373813d643613cd14447436e3b"
+ "reference": "aae99a9699ef6be4d75aeaa90a61ff6d049223b2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/news_admin/zipball/f0e87c7cb25d1e373813d643613cd14447436e3b",
- "reference": "f0e87c7cb25d1e373813d643613cd14447436e3b",
+ "url": "https://api.github.com/repos/EGroupware/news_admin/zipball/aae99a9699ef6be4d75aeaa90a61ff6d049223b2",
+ "reference": "aae99a9699ef6be4d75aeaa90a61ff6d049223b2",
"shasum": ""
},
"type": "egroupware-app",
@@ -1798,10 +1812,7 @@
],
"description": "EGroupware app to supply and aggregate RSS/Atom feeds",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/news_admin/tree/23.1"
- },
- "time": "2023-04-12T09:14:28+00:00"
+ "time": "2023-04-12T09:14:09+00:00"
},
{
"name": "egroupware/nls",
@@ -1854,9 +1865,6 @@
],
"description": "Native language support library",
"homepage": "https://www.horde.org/libraries/Horde_Nls",
- "support": {
- "source": "https://github.com/EGroupware/Nls/tree/2.3.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -1906,9 +1914,6 @@
],
"description": "EGroupware OpenID Connect / OAuth2 server",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/openid/tree/master"
- },
"time": "2023-02-28T07:49:36+00:00"
},
{
@@ -1917,12 +1922,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/projectmanager.git",
- "reference": "245d6760e8e36d93c859fb7ac3f41f2f4c9205c8"
+ "reference": "9c423e14805242861e2e265bec1d3620f41cefd5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/projectmanager/zipball/245d6760e8e36d93c859fb7ac3f41f2f4c9205c8",
- "reference": "245d6760e8e36d93c859fb7ac3f41f2f4c9205c8",
+ "url": "https://api.github.com/repos/EGroupware/projectmanager/zipball/9c423e14805242861e2e265bec1d3620f41cefd5",
+ "reference": "9c423e14805242861e2e265bec1d3620f41cefd5",
"shasum": ""
},
"require": {
@@ -1949,10 +1954,7 @@
],
"description": "EGroupware project-management application",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/projectmanager/tree/23.1"
- },
- "time": "2023-04-17T22:21:50+00:00"
+ "time": "2023-04-17T22:19:37+00:00"
},
{
"name": "egroupware/registration",
@@ -1960,12 +1962,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/registration.git",
- "reference": "0278781cd45a8190277dbb4a926e80259f4624ad"
+ "reference": "2d117c3ea86183f9f6736873b2b97ca2c698fcfc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/registration/zipball/0278781cd45a8190277dbb4a926e80259f4624ad",
- "reference": "0278781cd45a8190277dbb4a926e80259f4624ad",
+ "url": "https://api.github.com/repos/EGroupware/registration/zipball/2d117c3ea86183f9f6736873b2b97ca2c698fcfc",
+ "reference": "2d117c3ea86183f9f6736873b2b97ca2c698fcfc",
"shasum": ""
},
"type": "egroupware-app",
@@ -1998,10 +2000,7 @@
],
"description": "EGroupware app to allow self-registration of users",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/registration/tree/23.1"
- },
- "time": "2023-04-12T09:12:09+00:00"
+ "time": "2023-04-12T09:11:51+00:00"
},
{
"name": "egroupware/rocketchat",
@@ -2009,12 +2008,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/rocketchat.git",
- "reference": "b8fc3b96000fa460902b63dd9002b0d575f7b29a"
+ "reference": "82c216d22446cbb878ee2d5026fbe7a501d517ec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/rocketchat/zipball/b8fc3b96000fa460902b63dd9002b0d575f7b29a",
- "reference": "b8fc3b96000fa460902b63dd9002b0d575f7b29a",
+ "url": "https://api.github.com/repos/EGroupware/rocketchat/zipball/82c216d22446cbb878ee2d5026fbe7a501d517ec",
+ "reference": "82c216d22446cbb878ee2d5026fbe7a501d517ec",
"shasum": ""
},
"type": "egroupware-app",
@@ -2038,10 +2037,7 @@
],
"description": "EGroupware Rocket.Chat app allowing to access Rocket.Chat from within EGroupware",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/rocketchat/tree/23.1"
- },
- "time": "2023-04-12T09:11:22+00:00"
+ "time": "2023-04-12T09:10:52+00:00"
},
{
"name": "egroupware/secret",
@@ -2095,9 +2091,6 @@
],
"description": "Secret key encryption library",
"homepage": "https://www.horde.org/libraries/Horde_Secret",
- "support": {
- "source": "https://github.com/EGroupware/Secret/tree/2.1.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2106,12 +2099,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/smallpart.git",
- "reference": "9d162afd0fe12036edc5586231b450fc0c390e19"
+ "reference": "4f344885e09a9baf73deee6febf43ca4a5ad7fff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/smallpart/zipball/9d162afd0fe12036edc5586231b450fc0c390e19",
- "reference": "9d162afd0fe12036edc5586231b450fc0c390e19",
+ "url": "https://api.github.com/repos/EGroupware/smallpart/zipball/4f344885e09a9baf73deee6febf43ca4a5ad7fff",
+ "reference": "4f344885e09a9baf73deee6febf43ca4a5ad7fff",
"shasum": ""
},
"require": {
@@ -2143,10 +2136,7 @@
],
"description": "EGroupware smallPART - selfdirected media assisted learning lectures & Process Analysis Reflection Tool",
"homepage": "https://www.smallpart.de/",
- "support": {
- "source": "https://github.com/EGroupware/smallpart/tree/23.1"
- },
- "time": "2023-03-08T13:14:41+00:00"
+ "time": "2023-04-19T09:26:48+00:00"
},
{
"name": "egroupware/smtp",
@@ -2199,9 +2189,6 @@
],
"description": "SMTP client library",
"homepage": "https://www.horde.org",
- "support": {
- "source": "https://github.com/EGroupware/Smtp/tree/1.10.0"
- },
"time": "2020-11-19T00:00:00+00:00"
},
{
@@ -2248,9 +2235,6 @@
],
"description": "Network socket client library",
"homepage": "https://www.horde.org",
- "support": {
- "source": "https://github.com/EGroupware/Socket_Client/tree/2.2.0"
- },
"time": "2020-03-12T00:00:00+00:00"
},
{
@@ -2259,12 +2243,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/status.git",
- "reference": "7feb19d1719b364104fa289544742366af63f00b"
+ "reference": "c082ba5b2f0716aa21392b7975cf54261547631c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/status/zipball/7feb19d1719b364104fa289544742366af63f00b",
- "reference": "7feb19d1719b364104fa289544742366af63f00b",
+ "url": "https://api.github.com/repos/EGroupware/status/zipball/c082ba5b2f0716aa21392b7975cf54261547631c",
+ "reference": "c082ba5b2f0716aa21392b7975cf54261547631c",
"shasum": ""
},
"require": {
@@ -2291,10 +2275,7 @@
],
"description": "EGroupware status / presence app showing logged in and/or in chat active users",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/status/tree/23.1"
- },
- "time": "2023-04-12T09:10:28+00:00"
+ "time": "2023-04-12T09:10:08+00:00"
},
{
"name": "egroupware/stream-filter",
@@ -2344,9 +2325,6 @@
],
"description": "PHP stream filters library",
"homepage": "https://www.horde.org/libraries/Horde_Stream_Filter",
- "support": {
- "source": "https://github.com/EGroupware/Stream_Filter/tree/2.1.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2394,9 +2372,6 @@
],
"description": "PHP stream wrappers library",
"homepage": "https://www.horde.org/libraries/Horde_Stream_Wrapper",
- "support": {
- "source": "https://github.com/EGroupware/Stream_Wrapper/tree/2.2.0"
- },
"time": "2018-01-25T00:00:00+00:00"
},
{
@@ -2455,9 +2430,6 @@
],
"description": "Supporting library",
"homepage": "https://www.horde.org/libraries/Horde_Support",
- "support": {
- "source": "https://github.com/EGroupware/Support/tree/2.3.1"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2499,9 +2471,6 @@
],
"description": "EGroupware push server using Swoole",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/swoolepush/tree/master"
- },
"time": "2023-02-28T07:49:34+00:00"
},
{
@@ -2556,9 +2525,6 @@
],
"description": "Text diff generation and rendering library",
"homepage": "https://www.horde.org/libraries/Horde_Text_Diff",
- "support": {
- "source": "https://github.com/EGroupware/Text_Diff/tree/2.3.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2605,9 +2571,6 @@
],
"description": "Flowed text library",
"homepage": "https://www.horde.org/libraries/Horde_Text_Flowed",
- "support": {
- "source": "https://github.com/EGroupware/Text_Flowed/tree/2.1.0"
- },
"time": "2019-12-15T00:00:00+00:00"
},
{
@@ -2616,12 +2579,12 @@
"source": {
"type": "git",
"url": "https://github.com/EGroupware/tracker.git",
- "reference": "4a0690dbdfc9b0c5cb7887024ae259a43b0547e5"
+ "reference": "748cd9febc832adad4b470162d21a44598ea7383"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/EGroupware/tracker/zipball/4a0690dbdfc9b0c5cb7887024ae259a43b0547e5",
- "reference": "4a0690dbdfc9b0c5cb7887024ae259a43b0547e5",
+ "url": "https://api.github.com/repos/EGroupware/tracker/zipball/748cd9febc832adad4b470162d21a44598ea7383",
+ "reference": "748cd9febc832adad4b470162d21a44598ea7383",
"shasum": ""
},
"type": "egroupware-app",
@@ -2645,10 +2608,7 @@
],
"description": "EGroupware bug-tracker and helpdesk application",
"homepage": "https://www.egroupware.org/",
- "support": {
- "source": "https://github.com/EGroupware/tracker/tree/23.1"
- },
- "time": "2023-04-12T09:09:41+00:00"
+ "time": "2023-04-12T09:09:17+00:00"
},
{
"name": "egroupware/translation",
@@ -2694,9 +2654,6 @@
],
"description": "Translation library",
"homepage": "https://www.horde.org/libraries/Horde_Translation",
- "support": {
- "source": "https://github.com/EGroupware/Translation/tree/2.3.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2748,9 +2705,6 @@
],
"description": "URL library",
"homepage": "https://www.horde.org/libraries/Horde_Url",
- "support": {
- "source": "https://github.com/EGroupware/Url/tree/2.3.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2815,9 +2769,6 @@
],
"description": "Utility library",
"homepage": "https://www.horde.org/libraries/Horde_Util",
- "support": {
- "source": "https://github.com/EGroupware/Util/tree/2.7.0"
- },
"time": "2017-11-11T00:00:00+00:00"
},
{
@@ -2871,9 +2822,6 @@
"stream",
"wrapper"
],
- "support": {
- "source": "https://github.com/EGroupware/WebDAV/tree/0.4.0"
- },
"time": "2023-01-03T21:13:18+00:00"
},
{
@@ -2900,9 +2848,6 @@
],
"description": "Z-Push is an open-source application to synchronize ActiveSync compatible devices",
"homepage": "http://z-push.org/",
- "support": {
- "source": "https://github.com/EGroupware/z-push/tree/2.5.0.1"
- },
"time": "2015-09-02T00:00:00+00:00"
},
{
@@ -2956,10 +2901,6 @@
"jwt",
"php"
],
- "support": {
- "issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.0.0"
- },
"time": "2022-01-24T15:18:34+00:00"
},
{
@@ -3022,11 +2963,6 @@
"po",
"translation"
],
- "support": {
- "email": "oom@oscarotero.com",
- "issues": "https://github.com/oscarotero/Gettext/issues",
- "source": "https://github.com/php-gettext/Gettext/tree/v4.8.6"
- },
"funding": [
{
"url": "https://paypal.me/oscarotero",
@@ -3101,10 +3037,6 @@
"translations",
"unicode"
],
- "support": {
- "issues": "https://github.com/php-gettext/Languages/issues",
- "source": "https://github.com/php-gettext/Languages/tree/2.9.0"
- },
"funding": [
{
"url": "https://paypal.me/mlocati",
@@ -3338,10 +3270,6 @@
"rest",
"web service"
],
- "support": {
- "issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.4.5"
- },
"funding": [
{
"url": "https://github.com/GrahamCampbell",
@@ -3422,10 +3350,6 @@
"keywords": [
"promise"
],
- "support": {
- "issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/1.5.1"
- },
"funding": [
{
"url": "https://github.com/GrahamCampbell",
@@ -3538,10 +3462,6 @@
"uri",
"url"
],
- "support": {
- "issues": "https://github.com/guzzle/psr7/issues",
- "source": "https://github.com/guzzle/psr7/tree/2.4.5"
- },
"funding": [
{
"url": "https://github.com/GrahamCampbell",
@@ -3594,10 +3514,6 @@
"Apache-2.0"
],
"description": "Bare-bones OpenID Connect client",
- "support": {
- "issues": "https://github.com/jumbojett/OpenID-Connect-PHP/issues",
- "source": "https://github.com/jumbojett/OpenID-Connect-PHP/tree/v0.9.10"
- },
"time": "2022-09-30T12:34:46+00:00"
},
{
@@ -3636,14 +3552,14 @@
}
},
"autoload": {
- "psr-4": {
- "Lcobucci\\JWT\\": "src"
- },
"files": [
"compat/class-aliases.php",
"compat/json-exception-polyfill.php",
"compat/lcobucci-clock-polyfill.php"
- ]
+ ],
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3870,10 +3786,6 @@
"logging",
"psr-3"
],
- "support": {
- "issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/1.27.1"
- },
"funding": [
{
"url": "https://github.com/Seldaek",
@@ -3908,12 +3820,12 @@
},
"type": "library",
"autoload": {
- "psr-4": {
- "FastRoute\\": "src/"
- },
"files": [
"src/functions.php"
- ]
+ ],
+ "psr-4": {
+ "FastRoute\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3937,112 +3849,36 @@
"version": "1.0.8",
"dist": {
"type": "tar",
- "url": "https://registry.npmjs.org/as-jqplot/-/as-jqplot-1.0.8.tgz",
- "shasum": "97061e0f32167597b87c98dfd42c93f10a2fb249"
- },
- "type": "npm-asset-library",
- "extra": {
- "npm-asset-main": "index.js",
- "npm-asset-directories": [],
- "npm-asset-scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
- }
+ "url": "https://registry.npmjs.org/as-jqplot/-/as-jqplot-1.0.8.tgz"
},
+ "type": "npm-asset",
"license": [
"ISC"
- ],
- "authors": [
- ""
- ],
- "description": "AS jqPlot Shim"
+ ]
},
{
"name": "npm-asset/dhtmlx-gantt",
"version": "6.2.7",
"dist": {
"type": "tar",
- "url": "https://registry.npmjs.org/dhtmlx-gantt/-/dhtmlx-gantt-6.2.7.tgz",
- "shasum": "86689f36c1f10e2bfaa5126445b4c560d82b4587"
- },
- "type": "npm-asset-library",
- "extra": {
- "npm-asset-bugs": {
- "url": "https://github.com/DHTMLX/gantt/issues"
- },
- "npm-asset-main": "codebase/dhtmlxgantt.js",
- "npm-asset-directories": [],
- "npm-asset-repository": {
- "type": "git",
- "url": "git+https://github.com/DHTMLX/gantt.git"
- }
+ "url": "https://registry.npmjs.org/dhtmlx-gantt/-/dhtmlx-gantt-6.2.7.tgz"
},
+ "type": "npm-asset",
"license": [
"GPL-2.0"
- ],
- "authors": [
- {
- "name": "DHTMLX"
- }
- ],
- "description": "An open source JavaScript Gantt chart that helps you illustrate a project schedule in a nice-looking chart.",
- "homepage": "https://github.com/DHTMLX/gantt#readme",
- "keywords": [
- "browser",
- "calendar",
- "chart",
- "dhtmlx",
- "dhtmlxgantt",
- "gantt",
- "gantt chart",
- "scheduler",
- "timeline"
- ],
- "time": "2019-10-11T10:48:39+00:00"
+ ]
},
{
"name": "npm-asset/gridster",
"version": "0.5.6",
"dist": {
"type": "tar",
- "url": "https://registry.npmjs.org/gridster/-/gridster-0.5.6.tgz",
- "shasum": "4024713aabd559093a72e9b713f1e41f9bded76f"
+ "url": "https://registry.npmjs.org/gridster/-/gridster-0.5.6.tgz"
},
"require": {
"npm-asset/jquery": "2.0.3"
},
- "require-dev": {
- "npm-asset/bower": "~0.9.2",
- "npm-asset/grunt": "~0.4.1",
- "npm-asset/grunt-bump": "0.0.11",
- "npm-asset/grunt-contrib-concat": "~0.1.3",
- "npm-asset/grunt-contrib-cssmin": "~0.5.0",
- "npm-asset/grunt-contrib-jshint": "~0.3.0",
- "npm-asset/grunt-contrib-uglify": "~0.2.0",
- "npm-asset/grunt-contrib-watch": "~0.3.1",
- "npm-asset/grunt-contrib-yuidoc": "~0.4.0",
- "npm-asset/grunt-conventional-changelog": "~1.0.0",
- "npm-asset/qunitjs": "~1.11.0"
- },
- "type": "npm-asset-library",
- "extra": {
- "npm-asset-bugs": {
- "url": "https://github.com/ducksboard/gridster.js/issues"
- },
- "npm-asset-directories": [],
- "npm-asset-repository": {
- "type": "git",
- "url": "git://github.com/ducksboard/gridster.js.git"
- },
- "npm-asset-scripts": []
- },
- "authors": [
- {
- "name": "ducksboard",
- "email": "hackers@ducksboard.com"
- }
- ],
- "description": "a drag-and-drop multi-column jQuery grid plugin",
- "homepage": "http://gridster.net/"
+ "type": "npm-asset"
},
{
"name": "npm-asset/jquery",
@@ -4057,36 +3893,7 @@
"url": "https://api.github.com/repos/jquery/jquery/zipball/f852e631ba85af7da4ad7594785e122504e7b233",
"reference": "f852e631ba85af7da4ad7594785e122504e7b233"
},
- "require-dev": {
- "npm-asset/archiver": "~0.4.2",
- "npm-asset/grunt": "0.4.1",
- "npm-asset/grunt-compare-size": "~0.4.0",
- "npm-asset/grunt-contrib-jshint": "0.3.0",
- "npm-asset/grunt-contrib-uglify": "0.2.0",
- "npm-asset/grunt-contrib-watch": "0.3.1",
- "npm-asset/grunt-git-authors": "1.2.0",
- "npm-asset/grunt-update-submodules": "0.2.0",
- "npm-asset/gzip-js": "0.3.1",
- "npm-asset/testswarm": "~1.1.0"
- },
- "type": "npm-asset-library",
- "extra": {
- "npm-asset-bugs": {
- "url": "http://bugs.jquery.com"
- },
- "npm-asset-repository": {
- "type": "git",
- "url": "https://github.com/jquery/jquery.git"
- }
- },
- "authors": [
- {
- "name": "jQuery Foundation and other contributors",
- "url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"
- }
- ],
- "description": "JavaScript library for DOM operations",
- "homepage": "http://jquery.com"
+ "type": "npm-asset"
},
{
"name": "oomphinc/composer-installers-extender",
@@ -4139,10 +3946,6 @@
],
"description": "Extend the composer/installers plugin to accept any arbitrary package type.",
"homepage": "http://www.oomphinc.com/",
- "support": {
- "issues": "https://github.com/oomphinc/composer-installers-extender/issues",
- "source": "https://github.com/oomphinc/composer-installers-extender/tree/2.0.1"
- },
"time": "2021-12-15T12:32:42+00:00"
},
{
@@ -4205,11 +4008,6 @@
"hex2bin",
"rfc4648"
],
- "support": {
- "email": "info@paragonie.com",
- "issues": "https://github.com/paragonie/constant_time_encoding/issues",
- "source": "https://github.com/paragonie/constant_time_encoding"
- },
"time": "2022-01-17T05:32:27+00:00"
},
{
@@ -4255,11 +4053,6 @@
"pseudorandom",
"random"
],
- "support": {
- "email": "info@paragonie.com",
- "issues": "https://github.com/paragonie/random_compat/issues",
- "source": "https://github.com/paragonie/random_compat"
- },
"time": "2020-10-15T08:29:30+00:00"
},
{
@@ -4895,10 +4688,6 @@
"nosql",
"riak"
],
- "support": {
- "issues": "https://github.com/PHPSocialNetwork/riak-php-client/issues",
- "source": "https://github.com/PHPSocialNetwork/riak-php-client/tree/develop"
- },
"time": "2017-11-23T21:33:15+00:00"
},
{
@@ -4967,10 +4756,6 @@
}
],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
- "support": {
- "issues": "https://github.com/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.6.0"
- },
"funding": [
{
"url": "https://github.com/Synchro",
@@ -5068,6 +4853,20 @@
"x.509",
"x509"
],
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
"time": "2021-04-06T13:56:45+00:00"
},
{
@@ -5166,10 +4965,6 @@
"Two Factor Authentication",
"google2fa"
],
- "support": {
- "issues": "https://github.com/antonioribeiro/google2fa/issues",
- "source": "https://github.com/antonioribeiro/google2fa/tree/8.0.0"
- },
"time": "2020-04-05T10:47:18+00:00"
},
{
@@ -5228,10 +5023,6 @@
"qr code",
"qrcode"
],
- "support": {
- "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues",
- "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/master"
- },
"time": "2019-03-20T16:42:58+00:00"
},
{
@@ -5278,9 +5069,6 @@
"psr",
"psr-6"
],
- "support": {
- "source": "https://github.com/php-fig/cache/tree/master"
- },
"time": "2016-08-06T20:24:11+00:00"
},
{
@@ -5325,10 +5113,6 @@
"container-interop",
"psr"
],
- "support": {
- "issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/1.1.1"
- },
"time": "2021-03-05T17:36:06+00:00"
},
{
@@ -5375,10 +5159,6 @@
"psr",
"psr-14"
],
- "support": {
- "issues": "https://github.com/php-fig/event-dispatcher/issues",
- "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
- },
"time": "2019-01-08T18:20:26+00:00"
},
{
@@ -5428,28 +5208,25 @@
"psr",
"psr-18"
],
- "support": {
- "source": "https://github.com/php-fig/http-client/tree/master"
- },
"time": "2020-06-29T06:28:15+00:00"
},
{
"name": "psr/http-factory",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
"shasum": ""
},
"require": {
"php": ">=7.0.0",
- "psr/http-message": "^1.0"
+ "psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
@@ -5469,7 +5246,7 @@
"authors": [
{
"name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
+ "homepage": "https://www.php-fig.org/"
}
],
"description": "Common interfaces for PSR-7 HTTP message factories",
@@ -5483,32 +5260,29 @@
"request",
"response"
],
- "support": {
- "source": "https://github.com/php-fig/http-factory/tree/master"
- },
- "time": "2019-04-30T12:38:16+00:00"
+ "time": "2023-04-10T20:10:41+00:00"
},
{
"name": "psr/http-message",
- "version": "1.0.1",
+ "version": "1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -5536,10 +5310,7 @@
"request",
"response"
],
- "support": {
- "source": "https://github.com/php-fig/http-message/tree/master"
- },
- "time": "2016-08-06T14:39:51+00:00"
+ "time": "2023-04-04T09:50:52+00:00"
},
{
"name": "psr/http-server-handler",
@@ -5692,9 +5463,6 @@
"psr",
"psr-3"
],
- "support": {
- "source": "https://github.com/php-fig/log/tree/1.1.4"
- },
"time": "2021-05-03T11:20:27+00:00"
},
{
@@ -5735,10 +5503,6 @@
}
],
"description": "A polyfill for getallheaders.",
- "support": {
- "issues": "https://github.com/ralouphie/getallheaders/issues",
- "source": "https://github.com/ralouphie/getallheaders/tree/develop"
- },
"time": "2019-03-08T08:55:37+00:00"
},
{
@@ -5777,10 +5541,6 @@
"xml",
"xmldsig"
],
- "support": {
- "issues": "https://github.com/robrichards/xmlseclibs/issues",
- "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.1"
- },
"time": "2020-09-05T13:00:25+00:00"
},
{
@@ -5835,10 +5595,6 @@
}
],
"description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
- "support": {
- "issues": "https://github.com/simplesamlphp/assert/issues",
- "source": "https://github.com/simplesamlphp/assert/tree/master"
- },
"time": "2020-08-17T20:40:49+00:00"
},
{
@@ -5873,10 +5629,6 @@
"LGPL-2.1-only"
],
"description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.",
- "support": {
- "issues": "https://github.com/simplesamlphp/composer-module-installer/issues",
- "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.1.8"
- },
"time": "2020-08-25T19:04:33+00:00"
},
{
@@ -5931,10 +5683,6 @@
}
],
"description": "SAML2 PHP library from SimpleSAMLphp",
- "support": {
- "issues": "https://github.com/simplesamlphp/saml2/issues",
- "source": "https://github.com/simplesamlphp/saml2/tree/v4.5.0"
- },
"time": "2022-02-17T15:46:12+00:00"
},
{
@@ -6063,10 +5811,6 @@
"sp",
"ws-federation"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp"
- },
"time": "2022-01-24T15:44:40+00:00"
},
{
@@ -6113,10 +5857,6 @@
"adfs",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-adfs/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-adfs"
- },
"time": "2022-01-24T23:46:31+00:00"
},
{
@@ -6164,10 +5904,6 @@
"authcrypt",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-authcrypt/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-authcrypt"
- },
"time": "2022-01-03T20:50:47+00:00"
},
{
@@ -6217,10 +5953,6 @@
"facebook",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-authfacebook/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-authfacebook"
- },
"abandoned": true,
"time": "2020-03-13T11:29:21+00:00"
},
@@ -6267,10 +5999,6 @@
"authorize",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-authorize/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-authorize"
- },
"time": "2022-01-03T20:56:53+00:00"
},
{
@@ -6322,10 +6050,6 @@
"simplesamlphp",
"twitter"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-authtwitter/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-authtwitter"
- },
"time": "2022-01-03T23:01:48+00:00"
},
{
@@ -6377,10 +6101,6 @@
"windows",
"windowslive"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-authwindowslive/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-authwindowslive"
- },
"abandoned": true,
"time": "2019-12-03T09:01:13+00:00"
},
@@ -6435,10 +6155,6 @@
"simplesamlphp",
"x509"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-authx509/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-authx509"
- },
"time": "2022-01-06T19:02:38+00:00"
},
{
@@ -6488,10 +6204,6 @@
"authyubikey",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-authyubikey/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-authyubikey"
- },
"time": "2022-01-06T19:07:32+00:00"
},
{
@@ -6539,10 +6251,6 @@
"cas",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-cas/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-cas"
- },
"time": "2019-12-03T09:03:06+00:00"
},
{
@@ -6593,10 +6301,6 @@
"cdc",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-cdc/"
- },
"time": "2022-01-06T19:27:16+00:00"
},
{
@@ -6643,10 +6347,6 @@
"consent",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-consent/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-consent"
- },
"time": "2022-01-06T19:17:22+00:00"
},
{
@@ -6696,10 +6396,6 @@
"consentadmin",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-consentadmin"
- },
"time": "2022-01-06T19:19:38+00:00"
},
{
@@ -6746,10 +6442,6 @@
"discovery",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-discopower/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-discopower"
- },
"time": "2021-08-17T14:29:22+00:00"
},
{
@@ -6795,10 +6487,6 @@
"exampleattributeserver",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-exampleattributeserver/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-exampleattributeserver"
- },
"time": "2019-05-28T12:37:15+00:00"
},
{
@@ -6844,10 +6532,6 @@
"expirycheck",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-expirycheck/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-expirycheck"
- },
"time": "2022-01-06T21:16:01+00:00"
},
{
@@ -6900,10 +6584,6 @@
"ldap",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-ldap/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-ldap"
- },
"time": "2022-01-11T12:50:47+00:00"
},
{
@@ -6951,10 +6631,6 @@
"memcachemonitor",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-memcachemonitor"
- },
"time": "2022-01-06T22:37:15+00:00"
},
{
@@ -7003,10 +6679,6 @@
"cookies",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-memcookie/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-memcookie/"
- },
"time": "2019-08-08T18:33:47+00:00"
},
{
@@ -7052,10 +6724,6 @@
"metarefresh",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-metarefresh/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-metarefresh"
- },
"time": "2022-01-06T22:45:08+00:00"
},
{
@@ -7109,10 +6777,6 @@
"negotiate",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-negotiate"
- },
"time": "2022-01-03T23:18:27+00:00"
},
{
@@ -7162,10 +6826,6 @@
"oauth1",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-oauth/"
- },
"abandoned": true,
"time": "2021-08-31T18:55:00+00:00"
},
@@ -7213,10 +6873,6 @@
"preprodwarning",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-preprodwarning"
- },
"time": "2022-01-06T23:21:17+00:00"
},
{
@@ -7263,10 +6919,6 @@
"radius",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-radius/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-radius"
- },
"time": "2022-01-06T23:23:28+00:00"
},
{
@@ -7313,10 +6965,6 @@
"riak",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-riak/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-riak"
- },
"abandoned": true,
"time": "2019-12-03T08:28:45+00:00"
},
@@ -7364,10 +7012,6 @@
"sanitycheck",
"simplesamlphp"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-sanitycheck/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-sanitycheck"
- },
"time": "2020-05-07T11:34:29+00:00"
},
{
@@ -7413,10 +7057,6 @@
"simplesamlphp",
"smartattributes"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-smartattributes/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-smartattributes"
- },
"time": "2022-01-06T23:42:07+00:00"
},
{
@@ -7463,10 +7103,6 @@
"simplesamlphp",
"sqlauth"
],
- "support": {
- "issues": "https://github.com/tvdijen/simplesamlphp-module-sqlauth/issues",
- "source": "https://github.com/tvdijen/simplesamlphp-module-sqlauth"
- },
"time": "2022-01-06T23:50:52+00:00"
},
{
@@ -7514,10 +7150,6 @@
"simplesamlphp",
"statistics"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp-module-statistics/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp-module-statistics"
- },
"time": "2021-01-25T15:15:26+00:00"
},
{
@@ -7570,10 +7202,6 @@
"translation",
"twig"
],
- "support": {
- "issues": "https://github.com/simplesamlphp/twig-configurable-i18n/issues",
- "source": "https://github.com/simplesamlphp/twig-configurable-i18n"
- },
"abandoned": true,
"time": "2020-08-27T12:51:10+00:00"
},
@@ -7766,9 +7394,6 @@
"caching",
"psr6"
],
- "support": {
- "source": "https://github.com/symfony/cache/tree/v5.4.6"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -7845,9 +7470,6 @@
"interoperability",
"standards"
],
- "support": {
- "source": "https://github.com/symfony/cache-contracts/tree/v2.5.1"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -7924,9 +7546,6 @@
],
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/config/tree/v5.4.3"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8023,9 +7642,6 @@
"console",
"terminal"
],
- "support": {
- "source": "https://github.com/symfony/console/tree/v5.4.5"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8112,9 +7728,6 @@
],
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v5.4.6"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8179,9 +7792,6 @@
],
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8250,9 +7860,6 @@
],
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/error-handler/tree/v5.4.19"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8335,9 +7942,6 @@
],
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.19"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8414,9 +8018,6 @@
"interoperability",
"standards"
],
- "support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8478,9 +8079,6 @@
],
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/filesystem/tree/v5.4.6"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8541,9 +8139,6 @@
],
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/finder/tree/v5.4.3"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8693,9 +8288,6 @@
],
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/framework-bundle/tree/v5.4.6"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8712,6 +8304,175 @@
],
"time": "2022-03-04T14:13:35+00:00"
},
+ {
+ "name": "symfony/http-client",
+ "version": "v5.4.29",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client.git",
+ "reference": "04784c66cbee613a827363ee1e65db65392893c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/04784c66cbee613a827363ee1e65db65392893c1",
+ "reference": "04784c66cbee613a827363ee1e65db65392893c1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/http-client-contracts": "^2.4",
+ "symfony/polyfill-php73": "^1.11",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.0|^2|^3"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "1.0",
+ "symfony/http-client-implementation": "2.4"
+ },
+ "require-dev": {
+ "amphp/amp": "^2.5",
+ "amphp/http-client": "^4.2.1",
+ "amphp/http-tunnel": "^1.0",
+ "amphp/socket": "^1.1",
+ "guzzlehttp/promises": "^1.4",
+ "nyholm/psr7": "^1.0",
+ "php-http/httplug": "^1.0|^2.0",
+ "php-http/message-factory": "^1.0",
+ "psr/http-client": "^1.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^4.4.13|^5.1.5|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpClient\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "http"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client/tree/v5.4.29"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-09-14T20:49:15+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v2.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70",
+ "reference": "ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/http-client-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-12T15:48:08+00:00"
+ },
{
"name": "symfony/http-foundation",
"version": "v5.4.20",
@@ -8769,9 +8530,6 @@
],
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/http-foundation/tree/v5.4.20"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8881,9 +8639,6 @@
],
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/http-kernel/tree/v5.4.20"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -8963,9 +8718,6 @@
"polyfill",
"portable"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9044,9 +8796,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9128,9 +8877,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9211,9 +8957,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9287,9 +9030,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9366,9 +9106,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9449,9 +9186,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9528,9 +9262,6 @@
"portable",
"shim"
],
- "support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9618,9 +9349,6 @@
"uri",
"url"
],
- "support": {
- "source": "https://github.com/symfony/routing/tree/v5.4.3"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9701,9 +9429,6 @@
"interoperability",
"standards"
],
- "support": {
- "source": "https://github.com/symfony/service-contracts/tree/v2.5.1"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9787,9 +9512,6 @@
"utf-8",
"utf8"
],
- "support": {
- "source": "https://github.com/symfony/string/tree/v5.4.19"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9876,9 +9598,6 @@
"debug",
"dump"
],
- "support": {
- "source": "https://github.com/symfony/var-dumper/tree/v5.4.19"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -9949,9 +9668,6 @@
"instantiate",
"serialize"
],
- "support": {
- "source": "https://github.com/symfony/var-exporter/tree/v5.4.6"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -10024,9 +9740,6 @@
],
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/yaml/tree/v5.4.3"
- },
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -10153,10 +9866,6 @@
"i18n",
"text"
],
- "support": {
- "issues": "https://github.com/twigphp/Twig-extensions/issues",
- "source": "https://github.com/twigphp/Twig-extensions/tree/master"
- },
"abandoned": true,
"time": "2018-12-05T18:34:18+00:00"
},
@@ -10224,10 +9933,6 @@
"keywords": [
"templating"
],
- "support": {
- "issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v2.15.3"
- },
"funding": [
{
"url": "https://github.com/fabpot",
@@ -10292,10 +9997,6 @@
"check",
"validate"
],
- "support": {
- "issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.11.0"
- },
"time": "2022-06-03T18:03:27+00:00"
},
{
@@ -10340,10 +10041,6 @@
"MD5",
"apr1"
],
- "support": {
- "issues": "https://github.com/whitehat101/apr1-md5/issues",
- "source": "https://github.com/whitehat101/apr1-md5/tree/master"
- },
"time": "2015-02-11T11:06:42+00:00"
},
{
@@ -10462,6 +10159,20 @@
"constructor",
"instantiate"
],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-11-10T18:47:58+00:00"
},
{
@@ -10491,12 +10202,12 @@
},
"type": "library",
"autoload": {
- "psr-4": {
- "DeepCopy\\": "src/DeepCopy/"
- },
"files": [
"src/DeepCopy/deep_copy.php"
- ]
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -10510,6 +10221,12 @@
"object",
"object graph"
],
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
"time": "2020-11-13T09:40:50+00:00"
},
{
@@ -10714,10 +10431,6 @@
"reflection",
"static analysis"
],
- "support": {
- "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
- "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
- },
"time": "2020-06-27T09:03:43+00:00"
},
{
@@ -10771,10 +10484,6 @@
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
- },
"time": "2021-10-19T17:43:47+00:00"
},
{
@@ -10826,10 +10535,6 @@
}
],
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
- "support": {
- "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
- },
"time": "2022-10-14T12:47:21+00:00"
},
{
@@ -10960,6 +10665,12 @@
"testing",
"xunit"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2021-03-28T07:26:59+00:00"
},
{
@@ -11010,6 +10721,12 @@
"filesystem",
"iterator"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T05:57:25+00:00"
},
{
@@ -11063,6 +10780,12 @@
"keywords": [
"process"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T05:58:55+00:00"
},
{
@@ -11112,6 +10835,12 @@
"keywords": [
"template"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T05:33:50+00:00"
},
{
@@ -11161,6 +10890,12 @@
"keywords": [
"timer"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:16:10+00:00"
},
{
@@ -11225,11 +10960,11 @@
}
},
"autoload": {
- "classmap": [
- "src/"
- ],
"files": [
"src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -11250,6 +10985,16 @@
"testing",
"xunit"
],
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-02T03:54:37+00:00"
},
{
@@ -11296,6 +11041,12 @@
],
"description": "Library for parsing CLI options",
"homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T06:08:49+00:00"
},
{
@@ -11342,6 +11093,12 @@
],
"description": "Collection of value objects that represent the PHP code units",
"homepage": "https://github.com/sebastianbergmann/code-unit",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:08:54+00:00"
},
{
@@ -11387,6 +11144,12 @@
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T05:30:19+00:00"
},
{
@@ -11451,6 +11214,12 @@
"compare",
"equality"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T15:49:45+00:00"
},
{
@@ -11498,6 +11267,12 @@
],
"description": "Library for calculating the complexity of PHP code units",
"homepage": "https://github.com/sebastianbergmann/complexity",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T15:52:27+00:00"
},
{
@@ -11554,6 +11329,12 @@
"unidiff",
"unified diff"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:10:38+00:00"
},
{
@@ -11607,6 +11388,12 @@
"environment",
"hhvm"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T05:52:38+00:00"
},
{
@@ -11674,6 +11461,12 @@
"export",
"exporter"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T05:24:23+00:00"
},
{
@@ -11728,6 +11521,12 @@
"keywords": [
"global state"
],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T15:55:19+00:00"
},
{
@@ -11775,6 +11574,12 @@
],
"description": "Library for counting the lines of code in PHP source code",
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-11-28T06:42:11+00:00"
},
{
@@ -11822,6 +11627,12 @@
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:12:34+00:00"
},
{
@@ -11867,6 +11678,12 @@
],
"description": "Allows reflection of object attributes, including inherited and non-public ones",
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:14:26+00:00"
},
{
@@ -11920,6 +11737,12 @@
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:17:30+00:00"
},
{
@@ -11965,6 +11788,12 @@
],
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T06:45:17+00:00"
},
{
@@ -12011,6 +11840,12 @@
],
"description": "Collection of value objects that represent the types of the PHP type system",
"homepage": "https://github.com/sebastianbergmann/type",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-10-26T13:18:59+00:00"
},
{
@@ -12054,6 +11889,12 @@
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
"time": "2020-09-28T06:39:44+00:00"
},
{
@@ -12094,6 +11935,12 @@
}
],
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
"time": "2020-07-12T23:59:07+00:00"
}
],
diff --git a/doc/README.md b/doc/README.md
new file mode 100644
index 0000000000..ca2e8fab27
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,12 @@
+## Notes on automatic documentation
+
+This is a project in itself. Here's how the pieces fit together:
+
++ `build:dev` package script calls `/doc/scripts/build.mjs` which is responsible for calling the individual pieces. We
+ pass files to the subprocesses, but options are set in a separate config file.
++ `/doc/scripts/metadata.mjs` extracts the component information
+ using [CEM](https://custom-elements-manifest.open-wc.org/), and stores it to `/doc/dist/custom-elements.json`
++ `/doc/scripts/etemplate2/eleventy.config.cjs` uses [11ty](11ty.dev) to build a documentation site, from the
+ subdirectories in `/doc/etemplate2`, and stores it to `/doc/dist/site`
+
+If a component doesn't show up, it's probably not in the manifest.
\ No newline at end of file
diff --git a/doc/UCS-SAML-SSO.md b/doc/UCS-SAML-SSO.md
index 8a78df8619..b523d89a78 100644
--- a/doc/UCS-SAML-SSO.md
+++ b/doc/UCS-SAML-SSO.md
@@ -20,79 +20,58 @@
Label to display as option on login page: or leave empty and select SAML as authentication type above for single sign on
-
+ Test SSO
Identity Provider: You can specify multiple IdP on separate lines.
-
+ https://ucs.example.org/simplesamlphp/saml2/idp/metadata.php
- Metadata:
- refresh
-
- daily
- weekly
- not automatic
- just now
-
+ Metadata:
+ refresh [ just now v]
-
+ https://ucs.example.org/simplesamlphp/saml2/idp/metadata.php
Certificate Metadata is signed with: (Will be downloaded once, unless changed.)
-
+
+ https://ucs.example.org/simplesamlphp/saml2/idp/certificate
+
Result data to use as username:
-
- eduPersonPrincipalName
- eduPersonUniqueId
- emailAddress
- uid
- custom OID
-
-
+ [ uid v]
Result data to add or remove extra membership:
-
- eduPersonAffiliation
- custom OID
-
-
+ [ eduPersonAffiliation v]
Result values (comma-separated) and group-name to add or remove:
-
-
+ Staff
+ Teachers
Allow SAML logins to join existing accounts: (Requires SAML optional on login page and user to specify username and password)
-
- No
- Replace username and email
- Replace username and keep email
- Use account description to store SAML username
-
+ [ No v]
Match SAML usernames to existing ones (use strings or regular expression):
-
-
+
@@ -101,13 +80,13 @@
Name for Service Provider:
-
+ EGroupware
Technical contact:
-
-
+ Ralf Becker
+ rb@egroupware.org
@@ -178,4 +157,4 @@ Password: secretpassword
> Currently, there are two bugs, you need to work around:
> 1. EGroupware checks the above user/password as an IMAP user, so you need to additionally create him as UCS user with mail, in order to be able to store the dialog.
> 2. The account you use for testing, must NOT have any additional personal mail accounts, as you get an error in that case, when you open the mail app.
-* log out and in again with SSO and check everything works
\ No newline at end of file
+* log out and in again with SSO and check everything works
diff --git a/doc/docker/README.md b/doc/docker/README.md
index 686aea965b..e2a52f4020 100644
--- a/doc/docker/README.md
+++ b/doc/docker/README.md
@@ -41,4 +41,4 @@ services:
image: egroupware/egroupware:23.1
extra_hosts:
- "egw.example.org:172.17.0.1"
-```
+```
\ No newline at end of file
diff --git a/doc/docker/development/Dockerfile b/doc/docker/development/Dockerfile
index b8e7fe5efe..9164a212f6 100644
--- a/doc/docker/development/Dockerfile
+++ b/doc/docker/development/Dockerfile
@@ -3,11 +3,11 @@
## EGroupware development container using Ubuntu 20.04 and PHP from ondrej/php PPA
##
################################################################################
-FROM ubuntu:22.04
+FROM ubuntu:20.04
MAINTAINER rb@egroupware.org
ARG VERSION=dev-master
-ARG PHP_VERSION=8.1
+ARG PHP_VERSION=8.2
# keeping build-arg in environment for entrypoint.sh
ENV VERSION=$VERSION
@@ -48,10 +48,12 @@ RUN apt-get update \
&& mkdir -p /run/php \
# send logs to stderr to be viewed by docker logs
&& ln -s /dev/stderr /var/log/php$PHP_VERSION-fpm.log \
- # install nodejs 16.x PPA (Shoelace requires >= 14.17, Ubuntu 22.04 only has 12.x)
- && curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
+ # install nodejs 20.x (Shoelace requires >= 14.17, Ubuntu 22.04 only has 12.x) \
+ && mkdir -p /etc/apt/keyrings \
+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
# install tools to build EGroupware
- && apt-get install -y rsync nodejs zip curl sudo cron patch \
+ && apt-get install -y rsync nodejs npm zip curl sudo cron patch \
&& npm install -g grunt-cli \
&& bash -c \
'EXPECTED_SIGNATURE=$(curl https://composer.github.io/installer.sig); \
diff --git a/doc/docker/development/build.sh b/doc/docker/development/build.sh
index a061175b23..50f765489a 100755
--- a/doc/docker/development/build.sh
+++ b/doc/docker/development/build.sh
@@ -2,7 +2,7 @@
REPO=egroupware
IMAGE=development
-BASE=ubuntu:22.04
+BASE=ubuntu:20.04
RECOMMENDED_PHP_VERSION=8.1
PHP_VERSION=${1:-8.1}
@@ -44,4 +44,4 @@ docker build --no-cache --build-arg "VERSION=$VERSION" --build-arg="PHP_VERSION=
docker tag $REPO/$IMAGE:$TAG $REPO/$IMAGE:$BRANCH
docker push $REPO/$IMAGE:$BRANCH
}
-}
+}
\ No newline at end of file
diff --git a/doc/etemplate2/_includes/component.njk b/doc/etemplate2/_includes/component.njk
new file mode 100644
index 0000000000..6360c30225
--- /dev/null
+++ b/doc/etemplate2/_includes/component.njk
@@ -0,0 +1,325 @@
+
+{% extends "default.njk" %}
+
+{# Find the component based on the `tag` front matter #}
+
+{% set component = getComponent(component.tagName) %}
+
+{% block content %}
+ {# Determine the badge variant #}
+ {% if component.status == 'stable' %}
+ {% set badgeVariant = 'primary' %}
+ {% elseif component.status == 'experimental' %}
+ {% set badgeVariant = 'warning' %}
+ {% elseif component.status == 'planned' %}
+ {% set badgeVariant = 'neutral' %}
+ {% elseif component.status == 'deprecated' %}
+ {% set badgeVariant = 'danger' %}
+ {% else %}
+ {% set badgeVariant = 'neutral' %}
+ {% endif %}
+
+ {# Header #}
+
+
+
+ {% if component.summary %}
+ {{ component.summary | markdownInline | safe }}
+ {% endif %}
+ {% if component.description %}
+
Overview
+ {{ component.description | markdown | safe}}
+ {% endif %}
+
+
+ {# Markdown content #}
+ {{ content | safe }}
+
+ {# Slots #}
+ {% if component.slots.length %}
+ Slots
+
+
+
+
+ Name
+ Description
+
+
+
+ {% for slot in component.slots %}
+
+
+ {% if slot.name %}
+ {{ slot.name }}
+ {% else %}
+ (default)
+ {% endif %}
+
+ {{ slot.description | markdownInline | safe }}
+
+ {% endfor %}
+
+
+
+ Learn more about using slots .
+ {% endif %}
+
+ {# Properties #}
+ {% if component.properties.length %}
+ Properties
+
+
+
+
+ Name
+ Description
+ Reflects
+ Type
+ Default
+
+
+
+ {% for prop in component.properties %}
+
+
+ {{ prop.name }}
+ {% if prop.attribute != prop.name %}
+
+
+
+
+ {{ prop.attribute }}
+
+
+
+ {% endif %}
+
+
+ {{ prop.description | markdownInline | safe }}
+ {% if prop.deprecated %}
+
+ {{ prop.deprecated }}
+ {% endif %}
+
+
+ {% if prop.reflects %}
+
+ {% endif %}
+
+
+ {% if prop.type.text %}
+ {{ prop.type.text | markdownInline | safe }}
+ {% else %}
+ -
+ {% endif %}
+
+
+ {% if prop.default %}
+ {{ prop.default | markdownInline | safe }}
+ {% else %}
+ -
+ {% endif %}
+
+
+ {% endfor %}
+
+ updateComplete
+
+ A read-only promise that resolves when the component has
+ finished updating .
+
+
+
+
+
+
+
+
+ Learn more about attributes and properties .
+ {% endif %}
+
+ {# Events #}
+ {% if component.events.length %}
+ Events
+
+
+
+
+ Name
+ React Event
+ Description
+ Event Detail
+
+
+
+ {% for event in component.events %}
+
+ {{ event.name }}
+
+ {% if event.description %}
+ {{ event.description | markdownInline | safe }}
+ {% else %}
+ EVENT NEEDS A DESCRIPTION
+ {% endif %}
+
+
+ {% if event.type.text %}
+ {{ event.type.text }}
+ {% else %}
+ -
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
+ Learn more about events .
+ {% endif %}
+
+ {# Methods #}
+ {% if component.methods.length %}
+ Methods
+
+
+
+
+ Name
+ Description
+ Arguments
+
+
+
+ {% for method in component.methods %}
+
+
+ {{ method.name }}()
+
+
+ {{ method.description | markdownInline | safe }}
+ {% if method.deprecated %}
+ {{ method.deprecated | markdownInline | safe }}
+ {% endif %}
+
+
+ {% if method.parameters.length %}
+
+ {% for param in method.parameters %}
+ {{ param.name }}: {{ param.type.text }}{% if not loop.last %},{% endif %}
+ {% endfor %}
+
+ {% else %}
+ -
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
+ Learn more about methods .
+ {% endif %}
+
+ {# Custom Properties #}
+ {% if component.cssProperties.length %}
+ Custom Properties
+
+
+
+
+ Name
+ Description
+ Default
+
+
+
+ {% for cssProperty in component.cssProperties %}
+
+ {{ cssProperty.name }}
+ {{ cssProperty.description | markdownInline | safe }}
+ {{ cssProperty.default }}
+
+ {% endfor %}
+
+
+
+ Learn more about customizing CSS custom properties .
+ {% endif %}
+
+ {# CSS Parts #}
+ {% if component.cssParts.length %}
+ Parts
+
+
+
+
+ Name
+ Description
+
+
+
+ {% for cssPart in component.cssParts %}
+
+ {{ cssPart.name }}
+ {{ cssPart.description | markdownInline | safe }}
+
+ {% endfor %}
+
+
+
+ Learn more about customizing CSS parts .
+ {% endif %}
+
+ {# Animations #}
+ {% if component.animations.length %}
+ Animations
+
+
+
+
+ Name
+ Description
+
+
+
+ {% for animation in component.animations %}
+
+ {{ animation.name }}
+ {{ animation.description | markdownInline | safe }}
+
+ {% endfor %}
+
+
+
+ Learn more about customizing animations .
+ {% endif %}
+
+ {# Dependencies #}
+ {% if component.dependencies.length %}
+ Dependencies
+
+ This component automatically imports the following dependencies.
+
+
+ {% for dependency in component.dependencies %}
+ <{{ dependency }}>
+ {% endfor %}
+
+ {% endif %}
+{% endblock %}
diff --git a/doc/etemplate2/_includes/default.njk b/doc/etemplate2/_includes/default.njk
new file mode 100644
index 0000000000..1201ca1fe4
--- /dev/null
+++ b/doc/etemplate2/_includes/default.njk
@@ -0,0 +1,148 @@
+
+
+
+ {# Metadata #}
+
+
+
+ {{ meta.title }}
+
+ {# Opt out of Turbo caching #}
+
+
+ {# Stylesheets #}
+
+
+
+
+
+ {# Favicons #}
+
+
+ {# OpenGraph #}
+
+
+
+
+
+ {# API Viewer Element #}
+
+
+ {# Shoelace #}
+
+
+
+
+ {# EGroupware #}
+
+
+ {# Set the initial theme and menu states here to prevent flashing #}
+
+
+ {# Turbo + Scroll positioning #}
+
+
+
+
+
+
+
+
+ Skip to main content
+
+
+ {# Menu toggle #}
+
+
+ {# Icon toolbar #}
+
+
+
+
+ {# 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 @@
+
+
+ Getting Started
+
+
+
+ Resources
+
+
+
+ Components
+
+
+
+ Tutorials
+
+
+
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 = `
+
+ HTML
+
+ `;
+
+ const reactButton = `
+
+ React
+
+ `;
+
+ const codePenButton = `
+
+
+
+
+
+ `;
+
+ const codePreview = `
+
+
+ ${code.textContent}
+
+
+
+
+
+
+
+
${escapeHtml(code.textContent)}
+
+
+ ${
+ reactCode
+ ? `
+
+
${escapeHtml(reactCode.textContent)}
+
+ `
+ : ''
+ }
+
+
+
+
+ `;
+
+ 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 ``;
+ }
+ 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 = `
+
+
+
+
+ `;
+
+ 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
+
+
+
+
+
+
+
+
+
+
+```
+
+
\ 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 ? '' :
'