From fade177f10f8f56a7fbcbcef93e1a9a0a6ced987 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 14 Sep 2023 11:48:30 -0600 Subject: [PATCH 01/41] Fix first select option was not set --- api/js/etemplate/Et2Select/Et2Select.ts | 74 ++++++++++++++++++- .../Et2Select/Select/Et2SelectTimezone.ts | 7 +- api/js/etemplate/Et2Select/StaticOptions.ts | 4 +- package-lock.json | 71 ++---------------- 4 files changed, 85 insertions(+), 71 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 12d767605b..340d52aeb7 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -65,6 +65,7 @@ export class Et2WidgetWithSelect extends RowLimitedMixin(Et2WidgetWithSelectMixi // @ts-ignore SlSelect styles is a single CSSResult, not an array, so TS complains export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { + private _block_change_event : boolean = false; static get styles() { return [ @@ -303,6 +304,70 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } } + /** + * Handle the case where there is no value set, or the value provided is not an option. + * If this happens, we choose the first option or empty label. + * + * Careful when this is called. We change the value here, so an infinite loop is possible if the widget has + * onchange. + * + */ + protected fix_bad_value() + { + // Stop if there are no options + if(!Array.isArray(this.select_options) || this.select_options.length == 0) + { + // Nothing to do here + return; + } + + // emptyLabel is fine + if(this.value === "" && this.emptyLabel) + { + return; + } + + let valueArray = this.getValueAsArray(); + + // Check for value using missing options (deleted or otherwise not allowed) + let filtered = this.filterOutMissingOptions(valueArray); + if(filtered.length != valueArray.length) + { + this.value = filtered; + return; + } + + // Multiple is allowed to be empty, and if we don't have an emptyLabel or options nothing to do + if(this.multiple || (!this.emptyLabel && this.select_options.length === 0)) + { + return; + } + + // See if parent (search / free entry) is OK with it + if(super.fix_bad_value()) + { + return; + } + // If somebody gave '' as a select_option, let it be + if(this.value === '' && this.select_options.filter((option) => this.value === option.value).length == 1) + { + return; + } + // If no value is set, choose the first option + // Only do this on once during initial setup, or it can be impossible to clear the value + + // value not in options --> use emptyLabel, if exists, or first option otherwise + if(this.select_options.filter((option) => valueArray.find(val => val == option.value) || + Array.isArray(option.value) && option.value.filter(o => valueArray.find(val => val == o.value))).length === 0) + { + 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); + } + } + @property() get value() { @@ -384,10 +449,17 @@ 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"); value = value.filter(item => missing.indexOf(item) == -1); } } diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts b/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts index ff8dd669a1..1c008905b5 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectTimezone.ts @@ -1,13 +1,16 @@ import {Et2Select} from "../Et2Select"; import {Et2StaticSelectMixin, StaticOptions} from "../StaticOptions"; +import {cleanSelectOptions} from "../FindSelectOptions"; export class Et2SelectTimezone extends Et2StaticSelectMixin(Et2Select) { constructor() { super(); - - this._static_options = StaticOptions.timezone(this, {other: this.other || []}); + this.fetchComplete = StaticOptions.timezone(this, {other: this.other ?? []}).then((options) => + { + this.set_static_options(cleanSelectOptions(options)); + }) } } diff --git a/api/js/etemplate/Et2Select/StaticOptions.ts b/api/js/etemplate/Et2Select/StaticOptions.ts index 6bc1110ef6..21d78a8c17 100644 --- a/api/js/etemplate/Et2Select/StaticOptions.ts +++ b/api/js/etemplate/Et2Select/StaticOptions.ts @@ -393,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/package-lock.json b/package-lock.json index cd055225a3..928ef238bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3048,12 +3048,6 @@ "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==", "dev": true }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "peer": true - }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -3066,17 +3060,6 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "node_modules/@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", - "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", @@ -3086,12 +3069,6 @@ "@types/node": "*" } }, - "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-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -4446,12 +4423,6 @@ "url": "https://opencollective.com/core-js" } }, - "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/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -7287,7 +7258,7 @@ "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "devOptional": true, + "dev": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -9736,8 +9707,7 @@ "version": "1.10.11", "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.10.11.tgz", "integrity": "sha512-aJ50ccVeszpJt7wPH7Yfqm7f1aG1SA94qd90P0NaESh5/QUXn4CESO6igobo4DFHQ5z+1Rfdl8aphP4JxlH4gw==", - "dev": true, - "requires": {} + "dev": true }, "@interactjs/dev-tools": { "version": "1.10.11", @@ -9927,8 +9897,7 @@ "@lit-labs/react": { "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==", - "requires": {} + "integrity": "sha512-Nj+XB3HamqaWefN91lpFPJaqjJ78XzGkPWCedB4jyH22GBFEenpE9A/h8B/2dnIGXtNtd9D/RFpUdQ/dBtWFqA==" }, "@lit-labs/ssr-dom-shim": { "version": "1.0.0", @@ -10461,12 +10430,6 @@ "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==", "dev": true }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "peer": true - }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -10479,17 +10442,6 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", - "peer": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -10499,12 +10451,6 @@ "@types/node": "*" } }, - "@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "peer": true - }, "@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -11523,12 +11469,6 @@ "browserslist": "^4.21.5" } }, - "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 - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -13726,7 +13666,7 @@ "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "devOptional": true, + "dev": true, "requires": { "fsevents": "~2.3.2" } @@ -14365,8 +14305,7 @@ "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": {} + "dev": true }, "yallist": { "version": "4.0.0", From 01375295fe1f3bcf162abe5975ad3c497b735bda Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 14 Sep 2023 11:56:25 -0600 Subject: [PATCH 02/41] Fix widget label positioning --- api/js/etemplate/Et2Widget/Et2Widget.ts | 35 +++++++++++++++++++++++++ api/templates/default/etemplate2.css | 31 ---------------------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/api/js/etemplate/Et2Widget/Et2Widget.ts b/api/js/etemplate/Et2Widget/Et2Widget.ts index 2312ea7800..492c7d20be 100644 --- a/api/js/etemplate/Et2Widget/Et2Widget.ts +++ b/api/js/etemplate/Et2Widget/Et2Widget.ts @@ -103,6 +103,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)); + } `]; } diff --git a/api/templates/default/etemplate2.css b/api/templates/default/etemplate2.css index 1498a704f3..7518fe9bb5 100644 --- a/api/templates/default/etemplate2.css +++ b/api/templates/default/etemplate2.css @@ -78,37 +78,6 @@ 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)); -} /** * VBox widget From 472ee73dda796835768de022cdd43e8d37534e69 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 14 Sep 2023 14:30:20 -0600 Subject: [PATCH 03/41] Improve styling & behaviour of Et2SelectEmail --- api/js/etemplate/Et2Select/Et2Select.ts | 6 +++--- api/js/etemplate/Et2Select/SearchMixin.ts | 6 +++--- api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts | 13 +++++++------ api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts | 6 +++--- mail/templates/default/app.css | 3 ++- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 340d52aeb7..e87658a0ed 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -145,13 +145,13 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) /* Hide dropdown trigger when multiple & readonly */ - :host([readonly][multiple]) .select__expand-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; @@ -649,7 +649,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) ?removable=${!readonly} ?readonly=${readonly} ?editable=${isEditable} - value=${option.value} + .value=${option.value.replaceAll("___", " ")} @dblclick=${this._handleDoubleClick} @click=${typeof this.onTagClick == "function" ? (e) => this.onTagClick(e, e.target) : nothing} > diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts index f5db4adebc..52343707e0 100644 --- a/api/js/etemplate/Et2Select/SearchMixin.ts +++ b/api/js/etemplate/Et2Select/SearchMixin.ts @@ -11,9 +11,9 @@ import {css, CSSResultGroup, html, LitElement, nothing, render, TemplateResult} import {cleanSelectOptions, SelectOption} from "./FindSelectOptions"; import {Validator} from "@lion/form-core"; import {Et2Tag} from "./Tag/Et2Tag"; -import {SlMenuItem} from "@shoelace-style/shoelace"; import {StaticOptions} from "./StaticOptions"; import {dedupeMixin} from "@open-wc/dedupe-mixin"; +import {SlOption} from "@shoelace-style/shoelace"; // Otherwise import gets stripped let keep_import : Et2Tag; @@ -543,9 +543,9 @@ export const Et2WithSearchMixin = dedupeMixin( 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()}); } diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts index c74f59fb2b..98f4abe300 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts @@ -148,11 +148,6 @@ export class Et2SelectEmail extends Et2Select } } - connectedCallback() - { - super.connectedCallback(); - } - protected _bindListeners() { super._bindListeners(); @@ -207,6 +202,9 @@ export class Et2SelectEmail extends Et2Select */ _tagTemplate(option, index) { + const readonly = (this.readonly || option && typeof (option.disabled) != "undefined" && option.disabled); + const isEditable = this.editModeEnabled && !readonly; + return html` ${option.getTextLabel().trim()} diff --git a/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts b/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts index fdcd6a3883..fd97f5c776 100644 --- a/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts +++ b/api/js/etemplate/Et2Select/Tag/Et2EmailTag.ts @@ -218,15 +218,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) { diff --git a/mail/templates/default/app.css b/mail/templates/default/app.css index a6fa3a13b6..6c27a66c89 100644 --- a/mail/templates/default/app.css +++ b/mail/templates/default/app.css @@ -1070,7 +1070,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%} From 1d1b3f594740193b13d5a27a1935730ea59a33e2 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 14 Sep 2023 14:33:16 -0600 Subject: [PATCH 04/41] Avoid JS error on blur --- api/js/etemplate/Et2Select/Et2Select.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index e87658a0ed..a7ac9e3b42 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -729,7 +729,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { super.blur(); } - this.dropdown.hide(); + this.hide(); } /* Parent should be fine now? From 1fb543cb934c9a2129b44a3b8817980803348343 Mon Sep 17 00:00:00 2001 From: ralf Date: Fri, 15 Sep 2023 09:27:22 +0200 Subject: [PATCH 05/41] fix removing last user/group from valid-for in mail-account did not work add a strong warning that selecting a user/group for a mail account for all users effectively deletes it for all other users --- admin/js/app.ts | 23 +++++++++++++++++++++++ admin/lang/egw_de.lang | 2 ++ admin/lang/egw_en.lang | 2 ++ admin/templates/default/mailaccount.xet | 2 +- api/src/Mail/Account.php | 2 +- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/admin/js/app.ts b/admin/js/app.ts index bbd4ec0931..b92d603280 100644 --- a/admin/js/app.ts +++ b/admin/js/app.ts @@ -20,6 +20,7 @@ import {egwAction, egwActionObject} from '../../api/js/egw_action/egw_action'; import {LitElement} from "@lion/core"; import {et2_nextmatch} from "../../api/js/etemplate/et2_extension_nextmatch"; import {et2_DOMWidget} from "../../api/js/etemplate/et2_core_DOMWidget"; +import {Et2SelectAccount} from "../../api/js/etemplate/Et2Select/Et2SelectAccount"; /** * UI for Admin @@ -1367,6 +1368,28 @@ class AdminApp extends EgwApp if (use_default) use_default.set_value(false); } + /** + * onchange callback for mail account account_id (valid for) + * + * @param {object} _event + * @param {et2_widget} _widget + */ + warnMailAccountForAllChanged(_event : Event, _widget : Et2SelectAccount) + { + const account_id = _widget.value; + const old_account_id = this.et2.getArrayMgr('content').getEntry('account_id'); + + // this is (no longer) an account for all + if ((Array.isArray(account_id) ? account_id.length : account_id) && + // but this was an account for all + !(Array.isArray(old_account_id) ? old_account_id.length : old_account_id)) + { + _widget.blur(); + Et2Dialog.alert(this.egw.lang('By selecting a user or group you effectively delete the mail account for all other users!\n\nAre you really sure you want to do that?'), + this.egw.lang('This is a mail account for ALL users!'), Et2Dialog.WARNING_MESSAGE); + } + } + /** * default onExecute for admin actions * diff --git a/admin/lang/egw_de.lang b/admin/lang/egw_de.lang index 52755350b7..8f5d52223f 100644 --- a/admin/lang/egw_de.lang +++ b/admin/lang/egw_de.lang @@ -188,6 +188,7 @@ blocking after wrong password admin de Blockierung nach falschem Passwort bottom admin de unten bulk password reset admin de Rücksetzen mehrerer Passwörter by admin de Von +by selecting a user or group you effectively delete the mail account for all other users!\n\nare you really sure you want to do that? admin de Durch die Auswahl eines Benutzer oder Gruppe löschen Sie das Mailkonto für alle anderen Benutzer!\n\nSind Sie wirklich sicher, dass Sie das wollen? calculate next run admin de nächste Ausführung berechnen calendar recurrence horizont in days (default 1000) admin de Kalender Wiederholungs-Bereich in Tagen (Vorgabe sind 1000) can be used by application admin de Kann von folgender Anwendung verwendet werden @@ -920,6 +921,7 @@ this application is current admin de Diese Anwendung ist aktuell this application requires an upgrade admin de Diese Anwendung benötigt ein Upgrade this category is currently being used by applications as a parent category admin de Diese Kategorie wird gegenwärtig als übergeordnete Kategorie benutzt. this controls exports and merging. admin de Steuert den Export und den Merge Print von Dokumenten +this is a mail account for all users! admin de Das ist ein Mailkonto für ALLE Benutzer! this is not a personal mail account!\n\naccount will be deleted for all users!\n\nare you really sure you want to do that? admin de Das ist KEIN persönliches Mail-Konto!\n\nDas Konto wird für ALLE Benutzer gelöscht!\n\nSind Sie wirklich sicher, dass Sie das wollen? this key used in the html code your site serves to users. admin de Dieser Schlüssel steht im HTML Code den Ihre Website ausliefert. this php has no imap support compiled in!! admin de Dieses PHP hat keine IMAP Unterstützung!!! diff --git a/admin/lang/egw_en.lang b/admin/lang/egw_en.lang index cf3d5479e3..114664785c 100644 --- a/admin/lang/egw_en.lang +++ b/admin/lang/egw_en.lang @@ -188,6 +188,7 @@ blocking after wrong password admin en Blocking after wrong password bottom admin en Bottom bulk password reset admin en Bulk password reset by admin en By +by selecting a user or group you effectively delete the mail account for all other users!\n\nare you really sure you want to do that? admin en By selecting a user or group you effectively delete the mail account for all other users!\n\nAre you really sure you want to do that? calculate next run admin en Calculate next run calendar recurrence horizont in days (default 1000) admin en Calendar recurrence horizon in days. Default = 1000. can be used by application admin en Can be used by application @@ -923,6 +924,7 @@ this application is current admin en This application is current. this application requires an upgrade admin en This application requires an upgrade. this category is currently being used by applications as a parent category admin en This category is currently being used by applications as a parent category. this controls exports and merging. admin en This controls exports and merge prints. +this is a mail account for all users! admin en This is a mail account for ALL users! this is not a personal mail account!\n\naccount will be deleted for all users!\n\nare you really sure you want to do that? admin en This is NOT a personal mail account!\n\nAccount will be deleted for ALL users!\n\nAre you really sure you want to do that? this key used in the html code your site serves to users. admin en This key used in the HTML code your site serves to users. this php has no imap support compiled in!! admin en This PHP has no IMAP support compiled in!! diff --git a/admin/templates/default/mailaccount.xet b/admin/templates/default/mailaccount.xet index a7dee94980..839ff35758 100644 --- a/admin/templates/default/mailaccount.xet +++ b/admin/templates/default/mailaccount.xet @@ -341,7 +341,7 @@ - + diff --git a/api/src/Mail/Account.php b/api/src/Mail/Account.php index f1fb4392af..e8448fa310 100644 --- a/api/src/Mail/Account.php +++ b/api/src/Mail/Account.php @@ -1300,7 +1300,7 @@ class Account implements \ArrayAccess { $old_account_ids[] = $row['account_id']; } - if ($data['account_id'] && ($ids_to_remove = array_diff($old_account_ids, (array)$data['account_id']))) + if (($ids_to_remove = array_diff($old_account_ids, (array)$data['account_id']))) { self::$db->delete(self::VALID_TABLE, $where+array( 'account_id' => $ids_to_remove, From d27f8083a0509e1912d2fe2adcb206947e99ef22 Mon Sep 17 00:00:00 2001 From: ralf Date: Fri, 15 Sep 2023 09:31:09 +0200 Subject: [PATCH 06/41] run npm audit fix to fix 1 moderate security problem --- package-lock.json | 110 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 928ef238bd..c84b3c8262 100644 --- a/package-lock.json +++ b/package-lock.json @@ -928,15 +928,6 @@ "node": ">=4" } }, - "node_modules/@babel/plugin-proposal-decorators/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-proposal-decorators/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3048,6 +3039,12 @@ "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==", "dev": true }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "peer": true + }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -3060,6 +3057,17 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/react": { + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", + "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "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", @@ -3069,6 +3077,12 @@ "@types/node": "*" } }, + "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-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -3153,9 +3167,9 @@ } }, "node_modules/@web/config-loader/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" @@ -4423,6 +4437,12 @@ "url": "https://opencollective.com/core-js" } }, + "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/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -7258,7 +7278,7 @@ "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, + "devOptional": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -7339,9 +7359,9 @@ "dev": true }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -8838,12 +8858,6 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "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 - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -9707,7 +9721,8 @@ "version": "1.10.11", "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.10.11.tgz", "integrity": "sha512-aJ50ccVeszpJt7wPH7Yfqm7f1aG1SA94qd90P0NaESh5/QUXn4CESO6igobo4DFHQ5z+1Rfdl8aphP4JxlH4gw==", - "dev": true + "dev": true, + "requires": {} }, "@interactjs/dev-tools": { "version": "1.10.11", @@ -9897,7 +9912,8 @@ "@lit-labs/react": { "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==" + "integrity": "sha512-Nj+XB3HamqaWefN91lpFPJaqjJ78XzGkPWCedB4jyH22GBFEenpE9A/h8B/2dnIGXtNtd9D/RFpUdQ/dBtWFqA==", + "requires": {} }, "@lit-labs/ssr-dom-shim": { "version": "1.0.0", @@ -10430,6 +10446,12 @@ "integrity": "sha512-ARATsLdrGPUnaBvxLhUlnltcMgn7pQG312S8ccdYlnyijabrX9RN/KN/iGj9Am96CoW8e/K9628BA7Bv4XHdrA==", "dev": true }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "peer": true + }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -10442,6 +10464,17 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "@types/react": { + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", + "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "peer": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -10451,6 +10484,12 @@ "@types/node": "*" } }, + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "peer": true + }, "@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -10529,9 +10568,9 @@ }, "dependencies": { "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "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" @@ -11469,6 +11508,12 @@ "browserslist": "^4.21.5" } }, + "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 + }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -13666,7 +13711,7 @@ "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, + "devOptional": true, "requires": { "fsevents": "~2.3.2" } @@ -13719,9 +13764,9 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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": { @@ -14305,7 +14350,8 @@ "version": "7.5.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "dev": true + "dev": true, + "requires": {} }, "yallist": { "version": "4.0.0", From 19552059b3c9b16cb3a312b30596e1cd34ea5c41 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 15 Sep 2023 08:09:12 -0600 Subject: [PATCH 07/41] Fix no results sometimes showed even if there were results --- api/js/etemplate/Et2Select/SearchMixin.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts index 52343707e0..7654f786c3 100644 --- a/api/js/etemplate/Et2Select/SearchMixin.ts +++ b/api/js/etemplate/Et2Select/SearchMixin.ts @@ -7,7 +7,7 @@ * @author Nathan Gray */ -import {css, CSSResultGroup, html, LitElement, nothing, render, TemplateResult} from "lit"; +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"; @@ -419,6 +419,7 @@ export const Et2WithSearchMixin = dedupeMixin( return html` ${this._searchInputTemplate()} ${this._moreResultsTemplate()} + ${this._noResultsTemplate()} `; } @@ -463,6 +464,11 @@ export const Et2WithSearchMixin = dedupeMixin( protected _noResultsTemplate() { + if(this._total_result_count !== 0) + { + return nothing; + } + return html`
${this.egw().lang("no suggestions")}
`; } @@ -1037,15 +1043,6 @@ export const Et2WithSearchMixin = dedupeMixin( this.remoteSearch(this._searchInputNode.value, this.searchOptions) ]).then(() => { - // Show no results indicator - if(this.getAllOptions().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]); - } - // Remove spinner spinner.remove(); From b6a0e650fecad61f1dc385d85567a3579900a06a Mon Sep 17 00:00:00 2001 From: ralf Date: Mon, 18 Sep 2023 14:13:09 +0200 Subject: [PATCH 08/41] * Calendar/REST API: adding of participants to events --- api/src/CalDAV/JsCalendar.php | 118 +++++++++++++++++-- calendar/inc/class.calendar_groupdav.inc.php | 2 +- doc/REST-CalDAV-CardDAV/Calendar.md | 4 +- 3 files changed, 110 insertions(+), 14 deletions(-) diff --git a/api/src/CalDAV/JsCalendar.php b/api/src/CalDAV/JsCalendar.php index 94fc989436..d829476d99 100644 --- a/api/src/CalDAV/JsCalendar.php +++ b/api/src/CalDAV/JsCalendar.php @@ -95,7 +95,7 @@ class JsCalendar * @param string $method='PUT' 'PUT', 'POST' or 'PATCH' * @return array */ - public static function parseJsEvent(string $json, array $old=[], string $content_type=null, $method='PUT') + public static function parseJsEvent(string $json, array $old=[], string $content_type=null, $method='PUT', int $calendar_owner=null) { try { @@ -147,7 +147,7 @@ class JsCalendar break; case 'participants': - $event['participants'] = self::parseParticipants($value); + $event['participants'] = self::parseParticipants($value, $strict, $calendar_owner); break; case 'priority': @@ -537,21 +537,22 @@ class JsCalendar const TYPE_PARTICIPANT = 'Participant'; + static $status2jscal = [ + 'U' => 'needs-action', + 'A' => 'accepted', + 'R' => 'declined', + 'T' => 'tentative', + //'' => 'delegated', + ]; + /** * Return participants object * * @param array $event * @return array - */ + * @todo Resources and Groups without email */ protected static function Participants(array $event) { - static $status2jscal = [ - 'U' => 'needs-action', - 'A' => 'accepted', - 'R' => 'declined', - 'T' => 'tentative', - //'' => 'delegated', - ]; $participants = []; foreach($event['participants'] as $uid => $status) { @@ -589,7 +590,7 @@ class JsCalendar 'optional' => $role === 'OPT-PARTICIPANT', 'informational' => $role === 'NON-PARTICIPANT', ]), - 'participationStatus' => $status2jscal[$status], + 'participationStatus' => self::$status2jscal[$status], ]); $participants[$uid] = $participant; } @@ -597,6 +598,101 @@ class JsCalendar return $participants; } + /** + * Parse participants object + * + * @param array $participants + * @param bool $strict true: require @types and objects with attributes name, email, ... + * @param ?int $calendar_owner owner of the calendar / collection + * @return array + * @todo Resources and Groups without email + */ + protected static function parseParticipants(array $participants, bool $strict=true, int $calendar_owner=null) + { + $parsed = []; + + foreach($participants as $uid => $participant) + { + if ($strict && (!is_array($participant) || $participant[self::AT_TYPE] !== self::TYPE_PARTICIPANT)) + { + throw new \InvalidArgumentException("Missing or invalid @type: ".json_encode($participant, self::JSON_OPTIONS_ERROR)); + } + elseif (!is_array($participant)) + { + $participant = [ + 'email' => $participant, + ]; + } + // check if the uid is valid and matches the data in the object + if (($test_uid = self::Participants(['participants' => [ + $uid => 'U' + ]])) && ($test_uid['email'] ?? null) === $participant['email'] && + ($test_uid['kind'] ?? null) === ($participant['kind'] ?? null) && + ($test_uid['name'] ?? null) === ($participant['name'] ?? null)) + { + // use $uid as is + } + else + { + if (empty($participant['email']) || !preg_match(Api\Etemplate\Widget\Url::EMAIL_PREG, $participant['email'])) + { + throw new \InvalidArgumentException("Missing or invalid email address: ".json_encode($participant, self::JSON_OPTIONS_ERROR)); + } + static $contacts = null; + if (!isset($contacts)) $contacts = new Api\Contacts(); + if ((list($data) = $contacts->search([ + 'email' => $participant['email'], + 'email_home' => $participant['email'], + ], ['id','egw_addressbook.account_id as account_id','n_fn'], + 'egw_addressbook.account_id IS NOT NULL DESC, n_fn IS NOT NULL DESC', + '','',false,'OR'))) + { + // found an addressbook entry + $uid = $data['account_id'] ? (int)$data['account_id'] : 'c'.$data['id']; + } + else + { + $uid = 'e'.(empty($participant['name']) ? $participant['email'] : $participant['name'].' <'.$participant['email'].'>'); + } + } + $default_status = $uid === $GLOBALS['egw_info']['user']['account_id'] ? 'A' : 'U'; + $default_role = $uid === $calendar_owner ? 'CHAIR' : 'REQ-PARTICIPANT'; + $parsed[$uid] = \calendar_so::combine_status(array_search($participant['participationStatus'] ?? $default_status, self::$status2jscal) ?: $default_status, + 1, self::jscalRoles2role($participant['roles'] ?? null, $default_role)); + } + + return $parsed; + } + + protected static function jscalRoles2role(array $roles=null, string $default_role=null) + { + $role = $default_role ?? 'REQ-PARTICIPANT'; + foreach($roles ?? [] as $name => $value) + { + if ($value && $role !== 'CHAIR') + { + switch($name) + { + case 'owner': // we ignore the owner, it's set automatic to the owner of the calendar/collection + break; + case 'attendee': + $role = 'REQ-PARTICIPANT'; + break; + case 'optional': + $role = 'OPT-PARTICIPANT'; + break; + case 'informational': + $role = 'NON-PARTICIPANT'; + break; + case 'chair': + $role = 'CHAIR'; + break; + } + } + } + return $role; + } + const TYPE_LOCATION = 'Location'; const TYPE_VIRTALLOCATION = 'VirtualLocation'; diff --git a/calendar/inc/class.calendar_groupdav.inc.php b/calendar/inc/class.calendar_groupdav.inc.php index 28cb8d1168..707b85d0cb 100644 --- a/calendar/inc/class.calendar_groupdav.inc.php +++ b/calendar/inc/class.calendar_groupdav.inc.php @@ -1227,7 +1227,7 @@ class calendar_groupdav extends Api\CalDAV\Handler $type = null; if (($is_json=Api\CalDAV::isJSON($type))) { - $event = Api\CalDAV\JsCalendar::parseJsEvent($options['content'], $oldEvent ?? [], $type, $method); + $event = Api\CalDAV\JsCalendar::parseJsEvent($options['content'], $oldEvent ?? [], $type, $method, $user); $cal_id = $this->bo->save($event); } else diff --git a/doc/REST-CalDAV-CardDAV/Calendar.md b/doc/REST-CalDAV-CardDAV/Calendar.md index 61c2112b26..534f130fe7 100644 --- a/doc/REST-CalDAV-CardDAV/Calendar.md +++ b/doc/REST-CalDAV-CardDAV/Calendar.md @@ -202,7 +202,7 @@ curl https://example.org/egroupware/groupdav.php//calendar/ -H "Accept following GET parameters are supported to customize the returned properties: - props[]= eg. props[]=getetag to return only the ETAG (multiple DAV properties can be specified) - Default for addressbook collections is to only return address-data (JsContact), other collections return all props. + Default for calendar collections is to only return calendar-data (JsEvent), other collections return all props. - sync-token= to only request change since last sync-token, like rfc6578 sync-collection REPORT - nresults=N limit number of responses (only for sync-collection / given sync-token parameter!) this will return a "more-results"=true attribute and a new "sync-token" attribute to query for the next chunk @@ -215,7 +215,7 @@ Examples: see addressbook Example: GET request for a single resource ``` -curl 'https://example.org/egroupware/groupdav.php/addressbook/6502' -H "Accept: application/pretty+json" --user +curl 'https://example.org/egroupware/groupdav.php/calendar/6502' -H "Accept: application/pretty+json" --user { "@type": "Event", "prodId": "EGroupware Calendar 23.1.002", From 01797f071d3c8bcec91abca2311a87f4d74568a3 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 18 Sep 2023 13:57:34 -0600 Subject: [PATCH 09/41] Fix mail attachment dropdown actions did nothing --- api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts b/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts index d675d047a9..1185db5ec2 100644 --- a/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts +++ b/api/js/etemplate/Et2DropdownButton/Et2DropdownButton.ts @@ -131,10 +131,10 @@ export class Et2DropdownButton extends Et2WidgetWithSelectMixin(LitElement) ` : ''; return html` - + ${icon} ${this.noLang ? option.label : this.egw().lang(option.label)} - `; + `; } protected _handleSelect(ev) From f75567a863c37fd2391471cae79c5d00e9c9216a Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 18 Sep 2023 16:09:43 -0600 Subject: [PATCH 10/41] Select improvements - Add _styleTemplate for easier extension - re-organize file - Fix weird tag style - some cleanup --- api/js/etemplate/Et2Select/Et2Select.ts | 241 ++++++++++-------- api/js/etemplate/Et2Select/SearchMixin.ts | 4 +- .../Et2Select/Select/Et2SelectAccount.ts | 8 - .../Et2Select/Select/Et2SelectCategory.ts | 25 +- .../Et2Select/Select/Et2SelectEmail.ts | 10 - api/js/etemplate/Et2Select/Tag/Et2Tag.ts | 3 + 6 files changed, 148 insertions(+), 143 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index a7ac9e3b42..88b60207e3 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -17,7 +17,7 @@ import {RowLimitedMixin} from "../Layout/RowLimitedMixin"; import {Et2Tag} from "./Tag/Et2Tag"; import {Et2WithSearchMixin} from "./SearchMixin"; import {property} from "lit/decorators/property.js"; -import {SlChangeEvent, SlSelect} from "@shoelace-style/shoelace"; +import {SlChangeEvent, SlOption, SlSelect} from "@shoelace-style/shoelace"; import {repeat} from "lit/directives/repeat.js"; // export Et2WidgetWithSelect which is used as type in other modules @@ -556,59 +556,6 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } */ - _emptyLabelTemplate() : TemplateResult - { - if(!this.emptyLabel || this.multiple) - { - return html``; - } - return html` - v == "")} - > - ${this.emptyLabel} - `; - } - - 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), this._groupTemplate.bind(this)) - }`; - } - - /** - * Used to render each option into the select - * - * @param {SelectOption} option - * @returns {TemplateResult} - */ - protected _optionTemplate(option : SelectOption) : TemplateResult - { - // Exclude non-matches when searching - if(typeof option.isMatch == "boolean" && !option.isMatch) - { - 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(" ", "___"); - return html` - v == value)} - ?disabled=${option.disabled} - > - ${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. @@ -620,54 +567,6 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) return literal`et2-tag`; } - /** - * Custom tag - * @param {Et2Option} option - * @param {number} index - * @returns {TemplateResult} - * @protected - */ - protected _tagTemplate(option : Et2Option, index : number) : TemplateResult - { - const readonly = (this.readonly || option && typeof (option.disabled) != "undefined" && option.disabled); - const isEditable = this.editModeEnabled && !readonly; - const image = this._createImage(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} - ?removable=${!readonly} - ?readonly=${readonly} - ?editable=${isEditable} - .value=${option.value.replaceAll("___", " ")} - @dblclick=${this._handleDoubleClick} - @click=${typeof this.onTagClick == "function" ? (e) => this.onTagClick(e, e.target) : nothing} - > - ${image ?? nothing} - ${option.getTextLabel().trim()} - - `; - } - - /** - * Additional customisation template - * @returns {*} - * @protected - */ - protected _extraTemplate() - { - return typeof super._extraTemplate == "function" ? super._extraTemplate() : nothing; - } /** * Customise how tags are rendered. This overrides what SlSelect @@ -867,6 +766,141 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) 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), 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 + if(typeof option.isMatch == "boolean" && !option.isMatch) + { + 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(" ", "___"); + return html` + v == value)} + ?disabled=${option.disabled} + > + ${this._iconTemplate(option)} + ${this.noLang ? option.label : this.egw().lang(option.label)} + `; + } + + + /** + * Custom tag + * + * 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 + */ + protected _tagTemplate(option : SlOption, index : number) : TemplateResult + { + const readonly = (this.readonly || option && typeof (option.disabled) != "undefined" && option.disabled); + const isEditable = this.editModeEnabled && !readonly; + const image = this._createImage(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("___", " ")} + @dblclick=${this._handleDoubleClick} + @click=${typeof this.onTagClick == "function" ? (e) => this.onTagClick(e, e.target) : nothing} + > + ${image ?? nothing} + ${option.getTextLabel().trim()} + + `; + } + + /** + * Additional customisation template + * Override if needed. Added after select options. + * + * @protected + */ + protected _extraTemplate() : TemplateResult | typeof nothing + { + return typeof super._extraTemplate == "function" ? super._extraTemplate() : nothing; + } + public render() { const value = Array.isArray(this.value) ? @@ -883,12 +917,13 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } } return html` + ${this._styleTemplate()} } } - protected _extraTemplate() + protected _extraTemplate() : TemplateResult | typeof nothing { if(!this.searchEnabled && !this.editModeEnabled && !this.allowFreeEntries || this.readonly) { diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts b/api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts index 537d0cb213..6a77e3d55f 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectAccount.ts @@ -70,14 +70,6 @@ export class Et2SelectAccount extends SelectAccountMixin(Et2StaticSelectMixin(Et this.fetchComplete = Promise.all(fetch); } - - firstUpdated(changedProperties?) - { - super.firstUpdated(changedProperties); - // Due to the different way Et2SelectAccount handles options, we call this explicitly - this._renderOptions(); - } - set accountType(type : AccountType) { this.__accountType = type; diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts b/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts index c462612b1e..084627bcc5 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectCategory.ts @@ -105,15 +105,15 @@ export class Et2SelectCategory extends Et2StaticSelectMixin(Et2Select) } /** - * Used to render each option into the select - * Overridden for colors + * Custom, dynamic styling + * + * CSS variables are not making it through to options, re-declaring them here works * - * @param {SelectOption} option * @returns {TemplateResult} + * @protected */ - public render() : TemplateResult + protected _styleTemplate() : TemplateResult { - /** CSS variables are not making it through to options, re-declaring them here works */ return html` - ${super.render()} `; } @@ -141,20 +140,6 @@ export class Et2SelectCategory extends Et2StaticSelectMixin(Et2Select) { return literal`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/Select/Et2SelectEmail.ts b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts index 98f4abe300..32fec1bd8e 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts @@ -243,16 +243,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/Tag/Et2Tag.ts b/api/js/etemplate/Et2Select/Tag/Et2Tag.ts index 24fbbe26d0..1eab4fca40 100644 --- a/api/js/etemplate/Et2Select/Tag/Et2Tag.ts +++ b/api/js/etemplate/Et2Select/Tag/Et2Tag.ts @@ -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; From e72671bc20394d53ae7eca5792ce4760cdaf3d8f Mon Sep 17 00:00:00 2001 From: hadi Date: Tue, 19 Sep 2023 14:03:26 +0200 Subject: [PATCH 11/41] Fix styling of readonly selectbox --- api/js/etemplate/Et2Select/Et2Select.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 88b60207e3..91874781fc 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -197,6 +197,11 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) max-height: 8em; overflow-y: auto; } + :host([readonly])::part(combobox) { + background: none; + opacity: 1; + border: none; + } ` ]; } From 368c9fae631c835df063ae71c917918b7cf3c520 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 08:46:41 -0600 Subject: [PATCH 12/41] Fix link to did not link --- api/js/etemplate/Et2Link/Et2LinkSearch.ts | 4 ++-- api/js/etemplate/Et2Link/Et2LinkTo.ts | 3 ++- api/js/etemplate/Et2Select/SearchMixin.ts | 14 ++------------ 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/api/js/etemplate/Et2Link/Et2LinkSearch.ts b/api/js/etemplate/Et2Link/Et2LinkSearch.ts index d453f4c354..d5f0fe9c9e 100644 --- a/api/js/etemplate/Et2Link/Et2LinkSearch.ts +++ b/api/js/etemplate/Et2Link/Et2LinkSearch.ts @@ -87,8 +87,8 @@ export class Et2LinkSearch extends Et2Select // 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.value.length > 0 && ( - this.getAllOptions().length == 0 || - this.getAllOptions().filter && this.getAllOptions().filter(item => this.getValueAsArray().includes(item.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) diff --git a/api/js/etemplate/Et2Link/Et2LinkTo.ts b/api/js/etemplate/Et2Link/Et2LinkTo.ts index 8a6f6f6308..13a992f2a1 100644 --- a/api/js/etemplate/Et2Link/Et2LinkTo.ts +++ b/api/js/etemplate/Et2Link/Et2LinkTo.ts @@ -141,7 +141,7 @@ export class Et2LinkTo extends Et2InputWidget(ScopedElementsMixin(FormControlMix // Show a spinner let spinner = document.createElement("sl-spinner"); spinner.slot = "expand-icon"; - this.appendChild(spinner); + this.select.appendChild(spinner); // Hide clear button let clear_button = this._searchInputNode.shadowRoot.querySelector(".input__clear") @@ -1077,9 +1077,6 @@ export const Et2WithSearchMixin = dedupeMixin( { let target = this._optionTargetNode || this; - // Remove "no suggestions" - target.querySelector(".no-results")?.remove(); - // Remove any previously selected remote options that aren't used anymore this._selected_remote = this._selected_remote.filter((option) => { @@ -1090,14 +1087,7 @@ export const Et2WithSearchMixin = dedupeMixin( { 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) - { - n.remove(); - } - }) + // Not searching anymore, clear flag this.select_options.map((o) => o.isMatch = null); this.requestUpdate("select_options"); From 3b54165468d7c438e26be9b3a49c702412737a2c Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 10:00:08 -0600 Subject: [PATCH 13/41] Fix textarea did not take vertical space --- api/js/etemplate/Et2Textarea/Et2Textarea.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/js/etemplate/Et2Textarea/Et2Textarea.ts b/api/js/etemplate/Et2Textarea/Et2Textarea.ts index 4153c003b8..5e182b0e0d 100644 --- a/api/js/etemplate/Et2Textarea/Et2Textarea.ts +++ b/api/js/etemplate/Et2Textarea/Et2Textarea.ts @@ -36,7 +36,8 @@ export class Et2Textarea extends Et2InputWidget(SlTextarea) height: 100%; align-items: stretch !important; } - :host::part(base) { + + :host::part(form-control-input), :host::part(textarea) { height: 100%; } `, From dc9736260a1d4e92fe6bf05554ac0bd4b0a46990 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 10:08:18 -0600 Subject: [PATCH 14/41] Fix textarea did not take vertical space --- api/js/etemplate/Et2Textarea/Et2Textarea.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/js/etemplate/Et2Textarea/Et2Textarea.ts b/api/js/etemplate/Et2Textarea/Et2Textarea.ts index 5e182b0e0d..24872f5ff5 100644 --- a/api/js/etemplate/Et2Textarea/Et2Textarea.ts +++ b/api/js/etemplate/Et2Textarea/Et2Textarea.ts @@ -29,7 +29,8 @@ export class Et2Textarea extends Et2InputWidget(SlTextarea) width: 100%; height: 100%; } - .textarea--resize-vertical .textarea__control { + + .textarea--resize-vertical { height: 100%; } :host::part(form-control) { From 70f379d985a71de86ed6c99df742ed447a2b764d Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 11:59:48 -0600 Subject: [PATCH 15/41] Calendar: Fix extra blank participant, fix email showed up in sidebox owner options --- calendar/js/CalendarOwner.ts | 21 ++++++-------- calendar/templates/default/app.css | 2 +- calendar/templates/default/edit.xet | 2 +- calendar/templates/mobile/app.css | 44 ++--------------------------- calendar/templates/pixelegg/app.css | 2 +- 5 files changed, 14 insertions(+), 57 deletions(-) diff --git a/calendar/js/CalendarOwner.ts b/calendar/js/CalendarOwner.ts index b84c2d595e..6bf2418b7f 100644 --- a/calendar/js/CalendarOwner.ts +++ b/calendar/js/CalendarOwner.ts @@ -56,19 +56,16 @@ export class CalendarOwner extends Et2StaticSelectMixin(Et2Select) */ _optionTemplate(option : SelectOption) : TemplateResult { - - const checked = this.value == null ? - option.value === this.value || this.multiple && this.value.indexOf(option.value) >= 0 : - this.value.indexOf(option.value) >= 0; - - // 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(" ", "___"); return html` - v == value)} > ${this._iconTemplate(option)} ${this.noLang ? option.label : this.egw().lang(option.label)} 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/mobile/app.css b/calendar/templates/mobile/app.css index b4e6b7d26b..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 */ @@ -2359,52 +2359,12 @@ e.g. the div with class calendar_calTimeGrid is generated by the timeGridWidget background: #f2f2f2; } .calendar_calDayTodos .calendar_calDayTodosTable table td { + display: inline-block; padding: 3px; } -.calendar_calDayTodos .calendar_calDayTodosTable table td img[src$="svg"] { - background-color: #0c5da5; - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAxIDEiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxsaW5lYXJHcmFkaWVudCBpZD0iZzc0MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMCUiIHkyPSIxMDAlIj48c3RvcCBzdG9wLWNvbG9yPSIjMEM1REE1IiBvZmZzZXQ9IjAiLz48c3RvcCBzdG9wLWNvbG9yPSIjMEM1REE1IiBvZmZzZXQ9IjEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjZzc0MykiLz48L3N2Zz4=); - background-image: -moz-linear-gradient(top, #0C5DA5, #0C5DA5); - background-image: -ms-linear-gradient(top, #0C5DA5, #0C5DA5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0C5DA5), to(#0C5DA5)); - background-image: -webkit-linear-gradient(top, #0C5DA5, #0C5DA5); - background-image: -o-linear-gradient(top, #0C5DA5, #0C5DA5); - background-image: linear-gradient(top, #0C5DA5, #0C5DA5); - background-repeat: repeat-x; -} .calendar_calDayTodos .calendar_calDayTodosTable table td img { width: 12px; height: 12px; - /*.background_color_10_gray;*/ - -webkit-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); - -moz-box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); - box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.5); - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.calendar_calDayTodos .calendar_calDayTodosTable table td img:hover { - /*.background_color_20_gray;*/ - -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); - -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); - box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); - border: 1px solid rgba(0, 0, 0, 0.5); - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.calendar_calDayTodos .calendar_calDayTodosTable table td img:active { - /*.background_color_30_gray;*/ - border: 1px solid rgba(0, 0, 0, 0.9); - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 1px 2px 1px rgba(0, 0, 0, 0.5); - -moz-box-shadow: inset 1px 2px 1px rgba(0, 0, 0, 0.5); - box-shadow: inset 1px 2px 1px rgba(0, 0, 0, 0.5); - background-color: #b3e4a6; - background-color: #ace29e !important; } .calendar_calDayTodosHeader { text-align: center; 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 */ From cb484c8f6c3d2bd6a510ed12a6c70f5bcd8f2057 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 13:01:49 -0600 Subject: [PATCH 16/41] Fix some selectbox non-values causing issues --- api/js/etemplate/Et2Select/Et2Select.ts | 17 +++++++++++++---- .../Et2Select/Et2WidgetWithSelectMixin.ts | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 91874781fc..8bec574869 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -376,6 +376,15 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) @property() get value() { + // 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 == "")) + { + return []; + } + if(!this.multiple && !this.emptyLabel && this.__value == "") + { + return null; + } return this.multiple ? this.__value ?? [] : this.__value ?? ""; @@ -464,7 +473,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) if(missing.length > 0) { debugger; - console.warn("Invalid option '" + missing.join(", ") + "' removed"); + console.warn("Invalid option '" + missing.join(", ") + "' removed from " + this.id, this); value = value.filter(item => missing.indexOf(item) == -1); } } @@ -472,9 +481,9 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } /** - * Add an option for the "empty label" option, used if there's no value + * Additional customisations from the XET node * - * @returns {TemplateResult} + * @param {Element} _node */ loadFromXML(_node : Element) { @@ -926,7 +935,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) >(supe { return this.value; } - if(this.value == "null" || typeof this.value == "undefined" || !this.emptyLabel && this.value == "") + if(this.value == "null" || this.value == null || typeof this.value == "undefined" || !this.emptyLabel && this.value == "") { return []; } From 36f42f77db0162e1168ea688a826f204c445fc60 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 13:53:15 -0600 Subject: [PATCH 17/41] Fix quick add did not always work the second time --- api/js/etemplate/Et2Select/Et2Select.ts | 6 ++++-- api/js/jsapi/egw_links.js | 2 ++ pixelegg/css/mobile.css | 5 +++++ pixelegg/css/monochrome.css | 5 +++++ pixelegg/css/pixelegg.css | 5 +++++ pixelegg/less/layout_raster_buttons.less | 5 +++++ pixelegg/mobile/fw_mobile.css | 5 +++++ 7 files changed, 31 insertions(+), 2 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 8bec574869..0e0e514423 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -807,8 +807,10 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) return html``; } return html` - v == "")} + v == "")} > ${this.emptyLabel} `; diff --git a/api/js/jsapi/egw_links.js b/api/js/jsapi/egw_links.js index a70c88a414..80930fecb2 100644 --- a/api/js/jsapi/egw_links.js +++ b/api/js/jsapi/egw_links.js @@ -515,6 +515,8 @@ egw.extend('links', egw.MODULE_GLOBAL, function() const parent = document.getElementById(_parent); const select = document.createElement('et2-select'); select.setAttribute('id', 'quick_add_selectbox'); + // 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"); diff --git a/pixelegg/css/mobile.css b/pixelegg/css/mobile.css index 7e92110e0b..f945e2cc14 100644 --- a/pixelegg/css/mobile.css +++ b/pixelegg/css/mobile.css @@ -5613,6 +5613,11 @@ div.timesheet_timer { #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), #egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(form-control-input), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(form-control-input), diff --git a/pixelegg/css/monochrome.css b/pixelegg/css/monochrome.css index d7cd72b205..a5e5956ad3 100644 --- a/pixelegg/css/monochrome.css +++ b/pixelegg/css/monochrome.css @@ -5593,6 +5593,11 @@ div.timesheet_timer { #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), #egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(form-control-input), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(form-control-input), diff --git a/pixelegg/css/pixelegg.css b/pixelegg/css/pixelegg.css index 871b1f5df2..e42544d293 100644 --- a/pixelegg/css/pixelegg.css +++ b/pixelegg/css/pixelegg.css @@ -5603,6 +5603,11 @@ div.timesheet_timer { #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), #egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(form-control-input), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(form-control-input), diff --git a/pixelegg/less/layout_raster_buttons.less b/pixelegg/less/layout_raster_buttons.less index eace485d0b..a333da1e3a 100644 --- a/pixelegg/less/layout_raster_buttons.less +++ b/pixelegg/less/layout_raster_buttons.less @@ -298,6 +298,11 @@ div.timesheet_timer { } } + #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; } diff --git a/pixelegg/mobile/fw_mobile.css b/pixelegg/mobile/fw_mobile.css index 9fb573261e..cbe710c50c 100644 --- a/pixelegg/mobile/fw_mobile.css +++ b/pixelegg/mobile/fw_mobile.css @@ -5624,6 +5624,11 @@ div.timesheet_timer { #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), #egw_fw_topmenu_info_items #topmenu_info_timer #quick_add_selectbox::part(form-control-input), #egw_fw_topmenu_info_items #topmenu_info_quick_add #timer_selectbox::part(form-control-input), From a4b0a2a1f033ccb377b3e0b9f9d4d669b46f15bf Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 15:20:36 -0600 Subject: [PATCH 18/41] Get country flags showing again --- api/js/etemplate/Et2Select/Et2Select.ts | 2 +- api/js/etemplate/Et2Select/SearchMixin.ts | 4 + .../Et2Select/Select/Et2SelectCountry.ts | 52 +- api/templates/default/css/flags.css | 544 +++++++++--------- 4 files changed, 322 insertions(+), 280 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 0e0e514423..c607dbe7c5 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -808,7 +808,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } return html` v == "")} > diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts index 492ba29f24..73f95f07dc 100644 --- a/api/js/etemplate/Et2Select/SearchMixin.ts +++ b/api/js/etemplate/Et2Select/SearchMixin.ts @@ -687,6 +687,8 @@ export const Et2WithSearchMixin = dedupeMixin( { return; } + this.setAttribute("open", ""); + // Move search (& menu) if there's no value this._activeControls?.classList.toggle("novalue", this.multiple && this.value == '' || !this.multiple); @@ -759,6 +761,8 @@ export const Et2WithSearchMixin = dedupeMixin( { return; } + this.removeAttribute("open"); + this.clearSearch(); // Reset display diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts b/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts index d031d0be9d..4c364c0837 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectCountry.ts @@ -12,6 +12,7 @@ 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 @@ -46,14 +47,51 @@ export class Et2SelectCountry extends Et2StaticSelectMixin(Et2Select) 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); } + + /** + * 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/templates/default/css/flags.css b/api/templates/default/css/flags.css index 1beffdcfa7..8f446929b2 100644 --- a/api/templates/default/css/flags.css +++ b/api/templates/default/css/flags.css @@ -1,15 +1,15 @@ -et2-select-country sl-option::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 From cdd13e5109706bc17d020dc7be342f998510fe55 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 19 Sep 2023 16:04:19 -0600 Subject: [PATCH 19/41] Fix doubled options with freeEntries --- api/js/etemplate/Et2Select/Et2Select.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index c607dbe7c5..eb7b747e97 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -696,7 +696,9 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) protected handleValueChange(e : SlChangeEvent) { const old_value = this.__value; - this.__value = this.select.value; + this.__value = Array.isArray(this.select.value) ? + this.select.value.map(e => e.replaceAll("___", " ")) : + this.select.value.replaceAll("___", " "); this.requestUpdate("value", old_value); } From 5349c7a96642dab9e2a41c1e594f7188d1d242bd Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 20 Sep 2023 08:20:22 -0600 Subject: [PATCH 20/41] Fix selects with no emptyLabel but an option with value="" did not return a value --- api/js/etemplate/Et2Select/Et2Select.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index eb7b747e97..62c8d2cf96 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -377,11 +377,12 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) get value() { // 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 == "")) + 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 == "") + if(!this.multiple && !this.emptyLabel && this.__value == "" && !this.select_options.find(o => o.value == "")) { return null; } From e2d3c5f1e85d15b1a1751d65f5f457f204af07a7 Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 20 Sep 2023 14:24:01 -0600 Subject: [PATCH 21/41] Get some automatic tests working again --- .../Et2InputWidget/test/InputBasicTests.ts | 14 ++- api/js/etemplate/Et2Select/Et2Select.ts | 108 ++++-------------- api/js/etemplate/Et2Select/SearchMixin.ts | 29 +++-- .../Et2Select/test/EditableTag.test.ts | 27 +++-- .../Et2Select/test/Et2EmailTag.test.ts | 28 ++++- .../Et2Select/test/Et2SelectBasic.test.ts | 38 +++--- .../Et2Select/test/Et2SelectOptions.test.ts | 5 +- 7 files changed, 110 insertions(+), 139 deletions(-) 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/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 62c8d2cf96..2430a89fc1 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -14,7 +14,6 @@ import {Et2WidgetWithSelectMixin} from "./Et2WidgetWithSelectMixin"; import {SelectOption} from "./FindSelectOptions"; import shoelace from "../Styles/shoelace"; import {RowLimitedMixin} from "../Layout/RowLimitedMixin"; -import {Et2Tag} from "./Tag/Et2Tag"; import {Et2WithSearchMixin} from "./SearchMixin"; import {property} from "lit/decorators/property.js"; import {SlChangeEvent, SlOption, SlSelect} from "@shoelace-style/shoelace"; @@ -582,61 +581,6 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) return literal`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) - { - console.warn("Deprecated"); - debugger; - 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; - } - blur() { if(typeof super.blur == "function") @@ -727,37 +671,6 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) } - /** - * Get the icon for the select option - * - * @param option - * @protected - */ - protected _iconTemplate(option) - { - if(!option.icon) - { - return html``; - } - - return html` - ` - } - - 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 ""; - } - /** Shows the listbox. */ async show() { @@ -865,6 +778,24 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) `; } + /** + * Get the icon for the select option + * + * @param option + * @protected + */ + protected _iconTemplate(option) + { + if(!option.icon) + { + return html``; + } + + return html` + ` + } + /** * Custom tag @@ -881,7 +812,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { const readonly = (this.readonly || option && typeof (option.disabled) != "undefined" && option.disabled); const isEditable = this.editModeEnabled && !readonly; - const image = this._createImage(option); + const image = this._iconTemplate(option); const tagName = this.tagTag; return html` <${tagName} @@ -900,6 +831,7 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) ?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} > diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts index 73f95f07dc..bf003440e9 100644 --- a/api/js/etemplate/Et2Select/SearchMixin.ts +++ b/api/js/etemplate/Et2Select/SearchMixin.ts @@ -751,8 +751,10 @@ export const Et2WithSearchMixin = dedupeMixin( focus() { - this.show(); - this._searchInputNode.focus(); + this.show().then(() => + { + this._searchInputNode?.focus(); + }); } _handleMenuHide() @@ -1303,20 +1305,16 @@ export const Et2WithSearchMixin = dedupeMixin( } // Make sure not to double-add, but wait until the option is there - this.updateComplete.then(() => + if(this.multiple && this.getValueAsArray().indexOf(text) == -1) { - if(this.multiple && this.getValueAsArray().indexOf(text) == -1) - { - let value = this.getValueAsArray(); - value.push(text); - this.value = value; - } - else if(!this.multiple && this.value !== text) - { - this.value = text; - } - this.requestUpdate("value"); - }); + let value = this.getValueAsArray(); + value.push(text); + this.value = value; + } + else if(!this.multiple && this.value !== text) + { + this.value = text; + } // If we were overlapping edit inputbox with the value display, reset if(!this.readonly && this._activeControls?.classList.contains("novalue")) @@ -1370,7 +1368,6 @@ export const Et2WithSearchMixin = dedupeMixin( { this.value = value; } - this.querySelector("[value='" + original.replace(/'/g, "\\\'") + "']")?.remove(); this.__select_options = this.__select_options.filter(v => v.value !== original); } } diff --git a/api/js/etemplate/Et2Select/test/EditableTag.test.ts b/api/js/etemplate/Et2Select/test/EditableTag.test.ts index 20c649c4fa..c6521e4aac 100644 --- a/api/js/etemplate/Et2Select/test/EditableTag.test.ts +++ b/api/js/etemplate/Et2Select/test/EditableTag.test.ts @@ -13,6 +13,7 @@ window.egw = { }; let element : Et2Select; +const tag_name = "et2-tag"; async function before(editable = true) { @@ -20,16 +21,19 @@ async function before(editable = true) // @ts-ignore element = await fixture(html` - One - Two + + `); + // Need to call loadFromXML() explicitly to read the options + element.loadFromXML(element); + // Stub egw() sinon.stub(element, "egw").returns(window.egw); await element.updateComplete; let tags = []; - element.shadowRoot.querySelectorAll(element.tagTag).forEach((t : Et2Tag) => tags.push(t.updateComplete)); + element.shadowRoot.querySelectorAll(tag_name).forEach((t : Et2Tag) => tags.push(t.updateComplete)); await Promise.all(tags); return element; @@ -48,30 +52,29 @@ describe("Editable tag", () => it("Tag editable matches editModeEnabled", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.isTrue(tag[0].editable); // Change it to false & force immediate update element.editModeEnabled = false; - element.syncItemsFromValue(); element.requestUpdate(); await element.updateComplete; - tag = element.shadowRoot.querySelectorAll(element.tagTag); + tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.isFalse(tag[0].editable); }); it("Has edit button when editable ", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.exists(tag[0].shadowRoot.querySelector("et2-button-icon[label='edit*']"), "No edit button"); }); it("Shows input when edit button is clicked", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag)[0]; + let tag = element.select.combobox.querySelectorAll(tag_name)[0]; let edit_button = tag.shadowRoot.querySelector("et2-button-icon"); edit_button.click(); @@ -81,7 +84,7 @@ describe("Editable tag", () => }); it("Changes value when edited", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag)[0]; + let tag = element.select.combobox.querySelectorAll(tag_name)[0]; tag.isEditing = true; tag.requestUpdate(); await tag.updateComplete; @@ -119,7 +122,7 @@ describe("Editable tag", () => await listener2; assert.equal(tag.value, "change select too"); - // Haven't turned on allow free entries, so no change here + // Have turned on allow free entries, so it should change here assert.equal(element.value, "change select too", "Tag change did not cause value change in parent select (allowFreeEntries was on)"); }); @@ -129,7 +132,7 @@ describe("Editable tag", () => element.readonly = true; await element.updateComplete; - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); let wait = []; @@ -146,7 +149,7 @@ describe("Select is not editable", () => it("Does not have edit button when not editable", async() => { - let tag = element.shadowRoot.querySelectorAll(element.tagTag); + let tag = element.select.combobox.querySelectorAll(tag_name); assert.isAbove(tag.length, 0, "No tags found"); assert.isNull(tag[0].shadowRoot.querySelector("et2-button-icon[label='edit*']"), "Unexpected edit button"); diff --git a/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts b/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts index 8c36db5cfa..77a1af7c3e 100644 --- a/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts +++ b/api/js/etemplate/Et2Select/test/Et2EmailTag.test.ts @@ -9,6 +9,18 @@ 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', () => { @@ -18,7 +30,13 @@ describe('Et2EmailTag', () => { 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', () => @@ -48,7 +66,8 @@ describe('Et2EmailTag', () => it('should open addressbook with email preset on (+) click', () => { - component.egw = () => ({ + window.egw.open = () => + { open: (url, app, mode, extra) => { assert.equal(url, ''); @@ -56,7 +75,7 @@ describe('Et2EmailTag', () => assert.equal(mode, 'add'); assert.equal(extra['presets[email]'], 'test@example.com'); } - }); + }; component.handleMouseDown(new MouseEvent('click')); }); @@ -70,7 +89,8 @@ describe('Et2EmailTag', () => }; component.value = 'test@example.com'; component.checkContact = async(email) => contact; - component.egw = () => ({ + component.egw.open = () => + { open: (id, app, mode, extra) => { assert.equal(id, contact.id); @@ -78,7 +98,7 @@ describe('Et2EmailTag', () => 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 825d072ed2..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"); @@ -64,28 +65,30 @@ describe("Select widget basics", () => { // WIP const blurSpy = sinon.spy(); - element.addEventListener('blur', blurSpy); + element.addEventListener('sl-hide', blurSpy); const showPromise = new Promise(resolve => { element.addEventListener("sl-after-show", resolve); }); const hidePromise = new Promise(resolve => { - element.addEventListener("blur", 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.dropdown?.hasAttribute("open")); + assert.isFalse(element.select?.hasAttribute("open")); }) }); @@ -97,10 +100,11 @@ describe("Multiple", () => // @ts-ignore element = await fixture(html` - One - Two + + `); + element.loadFromXML(element); element.set_value("one,two"); // Stub egw() @@ -111,14 +115,14 @@ describe("Multiple", () => it("Can remove tags", async() => { - assert.equal(element.querySelectorAll("sl-option").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); @@ -138,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 dcfd397319..32b3045e0a 100644 --- a/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts +++ b/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts @@ -1,8 +1,9 @@ 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"; let parser = new window.DOMParser(); @@ -30,7 +31,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 +39,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` `); From 0f66624047eef4e446e5aa96139a9e374f5b6262 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 21 Sep 2023 08:18:09 -0600 Subject: [PATCH 22/41] Get some more automatic tests working again, remove JS files --- .../Et2InputWidget/Et2InputWidget.ts | 4 +- api/js/etemplate/Et2Select/SearchMixin.js | 1181 ----------------- api/js/etemplate/Et2Select/SearchMixin.ts | 2 +- api/js/etemplate/Et2Select/StaticOptions.js | 285 ---- .../Et2Select/test/Et2SelectOptions.test.ts | 8 +- .../Et2Select/test/SearchActions.test.ts | 16 +- 6 files changed, 16 insertions(+), 1480 deletions(-) delete mode 100644 api/js/etemplate/Et2Select/SearchMixin.js delete mode 100644 api/js/etemplate/Et2Select/StaticOptions.js diff --git a/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts b/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts index e1c3013fab..4d97779928 100644 --- a/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts +++ b/api/js/etemplate/Et2InputWidget/Et2InputWidget.ts @@ -489,7 +489,9 @@ const Et2InputWidgetMixin = >(superclass : T) // 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") + 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(); } diff --git a/api/js/etemplate/Et2Select/SearchMixin.js b/api/js/etemplate/Et2Select/SearchMixin.js deleted file mode 100644 index e805332ef6..0000000000 --- a/api/js/etemplate/Et2Select/SearchMixin.js +++ /dev/null @@ -1,1181 +0,0 @@ -/** - * EGroupware eTemplate2 - SearchMixin - * - * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License - * @package api - * @link https://www.egroupware.org - * @author Nathan Gray - */ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -import { css, html, render, SlotMixin } from "@lion/core"; -import { cleanSelectOptions } from "./FindSelectOptions"; -import { Et2Tag } from "./Tag/Et2Tag"; -import { SlMenuItem } from "@shoelace-style/shoelace"; -import { waitForEvent } from "@shoelace-style/shoelace/dist/internal/event"; -import { StaticOptions } from "./StaticOptions"; -// Otherwise import gets stripped -let keep_import; -/** - * Base class for things that do search type behaviour - * Separated to keep things a little simpler. - * - * Currently I assume we're extending an Et2Select, so changes may need to be made for better abstraction - */ -export const Et2WithSearchMixin = (superclass) => { - class Et2WidgetWithSearch extends SlotMixin(superclass) { - constructor(...args) { - super(...args); - // Hold the original option data from earlier search results, since we discard on subsequent search - this._selected_remote = []; - this.search = false; - this.searchUrl = ""; - this.searchOptions = { app: "addressbook" }; - this.allowFreeEntries = false; - this.editModeEnabled = false; - // 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.validators = []; - /** - * Used by Subclassers to add default Validators. - * A email input for instance, always needs the isEmail validator. - * @example - * ```js - * this.defaultValidators.push(new IsDate()); - * ``` - * @type {Validator[]} - */ - this.defaultValidators = []; - this.handleMenuSelect = this.handleMenuSelect.bind(this); - this._handleChange = this._handleChange.bind(this); - this.handleTagEdit = this.handleTagEdit.bind(this); - this._handleAfterShow = this._handleAfterShow.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._handleSearchChange = this._handleSearchChange.bind(this); - this._handleSearchKeyDown = this._handleSearchKeyDown.bind(this); - this._handleEditKeyDown = this._handleEditKeyDown.bind(this); - this._handlePaste = this._handlePaste.bind(this); - } - static get properties() { - return Object.assign(Object.assign({}, super.properties), { search: { type: Boolean, reflect: true }, searchUrl: { type: String }, - /** - * Allow custom entries that are not in the options - */ - allowFreeEntries: { type: Boolean, reflect: true }, - /** - * Additional search parameters that are passed to the server - * when we query searchUrl - */ - searchOptions: { type: Object }, - /** - * Allow editing tags by clicking on them. - * allowFreeEntries must be true - */ - editModeEnabled: { type: Boolean } }); - } - static get styles() { - 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; - } - .search_input.editing #search { - display: none; - } - .search_input.editing #edit { - display: initial; - } - :host([search]:not([multiple])) .select--open .select__prefix { - flex: 2 1 auto; - 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 { - display: none; - } - - /* Search textbox general styling, starts hidden */ - - .select__prefix ::slotted(.search_input), .search_input { - display: none; - flex: 1 1 auto; - margin-left: 0px; - width: 100%; - height: var(--sl-input-height-medium); - position: absolute; - background-color: white; - z-index: var(--sl-z-index-dropdown); - } - - /* Search UI active - show textbox & stuff */ - - ::slotted(.search_input.active), .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 { - top: 0px; - } - - /* Hide options that do not match current search text */ - ::slotted(.no-match) { - display: none; - } - /* Different cursor for editable tags */ - :host([allowfreeentries]):not([readonly]) .search_tag::part(base) { - cursor: text; - } - - /** Readonly **/ - /* No border */ - :host([readonly]) .form-control-input { - border: none; - } - /* disable focus border */ - :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; - } - ` - ]; - } - connectedCallback() { - super.connectedCallback(); - this.classList.toggle("search", this.searchEnabled); - // Missing any of the required attributes? Don't change anything. - // If readonly, skip it - if (!this.searchEnabled && !this.editModeEnabled && !this.allowFreeEntries || this.readonly) { - return; - } - this._addNodes(); - this._bindListeners(); - } - disconnectedCallback() { - super.disconnectedCallback(); - this._unbindListeners(); - } - willUpdate(changedProperties) { - super.willUpdate(changedProperties); - // Turn on search if there's more than 20 options - if (changedProperties.has("select_options") && this.select_options.length > 20) { - this.search = true; - } - // If searchURL is set, turn on search - if (changedProperties.has("searchUrl") && this.searchUrl) { - this.search = true; - // Decode URL, possibly again. If set in template, it can wind up double-encoded. - this.searchUrl = this.egw().decodePath(this.searchUrl); - } - // Add missing options if search or free entries enabled - if (changedProperties.has("value") && this.value) { - // Overridden to add options if allowFreeEntries=true - if (this.allowFreeEntries && typeof this.value == "string" && !this.select_options.find(o => o.value == this.value && - (!o.class || o.class && !o.class.includes('remote')))) { - this.createFreeEntry(this.value); - } - else if (this.allowFreeEntries && this.multiple) { - this.value.forEach((e) => { - if (!this.select_options.find(o => o.value == e)) { - this.createFreeEntry(e); - } - }); - } - if (this.searchEnabled) { - // Check to see if value is for an option we do not have - for (const newValueElement of this.getValueAsArray()) { - if (this.select_options.some(o => o.value == newValueElement)) { - continue; - } - this._missingOption(newValueElement); - } - } - } - } - update(changedProperties) { - var _a; - super.update(changedProperties); - // One of the key properties has changed, need to add the needed nodes - if (changedProperties.has("search") || changedProperties.has("editModeEnabled") || changedProperties.has("allowFreeEntries")) { - // Missing any of the required attributes? Now we need to take it out. - if (!this.searchEnabled && !this.editModeEnabled && !this.allowFreeEntries || this.readonly) { - (_a = this.querySelector(".search_input")) === null || _a === void 0 ? void 0 : _a.remove(); - return; - } - // Normally this should be handled in render(), but we have to add our nodes in - this._addNodes(); - } - // Update any tags if edit mode changes - if (changedProperties.has("editModeEnabled") || changedProperties.has("readonly")) { - // Required because we explicitly create tags instead of doing it in render() - this.shadowRoot.querySelectorAll(".select__tags > *").forEach((tag) => { - tag.editable = this.editModeEnabled && !this.readonly; - tag.removable = !this.readonly; - }); - } - } - /** - * Add the nodes we need to search - adjust parent shadowDOM - * - * @protected - */ - _addNodes() { - if (this._activeControls) { - // Already there - return; - } - 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); - }); - } - /** - * Customise how tags are rendered. - * Override to add edit - * - * @param item - * @protected - */ - _createTagNode(item) { - let tag = document.createElement(this.tagTag); - tag.editable = this.editModeEnabled && !this.readonly; - return tag; - } - _searchInputTemplate() { - let edit = null; - if (this.editModeEnabled) { - edit = html ` e.stopPropagation()} - @blur=${this.stopEdit.bind(this)} - />`; - } - // I can't figure out how to get this full width via CSS - return html ` - - ${edit} - `; - } - _noResultsTemplate() { - return html ` -
${this.egw().lang("no suggestions")}
`; - } - /** - * Do we have the needed properties set, so we can actually do searching - * - * @returns {boolean} - */ - get searchEnabled() { - return !this.readonly && (this.search || this.searchUrl.length > 0); - } - get _searchInputNode() { - var _a; - return (_a = this._activeControls) === null || _a === void 0 ? void 0 : _a.querySelector("#search"); - } - get _editInputNode() { - var _a; - return (_a = this._activeControls) === null || _a === void 0 ? void 0 : _a.querySelector("input#edit"); - } - get _activeControls() { - var _a; - return ((_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(".search_input")) || - this.querySelector(".search_input"); - } - /** - * Only local options, excludes server options - * - * @protected - */ - get localItems() { - return this.querySelectorAll(this.optionTag + ":not(.remote)"); - } - /** - * Only remote options from search results - * @returns {NodeList} - * @protected - */ - get remoteItems() { - return this.querySelectorAll(this.optionTag + ".remote"); - } - /** - * Only free entries - * @returns {NodeList} - * @protected - */ - get freeEntries() { - return this.querySelectorAll(this.optionTag + ".freeEntry"); - } - get select_options() { - let options = []; - // Any provided options - options = options.concat(this.__select_options); - // Any kept remote options - options = options.concat(this._selected_remote); - if (this.allowFreeEntries) { - this.freeEntries.forEach((item) => { - if (!options.some(i => i.value == item.value)) { - options.push({ value: item.value, label: item.textContent, class: item.classList.toString() }); - } - }); - } - return options; - } - set select_options(options) { - var _a; - super.select_options = options; - // Remove any selected remote, they're real options now - for (let remote_index = this._selected_remote.length - 1; remote_index >= 0; remote_index--) { - let remote = this._selected_remote[remote_index]; - if (options.findIndex(o => o.value == remote.value) != -1) { - this._selected_remote.splice(remote_index, 1); - (_a = this.querySelector('[value="' + remote.value + '"]')) === null || _a === void 0 ? void 0 : _a.classList.remove("remote"); - } - } - } - get value() { - return super.value; - } - set value(new_value) { - super.value = new_value; - if (!new_value || !this.allowFreeEntries && !this.searchUrl) { - return; - } - } - /** - * Some [part of a] value is missing from the available options, but should be there, so find and add it. - * - * This is used when not all options are sent to the client (search, link list). Ideally we want to send - * the options for the current value, but sometimes this is not the best option so here we search or create - * the option as needed. These are not free entries, but need to match some list somewhere. - * - * @param {string} newValueElement - * @protected - */ - _missingOption(newValueElement) { - // Given a value we need to search for - this will add in all matches, including the one needed - this.remoteSearch(newValueElement, this.searchOptions).then((result) => { - const option = result.find(o => o.value == newValueElement); - if (option) { - this._selected_remote.push(option); - } - }); - } - fix_bad_value() { - if (!this.allowFreeEntries && !this.searchEnabled) { - // Let regular select deal with it - return false; - } - 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) { - return false; - } - return true; - // TODO? Should we check the server, or just be OK with it? Passing the "current" value in sel_options makes sure the value is there - } - _bindListeners() { - this.addEventListener("sl-clear", this._handleClear); - this.addEventListener("sl-after-show", this._handleAfterShow); - // Need our own change to catch the change event from search input - this.addEventListener("change", this._handleChange); - if (this.allowFreeEntries) { - this.addEventListener("paste", this._handlePaste); - } - this.updateComplete.then(() => { - var _a, _b; - // Search messes up event order. Since it throws its own bubbling change event, - // selecting an option fires 2 change events - 1 before the widget is finished adjusting, losing the value - // We catch all change events, then call this._oldChange only when value changes - this.removeEventListener("change", this._oldChange); - (_a = this._searchInputNode) === null || _a === void 0 ? void 0 : _a.removeEventListener("change", this._searchInputNode.handleChange); - (_b = this._searchInputNode) === null || _b === void 0 ? void 0 : _b.addEventListener("change", this._handleSearchChange); - this.dropdown.querySelector('.select__label').addEventListener("change", this.handleTagEdit); - }); - } - _unbindListeners() { - var _a; - this.removeEventListener("sl-select", this._handleSelect); - this.removeEventListener("sl-after-show", this._handleAfterShow); - this.removeEventListener("sl-clear", this._handleClear); - this.removeEventListener("change", this._handleChange); - this.removeEventListener("paste", this._handlePaste); - (_a = this._searchInputNode) === null || _a === void 0 ? void 0 : _a.removeEventListener("change", this._handleSearchChange); - } - handleMenuShow() { - var _a, _b; - if (this.readonly) { - return; - } - // Move search (& menu) if there's no value - (_a = this._activeControls) === null || _a === void 0 ? void 0 : _a.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(); - if (this.searchEnabled || this.allowFreeEntries) { - (_b = this._activeControls) === null || _b === void 0 ? void 0 : _b.classList.add("active"); - this._searchInputNode.focus(); - this._searchInputNode.select(); - // Hide edit explicitly since it's so hard via CSS - if (this._editInputNode) { - this._editInputNode.style.display = "none"; - } - } - if (this.editModeEnabled && this.allowFreeEntries && !this.multiple && this.value) { - this.startEdit(); - this._editInputNode.select(); - // Hide search explicitly since it's so hard via CSS - this._searchInputNode.style.display = "none"; - } - } - /** - * Reposition the dropdown to allow space for current value and search. If the dropdown was positioned above - * instead of below, we don't need the extra space - remove it. - */ - _handleAfterShow() { - // 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 - window.setTimeout(() => { - var _a, _b, _c, _d, _e; - if (((_a = this.dropdown) === null || _a === void 0 ? void 0 : _a.getAttribute("distance")) && ((_c = (_b = this.dropdown) === null || _b === void 0 ? void 0 : _b.popup) === null || _c === void 0 ? void 0 : _c.dataset.currentPlacement) == "top") { - this.dropdown.setAttribute("distance", 0); - this.dropdown.reposition(); - } - else { - (_d = this.dropdown) === null || _d === void 0 ? void 0 : _d.setAttribute("distance", !this._activeControls || ((_e = this._activeControls) === null || _e === void 0 ? void 0 : _e.classList.contains("novalue")) ? - parseInt(getComputedStyle(this.control).getPropertyValue("border-width")) : - // Make room for search below - parseInt(getComputedStyle(this._activeControls).getPropertyValue("--sl-input-height-medium"))); - } - }, 100); - } - focus() { - var _a; - (_a = this.dropdown) === null || _a === void 0 ? void 0 : _a.show().then(() => { - this._searchInputNode.focus(); - }); - } - handleMenuHide() { - var _a; - if (this.readonly) { - return; - } - clearTimeout(this._searchTimeout); - super.handleMenuHide(); - // Reset display - if (this._searchInputNode) { - this._searchInputNode.style.display = ""; - } - if (this._editInputNode) { - this._editInputNode.style.display = ""; - } - if (this.searchEnabled || this.allowFreeEntries) { - (_a = this._activeControls) === null || _a === void 0 ? void 0 : _a.classList.remove("active"); - this.shadowRoot.querySelector('.select__label').style.display = ""; - } - } - _triggerChange(event) { - // Don't want searchbox events to trigger change event - if (event.target == this._searchInputNode) { - event.stopImmediatePropagation(); - event.preventDefault(); - return false; - } - return true; - } - _handleChange(event) { - if (event.target == this._searchInputNode) { - event.stopImmediatePropagation(); - event.preventDefault(); - return false; - } - return this._oldChange(event); - } - _handleDoubleClick(event) { - // No edit (shouldn't happen...) - if (!this.editModeEnabled) { - return; - } - // Find the tag - const path = event.composedPath(); - const tag = path.find((el) => el instanceof Et2Tag); - this.dropdown.hide(); - this.updateComplete.then(() => { - tag.startEdit(event); - }); - } - /** - * An option was selected - */ - handleMenuSelect(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)) { - this._selected_remote.push(Object.assign({}, event.detail.item.option)); - } - super.handleMenuSelect(event); - this.updateComplete.then(() => { - // If they just chose one from the list, re-focus the search - if (this.multiple && this.searchEnabled) { - 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) { - // Stop all the search stuff when they select an option - // this shows all non-matching options again - this._handleSearchAbort(event); - } - }); - } - /** - * Value was cleared - */ - _handleClear(e) { - // Only keep remote options that are still used - this._selected_remote = this._selected_remote.filter((option) => this.getValueAsArray().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()); - } - } - /** - * Handle blur from search field - * - * Either the user changed fields, or selected an option. For selecting don't interfere, but for - * changing fields we need to make sure the menu is hidden. - * - * @param event - */ - _handleSearchBlur(event) { - return __awaiter(this, void 0, void 0, function* () { - 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(); - }); - } - /** - * Handle keypresses inside the search input - * @param {KeyboardEvent} event - * @protected - */ - _handleSearchKeyDown(event) { - var _a; - clearTimeout(this._searchTimeout); - (_a = this._activeControls) === null || _a === void 0 ? void 0 : _a.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); - } - event.stopPropagation(); - // Don't allow event to bubble or it will interact with select - event.stopImmediatePropagation(); - if (Et2WidgetWithSearch.TAG_BREAK.indexOf(event.key) !== -1 && this.allowFreeEntries && this.createFreeEntry(this._searchInputNode.value)) { - event.preventDefault(); - this._searchInputNode.value = ""; - this.dropdown.hide().then(() => __awaiter(this, void 0, void 0, function* () { - // update sizing / position before getting ready for another one - if (this.multiple) { - yield this.dropdown.show(); - this._searchInputNode.focus(); - } - })); - } - else if (event.key == "Enter") { - event.preventDefault(); - this.startSearch(); - return; - } - else if (event.key == "Escape") { - this._handleSearchAbort(event); - this.dropdown.hide(); - return; - } - // Start the search automatically if they have enough letters - // -1 because we're in keyDown handler, and value is from _before_ this key was pressed - if (this._searchInputNode.value.length >= Et2WidgetWithSearch.MIN_CHARS - 1) { - this._searchTimeout = window.setTimeout(() => { this.startSearch(); }, Et2WidgetWithSearch.SEARCH_TIMEOUT); - } - } - _handleEditKeyDown(event) { - // Stop propagation, or parent key handler will add again - event.stopImmediatePropagation(); - if (Et2WidgetWithSearch.TAG_BREAK.indexOf(event.key) !== -1 && this.allowFreeEntries) { - // Prevent default, since that would try to submit - event.preventDefault(); - this.stopEdit(); - } - // Abort edit, put original value back - else if (event.key == "Escape") { - this.stopEdit(true); - } - } - /** - * Sometimes users paste multiple comma separated values at once. Split them then handle normally. - * - * @param {ClipboardEvent} event - * @protected - */ - _handlePaste(event) { - event.preventDefault(); - let paste = event.clipboardData.getData('text'); - if (!paste) { - return; - } - const selection = window.getSelection(); - if (selection.rangeCount) { - selection.deleteFromDocument(); - } - let values = paste.split(/,\t/); - values.forEach(v => { - this.createFreeEntry(v.trim()); - }); - this.dropdown.hide(); - } - /** - * Start searching - * - * If we have local options, we'll search & display any matches. - * If serverUrl is set, we'll ask the server for results as well. - */ - startSearch() { - return __awaiter(this, void 0, void 0, function* () { - // Stop timeout timer - clearTimeout(this._searchTimeout); - // Show a spinner - let spinner = document.createElement("sl-spinner"); - spinner.slot = "suffix"; - this.appendChild(spinner); - // Hide clear button - let clear_button = this._searchInputNode.shadowRoot.querySelector(".input__clear"); - if (clear_button) { - clear_button.style.display = "none"; - } - // Clear previous results - this._clearResults(); - yield this.updateComplete; - // Start the searches - return Promise.all([ - this.localSearch(this._searchInputNode.value, this.searchOptions), - this.remoteSearch(this._searchInputNode.value, this.searchOptions) - ]).then(() => { - // 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]); - } - // Remove spinner - spinner.remove(); - // Restore clear button - if (clear_button) { - 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(); - }); - }); - } - /** - * Clear search term and any search results - * - * Local options are not removed, but remote options are - */ - clearSearch() { - // Stop timeout timer - clearTimeout(this._searchTimeout); - this._clearResults(); - // Clear search term - if (this._searchInputNode) { - this._searchInputNode.value = ""; - } - } - _clearResults() { - var _a; - let target = this._optionTargetNode || this; - // Remove "no suggestions" - (_a = target.querySelector(".no-results")) === null || _a === void 0 ? void 0 : _a.remove(); - // Remove any previously selected remote options that aren't used anymore - this._selected_remote = this._selected_remote.filter((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) { - n.remove(); - } - }); - // Reset remaining options. It might be faster to re-create instead. - this._menuItems.forEach((item) => { - var _a; - item.disabled = ((_a = item.option) === null || _a === void 0 ? void 0 : _a.disabled) || false; - item.classList.remove("match"); - item.classList.remove("no-match"); - }); - } - /** - * Filter the local options - * - * @param {string} search - * @protected - */ - localSearch(search, options) { - return new Promise((resolve) => { - this.localItems.forEach((item) => { - 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); - }); - resolve(); - }); - } - /** - * Ask for remote options and add them in unconditionally - * @param {string} search - * @protected - */ - remoteSearch(search, options) { - if (!this.searchUrl) { - return Promise.resolve([]); - } - // Check our URL: JSON file or URL? - if (this.searchUrl.includes(".json")) { - // Get the file, search it - return this.jsonQuery(search, options); - } - else { - // Fire off the query to the server - return this.remoteQuery(search, options); - } - } - /** - * Search through a JSON file in the browser - * - * @param {string} search - * @param {object} options - * @protected - */ - jsonQuery(search, options) { - // Get the file - const controller = new AbortController(); - const signal = controller.signal; - let response_ok = false; - return StaticOptions.cached_from_file(this, this.searchUrl) - .then(options => { - // Filter the options - const lower_search = search.toLowerCase(); - const filtered = options.filter(option => { - return option.label.toLowerCase().includes(lower_search) || option.value.includes(search); - }); - // Limit results - const totalCount = filtered.length; - if (filtered.length > Et2WidgetWithSearch.RESULT_LIMIT) { - filtered.splice(Et2WidgetWithSearch.RESULT_LIMIT); - } - // Add the matches - this.processRemoteResults(filtered, totalCount); - return filtered; - }) - .catch((_err) => { - this.egw().message(_err.statusText || this.searchUrl, "error"); - return []; - }); - } - /** - * Actually query the server. - * - * This can be overridden to change request parameters or eg. send them as POST parameters. - * - * Default implementation here sends search string and options: - * - as two parameters to the AJAX function - * - and (additional) as GET parameters plus search string as "query" - * - * This is done to support as well the old taglist callbacks, as the regular select ones! - * - * @param {string} search - * @param {object} options - * @returns {any} - * @protected - */ - remoteQuery(search, options) { - // Include a limit, even if options don't, to avoid massive lists breaking the UI - let sendOptions = Object.assign({ num_rows: Et2WidgetWithSearch.RESULT_LIMIT }, options); - return this.egw().request(this.egw().link(this.egw().ajaxUrl(this.egw().decodePath(this.searchUrl)), Object.assign({ 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 - let total = null; - if (typeof results.total !== "undefined") { - total = results.total; - delete results.total; - } - let entries = cleanSelectOptions(results); - this.processRemoteResults(entries, total); - return entries; - }); - } - /** - * Add in remote results - * @param results - * @param totalResults If there are more results than were returned, total number of matches - * @protected - */ - processRemoteResults(entries, totalResults = 0) { - if (!(entries === null || entries === void 0 ? void 0 : entries.length)) { - return Promise.resolve(); - } - // Add a "remote" class so we can tell these apart from any local results - entries.forEach((entry) => entry.class = (entry.class || "") + " remote"); - let target = this._optionTargetNode || this; - if (target) { - // Add in remote options, avoiding duplicates - this.select_options.filter(function (item) { - let i = entries.findIndex(x => (x.value == item.value)); - if (i <= -1) { - entries.push(item); - } - return null; - }); - let options = html `${entries.map(this._optionTemplate.bind(this))}`; - /** - * 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"); - let resultCount = entries.length; - render(options, temp_target); - return Promise.all(([...temp_target.querySelectorAll(":scope > *")].map(item => item.render))) - .then(() => { - 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); - } - }); - } - } - /** - * Check if one of our [local] items matches the search - * - * @param search - * @param item - * @returns {boolean} - * @protected - */ - searchMatch(search, item) { - var _a; - if (!item || !item.value) { - return false; - } - if ((_a = item.textContent) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(search.toLowerCase())) { - return true; - } - if (typeof item.value == "string") { - return item.value.includes(search.toLowerCase()); - } - return item.value == search; - } - /** - * Create an entry that is not in the options and add it to the value - * - * @param {string} text Used as both value and label - */ - createFreeEntry(text) { - var _a; - if (!text || !this.validateFreeEntry(text)) { - return false; - } - // Make sure not to double-add - if (!this.querySelector("[value='" + text.replace(/'/g, "\\\'") + "']") && !this.__select_options.find(o => o.value == text)) { - this.__select_options.push({ - value: text.trim(), - label: text.trim(), - class: "freeEntry" - }); - this.requestUpdate('select_options'); - } - // Make sure not to double-add - if (this.multiple && this.value.indexOf(text) == -1) { - this.value.push(text); - } - else if (!this.multiple && this.value !== text) { - this.value = text; - } - this.requestUpdate("value"); - // If we were overlapping edit inputbox with the value display, reset - if (!this.readonly && ((_a = this._activeControls) === null || _a === void 0 ? void 0 : _a.classList.contains("novalue"))) { - this._searchInputNode.style.display = ""; - } - return true; - } - /** - * Check if a free entry value is acceptable. - * We use validators directly using the proposed value - * - * @param text - * @returns {boolean} - */ - validateFreeEntry(text) { - let validators = [...this.validators, ...this.defaultValidators]; - let result = validators.filter(v => v.execute(text, v.param, { node: this })); - return validators.length > 0 && result.length == 0 || validators.length == 0; - } - handleTagEdit(event) { - var _a; - let value = event.target.value; - let original = event.target.dataset.original_value; - if (!value || !this.allowFreeEntries || !this.validateFreeEntry(value)) { - // Not a good value, reset it. - event.target.variant = "danger"; - return false; - } - event.target.variant = "success"; - // Add to internal list - this.createFreeEntry(value); - // Remove original from value & DOM - if (value != original) { - if (this.multiple) { - this.value = this.value.filter(v => v !== original); - } - else { - this.value = value; - } - (_a = this.querySelector("[value='" + original.replace(/'/g, "\\\'") + "']")) === null || _a === void 0 ? void 0 : _a.remove(); - this.__select_options = this.__select_options.filter(v => v.value !== original); - } - } - /** - * Start editing the current value if multiple=false - * - * @param {Et2Tag} tag - */ - startEdit(tag) { - const tag_value = tag ? tag.value : this.value; - // hide the menu - this.dropdown.hide(); - waitForEvent(this, "sl-after-hide").then(() => { - // Turn on edit UI - this._activeControls.classList.add("editing", "active"); - // Pre-set value to tag value - this._editInputNode.style.display = ""; - this._editInputNode.value = tag_value; - this._editInputNode.focus(); - // If they abort the edit, they'll want the original back. - this._editInputNode.dataset.initial = tag_value; - }); - } - stopEdit(abort = false) { - var _a, _b; - // 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 (((_a = abort.relatedTarget) === null || _a === void 0 ? void 0 : _a.localName) == "sl-menu-item") { - return; - } - // Edit lost focus, accept changes - abort = false; - } - const original = this._editInputNode.dataset.initial; - delete this._editInputNode.dataset.initial; - let value = abort ? original : this._editInputNode.value; - this._editInputNode.value = ""; - if (value && value != original) { - this.createFreeEntry(value); - this.updateComplete.then(() => { - const item = this.querySelector("[value='" + value.replace(/'/g, "\\\'") + "']"); - item.dispatchEvent(new CustomEvent("sl-select", { detail: { item } })); - }); - } - // Remove original from value & DOM - if (value != original) { - if (this.multiple) { - this.value = this.value.filter(v => v !== original); - (_b = this.querySelector("[value='" + original.replace(/'/g, "\\\'") + "']")) === null || _b === void 0 ? void 0 : _b.remove(); - } - else { - this.value = value; - } - this.select_options = this.select_options.filter(v => v.value !== original); - } - this._activeControls.classList.remove("editing", "active"); - if (!this.multiple) { - this.updateComplete.then(() => __awaiter(this, void 0, void 0, function* () { - // Don't know why, but this doesn't always work leaving the value hidden by prefix - yield this.dropdown.hide(); - this.dropdown.classList.remove("select--open"); - this.dropdown.panel.setAttribute("hidden", ""); - })); - } - this.syncItemsFromValue(); - } - _handleSearchAbort(e) { - this._activeControls.classList.remove("active"); - this.clearSearch(); - this.syncItemsFromValue(); - } - /** - * et2-searchbox (SlInput) sends out an event on change. - * We don't care, and if we let it bubble it'll get in the way. - * @param e - * @protected - */ - _handleSearchChange(e) { - e.stopImmediatePropagation(); - e.preventDefault(); - return false; - } - } - /** - * When user is typing, we wait this long for them to be finished before we start the search - * @type {number} - * @protected - */ - Et2WidgetWithSearch.SEARCH_TIMEOUT = 500; - /** - * We need at least this many characters before we start the search - * - * @type {number} - * @protected - */ - Et2WidgetWithSearch.MIN_CHARS = 2; - /** - * Limit server searches to 100 results, matches Link::DEFAULT_NUM_ROWS - * @type {number} - */ - Et2WidgetWithSearch.RESULT_LIMIT = 100; - /** - * These characters will end a free tag - * @type {string[]} - */ - Et2WidgetWithSearch.TAG_BREAK = ["Tab", "Enter", ","]; - return Et2WidgetWithSearch; -}; -//# sourceMappingURL=SearchMixin.js.map \ No newline at end of file diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts index bf003440e9..327ebcef45 100644 --- a/api/js/etemplate/Et2Select/SearchMixin.ts +++ b/api/js/etemplate/Et2Select/SearchMixin.ts @@ -945,7 +945,7 @@ export const Et2WithSearchMixin = dedupeMixin( else if(event.key == "Escape") { this._handleSearchAbort(event); - this.dropdown.hide(); + this.hide(); return; } diff --git a/api/js/etemplate/Et2Select/StaticOptions.js b/api/js/etemplate/Et2Select/StaticOptions.js deleted file mode 100644 index fa371e0a0e..0000000000 --- a/api/js/etemplate/Et2Select/StaticOptions.js +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Some static options, no need to transfer them over and over. - * We still need the same thing on the server side to validate, so they - * have to match. See Etemplate\Widget\Select::typeOptions() - * The type specific legacy options wind up in attrs.other, but should be explicitly - * defined and set. - * - * @param {type} widget - */ -import { sprintf } from "../../egw_action/egw_action_common"; -import { cleanSelectOptions, find_select_options } from "./FindSelectOptions"; -/** - * Base class for things that have static options - * - * We keep static options separate and concatenate them in to allow for extra options without - * overwriting them when we get static options from the server - */ -export const Et2StaticSelectMixin = (superclass) => { - class Et2StaticSelectOptions extends (superclass) { - constructor(...args) { - super(...args); - this.static_options = []; - this.fetchComplete = Promise.resolve(); - // Trigger the options to get rendered into the DOM - this.requestUpdate("select_options"); - } - get select_options() { - // @ts-ignore - const options = super.select_options || []; - // make sure result is unique - return [...new Map([...(this.static_options || []), ...options].map(item => [item.value, item])).values()]; - } - set select_options(new_options) { - // @ts-ignore IDE doesn't recognise property - super.select_options = new_options; - } - set_static_options(new_static_options) { - this.static_options = new_static_options; - this.requestUpdate("select_options"); - } - /** - * Override the parent fix_bad_value() to wait for server-side options - * to come back before we check to see if the value is not there. - */ - fix_bad_value() { - this.fetchComplete.then(() => { - // @ts-ignore Doesn't know it's an Et2Select - if (typeof super.fix_bad_value == "function") { - // @ts-ignore Doesn't know it's an Et2Select - super.fix_bad_value(); - } - }); - } - } - return Et2StaticSelectOptions; -}; -/** - * Some options change, or are too complicated to have twice, so we get the - * options from the server once, then keep them to use if they're needed again. - * We use the options string to keep the different possibilities (eg. categories - * for different apps) separate. - * - * @param {et2_selectbox} widget Selectbox we're looking at - * @param {string} options_string - * @param {Object} attrs Widget attributes (not yet fully set) - * @param {boolean} return_promise true: always return a promise - * @returns {Object[]|Promise} Array of options, or empty and they'll get filled in later, or Promise - */ -export const StaticOptions = new class StaticOptionsType { - cached_server_side(widget, type, options_string, return_promise) { - // normalize options by removing trailing commas - options_string = options_string.replace(/,+$/, ''); - const cache_id = widget.nodeName + '_' + options_string; - const cache_owner = widget.egw().getCache('Et2Select'); - let cache = cache_owner[cache_id]; - if (typeof cache === 'undefined') { - // Fetch with json instead of jsonq because there may be more than - // one widget listening for the response by the time it gets back, - // and we can't do that when it's queued. - const req = widget.egw().json('EGroupware\\Api\\Etemplate\\Widget\\Select::ajax_get_options', [type, options_string, widget.value]).sendRequest(); - if (typeof cache === 'undefined') { - cache_owner[cache_id] = req; - } - cache = req; - } - if (typeof cache.then === 'function') { - // pending, wait for it - const promise = cache.then((response) => { - cache = cache_owner[cache_id] = response.response[0].data || undefined; - if (return_promise) - return cache; - // Set select_options in attributes in case we get a response before - // the widget is finished loading (otherwise it will re-set to {}) - //widget.select_options = cache; - // Avoid errors if widget is destroyed before the timeout - if (widget && typeof widget.id !== 'undefined') { - if (typeof widget.set_static_options == "function") { - widget.set_static_options(cache); - } - else if (typeof widget.set_select_options == "function") { - widget.set_select_options(find_select_options(widget, {}, cache)); - } - } - }); - return return_promise ? promise : []; - } - else { - // Check that the value is in there - // Make sure we are not requesting server for an empty value option or - // other widgets but select-timezone as server won't find anything and - // it will fall into an infinitive loop, e.g. select-cat widget. - if (widget.value && widget.value != "" && widget.value != "0" && type == "select-timezone") { - var missing_option = true; - for (var i = 0; i < cache.length && missing_option; i++) { - if (cache[i].value == widget.value) { - missing_option = false; - } - } - // Try again - ask the server with the current value this time - if (missing_option) { - delete cache_owner[cache_id]; - return this.cached_server_side(widget, type, options_string); - } - else { - if (widget.value && widget && widget.get_value() !== widget.value) { - egw.window.setTimeout(function () { - // Avoid errors if widget is destroyed before the timeout - if (this.widget && typeof this.widget.id !== 'undefined') { - this.widget.set_value(this.widget.options.value); - } - }.bind({ widget: widget }), 1); - } - } - } - return return_promise ? Promise.resolve(cache) : cache; - } - } - cached_from_file(widget, file) { - const cache_owner = widget.egw().getCache('Et2Select'); - let cache = cache_owner[file]; - if (typeof cache === 'undefined') { - cache_owner[file] = cache = widget.egw().window.fetch(file) - .then((response) => { - // Get the options - if (!response.ok) { - throw response; - } - return response.json(); - }) - .then(options => { - var _a; - // Need to clean the options because file may be key=>value, may have option list, may be mixed - cache_owner[file] = (_a = cleanSelectOptions(options)) !== null && _a !== void 0 ? _a : []; - return cache_owner[file]; - }); - } - else if (cache && typeof cache.then === "undefined") { - return Promise.resolve(cache); - } - return cache; - } - priority(widget) { - return [ - { value: "1", label: 'low' }, - { value: "2", label: 'normal' }, - { value: "3", label: 'high' }, - { value: "0", label: 'undefined' } - ]; - } - bool(widget) { - return [ - { value: "0", label: 'no' }, - { value: "1", label: 'yes' } - ]; - } - month(widget) { - return [ - { value: "1", label: 'January' }, - { value: "2", label: 'February' }, - { value: "3", label: 'March' }, - { value: "4", label: 'April' }, - { value: "5", label: 'May' }, - { value: "6", label: 'June' }, - { value: "7", label: 'July' }, - { value: "8", label: 'August' }, - { value: "9", label: 'September' }, - { value: "10", label: 'October' }, - { value: "11", label: 'November' }, - { value: "12", label: 'December' } - ]; - } - number(widget, attrs = { - min: undefined, - max: undefined, - interval: undefined, - format: undefined - }) { - var _a, _b, _c, _d; - var options = []; - var min = (_a = attrs.min) !== null && _a !== void 0 ? _a : parseFloat(widget.min); - var max = (_b = attrs.max) !== null && _b !== void 0 ? _b : parseFloat(widget.max); - var interval = (_c = attrs.interval) !== null && _c !== void 0 ? _c : parseFloat(widget.interval); - var format = (_d = attrs.format) !== null && _d !== void 0 ? _d : '%d'; - // leading zero specified in interval - if (widget.leading_zero && widget.leading_zero[0] == '0') { - format = '%0' + ('' + interval).length + 'd'; - } - // Suffix - if (widget.suffix) { - format += widget.egw().lang(widget.suffix); - } - // Avoid infinite loop if interval is the wrong direction - if ((min <= max) != (interval > 0)) { - interval = -interval; - } - for (var i = 0, n = min; n <= max && i <= 100; n += interval, ++i) { - options.push({ value: "" + n, label: sprintf(format, n) }); - } - return options; - } - percent(widget) { - return this.number(widget); - } - year(widget, attrs) { - if (typeof attrs != 'object') { - attrs = {}; - } - var t = new Date(); - attrs.min = t.getFullYear() + parseInt(widget.min); - attrs.max = t.getFullYear() + parseInt(widget.max); - return this.number(widget, attrs); - } - day(widget, attrs) { - attrs.other = [1, 31, 1]; - return this.number(widget, attrs); - } - hour(widget, attrs) { - var options = []; - var timeformat = widget.egw().preference('common', 'timeformat'); - for (var h = 0; h <= 23; ++h) { - options.push({ - value: h, - label: timeformat == 12 ? - ((12 ? h % 12 : 12) + ' ' + (h < 12 ? egw.lang('am') : egw.lang('pm'))) : - sprintf('%02d', h) - }); - } - return options; - } - app(widget, attrs) { - var options = ',' + (attrs.other || []).join(','); - return this.cached_server_side(widget, 'select-app', options); - } - cat(widget) { - var options = [widget.globalCategories, /*?*/ , widget.application, widget.parentCat]; - if (typeof options[3] == 'undefined') { - options[3] = widget.application || - // When the widget is first created, it doesn't have a parent and can't find it's instanceManager - (widget.getInstanceManager() && widget.getInstanceManager().app) || - widget.egw().app_name(); - } - return this.cached_server_side(widget, 'select-cat', options.join(','), true); - } - country(widget, attrs, return_promise) { - var options = ','; - return this.cached_server_side(widget, 'select-country', options, return_promise); - } - state(widget, attrs) { - var options = attrs.country_code ? attrs.country_code : 'de'; - return this.cached_server_side(widget, 'select-state', options); - } - dow(widget, attrs) { - var options = (widget.rows || "") + ',' + (attrs.other || []).join(','); - return this.cached_server_side(widget, 'select-dow', options, true); - } - lang(widget, attrs) { - var options = ',' + (attrs.other || []).join(','); - return this.cached_server_side(widget, 'select-lang', options); - } - timezone(widget, attrs) { - var options = ',' + (attrs.other || []).join(','); - return this.cached_server_side(widget, 'select-timezone', options); - } -}; -//# sourceMappingURL=StaticOptions.js.map \ 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 32b3045e0a..8558006c26 100644 --- a/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts +++ b/api/js/etemplate/Et2Select/test/Et2SelectOptions.test.ts @@ -65,7 +65,7 @@ describe("Select widget", () => await element.updateComplete; /** TESTING **/ - assert.isNotNull(element.querySelector("[value='option']"), "Missing static option"); + assert.isNotNull(element.select.querySelector("[value='option']"), "Missing static option"); }); it("directly in sel_options", async() => @@ -85,7 +85,7 @@ describe("Select widget", () => await element.updateComplete; /** TESTING **/ - assert.equal(element.querySelectorAll("sl-option").length, 2); + assert.equal(element.select.querySelectorAll("sl-option").length, 2); }); it("merges static options with sel_options", async() => @@ -106,9 +106,7 @@ describe("Select widget", () => 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-option")).map(o => o.value); + let option_keys = Object.values(element.select.querySelectorAll("sl-option")).map(o => o.value); assert.include(option_keys, "option", "Static option missing"); assert.includeMembers(option_keys, ["1", "2", "option"], "Option mis-match"); assert.equal(option_keys.length, 3); diff --git a/api/js/etemplate/Et2Select/test/SearchActions.test.ts b/api/js/etemplate/Et2Select/test/SearchActions.test.ts index 74c1dd2ee2..8b7b93c010 100644 --- a/api/js/etemplate/Et2Select/test/SearchActions.test.ts +++ b/api/js/etemplate/Et2Select/test/SearchActions.test.ts @@ -9,7 +9,7 @@ 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 @@ -65,6 +65,7 @@ describe("Search actions", () => '
'; container.loadFromXML(parser.parseFromString(node, "text/xml")); + await elementUpdated(container); const change = sinon.spy(); let element = container.getWidgetById('select'); @@ -72,7 +73,7 @@ describe("Search actions", () => await elementUpdated(element); - element.value = "two"; + element.select.querySelector("[value='two']").dispatchEvent(new Event("click")); await elementUpdated(element); @@ -96,7 +97,7 @@ describe("Trigger search", () => // Create an element to test with, and wait until it's ready // @ts-ignore element = await fixture(html` - + One Two Three @@ -111,6 +112,7 @@ describe("Trigger search", () => await element.updateComplete; await element._searchInputNode.updateComplete; + await elementUpdated(element); }); afterEach(() => @@ -125,11 +127,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 +147,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,8 +163,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": "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"); From 92cf528fe84e24ab3bf114c41b8577eb9a6175ca Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 21 Sep 2023 10:43:09 -0600 Subject: [PATCH 23/41] Introduce widget.hidden to hide widgets, and widget.set_disabled() now also hides widgets. --- api/js/etemplate/Et2Widget/Et2Widget.ts | 34 ++++++++++++++++++++++--- api/templates/default/etemplate2.css | 3 +++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/api/js/etemplate/Et2Widget/Et2Widget.ts b/api/js/etemplate/Et2Widget/Et2Widget.ts index 492c7d20be..f3de00e749 100644 --- a/api/js/etemplate/Et2Widget/Et2Widget.ts +++ b/api/js/etemplate/Et2Widget/Et2Widget.ts @@ -161,14 +161,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. @@ -350,12 +366,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); } @@ -760,7 +781,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); @@ -1434,6 +1455,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.getArryMgr("content").parseBoolExpression(attrs["hidden"])) + { + return null; + } + const readonly = parent?.getArrayMgr("readonlys") ? (parent.getArrayMgr("readonlys")).isReadOnly( attrs["id"], attrs["readonly"], diff --git a/api/templates/default/etemplate2.css b/api/templates/default/etemplate2.css index 7518fe9bb5..5c3c7df412 100644 --- a/api/templates/default/etemplate2.css +++ b/api/templates/default/etemplate2.css @@ -78,6 +78,9 @@ display: none; } +*[hidden] { + display: none !important; +} /** * VBox widget From e3138fe886e87ec51bd08afcdad5ed3f1e7e75f3 Mon Sep 17 00:00:00 2001 From: ralf Date: Fri, 22 Sep 2023 10:28:00 +0200 Subject: [PATCH 24/41] fix calendar.edit wont open, caused by new hidden attribute: - parent can be undefined - typo parent.getArr(a)yMgr() - parseBoolExpression() does NOT support boolean values - returning null gives errors later on, commented it out for now :( --- api/js/etemplate/Et2Widget/Et2Widget.ts | 4 ++-- api/js/etemplate/et2_core_arrayMgr.ts | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/api/js/etemplate/Et2Widget/Et2Widget.ts b/api/js/etemplate/Et2Widget/Et2Widget.ts index f3de00e749..6a95df5f77 100644 --- a/api/js/etemplate/Et2Widget/Et2Widget.ts +++ b/api/js/etemplate/Et2Widget/Et2Widget.ts @@ -1457,9 +1457,9 @@ export function loadWebComponent(_nodeName : string, _template_node : Element|{[ } // Don't need to create hidden elements - if(parent.hidden || attrs["hidden"] && parent.getArrayMgr("content") && parent.getArryMgr("content").parseBoolExpression(attrs["hidden"])) + if(parent?.hidden || attrs["hidden"] && parent?.getArrayMgr("content") && parent.getArrayMgr("content").parseBoolExpression(attrs["hidden"])) { - return null; + //return null; } const readonly = parent?.getArrayMgr("readonlys") ? 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; From 534e1b5d721389d6e0d5d73c81ba90c2d29c1433 Mon Sep 17 00:00:00 2001 From: ralf Date: Fri, 22 Sep 2023 11:56:03 +0200 Subject: [PATCH 25/41] allow to destroy multiple exec_ids --- api/src/Etemplate.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/api/src/Etemplate.php b/api/src/Etemplate.php index 1eb6acee47..b013b6fd73 100644 --- a/api/src/Etemplate.php +++ b/api/src/Etemplate.php @@ -471,15 +471,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); + } } } From a00fdb9eb25bd9338bb84de267216f7d002e04e8 Mon Sep 17 00:00:00 2001 From: hadi Date: Fri, 22 Sep 2023 16:11:14 +0200 Subject: [PATCH 26/41] Clean up etemplate2 sessions before closing the top level window --- api/js/etemplate/etemplate2.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/js/etemplate/etemplate2.ts b/api/js/etemplate/etemplate2.ts index daf92ff45d..d966859ece 100644 --- a/api/js/etemplate/etemplate2.ts +++ b/api/js/etemplate/etemplate2.ts @@ -453,6 +453,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) From 054d124afe436bda7e81595ae3aa9c8a0b9820a7 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 22 Sep 2023 13:50:55 -0600 Subject: [PATCH 27/41] Initial attempt at a nice dev reference. Many thanks to all the other developers who made this possible, especially Shoelace --- api/js/etemplate/Layout/Et2Box/Et2Box.ts | 5 + doc/etemplate2/_includes/component.njk | 305 + doc/etemplate2/_includes/default.njk | 144 + doc/etemplate2/_includes/sidebar.njk | 40 + doc/etemplate2/_utilities/active-links.cjs | 35 + doc/etemplate2/_utilities/anchor-headings.cjs | 64 + doc/etemplate2/_utilities/cem.cjs | 89 + doc/etemplate2/_utilities/code-previews.cjs | 138 + .../_utilities/copy-code-buttons.cjs | 26 + doc/etemplate2/_utilities/external-links.cjs | 41 + doc/etemplate2/_utilities/highlight-code.cjs | 63 + doc/etemplate2/_utilities/markdown.cjs | 67 + doc/etemplate2/_utilities/prettier.cjs | 27 + doc/etemplate2/_utilities/replacer.cjs | 19 + .../_utilities/scrolling-tables.cjs | 21 + doc/etemplate2/_utilities/strings.cjs | 16 + .../_utilities/table-of-contents.cjs | 42 + doc/etemplate2/_utilities/typography.cjs | 23 + doc/etemplate2/assets/examples/include.html | 19 + .../images/widgets_rendered_example.png | Bin 0 -> 3102 bytes .../assets/scripts/code-previews.js | 286 + doc/etemplate2/assets/scripts/docs.js | 298 + doc/etemplate2/assets/scripts/search.js | 376 + doc/etemplate2/assets/scripts/turbo.js | 29 + .../assets/styles/code-previews.css | 173 + doc/etemplate2/assets/styles/docs.css | 1422 ++ doc/etemplate2/assets/styles/search.css | 347 + .../custom-elements-manifest.config.mjs | 198 + doc/etemplate2/eleventy.config.cjs | 280 + .../pages/components/default_component.njk | 8 + .../pages/getting-started/styling.md | 26 + .../pages/getting-started/widgets.md | 28 + doc/etemplate2/pages/index.md | 18 + doc/scripts/build.mjs | 407 + doc/scripts/metadata.mjs | 14 + package-lock.json | 13834 +++++++++------- package.json | 25 + 37 files changed, 12722 insertions(+), 6231 deletions(-) create mode 100644 doc/etemplate2/_includes/component.njk create mode 100644 doc/etemplate2/_includes/default.njk create mode 100644 doc/etemplate2/_includes/sidebar.njk create mode 100644 doc/etemplate2/_utilities/active-links.cjs create mode 100644 doc/etemplate2/_utilities/anchor-headings.cjs create mode 100644 doc/etemplate2/_utilities/cem.cjs create mode 100644 doc/etemplate2/_utilities/code-previews.cjs create mode 100644 doc/etemplate2/_utilities/copy-code-buttons.cjs create mode 100644 doc/etemplate2/_utilities/external-links.cjs create mode 100644 doc/etemplate2/_utilities/highlight-code.cjs create mode 100644 doc/etemplate2/_utilities/markdown.cjs create mode 100644 doc/etemplate2/_utilities/prettier.cjs create mode 100644 doc/etemplate2/_utilities/replacer.cjs create mode 100644 doc/etemplate2/_utilities/scrolling-tables.cjs create mode 100644 doc/etemplate2/_utilities/strings.cjs create mode 100644 doc/etemplate2/_utilities/table-of-contents.cjs create mode 100644 doc/etemplate2/_utilities/typography.cjs create mode 100644 doc/etemplate2/assets/examples/include.html create mode 100644 doc/etemplate2/assets/images/widgets_rendered_example.png create mode 100644 doc/etemplate2/assets/scripts/code-previews.js create mode 100644 doc/etemplate2/assets/scripts/docs.js create mode 100644 doc/etemplate2/assets/scripts/search.js create mode 100644 doc/etemplate2/assets/scripts/turbo.js create mode 100644 doc/etemplate2/assets/styles/code-previews.css create mode 100644 doc/etemplate2/assets/styles/docs.css create mode 100644 doc/etemplate2/assets/styles/search.css create mode 100644 doc/etemplate2/custom-elements-manifest.config.mjs create mode 100644 doc/etemplate2/eleventy.config.cjs create mode 100644 doc/etemplate2/pages/components/default_component.njk create mode 100644 doc/etemplate2/pages/getting-started/styling.md create mode 100644 doc/etemplate2/pages/getting-started/widgets.md create mode 100644 doc/etemplate2/pages/index.md create mode 100644 doc/scripts/build.mjs create mode 100644 doc/scripts/metadata.mjs diff --git a/api/js/etemplate/Layout/Et2Box/Et2Box.ts b/api/js/etemplate/Layout/Et2Box/Et2Box.ts index b5423eaf4f..6f761080ee 100644 --- a/api/js/etemplate/Layout/Et2Box/Et2Box.ts +++ b/api/js/etemplate/Layout/Et2Box/Et2Box.ts @@ -14,6 +14,11 @@ 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() diff --git a/doc/etemplate2/_includes/component.njk b/doc/etemplate2/_includes/component.njk new file mode 100644 index 0000000000..58094a7106 --- /dev/null +++ b/doc/etemplate2/_includes/component.njk @@ -0,0 +1,305 @@ + +{% 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 #} +
+

{{ component.name | classNameToComponentName }}

+ +
+ <{{ component.tagName }}> | {{ component.name }} +
+ +
+ + Since {{component.since or '?' }} + + + {{ component.status }} + +
+
+ +

+ {% if component.summary %} + {{ component.summary | markdownInline | safe }} + {% endif %} +

+ + {# Markdown content #} + {{ content | safe }} + + {# Slots #} + {% if component.slots.length %} +

Slots

+ + + + + + + + + + {% for slot in component.slots %} + + + + + {% endfor %} + +
NameDescription
+ {% if slot.name %} + {{ slot.name }} + {% else %} + (default) + {% endif %} + {{ slot.description | markdownInline | safe }}
+ +

Learn more about using slots.

+ {% endif %} + + {# Properties #} + {% if component.properties.length %} +

Properties

+ + + + + + + + + + + + + {% for prop in component.properties %} + + + + + + + + {% endfor %} + + + + + + + + +
NameDescriptionReflectsTypeDefault
+ {{ prop.name }} + {% if prop.attribute != prop.name %} +
+ + + + {{ prop.attribute }} + + + + {% endif %} +
+ {{ prop.description | markdownInline | safe }} + + {% if prop.reflects %} + + {% endif %} + + {% if prop.type.text %} + {{ prop.type.text | markdownInline | safe }} + {% else %} + - + {% endif %} + + {% if prop.default %} + {{ prop.default | markdownInline | safe }} + {% else %} + - + {% endif %} +
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

+ + + + + + + + + + + + {% for event in component.events %} + + + + + + + {% endfor %} + +
NameReact EventDescriptionEvent Detail
{{ event.name }}{{ event.reactName }}{{ event.description | markdownInline | safe }} + {% if event.type.text %} + {{ event.type.text }} + {% else %} + - + {% endif %} +
+ +

Learn more about events.

+ {% endif %} + + {# Methods #} + {% if component.methods.length %} +

Methods

+ + + + + + + + + + + {% for method in component.methods %} + + + + + + {% endfor %} + +
NameDescriptionArguments
{{ method.name }}(){{ method.description | markdownInline | safe }} + {% if method.parameters.length %} + + {% for param in method.parameters %} + {{ param.name }}: {{ param.type.text }}{% if not loop.last %},{% endif %} + {% endfor %} + + {% else %} + - + {% endif %} +
+ +

Learn more about methods.

+ {% endif %} + + {# Custom Properties #} + {% if component.cssProperties.length %} +

Custom Properties

+ + + + + + + + + + + {% for cssProperty in component.cssProperties %} + + + + + + {% endfor %} + +
NameDescriptionDefault
{{ cssProperty.name }}{{ cssProperty.description | markdownInline | safe }}{{ cssProperty.default }}
+ +

Learn more about customizing CSS custom properties.

+ {% endif %} + + {# CSS Parts #} + {% if component.cssParts.length %} +

Parts

+ + + + + + + + + + {% for cssPart in component.cssParts %} + + + + + {% endfor %} + +
NameDescription
{{ cssPart.name }}{{ cssPart.description | markdownInline | safe }}
+ +

Learn more about customizing CSS parts.

+ {% endif %} + + {# Animations #} + {% if component.animations.length %} +

Animations

+ + + + + + + + + + {% for animation in component.animations %} + + + + + {% endfor %} + +
NameDescription
{{ animation.name }}{{ animation.description | markdownInline | safe }}
+ +

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..363b23ae49 --- /dev/null +++ b/doc/etemplate2/_includes/default.njk @@ -0,0 +1,144 @@ + + + + {# Metadata #} + + + + {{ meta.title }} + + {# Opt out of Turbo caching #} + + + {# Stylesheets #} + + + + + + {# Favicons #} + + + {# OpenGraph #} + + + + + + {# EGroupware #} + + + {# Shoelace #} + + + + + {# Set the initial theme and menu states here to prevent flashing #} + + + {# Turbo + Scroll positioning #} + + + + + + + + + Skip to main content + + + {# Menu toggle #} + + + {# Icon toolbar #} +
+ {# GitHub #} + + + + + {# Theme selector #} + + + + + + + Light + Dark + + System + + +
+ + + + {# Content #} +
+ +
+ {% if toc %} + + {% endif %} + +
+ {% block content %} + {{ content | safe }} + {% endblock %} +
+
+
+ + diff --git a/doc/etemplate2/_includes/sidebar.njk b/doc/etemplate2/_includes/sidebar.njk new file mode 100644 index 0000000000..96d97e2019 --- /dev/null +++ b/doc/etemplate2/_includes/sidebar.njk @@ -0,0 +1,40 @@ + 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..db0c93a09b --- /dev/null +++ b/doc/etemplate2/_utilities/cem.cjs @@ -0,0 +1,89 @@ +const customElementsManifest = require('../../dist/custom-elements.json'); + +// +// 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; + }); +}; diff --git a/doc/etemplate2/_utilities/code-previews.cjs b/doc/etemplate2/_utilities/code-previews.cjs new file mode 100644 index 0000000000..89840f6b4b --- /dev/null +++ b/doc/etemplate2/_utilities/code-previews.cjs @@ -0,0 +1,138 @@ +let count = 1; + +function escapeHtml(str) { + return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"'); +} + +/** + * Turns code fields with the :preview suffix into interactive code previews. + */ +module.exports = function (doc, options) { + options = { + within: 'body', // the element containing the code fields to convert + ...options + }; + + const within = doc.querySelector(options.within); + if (!within) { + return doc; + } + + within.querySelectorAll('[class*=":preview"]').forEach(code => { + const pre = code.closest('pre'); + if (!pre) { + return; + } + const adjacentPre = pre.nextElementSibling?.tagName.toLowerCase() === 'pre' ? pre.nextElementSibling : null; + const reactCode = adjacentPre?.querySelector('code[class$="react"]'); + const sourceGroupId = `code-preview-source-group-${count}`; + const isExpanded = code.getAttribute('class').includes(':expanded'); + const noCodePen = code.getAttribute('class').includes(':no-codepen'); + + count++; + + const htmlButton = ` + + `; + + const reactButton = ` + + `; + + const codePenButton = ` + + `; + + const codePreview = ` +
+
+ ${code.textContent} +
+ +
+
+ +
+
+
${escapeHtml(code.textContent)}
+
+ + ${ + reactCode + ? ` +
+
${escapeHtml(reactCode.textContent)}
+
+ ` + : '' + } +
+ +
+ + + ${reactCode ? ` ${htmlButton} ${reactButton} ` : ''} + + ${noCodePen ? '' : codePenButton} +
+
+ `; + + pre.insertAdjacentHTML('afterend', codePreview); + pre.remove(); + + if (adjacentPre) { + adjacentPre.remove(); + } + }); + + // Wrap code preview scripts in anonymous functions so they don't run in the global scope + doc.querySelectorAll('.code-preview__preview script').forEach(script => { + if (script.type === 'module') { + // Modules are already scoped + script.textContent = script.innerHTML; + } else { + // Wrap non-modules in an anonymous function so they don't run in the global scope + script.textContent = `(() => { ${script.innerHTML} })();`; + } + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/copy-code-buttons.cjs b/doc/etemplate2/_utilities/copy-code-buttons.cjs new file mode 100644 index 0000000000..306164b246 --- /dev/null +++ b/doc/etemplate2/_utilities/copy-code-buttons.cjs @@ -0,0 +1,26 @@ +/** + * Adds copy code buttons to code fields. The provided doc should be a document object provided by JSDOM. The same + * document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc) { + doc.querySelectorAll('pre > code').forEach(code => { + const pre = code.closest('pre'); + const button = doc.createElement('button'); + button.setAttribute('type', 'button'); + button.classList.add('copy-code-button'); + button.setAttribute('aria-label', 'Copy'); + button.innerHTML = ` + + + + + + `; + + pre.append(button); + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/external-links.cjs b/doc/etemplate2/_utilities/external-links.cjs new file mode 100644 index 0000000000..36a95898a2 --- /dev/null +++ b/doc/etemplate2/_utilities/external-links.cjs @@ -0,0 +1,41 @@ +const { isExternalLink } = require('./strings.cjs'); + +/** + * Transforms external links to make them safer and optionally add a target. The provided doc should be a document + * object provided by JSDOM. The same document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc, options) { + options = { + className: 'external-link', // the class name to add to links + noopener: true, // sets rel="noopener" + noreferrer: true, // sets rel="noreferrer" + ignore: () => false, // callback function to filter links that should be ignored + within: 'body', // element that contains the target links + target: '', // sets the target attribute + ...options + }; + + const within = doc.querySelector(options.within); + + if (within) { + within.querySelectorAll('a').forEach(link => { + if (isExternalLink(link) && !options.ignore(link)) { + link.classList.add(options.className); + + const rel = []; + if (options.noopener) rel.push('noopener'); + if (options.noreferrer) rel.push('noreferrer'); + + if (rel.length) { + link.setAttribute('rel', rel.join(' ')); + } + + if (options.target) { + link.setAttribute('target', options.target); + } + } + }); + } + + return doc; +}; diff --git a/doc/etemplate2/_utilities/highlight-code.cjs b/doc/etemplate2/_utilities/highlight-code.cjs new file mode 100644 index 0000000000..bb4c01f092 --- /dev/null +++ b/doc/etemplate2/_utilities/highlight-code.cjs @@ -0,0 +1,63 @@ +const Prism = require('prismjs'); +const PrismLoader = require('prismjs/components/index.js'); + +PrismLoader('diff'); +PrismLoader.silent = true; + +/** Highlights a code string. */ +function highlight(code, language) { + const alias = language.replace(/^diff-/, ''); + const isDiff = /^diff-/i.test(language); + + // Auto-load the target language + if (!Prism.languages[alias]) { + PrismLoader(alias); + + if (!Prism.languages[alias]) { + throw new Error(`Unsupported language for code highlighting: "${language}"`); + } + } + + // Register diff-* languages to use the diff grammar + if (isDiff) { + Prism.languages[language] = Prism.languages.diff; + } + + return Prism.highlight(code, Prism.languages[language], language); +} + +/** + * Highlights all code fields that have a language parameter. If the language has a colon in its name, the first chunk + * will be the language used and additional chunks will be applied as classes to the `
`. For example, a code field
+ * tagged with "html:preview" will be rendered as `
`.
+ *
+ * The provided doc should be a document object provided by JSDOM. The same document will be returned with the
+ * appropriate DOM manipulations.
+ */
+module.exports = function (doc) {
+  doc.querySelectorAll('pre > code[class]').forEach(code => {
+    // Look for class="language-*" and split colons into separate classes
+    code.classList.forEach(className => {
+      if (className.startsWith('language-')) {
+        //
+        // We use certain suffixes to indicate code previews, expanded states, etc. The class might look something like
+        // this:
+        //
+        //  class="language-html:preview:expanded"
+        //
+        // The language will always come first, so we need to drop the "language-" prefix and everything after the first
+        // color to get the highlighter language.
+        //
+        const language = className.replace(/^language-/, '').split(':')[0];
+
+        try {
+          code.innerHTML = highlight(code.textContent ?? '', language);
+        } catch (err) {
+          // Language not found, skip it
+        }
+      }
+    });
+  });
+
+  return doc;
+};
diff --git a/doc/etemplate2/_utilities/markdown.cjs b/doc/etemplate2/_utilities/markdown.cjs
new file mode 100644
index 0000000000..4a73e8f399
--- /dev/null
+++ b/doc/etemplate2/_utilities/markdown.cjs
@@ -0,0 +1,67 @@
+const MarkdownIt = require('markdown-it');
+const markdownItContainer = require('markdown-it-container');
+const markdownItIns = require('markdown-it-ins');
+const markdownItKbd = require('markdown-it-kbd');
+const markdownItMark = require('markdown-it-mark');
+const markdownItReplaceIt = require('markdown-it-replace-it');
+
+const markdown = MarkdownIt({
+  html: true,
+  xhtmlOut: false,
+  breaks: false,
+  langPrefix: 'language-',
+  linkify: false,
+  typographer: false
+});
+
+// Third-party plugins
+markdown.use(markdownItContainer);
+markdown.use(markdownItIns);
+markdown.use(markdownItKbd);
+markdown.use(markdownItMark);
+markdown.use(markdownItReplaceIt);
+
+// Callouts
+['tip', 'warning', 'danger'].forEach(type => {
+  markdown.use(markdownItContainer, type, {
+    render: function (tokens, idx) {
+      if (tokens[idx].nesting === 1) {
+        return `\n';
+    }
+  });
+});
+
+// Asides
+markdown.use(markdownItContainer, 'aside', {
+  render: function (tokens, idx) {
+    if (tokens[idx].nesting === 1) {
+      return `\n';
+  }
+});
+
+// Details
+markdown.use(markdownItContainer, 'details', {
+  validate: params => params.trim().match(/^details\s+(.*)$/),
+  render: (tokens, idx) => {
+    const m = tokens[idx].info.trim().match(/^details\s+(.*)$/);
+    if (tokens[idx].nesting === 1) {
+      return `
\n${markdown.utils.escapeHtml(m[1])}\n`; + } + return '
\n'; + } +}); + +// Replace [#1234] with a link to GitHub issues +markdownItReplaceIt.replacements.push({ + name: 'github-issues', + re: /\[#([0-9]+)\]/gs, + sub: '#$1', + html: true, + default: true +}); + +module.exports = markdown; diff --git a/doc/etemplate2/_utilities/prettier.cjs b/doc/etemplate2/_utilities/prettier.cjs new file mode 100644 index 0000000000..67850eaff4 --- /dev/null +++ b/doc/etemplate2/_utilities/prettier.cjs @@ -0,0 +1,27 @@ +const {format} = require('prettier'); + +/** Formats markup using prettier. */ +module.exports = function (content, options) +{ + options = { + arrowParens: 'avoid', + bracketSpacing: true, + htmlWhitespaceSensitivity: 'css', + insertPragma: false, + bracketSameLine: false, + jsxSingleQuote: false, + parser: 'html', + printWidth: 120, + proseWrap: 'preserve', + quoteProps: 'as-needed', + requirePragma: false, + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: 'none', + useTabs: false, + ...options + }; + + return format(content, options); +}; diff --git a/doc/etemplate2/_utilities/replacer.cjs b/doc/etemplate2/_utilities/replacer.cjs new file mode 100644 index 0000000000..ddc4d4a374 --- /dev/null +++ b/doc/etemplate2/_utilities/replacer.cjs @@ -0,0 +1,19 @@ +/** + * @typedef {object} Replacement + * @property {string | RegExp} pattern + * @property {string} replacement + */ + +/** + * @typedef {Array} Replacements + */ + +/** + * @param {Document} content + * @param {Replacements} replacements + */ +module.exports = function (content, replacements) { + replacements.forEach(replacement => { + content.body.innerHTML = content.body.innerHTML.replaceAll(replacement.pattern, replacement.replacement); + }); +}; diff --git a/doc/etemplate2/_utilities/scrolling-tables.cjs b/doc/etemplate2/_utilities/scrolling-tables.cjs new file mode 100644 index 0000000000..148248dbe8 --- /dev/null +++ b/doc/etemplate2/_utilities/scrolling-tables.cjs @@ -0,0 +1,21 @@ +/** + * Turns headings into clickable, deep linkable anchors. The provided doc should be a document object provided by JSDOM. + * The same document will be returned with the appropriate DOM manipulations. + */ +module.exports = function (doc, options) { + const tables = [...doc.querySelectorAll('table')]; + + options = { + className: 'table-scroll', // the class name to add to the table's container + ...options + }; + + tables.forEach(table => { + const div = doc.createElement('div'); + div.classList.add(options.className); + table.insertAdjacentElement('beforebegin', div); + div.append(table); + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/strings.cjs b/doc/etemplate2/_utilities/strings.cjs new file mode 100644 index 0000000000..6831d66d96 --- /dev/null +++ b/doc/etemplate2/_utilities/strings.cjs @@ -0,0 +1,16 @@ +const slugify = require('slugify'); + +/** Creates a slug from an arbitrary string of text. */ +module.exports.createSlug = function (text) { + return slugify(String(text), { + remove: /[^\w|\s]/g, + lower: true + }); +}; + +/** Determines whether or not a link is external. */ +module.exports.isExternalLink = function (link) { + // We use the "internal" hostname when initializing JSDOM so we know that those are local links + if (!link.hostname || link.hostname === 'internal') return false; + return true; +}; diff --git a/doc/etemplate2/_utilities/table-of-contents.cjs b/doc/etemplate2/_utilities/table-of-contents.cjs new file mode 100644 index 0000000000..1ac04fd31c --- /dev/null +++ b/doc/etemplate2/_utilities/table-of-contents.cjs @@ -0,0 +1,42 @@ +/** + * Generates an in-page table of contents based on headings. + */ +module.exports = function (doc, options) { + options = { + levels: ['h2'], // headings to include (they must have an id) + container: 'nav', // the container to append links to + listItem: true, // if true, links will be wrapped in
  • + within: 'body', // the element containing the headings to summarize + ...options + }; + + const container = doc.querySelector(options.container); + const within = doc.querySelector(options.within); + const headingSelector = options.levels.map(h => `${h}[id]`).join(', '); + + if (!container || !within) { + return doc; + } + + within.querySelectorAll(headingSelector).forEach(heading => { + const listItem = doc.createElement('li'); + const link = doc.createElement('a'); + const level = heading.tagName.slice(1); + + link.href = `#${heading.id}`; + link.textContent = heading.textContent; + + if (options.listItem) { + // List item + link + listItem.setAttribute('data-level', level); + listItem.append(link); + container.append(listItem); + } else { + // Link only + link.setAttribute('data-level', level); + container.append(link); + } + }); + + return doc; +}; diff --git a/doc/etemplate2/_utilities/typography.cjs b/doc/etemplate2/_utilities/typography.cjs new file mode 100644 index 0000000000..53fe84b611 --- /dev/null +++ b/doc/etemplate2/_utilities/typography.cjs @@ -0,0 +1,23 @@ +const smartquotes = require('smartquotes'); + +smartquotes.replacements.push([/---/g, '\u2014']); // em dash +smartquotes.replacements.push([/--/g, '\u2013']); // en dash +smartquotes.replacements.push([/\.\.\./g, '\u2026']); // ellipsis +smartquotes.replacements.push([/\(c\)/gi, '\u00A9']); // copyright +smartquotes.replacements.push([/\(r\)/gi, '\u00AE']); // registered trademark +smartquotes.replacements.push([/\?!/g, '\u2048']); // ?! +smartquotes.replacements.push([/!!/g, '\u203C']); // !! +smartquotes.replacements.push([/\?\?/g, '\u2047']); // ?? +smartquotes.replacements.push([/([0-9]\s?)-(\s?[0-9])/g, '$1\u2013$2']); // number ranges use en dash + +/** + * Improves typography by adding smart quotes and similar corrections within the specified element(s). + * + * The provided doc should be a document object provided by JSDOM. The same document will be returned with the + * appropriate DOM manipulations. + */ +module.exports = function (doc, selector = 'body') { + const elements = [...doc.querySelectorAll(selector)]; + elements.forEach(el => smartquotes.element(el)); + return doc; +}; diff --git a/doc/etemplate2/assets/examples/include.html b/doc/etemplate2/assets/examples/include.html new file mode 100644 index 0000000000..3a5dc6228d --- /dev/null +++ b/doc/etemplate2/assets/examples/include.html @@ -0,0 +1,19 @@ +

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

    +

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

    +

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

    + + diff --git a/doc/etemplate2/assets/images/widgets_rendered_example.png b/doc/etemplate2/assets/images/widgets_rendered_example.png new file mode 100644 index 0000000000000000000000000000000000000000..73343154a6bd913f2402b775c983139398966448 GIT binary patch literal 3102 zcmcJRcTm&W7RP^}NR=8aC}9zSfD4LXut6XpvV<0z(m{GjKoF6dxQd`b1s9R35Rei| z6r=;XWCD%ksq?Gvo?D@Qs2K$2}?X6hK@$r-Z^%3D|N{0kiShib}9`W@+W z&fdu)=bY0KdxI?p;&RXX61-z$n39IS?I^In)Y6kUXMU(OhaTgLsGmiS{10n6Q#E^s{2q9!hjZ>@!05T`wasZ%06a#Lhq4xsq<`7}vqZ&vE z_##J8jr=r(P2{ri5Wx-e5#uH~xZd7z{zu=EcN2`0xV1pRaRp)o7rY%H3$N+q)u7u# zf7K!smG}B@2VQ{Jq>R{}r&AL@wZ7ik=|1x2#=-$X1#AdQ6Z;m!?d9Hoj9$D-*KufW z_c}Q~G(R7*tp(gV&|v!kHzIY3W$q?NFrwjHMt5HL!Zu~^0k6(AcztLaStM2;oQM*m zs$0K3>JWvulf;@=boLXLdMj#2qXC(uRzgKnVYDRxyozlIhsKw4%B+>)4CnkIXS`#M zgHBD%>+&cA@*?%aR$@${7!sKETqg$o`0R*7Rk#^DPFJ@)>Qu$X2}ON#rS9w6kIF!w z(@q$B&v)r5>KgtQIp^m(j=q{mbJq&>3xsc;n4a0ZZGS^(@$wUyCuDBPRLqEZDuh<*RR6 zv0(jl`=tcl80+Mf%$wNg*Gm&A-tcg9M^e{ek={JX0Hud9s8%E9*|yV__f7k(svaJE zo@Yg4WvzSNG-V_7VmsKE&;`nNe&+VEu>4B%j5U@*)()%FKJ;^Cv})xrxlV$~`+*NB zGczcD5A8z==H<=00)pZEV`$YxMx#D?Q3NK3MRTC0H{PfZJ+-98L|D5ofe0F_m}?#$ z_*vz}h?6AJ=Ctw|ePSFcH@(V@L>gL74B*vstw|x_+33}Mng-2NDi;I8ScPHZ#<0?I ze9JP*ijh_3cDt#9l(;b2>>)=0{%9=#6KeZi;Ey#WAAYR4tW8@YYHY zK&^EI^8H2fCmh5E3a^Q-e=&Lu)n#O%zMiA>1r)rW+8RK>7}tSsZ?2`c{2@inrFF<5 zqc15gq*Z6d@=3*^_-^cd^xj)bV;ShGwr7riK1yF{G_Y;7a^DA@RIWz@Y(3f z+JKI7JdX*j(9|a^QACN9)5W7E-3Mmi$W3DTF}hB_PLdDDXUHl=O`E>m8D%V-JT+GRDN<8_2`8sXv|IfIo@IaH0$81w|dBN5{1Xe-{#6l9Enj$ItE0g zp`{M*{;xSCSxSI}F*Oh(c{jU&1qg_+$+{RdT@@r$7@y?xyR6_xjNp2Hy8>Y1q0|50 z>(@UGaq2~Q0*ttNcwk{7fNVS0l4Y1@G{EiG5RgVdB+|**BcGoQGE*DHF9EadTnpAo z>_i=}pUb$M+pxBa)1hRqw7x*E&GF+aZ`q9-LFgbN);y4J=UQYpTd6U~L zAj!8vBZPoo-4ip=QbNorVc>StmIm>VFqtX>?7hBbEy(1aDhY^9&*$YyQZq%I9tC8A zA9S(g?EaCeZER4w(^L_{nHd+o9+;Zzg4t<_(pC$fcv7+E=44$^6+~o@rabEMxW_&2swP zpq6^;16pYDr(XztF(~Er84BA)(L95&P6g>Js?aK;S|iG%-&x@i3fkbqcGFEyR%aa>Dr!XW;q;}cfy=1hVgV&!|@i}>W#h%no3V->qVYP z=}19FXvCd_m9)myg^9M3DKETW*k{EHa9bqY#$*b&`Sa-u7g)HgjLPt6De8z?1oF97 zLy~o>tBYEI>(S=IN5r#+IR;msGTnI;SfX^+k-qq7v&YKfY~y7w|F*(`M=we-LF8=a z7x~bPDP>j}^wl=cqUP(C&ZI{rgr(xZ^%+)Uv{Fo;Rx)oa;NMs4ztsc@ttK%&A?4Uh}7PL_4dFF)(EXR4VrmZ)xITyVsmeJn zlFYjbbMat;D|F_A_(}^;pG2zs%2S>BF3qTX+2&fHggpg@;oSRR{FXNU*KKb9`N%c; zBVtfT^@h9S_;?knz(B3KbbhnteWG1S+O}PTqkTXiTp^36PqxxxBbA6jjV^S*>~m}w zj##vVc6@A#@2>NOsg8VAA7Ozf|_ zLS9;Kj8c&&Q(Ia18_@Nt=Rfgk?Q9Lc9zB1}ksswXAOa9S&F8sEBXu&*_-M5B+!tMW zIfCgzIh9Oi%clf3OvE>*{TnE5GDzRa1RIjEt*4iLEWf#}VC-)G6r+5qLxgT@bsw_+ zFB}D2A>QLq{}*EYmndu(5E!$`m)~j=FMk31!8BD!lYzxh?Y z^LmL9$4_F{=%*b%> G+y4XxKid=l literal 0 HcmV?d00001 diff --git a/doc/etemplate2/assets/scripts/code-previews.js b/doc/etemplate2/assets/scripts/code-previews.js new file mode 100644 index 0000000000..f7fe75a506 --- /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 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 React from 'https://esm.sh/react@${reactVersion}';\n` + + `import ReactDOM from 'https://esm.sh/react-dom@${reactVersion}';\n` + + `import { setBasePath } from 'https://esm.sh/@shoelace-style/shoelace@${egwVersion}/${cdndir}/utilities/base-path';\n` + + `\n` + + `// Set the base path for Shoelace assets\n` + + `setBasePath('https://esm.sh/@shoelace-style/shoelace@${egwVersion}/${npmdir}/')\n` + + `\n${convertModuleLinks(reactExample)}\n` + + `\n` + + `ReactDOM.render(, document.getElementById('root'));`; + } + + // CSS templates + cssTemplate = + `@import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@${egwVersion}/${cdndir}/themes/${ + isDark ? 'dark' : 'light' + }.css';\n` + + '\n' + + 'body {\n' + + ' font: 16px sans-serif;\n' + + ' background-color: var(--sl-color-neutral-0);\n' + + ' color: var(--sl-color-neutral-900);\n' + + ' padding: 1rem;\n' + + '}'; + + // Docs: https://blog.codepen.io/documentation/prefill/ + const data = { + title: '', + description: '', + tags: ['shoelace', 'web components'], + editors, + head: ``, + html_classes: `sl-theme-${isDark ? 'dark' : 'light'}`, + css_external: ``, + js_external: ``, + js_module: true, + js_pre_processor: isReact ? 'babel' : 'none', + html: htmlTemplate, + css: cssTemplate, + js: jsTemplate + }; + + const input = document.createElement('input'); + input.type = 'hidden'; + input.name = 'data'; + input.value = JSON.stringify(data); + form.append(input); + + document.documentElement.append(form); + form.submit(); + form.remove(); + } + }); + + // Set the initial flavor + window.addEventListener('turbo:load', syncFlavor); +})(); diff --git a/doc/etemplate2/assets/scripts/docs.js b/doc/etemplate2/assets/scripts/docs.js new file mode 100644 index 0000000000..60b1fa8cad --- /dev/null +++ b/doc/etemplate2/assets/scripts/docs.js @@ -0,0 +1,298 @@ +// +// Sidebar +// +// When the sidebar is hidden, we apply the inert attribute to prevent focus from reaching it. Due to the many states +// the sidebar can have (e.g. static, hidden, expanded), we test for visibility by checking to see if it's placed +// offscreen or not. Then, on resize/transition we make sure to update the attribute accordingly. +// +(() => { + function getSidebar() { + return document.getElementById('sidebar'); + } + + function isSidebarOpen() { + return document.documentElement.classList.contains('sidebar-open'); + } + + function isSidebarVisible() { + return getSidebar().getBoundingClientRect().x >= 0; + } + + function toggleSidebar(force) { + const isOpen = typeof force === 'boolean' ? force : !isSidebarOpen(); + return document.documentElement.classList.toggle('sidebar-open', isOpen); + } + + function updateInert() { + getSidebar().inert = !isSidebarVisible(); + } + + // Toggle the menu + document.addEventListener('click', event => { + const menuToggle = event.target.closest('#menu-toggle'); + if (!menuToggle) return; + toggleSidebar(); + }); + + // Update the sidebar's inert state when the window resizes and when the sidebar transitions + window.addEventListener('resize', () => toggleSidebar(false)); + + document.addEventListener('transitionend', event => { + const sidebar = event.target.closest('#sidebar'); + if (!sidebar) return; + updateInert(); + }); + + // Close when a menu item is selected on mobile + document.addEventListener('click', event => { + const sidebar = event.target.closest('#sidebar'); + const link = event.target.closest('a'); + if (!sidebar || !link) return; + + if (isSidebarOpen()) { + toggleSidebar(); + } + }); + + // Close when open and escape is pressed + document.addEventListener('keydown', event => { + if (event.key === 'Escape' && isSidebarOpen()) { + event.stopImmediatePropagation(); + toggleSidebar(); + } + }); + + // Close when clicking outside of the sidebar + document.addEventListener('mousedown', event => { + if (isSidebarOpen() & !event.target?.closest('#sidebar, #menu-toggle')) { + event.stopImmediatePropagation(); + toggleSidebar(); + } + }); + + updateInert(); +})(); + +// +// Theme selector +// +(() => { + function getTheme() { + return localStorage.getItem('theme') || 'auto'; + } + + function isDark() { + if (theme === 'auto') { + return window.matchMedia('(prefers-color-scheme: dark)').matches; + } + return theme === 'dark'; + } + + function setTheme(newTheme) { + theme = newTheme; + localStorage.setItem('theme', theme); + + // Update the UI + updateSelection(); + + // Toggle the dark mode class + document.documentElement.classList.toggle('sl-theme-dark', isDark()); + } + + function updateSelection() { + const menu = document.querySelector('#theme-selector sl-menu'); + if (!menu) return; + [...menu.querySelectorAll('sl-menu-item')].map(item => (item.checked = item.getAttribute('value') === theme)); + } + + let theme = getTheme(); + + // Selection is not preserved when changing page, so update when opening dropdown + document.addEventListener('sl-show', event => { + const themeSelector = event.target.closest('#theme-selector'); + if (!themeSelector) return; + updateSelection(); + }); + + // Listen for selections + document.addEventListener('sl-select', event => { + const menu = event.target.closest('#theme-selector sl-menu'); + if (!menu) return; + setTheme(event.detail.item.value); + }); + + // Update the theme when the preference changes + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => setTheme(theme)); + + // Toggle with backslash + document.addEventListener('keydown', event => { + if ( + event.key === '\\' && + !event.composedPath().some(el => ['input', 'textarea'].includes(el?.tagName?.toLowerCase())) + ) { + event.preventDefault(); + setTheme(isDark() ? 'light' : 'dark'); + } + }); + + // Set the initial theme and sync the UI + setTheme(theme); +})(); + +// +// Open details when printing +// +(() => { + const detailsOpenOnPrint = new Set(); + + window.addEventListener('beforeprint', () => { + detailsOpenOnPrint.clear(); + document.querySelectorAll('details').forEach(details => { + if (details.open) { + detailsOpenOnPrint.add(details); + } + details.open = true; + }); + }); + + window.addEventListener('afterprint', () => { + document.querySelectorAll('details').forEach(details => { + details.open = detailsOpenOnPrint.has(details); + }); + detailsOpenOnPrint.clear(); + }); +})(); + +// +// Copy code buttons +// +(() => { + document.addEventListener('click', event => { + const button = event.target.closest('.copy-code-button'); + const pre = button?.closest('pre'); + const code = pre?.querySelector('code'); + const copyIcon = button?.querySelector('.copy-code-button__copy-icon'); + const copiedIcon = button?.querySelector('.copy-code-button__copied-icon'); + + if (button && code) { + navigator.clipboard.writeText(code.innerText); + copyIcon.style.display = 'none'; + copiedIcon.style.display = 'inline'; + button.classList.add('copy-code-button--copied'); + + setTimeout(() => { + copyIcon.style.display = 'inline'; + copiedIcon.style.display = 'none'; + button.classList.remove('copy-code-button--copied'); + }, 1000); + } + }); +})(); + +// +// Smooth links +// +(() => { + document.addEventListener('click', event => { + const link = event.target.closest('a'); + const id = (link?.hash ?? '').substr(1); + const isFragment = link?.hasAttribute('href') && link?.getAttribute('href').startsWith('#'); + + if (!link || !isFragment || link.getAttribute('data-smooth-link') === 'false') { + return; + } + + // Scroll to the top + if (link.hash === '') { + event.preventDefault(); + window.scroll({ top: 0, behavior: 'smooth' }); + history.pushState(undefined, undefined, location.pathname); + } + + // Scroll to an id + if (id) { + const target = document.getElementById(id); + + if (target) { + event.preventDefault(); + window.scroll({ top: target.offsetTop, behavior: 'smooth' }); + history.pushState(undefined, undefined, `#${id}`); + } + } + }); +})(); + +// +// Table of Contents scrollspy +// +(() => { + // This will be stale if its not a function. + const getLinks = () => [...document.querySelectorAll('.content__toc a')]; + const linkTargets = new WeakMap(); + const visibleTargets = new WeakSet(); + const observer = new IntersectionObserver(handleIntersect, { rootMargin: '0px 0px' }); + let debounce; + + function handleIntersect(entries) { + entries.forEach(entry => { + // Remember which targets are visible + if (entry.isIntersecting) { + visibleTargets.add(entry.target); + } else { + visibleTargets.delete(entry.target); + } + }); + + updateActiveLinks(); + } + + function updateActiveLinks() { + const links = getLinks(); + // Find the first visible target and activate the respective link + links.find(link => { + const target = linkTargets.get(link); + + if (target && visibleTargets.has(target)) { + links.forEach(el => el.classList.toggle('active', el === link)); + return true; + } + + return false; + }); + } + + // Observe link targets + function observeLinks() { + getLinks().forEach(link => { + const hash = link.hash.slice(1); + const target = hash ? document.querySelector(`.content__body #${hash}`) : null; + + if (target) { + linkTargets.set(link, target); + observer.observe(target); + } + }); + } + + observeLinks(); + + document.addEventListener('turbo:load', updateActiveLinks); + document.addEventListener('turbo:load', observeLinks); +})(); + +// +// Show custom versions in the sidebar +// +(() => { + function updateVersion() { + const el = document.querySelector('.sidebar-version'); + if (!el) return; + + if (location.hostname === 'next.shoelace.style') el.textContent = 'Next'; + if (location.hostname === 'localhost') el.textContent = 'Development'; + } + + updateVersion(); + + document.addEventListener('turbo:load', updateVersion); +})(); diff --git a/doc/etemplate2/assets/scripts/search.js b/doc/etemplate2/assets/scripts/search.js new file mode 100644 index 0000000000..049ab30a4f --- /dev/null +++ b/doc/etemplate2/assets/scripts/search.js @@ -0,0 +1,376 @@ +(() => { + // Append the search dialog to the body + const siteSearch = document.createElement('div'); + const scrollbarWidth = Math.abs(window.innerWidth - document.documentElement.clientWidth); + + siteSearch.classList.add('search'); + siteSearch.innerHTML = ` +
    + +
    +
    +
    + + + +
    +
    +
    +
      +
      No matching pages
      +
      +
      + Navigate + Select + Esc Close +
      +
      +
      + `; + + const overlay = siteSearch.querySelector('.search__overlay'); + const dialog = siteSearch.querySelector('.search__dialog'); + const input = siteSearch.querySelector('.search__input'); + const clearButton = siteSearch.querySelector('.search__clear-button'); + const results = siteSearch.querySelector('.search__results'); + const version = document.documentElement.getAttribute('data-shoelace-version'); + const key = `search_${version}`; + const searchDebounce = 50; + const animationDuration = 150; + let isShowing = false; + let searchTimeout; + let searchIndex; + let map; + + const loadSearchIndex = new Promise(resolve => { + const cache = localStorage.getItem(key); + const wait = 'requestIdleCallback' in window ? requestIdleCallback : requestAnimationFrame; + + // Cleanup older search indices (everything before this version) + try { + const items = { ...localStorage }; + + Object.keys(items).forEach(k => { + if (key > k) { + localStorage.removeItem(k); + } + }); + } catch { + /* do nothing */ + } + + // Look for a cached index + try { + if (cache) { + const data = JSON.parse(cache); + + searchIndex = window.lunr.Index.load(data.searchIndex); + map = data.map; + + return resolve(); + } + } catch { + /* do nothing */ + } + + // Wait until idle to fetch the index + wait(() => { + fetch('/assets/search.json') + .then(res => res.json()) + .then(data => { + if (!window.lunr) { + console.error('The Lunr search client has not yet been loaded.'); + } + + searchIndex = window.lunr.Index.load(data.searchIndex); + map = data.map; + + // Cache the search index for this version + if (version) { + try { + localStorage.setItem(key, JSON.stringify(data)); + } catch (err) { + console.warn(`Unable to cache the search index: ${err}`); + } + } + + resolve(); + }); + }); + }); + + async function show() { + isShowing = true; + document.body.append(siteSearch); + document.body.classList.add('search-visible'); + document.body.style.setProperty('--docs-search-scroll-lock-size', `${scrollbarWidth}px`); + clearButton.hidden = true; + requestAnimationFrame(() => input.focus()); + updateResults(); + + dialog.showModal(); + + await Promise.all([ + dialog.animate( + [ + { opacity: 0, transform: 'scale(.9)', transformOrigin: 'top' }, + { opacity: 1, transform: 'scale(1)', transformOrigin: 'top' } + ], + { duration: animationDuration } + ).finished, + overlay.animate([{ opacity: 0 }, { opacity: 1 }], { duration: animationDuration }).finished + ]); + + dialog.addEventListener('mousedown', handleMouseDown); + dialog.addEventListener('keydown', handleKeyDown); + } + + async function hide() { + isShowing = false; + + await Promise.all([ + dialog.animate( + [ + { opacity: 1, transform: 'scale(1)', transformOrigin: 'top' }, + { opacity: 0, transform: 'scale(.9)', transformOrigin: 'top' } + ], + { duration: animationDuration } + ).finished, + overlay.animate([{ opacity: 1 }, { opacity: 0 }], { duration: animationDuration }).finished + ]); + + dialog.close(); + + input.blur(); // otherwise Safari will scroll to the bottom of the page on close + input.value = ''; + document.body.classList.remove('search-visible'); + document.body.style.removeProperty('--docs-search-scroll-lock-size'); + siteSearch.remove(); + updateResults(); + + dialog.removeEventListener('mousedown', handleMouseDown); + dialog.removeEventListener('keydown', handleKeyDown); + } + + function handleInput() { + clearButton.hidden = input.value === ''; + + // Debounce search queries + clearTimeout(searchTimeout); + searchTimeout = setTimeout(() => updateResults(input.value), searchDebounce); + } + + function handleClear() { + clearButton.hidden = true; + input.value = ''; + input.focus(); + updateResults(); + } + + function handleMouseDown(event) { + if (!event.target.closest('.search__content')) { + hide(); + } + } + + function handleKeyDown(event) { + // Close when pressing escape + if (event.key === 'Escape') { + event.preventDefault(); // prevent from closing immediately so it can animate + event.stopImmediatePropagation(); + hide(); + return; + } + + // Handle keyboard selections + if (['ArrowDown', 'ArrowUp', 'Home', 'End', 'Enter'].includes(event.key)) { + event.preventDefault(); + + const currentEl = results.querySelector('[data-selected="true"]'); + const items = [...results.querySelectorAll('li')]; + const index = items.indexOf(currentEl); + let nextEl; + + if (items.length === 0) { + return; + } + + switch (event.key) { + case 'ArrowUp': + nextEl = items[Math.max(0, index - 1)]; + break; + case 'ArrowDown': + nextEl = items[Math.min(items.length - 1, index + 1)]; + break; + case 'Home': + nextEl = items[0]; + break; + case 'End': + nextEl = items[items.length - 1]; + break; + case 'Enter': + currentEl?.querySelector('a')?.click(); + break; + } + + // Update the selected item + items.forEach(item => { + if (item === nextEl) { + input.setAttribute('aria-activedescendant', item.id); + item.setAttribute('data-selected', 'true'); + nextEl.scrollIntoView({ block: 'nearest' }); + } else { + item.setAttribute('data-selected', 'false'); + } + }); + } + } + + async function updateResults(query = '') { + try { + await loadSearchIndex; + + const hasQuery = query.length > 0; + const searchTerms = query + .split(' ') + .map((term, index, arr) => { + // Search API: https://lunrjs.com/guides/searching.html + if (index === arr.length - 1) { + // The last term is not mandatory and 1x fuzzy. We also duplicate it with a wildcard to match partial words + // as the user types. + return `${term}~1 ${term}*`; + } else { + // All other terms are mandatory and 1x fuzzy + return `+${term}~1`; + } + }) + .join(' '); + const matches = hasQuery ? searchIndex.search(searchTerms) : []; + const hasResults = hasQuery && matches.length > 0; + + siteSearch.classList.toggle('search--has-results', hasQuery && hasResults); + siteSearch.classList.toggle('search--no-results', hasQuery && !hasResults); + + input.setAttribute('aria-activedescendant', ''); + results.innerHTML = ''; + + matches.forEach((match, index) => { + const page = map[match.ref]; + const li = document.createElement('li'); + const a = document.createElement('a'); + const displayTitle = page.title ?? ''; + const displayDescription = page.description ?? ''; + const displayUrl = page.url.replace(/^\//, '').replace(/\/$/, ''); + let icon = 'file-text'; + + a.setAttribute('role', 'option'); + a.setAttribute('id', `search-result-item-${match.ref}`); + + if (page.url.includes('getting-started/')) { + icon = 'lightbulb'; + } + if (page.url.includes('resources/')) { + icon = 'book'; + } + if (page.url.includes('components/')) { + icon = 'puzzle'; + } + if (page.url.includes('tokens/')) { + icon = 'palette2'; + } + if (page.url.includes('utilities/')) { + icon = 'wrench'; + } + if (page.url.includes('tutorials/')) { + icon = 'joystick'; + } + + li.classList.add('search__result'); + li.setAttribute('role', 'option'); + li.setAttribute('id', `search-result-item-${match.ref}`); + li.setAttribute('data-selected', index === 0 ? 'true' : 'false'); + + a.href = page.url; + a.innerHTML = ` + +
      +
      +
      +
      +
      + `; + a.querySelector('.search__result-title').textContent = displayTitle; + a.querySelector('.search__result-description').textContent = displayDescription; + a.querySelector('.search__result-url').textContent = displayUrl; + + li.appendChild(a); + results.appendChild(li); + }); + } catch { + // Ignore query errors as the user types + } + } + + // Show the search dialog when clicking on data-plugin="search" + document.addEventListener('click', event => { + const searchButton = event.target.closest('[data-plugin="search"]'); + if (searchButton) { + show(); + } + }); + + // Show the search dialog when slash (or CMD+K) is pressed and focus is not inside a form element + document.addEventListener('keydown', event => { + if ( + !isShowing && + (event.key === '/' || (event.key === 'k' && (event.metaKey || event.ctrlKey))) && + !event.composedPath().some(el => ['input', 'textarea'].includes(el?.tagName?.toLowerCase())) + ) { + event.preventDefault(); + show(); + } + }); + + // Purge cache when we press CMD+CTRL+R + document.addEventListener('keydown', event => { + if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === 'r') { + localStorage.clear(); + } + }); + + input.addEventListener('input', handleInput); + clearButton.addEventListener('click', handleClear); + + // Close when a result is selected + results.addEventListener('click', event => { + if (event.target.closest('a')) { + hide(); + } + }); +})(); diff --git a/doc/etemplate2/assets/scripts/turbo.js b/doc/etemplate2/assets/scripts/turbo.js new file mode 100644 index 0000000000..7075217f03 --- /dev/null +++ b/doc/etemplate2/assets/scripts/turbo.js @@ -0,0 +1,29 @@ +import * as Turbo from 'https://cdn.jsdelivr.net/npm/@hotwired/turbo@7.3.0/+esm'; + +(() => { + if (!window.scrollPositions) { + window.scrollPositions = {}; + } + + function preserveScroll() { + document.querySelectorAll('[data-preserve-scroll').forEach(element => { + scrollPositions[element.id] = element.scrollTop; + }); + } + + function restoreScroll(event) { + document.querySelectorAll('[data-preserve-scroll').forEach(element => { + element.scrollTop = scrollPositions[element.id]; + }); + + if (event.detail && event.detail.newBody) { + event.detail.newBody.querySelectorAll('[data-preserve-scroll').forEach(element => { + element.scrollTop = scrollPositions[element.id]; + }); + } + } + + window.addEventListener('turbo:before-cache', preserveScroll); + window.addEventListener('turbo:before-render', restoreScroll); + window.addEventListener('turbo:render', restoreScroll); +})(); diff --git a/doc/etemplate2/assets/styles/code-previews.css b/doc/etemplate2/assets/styles/code-previews.css new file mode 100644 index 0000000000..0fa5efacc6 --- /dev/null +++ b/doc/etemplate2/assets/styles/code-previews.css @@ -0,0 +1,173 @@ +/* Interactive code blocks */ +.code-preview { + position: relative; + border-radius: 3px; + background-color: var(--sl-color-neutral-50); + margin-bottom: 1.5rem; +} + +.code-preview__preview { + position: relative; + border: solid 1px var(--sl-color-neutral-200); + border-bottom: none; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: var(--sl-color-neutral-0); + min-width: 20rem; + max-width: 100%; + padding: 1.5rem 3.25rem 1.5rem 1.5rem; +} + +/* Block the preview while dragging to prevent iframes from intercepting drag events */ +.code-preview__preview--dragging:after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: ew-resize; +} + +.code-preview__resizer { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 0; + right: 0; + bottom: 0; + width: 1.75rem; + font-size: 20px; + color: var(--sl-color-neutral-600); + background-color: var(--sl-color-neutral-0); + border-left: solid 1px var(--sl-color-neutral-200); + border-top-right-radius: 3px; + cursor: ew-resize; +} + +@media screen and (max-width: 600px) { + .code-preview__preview { + padding-right: 1.5rem; + } + + .code-preview__resizer { + display: none; + } +} + +.code-preview__source { + border: solid 1px var(--sl-color-neutral-200); + border-bottom: none; + border-radius: 0 !important; + display: none; +} + +.code-preview--expanded .code-preview__source { + display: block; +} + +.code-preview__source pre { + margin: 0; +} + +.code-preview__buttons { + position: relative; + border: solid 1px var(--sl-color-neutral-200); + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + display: flex; +} + +.code-preview__button { + flex: 0 0 auto; + height: 2.5rem; + min-width: 2.5rem; + border: none; + border-radius: 0; + background: var(--sl-color-neutral-0); + font: inherit; + font-size: 0.7rem; + font-weight: 500; + text-transform: uppercase; + color: var(--sl-color-neutral-600); + padding: 0 1rem; + cursor: pointer; +} + +.code-preview__button:not(:last-of-type) { + border-right: solid 1px var(--sl-color-neutral-200); +} + +.code-preview__button--html, +.code-preview__button--react { + width: 70px; + display: flex; + place-items: center; + justify-content: center; +} + +.code-preview__button--selected { + font-weight: 700; + color: var(--sl-color-primary-600); +} + +.code-preview__button--codepen { + display: flex; + place-items: center; + width: 6rem; +} + +.code-preview__button:first-of-type { + border-bottom-left-radius: 3px; +} + +.code-preview__button:last-of-type { + border-bottom-right-radius: 3px; +} + +.code-preview__button:hover, +.code-preview__button:active { + box-shadow: 0 0 0 1px var(--sl-color-primary-400); + border-right-color: transparent; + background-color: var(--sl-color-primary-50); + color: var(--sl-color-primary-600); + z-index: 1; +} + +.code-preview__button:focus-visible { + outline: none; + outline: var(--sl-focus-ring); + z-index: 2; +} + +.code-preview__toggle { + position: relative; + display: flex; + flex: 1 1 auto; + align-items: center; + justify-content: center; + width: 100%; + color: var(--sl-color-neutral-600); + cursor: pointer; +} + +.code-preview__toggle svg { + width: 1em; + height: 1em; + margin-left: 0.25rem; +} + +.code-preview--expanded .code-preview__toggle svg { + transform: rotate(180deg); +} + +/* We can apply data-flavor="html|react" to any element on the page to toggle it when the flavor changes */ +.flavor-html [data-flavor]:not([data-flavor='html']) { + display: none; +} + +.flavor-react [data-flavor]:not([data-flavor='react']) { + display: none; +} diff --git a/doc/etemplate2/assets/styles/docs.css b/doc/etemplate2/assets/styles/docs.css new file mode 100644 index 0000000000..7b52198156 --- /dev/null +++ b/doc/etemplate2/assets/styles/docs.css @@ -0,0 +1,1422 @@ +: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: 860px; + --docs-sidebar-width: 320px; + --docs-sidebar-transition-speed: 250ms; + --docs-content-toc-max-width: 260px; + --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; +} + +.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..f98b0ed701 --- /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[!DFILST]*/*.ts"], // There's something wrong with some widgets, they break the parser + /** Globs to exclude */ + exclude: ["*Date*"],//, 'et2_*.ts', '**/test/*', '**/*.styles.ts', '**/*.test.ts'], + dev: true, + 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..c0e5872ca4 --- /dev/null +++ b/doc/etemplate2/eleventy.config.cjs @@ -0,0 +1,280 @@ +/* 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} = 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 +fs.writeFileSync("_data/components.json", JSON.stringify(allComponents)); + +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, + cdndir, + npmdir + }); + + // + // Layout aliases + // + eleventyConfig.addLayoutAlias('default', 'default.njk'); + + // + // Copy EGw stuff in + // + eleventyConfig.addPassthroughCopy({"../../api/templates/default/images/logo.svg": "assets/images/logo.svg"}); + eleventyConfig.addPassthroughCopy({"../../pixelegg/css/monochrome.css": "assets/styles/monochrome.css"}); + //eleventyConfig.addPassthroughCopy({"../../api/js": "assets/scripts/chunks"}); + eleventyConfig.addPassthroughCopy({"../../api/js/etemplate/etemplate2.js": "assets/scripts/etemplate/etemplate2.js"}); + + // Shoelace + eleventyConfig.addPassthroughCopy({"../../node_modules/@shoelace-style/shoelace/dist/": "assets/shoelace/"}); + /* + eleventyConfig.addPassthroughCopy({"../../node_modules/@shoelace-style/shoelace/dist/shoelace-autoloader.js": "assets/shoelace/shoelace-autoloader.js"}); + eleventyConfig.addPassthroughCopy({"../../node_modules/@shoelace-style/shoelace/dist/themes/*": "assets/shoelace/themes/"}); + eleventyConfig.addPassthroughCopy({"../../node_modules/@shoelace-style/shoelace/dist/chunks/*": "assets/shoelace/chunks/"}); + eleventyConfig.addPassthroughCopy({"../../node_modules/@shoelace-style/shoelace/dist/assets/*": "assets/shoelace/assets/"}); + eleventyConfig.addPassthroughCopy({"../../node_modules/@shoelace-style/shoelace/dist/components/*": "assets/shoelace/components/"}); + */ + + // + // 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(/^Sl/, '')); + if (name === 'Qr Code') + { + name = 'QR Code'; + } // manual override + return name; + }); + + eleventyConfig.addFilter('removeSlPrefix', tagName => + { + return tagName.replace(/^sl-/, ''); + }); + + // + // 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/getting-started/styling.md b/doc/etemplate2/pages/getting-started/styling.md new file mode 100644 index 0000000000..3d3fcea985 --- /dev/null +++ b/doc/etemplate2/pages/getting-started/styling.md @@ -0,0 +1,26 @@ +## 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); + +} +``` diff --git a/doc/etemplate2/pages/getting-started/widgets.md b/doc/etemplate2/pages/getting-started/widgets.md new file mode 100644 index 0000000000..0f6f6e9a6a --- /dev/null +++ b/doc/etemplate2/pages/getting-started/widgets.md @@ -0,0 +1,28 @@ +## Widgets + +Widgets are the building blocks of our UI. +While there is some legacy mess, 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/). + +Automated widget testing is done using "web-test-runner" to run the tests, which 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. + +If you just want to use existing widgets, you can just put them in your .xet template file: + +```xml + + + + + +``` + +Rendered example template \ No newline at end of file diff --git a/doc/etemplate2/pages/index.md b/doc/etemplate2/pages/index.md new file mode 100644 index 0000000000..0ab24f0e0e --- /dev/null +++ b/doc/etemplate2/pages/index.md @@ -0,0 +1,18 @@ +--- +meta: + title: 'EGroupware' + description: Web based groupware server +toc: false +--- + +EGroupware Etemplate development docs + +## Quick Start + +EGroupware UI is created from templates stored in <app>/templates/default/*.xet files. +The templates are composed of widget tags. +If this works, here is a box: + +```html:preview +Box content +``` \ No newline at end of file diff --git a/doc/scripts/build.mjs b/doc/scripts/build.mjs new file mode 100644 index 0000000000..0566a35301 --- /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']; + + 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 + './src/shoelace.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: cdndir, + 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/package-lock.json b/package-lock.json index c84b3c8262..e2deee6a20 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": { "": { @@ -23,11 +23,13 @@ "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,12 +41,34 @@ "@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" }, @@ -52,6 +76,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.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -1264,6 +1541,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", @@ -1750,6 +2051,198 @@ "@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-jsx/node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "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-react-pure-annotations/node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "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", @@ -2010,6 +2503,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", @@ -2112,6 +2643,461 @@ "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", @@ -2143,6 +3129,18 @@ "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", @@ -2387,6 +3385,12 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "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", "resolved": "https://registry.npmjs.org/@lion/core/-/core-0.21.1.tgz", @@ -2790,6 +3794,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", @@ -2825,6 +3882,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", @@ -2850,6 +3913,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", @@ -2890,6 +3962,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", @@ -2902,6 +3984,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", @@ -2914,12 +4002,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", @@ -2960,6 +4077,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", @@ -2984,6 +4110,12 @@ "@types/istanbul-lib-report": "*" } }, + "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", "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", @@ -3021,6 +4153,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", @@ -3040,9 +4178,9 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "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": { @@ -3058,9 +4196,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "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": "*", @@ -3077,12 +4215,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", @@ -3112,6 +4265,15 @@ "@types/sinon": "*" } }, + "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.3", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", @@ -3256,6 +4418,16 @@ "node": ">=10.0.0" } }, + "node_modules/@web/dev-server-esbuild/node_modules/esbuild": { + "version": "0.12.29", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", + "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + } + }, "node_modules/@web/dev-server-rollup": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.9.tgz", @@ -3536,6 +4708,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", @@ -3630,6 +4831,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", @@ -3651,11 +4881,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", @@ -3687,6 +5087,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", @@ -3699,6 +5108,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", @@ -3714,6 +5203,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", @@ -3769,6 +5270,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", @@ -3778,6 +5288,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", @@ -3796,6 +5312,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", @@ -3811,6 +5357,21 @@ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, + "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", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", @@ -3820,6 +5381,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", @@ -3859,6 +5448,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", @@ -3884,6 +5485,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", @@ -3909,6 +5573,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", @@ -3931,6 +5732,313 @@ "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/browser-sync/node_modules/ua-parser-js": { + "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": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -3959,6 +6067,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", @@ -4045,6 +6159,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", @@ -4073,6 +6203,497 @@ } ] }, + "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/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, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.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/generator": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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-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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@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, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "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-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, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@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, + "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/@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, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cem/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/traverse": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", + "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.19", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/@babel/types": { + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cem/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cem/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/cem/node_modules/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 + }, + "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/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, + "engines": { + "node": ">=4" + } + }, + "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/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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", @@ -4098,6 +6719,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", @@ -4152,6 +6808,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", @@ -4164,6 +6829,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", @@ -4176,6 +6868,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", @@ -4225,6 +6996,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "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", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", @@ -4239,6 +7016,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", @@ -4355,6 +7144,15 @@ "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", @@ -4365,12 +7163,159 @@ "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", @@ -4401,6 +7346,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", @@ -4437,12 +7397,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", @@ -4459,9 +7575,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" @@ -4475,6 +7591,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", @@ -4499,6 +7621,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", @@ -4508,6 +7642,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", @@ -4547,6 +7768,24 @@ "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", @@ -4574,18 +7813,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", @@ -4598,6 +8050,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", @@ -4616,6 +8077,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", @@ -4629,13 +8221,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": { @@ -4662,6 +8299,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", @@ -4675,6 +8325,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", @@ -4705,6 +8385,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", @@ -4726,12 +8444,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", @@ -4767,10 +8693,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", @@ -4780,9 +8712,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", @@ -4792,6 +8730,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", @@ -4814,6 +8764,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", @@ -4826,6 +8806,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", @@ -4909,6 +8960,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", @@ -4930,6 +9001,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", @@ -4945,15 +9025,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, @@ -4979,6 +9085,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", @@ -4993,6 +9108,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", @@ -5046,6 +9173,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", @@ -5098,31 +9231,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", @@ -5308,6 +9455,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", @@ -5368,6 +9557,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", @@ -5389,12 +9594,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", @@ -5408,6 +9702,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", @@ -5433,6 +9742,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", @@ -5446,6 +9799,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", @@ -5479,14 +9841,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", @@ -5528,6 +9911,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", @@ -5541,6 +9933,30 @@ "node": ">=0.10.0" } }, + "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", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -5565,6 +9981,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", @@ -5580,10 +10006,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" @@ -5614,9 +10071,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" @@ -5625,6 +10082,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", @@ -5640,6 +10115,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", @@ -5652,6 +10172,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", @@ -5660,6 +10192,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", @@ -5696,6 +10244,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", @@ -5741,6 +10301,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", @@ -5798,6 +10367,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", @@ -5830,6 +10472,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", @@ -5849,6 +10497,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", @@ -5861,6 +10704,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", @@ -5873,6 +10728,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", @@ -5891,6 +10774,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", @@ -6013,6 +10914,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", @@ -6072,6 +10983,56 @@ "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.8.0", "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", @@ -6115,6 +11076,155 @@ "@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", @@ -6145,12 +11255,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", @@ -6169,6 +11319,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", @@ -6181,6 +11346,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", @@ -6237,12 +11417,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", @@ -6258,6 +11529,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", @@ -6267,6 +11544,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", @@ -6282,14 +11577,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" @@ -6337,6 +11641,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", @@ -6350,9 +11660,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": { @@ -6373,12 +11704,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", @@ -6388,6 +11781,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", @@ -6401,6 +11800,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", @@ -6443,6 +11858,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", @@ -6470,6 +11894,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", @@ -6479,6 +11915,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", @@ -6537,6 +12013,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", @@ -6549,6 +12031,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", @@ -6595,6 +12086,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", @@ -6650,6 +12284,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", @@ -6659,6 +12330,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", @@ -6682,6 +12369,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", @@ -6697,6 +12390,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", @@ -6715,6 +12450,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", @@ -6783,6 +12527,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", @@ -6833,6 +12586,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", @@ -6886,6 +12648,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", @@ -6898,6 +12750,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", @@ -6907,6 +12783,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", @@ -6918,12 +12818,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", @@ -6986,6 +13044,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", @@ -7015,6 +13079,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", @@ -7068,6 +13141,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", @@ -7148,6 +13271,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", @@ -7227,6 +13374,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", @@ -7323,6 +13498,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", @@ -7346,6 +13527,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", @@ -7358,6 +13545,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", @@ -7367,6 +13615,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", @@ -7376,12 +13766,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", @@ -7443,12 +13953,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": { @@ -7483,6 +13996,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", @@ -7516,12 +14150,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", @@ -7552,6 +14235,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", @@ -7582,14 +14331,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" @@ -7628,6 +14377,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", @@ -7649,6 +14416,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", @@ -7682,6 +14455,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", @@ -7727,6 +14509,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", @@ -7742,6 +14654,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", @@ -7772,6 +14690,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", @@ -7873,6 +14797,25 @@ "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", @@ -7945,6 +14888,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", @@ -7980,12 +14932,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", @@ -8039,6 +15064,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", @@ -8048,6 +15116,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", @@ -8076,6 +15543,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", @@ -8174,12 +15662,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", @@ -8208,6181 +15756,5 @@ "node": ">= 4.0.0" } } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@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.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", - "dev": true, - "requires": { - "@babel/types": "^7.21.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.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "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.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@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.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "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.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "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.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "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-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, - "requires": { - "@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" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.10", - "chalk": "^2.4.2" - } - }, - "@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, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@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, - "requires": { - "@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" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@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, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@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, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@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 - }, - "@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, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@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, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@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.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true - }, - "@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", - "dev": true - }, - "@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - } - }, - "@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - } - }, - "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/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-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, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "dependencies": { - "@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 - } - } - }, - "@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.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "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==" - }, - "@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==" - }, - "@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.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", - "requires": { - "@floating-ui/utils": "^0.1.1" - } - }, - "@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", - "requires": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" - } - }, - "@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" - }, - "@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/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/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/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" - } - }, - "@lit-labs/react": { - "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==", - "requires": {} - }, - "@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" - } - }, - "@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.1.1", - "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.1.1.tgz", - "integrity": "sha512-NkM/hj3Js6yXCU9WxhsyxRUdyqUUUl/BSvIluUMptQteUWGOJaoyP1iMbOMqO544DYMzBfnoCw66ZHkGuTdKgA==" - }, - "@shoelace-style/shoelace": { - "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==", - "requires": { - "@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.1.1", - "composed-offset-position": "^0.0.4", - "lit": "^2.7.5", - "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/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/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/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "peer": 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/react": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", - "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", - "peer": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@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/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "peer": true - }, - "@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/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" - }, - "@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 - }, - "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.30001460", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001460.tgz", - "integrity": "sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==", - "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-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, - "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==", - "dev": true - }, - "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==" - }, - "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==" - }, - "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" - } - }, - "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 - }, - "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-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.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", - "requires": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" - } - }, - "lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" - }, - "dependencies": { - "@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==" - } - } - }, - "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.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", - "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 - }, - "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 e6076e9af5..3250673783 100644 --- a/package.json +++ b/package.json @@ -7,15 +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", @@ -27,12 +30,34 @@ "@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" }, From 250e31ed530dd38edf36befd39e5ec40b85b84da Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 22 Sep 2023 15:03:37 -0600 Subject: [PATCH 28/41] Some more styling & docs --- doc/etemplate2/_includes/default.njk | 5 +- doc/etemplate2/_includes/sidebar.njk | 2 + doc/etemplate2/assets/styles/docs.css | 4 +- doc/etemplate2/pages/components/sandbox.md | 6 ++ .../pages/getting-started/widgets.md | 12 ++-- .../pages/tutorials/automatic-testing.md | 69 +++++++++++++++++++ .../pages/tutorials/creating-a-widget.md | 39 +++++++++++ 7 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 doc/etemplate2/pages/components/sandbox.md create mode 100644 doc/etemplate2/pages/tutorials/automatic-testing.md create mode 100644 doc/etemplate2/pages/tutorials/creating-a-widget.md diff --git a/doc/etemplate2/_includes/default.njk b/doc/etemplate2/_includes/default.njk index 363b23ae49..52764d27bf 100644 --- a/doc/etemplate2/_includes/default.njk +++ b/doc/etemplate2/_includes/default.njk @@ -29,8 +29,11 @@ + {# API Viewer Element #} + + {# EGroupware #} - + {# Shoelace #} diff --git a/doc/etemplate2/_includes/sidebar.njk b/doc/etemplate2/_includes/sidebar.njk index 96d97e2019..921035201b 100644 --- a/doc/etemplate2/_includes/sidebar.njk +++ b/doc/etemplate2/_includes/sidebar.njk @@ -21,6 +21,7 @@
    • Components

        +
      • Sandbox
      • {% for component in meta.components %}
      • @@ -33,6 +34,7 @@
      • Tutorials

        diff --git a/doc/etemplate2/assets/styles/docs.css b/doc/etemplate2/assets/styles/docs.css index 7b52198156..fcc676c282 100644 --- a/doc/etemplate2/assets/styles/docs.css +++ b/doc/etemplate2/assets/styles/docs.css @@ -3,10 +3,10 @@ --docs-border-color: var(--sl-color-neutral-200); --docs-border-width: 1px; --docs-border-radius: var(--sl-border-radius-medium); - --docs-content-max-width: 860px; + --docs-content-max-width: 100%; --docs-sidebar-width: 320px; --docs-sidebar-transition-speed: 250ms; - --docs-content-toc-max-width: 260px; + --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); 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/widgets.md b/doc/etemplate2/pages/getting-started/widgets.md index 0f6f6e9a6a..3a1054d54e 100644 --- a/doc/etemplate2/pages/getting-started/widgets.md +++ b/doc/etemplate2/pages/getting-started/widgets.md @@ -1,16 +1,12 @@ ## Widgets Widgets are the building blocks of our UI. -While there is some legacy mess, we are currently making all our +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/). +based on [Lit](https://lit.dev/docs/). Many of our widgets use [Shoelace](https://shoelace.style) components as building +blocks. -Automated widget testing is done using "web-test-runner" to run the tests, which 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. - -If you just want to use existing widgets, you can just put them in your .xet template file: +If you just want to use existing widgets, you can put them in your .xet template file: ```xml 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 From 20c93a0c7a06a90391ebfcfb9f5a5987ade0fac2 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 22 Sep 2023 15:29:44 -0600 Subject: [PATCH 29/41] Put CEM where api-viewer can find it --- doc/etemplate2/eleventy.config.cjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/etemplate2/eleventy.config.cjs b/doc/etemplate2/eleventy.config.cjs index c0e5872ca4..7f1976e7d4 100644 --- a/doc/etemplate2/eleventy.config.cjs +++ b/doc/etemplate2/eleventy.config.cjs @@ -24,9 +24,12 @@ const npmdir = 'dist'; const allComponents = getAllComponents(); let hasBuiltSearchIndex = false; -// Write component data to file, 11ty will pick it up and create pages +// Write component data to file, 11ty will pick it up and create pages - the name & location are important 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) { // From c5d3bb89ab629a1ba1611ac037467b61fb6039b1 Mon Sep 17 00:00:00 2001 From: ralf Date: Mon, 25 Sep 2023 09:43:21 +0200 Subject: [PATCH 30/41] * Notifications: aggregate messages by app:id to return only latest one, also added a cut-off date of 30 days and cleaning older messages --- .../inc/class.notifications_ajax.inc.php | 190 +++++++----------- .../inc/class.notifications_popup.inc.php | 121 +++++++---- 2 files changed, 156 insertions(+), 155 deletions(-) diff --git a/notifications/inc/class.notifications_ajax.inc.php b/notifications/inc/class.notifications_ajax.inc.php index 507516abd1..758da29b0b 100644 --- a/notifications/inc/class.notifications_ajax.inc.php +++ b/notifications/inc/class.notifications_ajax.inc.php @@ -15,7 +15,8 @@ use EGroupware\Api; /** * Ajax methods for notifications */ -class notifications_ajax { +class notifications_ajax +{ /** * Appname */ @@ -36,6 +37,11 @@ class notifications_ajax { */ const _type = 'base'; + /** + * Do NOT consider notifications older than this + */ + const CUT_OFF_DATE = '-30days'; + /** * holds account object for user to notify * @@ -64,22 +70,6 @@ class notifications_ajax { */ private $db; - /** - * holds the users session data - * - * @var array - */ - var $session_data; - - /** - * holds the users session data defaults - * - * @var array - */ - var $session_data_defaults = array( - 'notified_mail_uids' => array(), - ); - /** * the xml response object * @@ -98,15 +88,11 @@ class notifications_ajax { * constructor * */ - public function __construct() { + public function __construct() + { $this->response = Api\Json\Response::get(); $this->recipient = (object)$GLOBALS['egw']->accounts->read($GLOBALS['egw_info']['user']['account_id']); - $this->config = (object)Api\Config::read(self::_appname); - - $prefs = new Api\Preferences($this->recipient->account_id); - $this->preferences = $prefs->read(); - $this->db = $GLOBALS['egw']->db; $this->isPushServer = Api\Cache::getInstance('notifications', 'isPushServer', function () @@ -147,18 +133,9 @@ class notifications_ajax { * * @param array $notifymessages one or multiple notify_id(s) */ - public function delete_message($notifymessages) + public function delete_message(array $notifymessages) { - $notify_ids = $this->fetch_notify_ids($notifymessages); - if (!empty($notify_ids)) - { - $this->db->delete(self::_notification_table,array( - 'notify_id' => $notify_ids, - 'account_id' => $this->recipient->account_id, - 'notify_type' => self::_type - ),__LINE__,__FILE__,self::_appname); - } - $this->response->data(['deleted'=>$notify_ids]); + $this->update($notifymessages, null); // null = delete } /** @@ -172,80 +149,95 @@ class notifications_ajax { * this status has been used more specifically for browser type * of notifications. */ - public function update_status($notifymessages, $status = "SEEN") + public function update_status(array $notifymessages, $status = "SEEN") { - $notify_ids = $this->fetch_notify_ids($notifymessages); - if (!empty($notify_ids)) - { - $this->db->update(self::_notification_table,array('notify_status' => $status),array( - 'notify_id' => $notify_ids, - 'account_id' => $this->recipient->account_id, - 'notify_type' => self::_type - ),__LINE__,__FILE__,self::_appname); - } + $this->update($notifymessages, $status); } /** - * gets all relevant notify ids based on given notify message data - * @param $notifymessages + * Update or delete the given notification messages, incl. not explicitly mentioned ones with same app:id + * + * @param array $notifymessages + * @param string|null $status use null to delete * @return array */ - public function fetch_notify_ids ($notifymessages) + protected function update(array $notifymessages, $status='SEEN') { - $notify_ids = []; - + $notify_ids = $app_ids = []; foreach ($notifymessages as $data) { - if (is_array($data) && $data['id']) + if (is_array($data) && !empty($data['id'])) { - array_push($notify_ids, (string)$data['id']); - if (is_array($data['data'])) $notify_ids = array_unique(array_merge($notify_ids, $this->search_in_notify_data($data['data']['id'], $data['data']['app']))); + if (is_array($data['data'] ?? null) && !empty($data['data']['id'])) + { + $app_ids[$data['data']['app']][$data['data']['id']] = $data['data']['id']; + } + $notify_ids[] = $data['id']; } else { - array_push($notify_ids, (string)$data); + $notify_ids[] = $data; } - } - return $notify_ids; - } - - /** - * Fetches all notify_ids relevant to the entry - * @param $_id - * @param $_appname - * @return array - */ - public function search_in_notify_data($_id, $_appname) - { - $ret = []; - if ($_id && $_appname) - { - try { - // mariaDB supported query - $ret = $this->db->select(self::_notification_table, 'notify_id', array( + $cut_off = $this->db->quote(Api\DateTime::to(self::CUT_OFF_DATE, Api\DateTime::DATABASE)); + try { + // MariaDB code using JSON_EXTRACT() + foreach($app_ids as $app => $ids) + { + $where = [ 'account_id' => $this->recipient->account_id, 'notify_type' => self::_type, - 'notify_data->"$.appname"' => $_appname, - 'notify_data->"$.data.id"' => $_id - ), - __LINE__,__FILE__,0 ,'ORDER BY notify_id DESC',self::_appname); - } - catch (Api\Db\Exception $e) { - // do it manual for all other DB - foreach($this->db->select(self::_notification_table, '*', array( - 'account_id' => $this->recipient->account_id, - 'notify_type' => self::_type - ), - __LINE__,__FILE__,0 ,'ORDER BY notify_id DESC',self::_appname) as $row) + "JSON_EXTRACT(notify_data, '$.appname') = ".$this->db->quote($app), + "JSON_EXTRACT(notify_data, '$.data.id') IN (".implode(',', array_map([$this->db, 'quote'], array_unique($ids))).')', + 'notify_created > '.$cut_off, + ]; + if (isset($status)) { - $data = json_decode($row['notify_data'], true); - if ($data['appname'] == $_appname && $data['data']['id'] == $_id) $ret[] = $row['notify_id']; + $this->db->update(self::_notification_table, ['notify_status' => $status], $where, __LINE__, __FILE__, self::_appname); + } + else + { + $this->db->delete(self::_notification_table, $where, __LINE__, __FILE__, self::_appname); } } } - return $ret; + // other DBs + catch (Api\Db\Exception $e) { + foreach($this->db->select(self::_notification_table, 'notify_id,notify_data', [ + 'account_id' => $this->recipient->account_id, + 'notify_type' => self::_type, + 'notify_created > '.$cut_off, + "notify_data <> '[]'", // does not return NULL or '[]' rows + ]) as $row) + { + if (($data = json_decode($row['notify_data'], true)) && + isset($data['data']['id']) && in_array($data['data']['id'], $app_ids[$data['appname']] ?? [])) + { + $notify_ids[] = $row['notify_id']; + } + } + } + $where = [ + 'notify_id' => array_unique($notify_ids), + 'account_id' => $this->recipient->account_id, + 'notify_type' => self::_type + ]; + if (isset($status)) + { + $this->db->update(self::_notification_table, ['notify_status' => $status], $where, __LINE__, __FILE__, self::_appname); + } + else + { + $this->db->delete(self::_notification_table, $where, __LINE__, __FILE__, self::_appname); + } + + // cleanup messages older than our cut-off-date + $this->db->delete(self::_notification_table, [ + 'notification_created <= '.$cut_off, + 'notify_type' => self::_type + ], __LINE__, __FILE__, self::_appname); } + /** * gets all egwpopup notifications for calling user * @@ -257,30 +249,4 @@ class notifications_ajax { $this->response->apply('app.notifications.append', array($entries['rows']??[], $browserNotify, $entries['total']??0)); return true; } - - /** - * restores the users session data for notifications - * - * @return boolean true - */ - private function restore_session_data() { - $session_data = Api\Cache::getSession(self::_appname, 'session_data'); - if(is_array($session_data)) { - $this->session_data = $session_data; - } else { - $this->session_data = $this->session_data_defaults; - } - - return true; - } - - /** - * saves the users session data for notifications - * - * @return boolean true - */ - private function save_session_data() { - Api\Cache::setSession(self::_appname, 'session_data', $this->session_data); - return true; - } } \ No newline at end of file diff --git a/notifications/inc/class.notifications_popup.inc.php b/notifications/inc/class.notifications_popup.inc.php index 2c0f780416..3adccb5f5e 100644 --- a/notifications/inc/class.notifications_popup.inc.php +++ b/notifications/inc/class.notifications_popup.inc.php @@ -21,8 +21,8 @@ use EGroupware\Api; * out the table to look if there is a notificaton for this * client. The second stage is done in class.notifications_ajax.inc.php */ -class notifications_popup implements notifications_iface { - +class notifications_popup implements notifications_iface +{ /** * Appname */ @@ -120,13 +120,14 @@ class notifications_popup implements notifications_iface { * @param array $_user_sessions * @param array $_data */ - private function save($_message, $_data) { + private function save($_message, $_data) + { $result = $this->db->insert( self::_notification_table, array( 'account_id' => $this->recipient->account_id, 'notify_message' => $_message, 'notify_type' => self::_type, - 'notify_data' => is_array($_data) ? json_encode($_data) : NULL, - 'notify_created' => Api\DateTime::user2server('now'), + 'notify_data' => $_data && is_array($_data) ? json_encode($_data) : NULL, + 'notify_created' => new Api\DateTime(), ), false,__LINE__,__FILE__,self::_appname); if ($result === false) throw new Exception("Can't save notification into SQL table"); $push = new Api\Json\Push($this->recipient->account_id); @@ -136,50 +137,83 @@ class notifications_popup implements notifications_iface { /** - * read all notification messages for given recipient + * Read the 100 most recent notification messages for given recipient + * + * We use a cut-off-date of 30day, not returning anything older! + * * @param $_account_id + * @param int $num_rows * @return array */ - public static function read($_account_id) + public static function read($_account_id, int $num_rows=100) { if (!$_account_id) return []; - $rs = $GLOBALS['egw']->db->select(self::_notification_table, '*', array( - 'account_id' => $_account_id, - 'notify_type' => self::_type - ), - __LINE__,__FILE__,0 ,'ORDER BY notify_id DESC',self::_appname, 100); - // Fetch the total - $total = $GLOBALS['egw']->db->select(self::_notification_table, 'COUNT(*)', array( - 'account_id' => $_account_id, - 'notify_type' => self::_type - ), - __LINE__,__FILE__,0 ,'',self::_appname)->fetchColumn(); - $result = array(); - if ($rs->NumRows() > 0) { - foreach ($rs as $notification) { - $actions = null; - $data = json_decode($notification['notify_data'], true); - if (!empty($data['appname']) && !empty($data['data'])) - { - $_actions = Api\Hooks::process (array( - 'location' => 'notifications_actions', - 'data' => $data['data'] - ), $data['appname'], true); - $actions = $_actions[$data['appname']]; - } - $result[] = array( - 'id' => $notification['notify_id'], - 'message' => $notification['notify_message'], - 'status' => $notification['notify_status'], - 'created' => Api\DateTime::server2user($notification['notify_created']), - 'current' => new Api\DateTime('now'), - 'actions' => is_array($actions)?$actions:NULL, - 'extra_data' => $data['data'] ?? [], - ); + /** @var Api\Db $db */ + $db = $GLOBALS['egw']->db; + $result = []; + if (($total = $db->select(self::_notification_table, 'COUNT(*)', [ + 'account_id' => $_account_id, + 'notify_type' => self::_type, + 'notify_created > '.($cut_off=$db->quote(Api\DateTime::to(notifications_ajax::CUT_OFF_DATE, Api\DateTime::DATABASE))), + ], __LINE__, __FILE__, false, '', self::_appname)->fetchColumn())) + { + $n = 0; + $chunk_size = 150; + do + { + $notification = null; + foreach ($rs=$db->select(self::_notification_table, '*', [ + 'account_id' => $_account_id, + 'notify_type' => self::_type, + 'notify_created > ' . $cut_off, + ], __LINE__, __FILE__, $n, 'ORDER BY notify_id DESC', self::_appname, $chunk_size) as $notification) + { + $actions = null; + $data = json_decode($notification['notify_data'], true); + if (!empty($data['appname']) && !empty($data['data'])) + { + $_actions = Api\Hooks::process(array( + 'location' => 'notifications_actions', + 'data' => $data['data'] + ), $data['appname'], true); + $actions = $_actions[$data['appname']]; + } + $data = [ + 'id' => $notification['notify_id'], + 'message' => $notification['notify_message'], + 'status' => $notification['notify_status'], + 'created' => Api\DateTime::server2user($notification['notify_created']), + 'current' => new Api\DateTime('now'), + 'actions' => is_array($actions) ? $actions : NULL, + 'extra_data' => $data['data'] ?? [], + ]; + // aggregate by app:id reporting only the newest entry + if (!empty($data['extra_data']['id'])) + { + if (!isset($result[$id = $data['extra_data']['app'] . ':' . $data['extra_data']['id']])) + { + $result[$id] = $data; + } + else + { + $total--; + /* in case we want to show all + $result['id']['others'][] = $data; + */ + } + } + else + { + $result[] = $data; + } + } + $n += $chunk_size; } - return ['rows' => $result, 'total'=> $total]; + while(!$notification || count($result) < min($num_rows, $total)); + + return ['rows' => array_values($result), 'total'=> $total]; } } @@ -273,9 +307,10 @@ class notifications_popup implements notifications_iface { * * @param settings array with keys account_id and new_owner (new_owner is optional) */ - public static function deleteaccount($settings) { + public static function deleteaccount($settings) + { $GLOBALS['egw']->db->delete( self::_notification_table, array( 'account_id' => $settings['account_id'] ),__LINE__,__FILE__,self::_appname); } -} +} \ No newline at end of file From 6d0a244452d7455b5df1e00f8d1f96ccea5f32fd Mon Sep 17 00:00:00 2001 From: ralf Date: Mon, 25 Sep 2023 11:29:56 +0200 Subject: [PATCH 31/41] fix wrong colum "notification_created" has to be "notify_created" --- notifications/inc/class.notifications_ajax.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notifications/inc/class.notifications_ajax.inc.php b/notifications/inc/class.notifications_ajax.inc.php index 758da29b0b..c0c65575db 100644 --- a/notifications/inc/class.notifications_ajax.inc.php +++ b/notifications/inc/class.notifications_ajax.inc.php @@ -233,7 +233,7 @@ class notifications_ajax // cleanup messages older than our cut-off-date $this->db->delete(self::_notification_table, [ - 'notification_created <= '.$cut_off, + 'notify_created <= '.$cut_off, 'notify_type' => self::_type ], __LINE__, __FILE__, self::_appname); } From 1d6caf5bdd550545ba91dcc9138ce3f212fc5e7f Mon Sep 17 00:00:00 2001 From: hadi Date: Mon, 25 Sep 2023 13:54:13 +0200 Subject: [PATCH 32/41] Fix sub categories styling --- api/templates/default/etemplate2.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/templates/default/etemplate2.css b/api/templates/default/etemplate2.css index 5c3c7df412..3b8969ada6 100644 --- a/api/templates/default/etemplate2.css +++ b/api/templates/default/etemplate2.css @@ -1431,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)); } From 8b5819094d18e7dff92cf7cd7d6de87ebdd313ba Mon Sep 17 00:00:00 2001 From: hadi Date: Mon, 25 Sep 2023 14:35:18 +0200 Subject: [PATCH 33/41] Fix broken fullEmail feature --- api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts index 32fec1bd8e..d393a0ef9f 100644 --- a/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts +++ b/api/js/etemplate/Et2Select/Select/Et2SelectEmail.ts @@ -211,8 +211,8 @@ export class Et2SelectEmail extends Et2Select ...option.classList, "et2-select-draggable": !this.readonly && this.allowFreeEntries && this.allowDragAndDrop })} - ?.fullEmail=${this.fullEmail} - ?.onlyEmail=${this.onlyEmail} + .fullEmail=${this.fullEmail} + .onlyEmail=${this.onlyEmail} ?removable=${!readonly} ?readonly=${readonly} ?editable=${isEditable} From e50457326948bd75353eadbc57b8f2eb0e0e70b0 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 08:22:41 -0600 Subject: [PATCH 34/41] Write down how this works while I remember --- doc/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 doc/README.md 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 From 5601897dbb56deb27cc8684d8aa0c400c2a4ebfb Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 08:50:36 -0600 Subject: [PATCH 35/41] Put additonal options to static select before the static options --- api/js/etemplate/Et2Select/StaticOptions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/js/etemplate/Et2Select/StaticOptions.ts b/api/js/etemplate/Et2Select/StaticOptions.ts index 21d78a8c17..99e7a6c2e8 100644 --- a/api/js/etemplate/Et2Select/StaticOptions.ts +++ b/api/js/etemplate/Et2Select/StaticOptions.ts @@ -67,7 +67,7 @@ export const Et2StaticSelectMixin = > return options; } // Merge & make sure result is unique - return [...new Map([...(this._static_options || []), ...options].map(item => + return [...new Map([...options, ...(this._static_options || [])].map(item => [item.value, item])).values()]; } From 735b52b38bcc9b6b41f04227d706beb182fa2693 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 09:37:48 -0600 Subject: [PATCH 36/41] Remove block_change_event It doesn't seem to be needed now, and is actually stopping the first user change from firing (change alarm time in calendar edit) --- api/js/etemplate/Et2Select/Et2Select.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/api/js/etemplate/Et2Select/Et2Select.ts b/api/js/etemplate/Et2Select/Et2Select.ts index 2430a89fc1..d768417fb3 100644 --- a/api/js/etemplate/Et2Select/Et2Select.ts +++ b/api/js/etemplate/Et2Select/Et2Select.ts @@ -64,7 +64,6 @@ export class Et2WidgetWithSelect extends RowLimitedMixin(Et2WidgetWithSelectMixi // @ts-ignore SlSelect styles is a single CSSResult, not an array, so TS complains export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) { - private _block_change_event : boolean = false; static get styles() { return [ @@ -298,14 +297,10 @@ export class Et2Select extends Et2WithSearchMixin(Et2WidgetWithSelect) _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); - } } /** @@ -366,7 +361,6 @@ 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); } From d33377e17d42a65cedd9ec49bfe96e0919433249 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 09:51:06 -0600 Subject: [PATCH 37/41] Fix date-duration did not show selected properly --- api/js/etemplate/Et2Date/Et2DateDuration.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/js/etemplate/Et2Date/Et2DateDuration.ts b/api/js/etemplate/Et2Date/Et2DateDuration.ts index 200a0b0641..a68eb5caa7 100644 --- a/api/js/etemplate/Et2Date/Et2DateDuration.ts +++ b/api/js/etemplate/Et2Date/Et2DateDuration.ts @@ -611,14 +611,14 @@ export class Et2DateDuration extends Et2InputWidget(FormControlMixin(LitElement) }; // It would be nice to use an et2-select here, but something goes weird with the styling return html` - + ${[...this.displayFormat].map((format : string) => html` ${this.time_formats[format]} ` )} - + `; } From 70be19cdfb619bc1ee96b1ea3bb482e223ccbaf0 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 10:16:32 -0600 Subject: [PATCH 38/41] Et2Select: Fix change event did not fire when free entry was added --- api/js/etemplate/Et2Select/SearchMixin.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/js/etemplate/Et2Select/SearchMixin.ts b/api/js/etemplate/Et2Select/SearchMixin.ts index 327ebcef45..a444d854b7 100644 --- a/api/js/etemplate/Et2Select/SearchMixin.ts +++ b/api/js/etemplate/Et2Select/SearchMixin.ts @@ -464,7 +464,7 @@ export const Et2WithSearchMixin = dedupeMixin( protected _noResultsTemplate() { - if(this._total_result_count !== 0) + if(this._total_result_count !== 0 || !this._searchInputNode?.value) { return nothing; } @@ -1294,7 +1294,7 @@ export const Et2WithSearchMixin = dedupeMixin( 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(), @@ -1315,6 +1315,7 @@ export const Et2WithSearchMixin = dedupeMixin( { this.value = text; } + 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")) From c30039cf880c15804a497e978946de4c96321eb3 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 10:24:36 -0600 Subject: [PATCH 39/41] Admin: Use appname for ACL edit, not the name of the application entry (eg: calendar vs event) --- admin/js/app.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/admin/js/app.ts b/admin/js/app.ts index b92d603280..7ac741940f 100644 --- a/admin/js/app.ts +++ b/admin/js/app.ts @@ -711,8 +711,7 @@ class AdminApp extends EgwApp sel_options.acl_appname = []; for(let app in acl_rights) { - sel_options.acl_appname.push({value: app, label: this.egw.lang( - this.egw.link_get_registry(app, 'entries') || app)}); + sel_options.acl_appname.push({value: app, label: app}); } // Sort list sel_options.acl_appname.sort(function(a,b) { From b999f0be9811c4ab1c9301c39854a8abf905bf27 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 25 Sep 2023 10:35:26 -0600 Subject: [PATCH 40/41] Update @web/dev-server-esbuild version, lesser versions fial on Hadi's machine --- package-lock.json | 503 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 467 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2deee6a20..9aadfc3768 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "@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", @@ -4403,29 +4403,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.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", + "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": { @@ -6016,29 +6464,6 @@ "node": ">=8" } }, - "node_modules/browser-sync/node_modules/ua-parser-js": { - "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": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "engines": { - "node": "*" - } - }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -14779,9 +15204,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": [ { @@ -14791,6 +15216,10 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "engines": { diff --git a/package.json b/package.json index 3250673783..f7f8c88906 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@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", From d7b6306d32b820618d73ee56288eb440d84ab3ba Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 26 Sep 2023 15:47:16 -0600 Subject: [PATCH 41/41] Fix column selection --- .../etemplate/Et2Nextmatch/ColumnSelection.ts | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/api/js/etemplate/Et2Nextmatch/ColumnSelection.ts b/api/js/etemplate/Et2Nextmatch/ColumnSelection.ts index 5292b747ee..6d7eb59c9b 100644 --- a/api/js/etemplate/Et2Nextmatch/ColumnSelection.ts +++ b/api/js/etemplate/Et2Nextmatch/ColumnSelection.ts @@ -45,6 +45,10 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) background-repeat: no-repeat; cursor: grab; } + + sl-menu-item::part(label), sl-menu-item::part(submenu-icon) { + cursor: initial; + } /* Change vertical alignment of CF checkbox line to up with title, not middle */ .custom_fields::part(base) { align-items: baseline; @@ -75,19 +79,17 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) { super(...args); - this.columnClickHandler = this.columnClickHandler.bind(this); this.handleSelectAll = this.handleSelectAll.bind(this); } connectedCallback() { super.connectedCallback(); - this.updateComplete.then(() => { this.sort = Sortable.create(this.shadowRoot.querySelector('sl-menu'), { ghostClass: 'ui-fav-sortable-placeholder', - draggable: 'sl-option.column', + draggable: 'sl-menu-item.column', dataIdAttr: 'value', direction: 'vertical', delay: 25 @@ -101,7 +103,7 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) - + ${repeat(this.__columns, (column) => column.id, (column) => this.rowTemplate(column))} `; } @@ -143,11 +145,11 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) return html``; } return html` - {item.checked = !checked}); + let checked = (this.shadowRoot.querySelector("sl-menu-item")).checked || false; + this.shadowRoot.querySelectorAll('sl-menu-item').forEach((item) => {item.checked = !checked}); } set columns(new_columns) @@ -229,7 +223,7 @@ export class Et2ColumnSelection extends Et2InputWidget(LitElement) { menuItem.querySelectorAll("[value][checked]").forEach((cf : SlMenuItem) => { - value.push(cf.value); + value.push(cf.value.replaceAll("___", " ")); }) } }