diff --git a/package.json b/package.json index a377460..820456b 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,6 @@ "dependencies": { "@ctrl/tinycolor": "^3.1.6", "@material/mwc-ripple": "^0.19.1", - "custom-card-helpers": "^1.9.0", "fast-copy": "^2.1.0", "home-assistant-js-websocket": "^8.2.0", "lit": "^2.7.6", diff --git a/src/action-handler.ts b/src/action-handler.ts index a7bd39f..10375e4 100644 --- a/src/action-handler.ts +++ b/src/action-handler.ts @@ -2,7 +2,7 @@ import { noChange } from 'lit-html'; // import '@material/mwc-ripple'; // tslint:disable-next-line import { Ripple } from '@material/mwc-ripple'; -import { myFireEvent } from './my-fire-event'; +import { fireEvent } from './common/fire-event'; import { deepEqual } from './deep-equal'; import { AttributePart, Directive, DirectiveParameters, directive } from 'lit-html/directive'; @@ -154,7 +154,7 @@ class ActionHandler extends HTMLElement implements ActionHandler { if (options.repeat && !this.isRepeating) { this.isRepeating = true; this.repeatTimeout = setInterval(() => { - myFireEvent(element, 'action', { action: 'hold' }); + fireEvent(element, 'action', { action: 'hold' }); }, options.repeat); } }, this.holdTime); @@ -186,21 +186,21 @@ class ActionHandler extends HTMLElement implements ActionHandler { } if (options.hasHold && this.held) { if (!options.repeat) { - myFireEvent(target, 'action', { action: 'hold' }); + fireEvent(target, 'action', { action: 'hold' }); } } else if (options.hasDoubleClick) { if ((ev.type === 'click' && (ev as MouseEvent).detail < 2) || !this.dblClickTimeout) { this.dblClickTimeout = window.setTimeout(() => { this.dblClickTimeout = undefined; - myFireEvent(target, 'action', { action: 'tap' }); + fireEvent(target, 'action', { action: 'tap' }); }, 250); } else { clearTimeout(this.dblClickTimeout); this.dblClickTimeout = undefined; - myFireEvent(target, 'action', { action: 'double_tap' }); + fireEvent(target, 'action', { action: 'double_tap' }); } } else { - myFireEvent(target, 'action', { action: 'tap' }); + fireEvent(target, 'action', { action: 'tap' }); } }; diff --git a/src/at_least_version.ts b/src/at_least_version.ts deleted file mode 100644 index 144803c..0000000 --- a/src/at_least_version.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const atLeastVersion = (version: string, major: number, minor: number): boolean => { - const [haMajor, haMinor] = version.split('.', 2); - return Number(haMajor) > major || (Number(haMajor) === major && Number(haMinor) >= minor); -}; diff --git a/src/button-card.ts b/src/button-card.ts index 4290bb2..c7fe570 100644 --- a/src/button-card.ts +++ b/src/button-card.ts @@ -9,7 +9,6 @@ import { styleMap, StyleInfo } from 'lit-html/directives/style-map'; import { unsafeHTML } from 'lit-html/directives/unsafe-html'; import { classMap, ClassInfo } from 'lit-html/directives/class-map'; import { HassEntity } from 'home-assistant-js-websocket'; -import { timerTimeRemaining, createThing, DOMAINS_TOGGLE, computeStateDomain } from 'custom-card-helpers'; import { LovelaceCard } from './types/lovelace'; import { ButtonCardConfig, @@ -36,17 +35,20 @@ import { getLovelaceCast, secondsToDuration, durationToSeconds, + computeStateDomain, } from './helpers'; +import { createThing } from './common/create-thing'; import { styles } from './styles'; -import { computeStateDisplay } from './compute_state_display'; +import { computeStateDisplay } from './common/compute_state_display'; import copy from 'fast-copy'; import * as pjson from '../package.json'; import { deepEqual } from './deep-equal'; -import { stateColorCss } from './state_color'; -import { ON } from './common/const'; +import { stateColorCss } from './common/state_color'; +import { ON, DOMAINS_TOGGLE } from './common/const'; import { handleAction } from './handle-action'; -import { myFireEvent } from './my-fire-event'; +import { fireEvent } from './common/fire-event'; import { HomeAssistant } from './types/homeassistant'; +import { timerTimeRemaining } from './common/timer'; let helpers = (window as any).cardHelpers; const helperPromise = new Promise(async (resolve) => { @@ -145,7 +147,7 @@ class ButtonCard extends LitElement { else { const element = createThing(config); helperPromise.then(() => { - myFireEvent(element, 'll-rebuild', {}); + fireEvent(element, 'll-rebuild', {}); }); return element; } diff --git a/src/compute_state_display.ts b/src/common/compute_state_display.ts similarity index 91% rename from src/compute_state_display.ts rename to src/common/compute_state_display.ts index f6684f8..a7e59c8 100644 --- a/src/compute_state_display.ts +++ b/src/common/compute_state_display.ts @@ -1,14 +1,19 @@ import { HassConfig, HassEntity } from 'home-assistant-js-websocket'; -import { LocalizeFunc } from 'custom-card-helpers'; -import { computeDomain, isNumericFromAttributes } from './helpers'; -import { formatNumber, getNumberFormatOptions, blankBeforePercent } from './common/format_number'; -import { EntityRegistryDisplayEntry, FrontendLocaleData, HomeAssistant, TimeZone } from './types/homeassistant'; -import { UNIT_TO_MILLISECOND_CONVERT, formatDuration } from './common/duration'; -import { formatDateTime } from './common/format_date_time'; -import { formatDate } from './common/format_date'; -import { formatTime } from './common/format_time'; -import { UPDATE_SUPPORT_PROGRESS, updateIsInstallingFromAttributes } from './common/update'; -import { supportsFeatureFromAttributes } from './common/supports-features'; +import { computeDomain, isNumericFromAttributes } from '../helpers'; +import { formatNumber, getNumberFormatOptions, blankBeforePercent } from './format_number'; +import { + LocalizeFunc, + EntityRegistryDisplayEntry, + FrontendLocaleData, + HomeAssistant, + TimeZone, +} from '../types/homeassistant'; +import { UNIT_TO_MILLISECOND_CONVERT, formatDuration } from './duration'; +import { formatDateTime } from './format_date_time'; +import { formatDate } from './format_date'; +import { formatTime } from './format_time'; +import { UPDATE_SUPPORT_PROGRESS, updateIsInstallingFromAttributes } from './update'; +import { supportsFeatureFromAttributes } from './supports-features'; const UNAVAILABLE = 'unavailable'; const UNKNOWN = 'unknown'; diff --git a/src/common/const.ts b/src/common/const.ts index 2231daf..6d70506 100644 --- a/src/common/const.ts +++ b/src/common/const.ts @@ -1,10 +1,10 @@ export const UNAVAILABLE = 'unavailable'; export const BINARY_STATE_ON = 'on'; export const BINARY_STATE_OFF = 'off'; -const arrayLiteralIncludes = (array: T) => ( - searchElement: unknown, - fromIndex?: number, -): searchElement is T[number] => array.includes(searchElement as T[number], fromIndex); +const arrayLiteralIncludes = + (array: T) => + (searchElement: unknown, fromIndex?: number): searchElement is T[number] => + array.includes(searchElement as T[number], fromIndex); export const UNKNOWN = 'unknown'; export const ON = 'on'; @@ -15,3 +15,5 @@ export const OFF_STATES = [UNAVAILABLE, UNKNOWN, OFF] as const; export const isUnavailableState = arrayLiteralIncludes(UNAVAILABLE_STATES); export const isOffState = arrayLiteralIncludes(OFF_STATES); + +export const DOMAINS_TOGGLE = new Set(['fan', 'input_boolean', 'light', 'switch', 'group', 'automation', 'humidifier']); diff --git a/src/common/create-thing.ts b/src/common/create-thing.ts new file mode 100644 index 0000000..36eec57 --- /dev/null +++ b/src/common/create-thing.ts @@ -0,0 +1,96 @@ +import { fireEvent } from './fire-event'; + +const SPECIAL_TYPES = new Set(['call-service', 'divider', 'section', 'weblink', 'cast', 'select']); +const DOMAIN_TO_ELEMENT_TYPE = { + alert: 'toggle', + automation: 'toggle', + climate: 'climate', + cover: 'cover', + fan: 'toggle', + group: 'group', + input_boolean: 'toggle', + input_number: 'input-number', + input_select: 'input-select', + input_text: 'input-text', + light: 'toggle', + lock: 'lock', + media_player: 'media-player', + remote: 'toggle', + scene: 'scene', + script: 'script', + sensor: 'sensor', + timer: 'timer', + switch: 'toggle', + vacuum: 'toggle', + // Temporary. Once climate is rewritten, + // water heater should get it's own row. + water_heater: 'climate', + input_datetime: 'input-datetime', +}; + +declare global { + // eslint-disable-next-line + interface HASSDomEvents { + 'll-rebuild': Record; + 'll-badge-rebuild': Record; + } +} + +export const createThing = (cardConfig, isRow = false) => { + const _createError = (error, config) => { + return _createThing('hui-error-card', { + type: 'error', + error, + config, + }); + }; + + const _createThing = (tag, config) => { + const element = window.document.createElement(tag); + try { + // Preventing an error-card infinity loop: https://github.com/custom-cards/custom-card-helpers/issues/54 + if (!element.setConfig) return; + element.setConfig(config); + } catch (err) { + console.error(tag, err); + return _createError((err as Error).message, config); + } + return element; + }; + + if (!cardConfig || typeof cardConfig !== 'object' || (!isRow && !cardConfig.type)) + return _createError('No type defined', cardConfig); + let tag = cardConfig.type; + if (tag && tag.startsWith('custom:')) { + tag = tag.substr('custom:'.length); + } else if (isRow) { + if (SPECIAL_TYPES.has(tag)) { + tag = `hui-${tag}-row`; + } else { + if (!cardConfig.entity) { + return _createError('Invalid config given.', cardConfig); + } + + const domain = cardConfig.entity.split('.', 1)[0]; + tag = `hui-${DOMAIN_TO_ELEMENT_TYPE[domain] || 'text'}-entity-row`; + } + } else { + tag = `hui-${tag}-card`; + } + + if (customElements.get(tag)) return _createThing(tag, cardConfig); + + // If element doesn't exist (yet) create an error + const element = _createError(`Custom element doesn't exist: ${cardConfig.type}.`, cardConfig); + element.style.display = 'None'; + const timer = setTimeout(() => { + element.style.display = ''; + }, 2000); + // Remove error if element is defined later + customElements.whenDefined(cardConfig.type).then(() => { + clearTimeout(timer); + fireEvent(element, 'll-rebuild', {}, element); + }); + + return element; +}; diff --git a/src/my-fire-event.ts b/src/common/fire-event.ts similarity index 97% rename from src/my-fire-event.ts rename to src/common/fire-event.ts index 4508d81..cadd95c 100644 --- a/src/my-fire-event.ts +++ b/src/common/fire-event.ts @@ -55,7 +55,7 @@ export interface HASSDomEvent extends Event { * @return {Event} The new event that was fired. */ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -export const myFireEvent = ( +export const fireEvent = ( node: HTMLElement | Window, type: HassEvent, detail?: HASSDomEvents[HassEvent], diff --git a/src/state_color.ts b/src/common/state_color.ts similarity index 90% rename from src/state_color.ts rename to src/common/state_color.ts index 63186d6..68d6ea8 100644 --- a/src/state_color.ts +++ b/src/common/state_color.ts @@ -1,11 +1,11 @@ /** Return an color representing a state. */ import { HassEntity } from 'home-assistant-js-websocket'; -import { UNAVAILABLE } from './common/const'; -import { computeGroupDomain, GroupEntity } from './helpers'; -import { computeCssVariable } from './helpers'; -import { computeDomain, slugify } from './helpers'; -import { batteryStateColorProperty } from './helpers'; -import { stateActive } from './helpers'; +import { UNAVAILABLE } from './const'; +import { computeGroupDomain, GroupEntity } from '../helpers'; +import { computeCssVariable } from '../helpers'; +import { computeDomain, slugify } from '../helpers'; +import { batteryStateColorProperty } from '../helpers'; +import { stateActive } from '../helpers'; const STATE_COLORED_DOMAIN = new Set([ 'alarm_control_panel', diff --git a/src/common/timer.ts b/src/common/timer.ts new file mode 100644 index 0000000..d89df25 --- /dev/null +++ b/src/common/timer.ts @@ -0,0 +1,17 @@ +import { HassEntity } from 'home-assistant-js-websocket'; +import { durationToSeconds } from '../helpers'; + +export const timerTimeRemaining = (stateObj: HassEntity): undefined | number => { + if (!stateObj.attributes.remaining) { + return undefined; + } + let timeRemaining = durationToSeconds(stateObj.attributes.remaining); + + if (stateObj.state === 'active') { + const now = new Date().getTime(); + const madeActive = new Date(stateObj.last_changed).getTime(); + timeRemaining = Math.max(timeRemaining - (now - madeActive) / 1000, 0); + } + + return timeRemaining; +}; diff --git a/src/handle-action.ts b/src/handle-action.ts index 90d9d41..9bcc96d 100644 --- a/src/handle-action.ts +++ b/src/handle-action.ts @@ -1,4 +1,4 @@ -import { myFireEvent } from './my-fire-event'; +import { fireEvent } from './common/fire-event'; import { ActionConfig } from './types/types'; import { HomeAssistant } from './types/homeassistant'; @@ -16,7 +16,7 @@ export const handleAction = async ( config: ActionConfigParams, action: string, ): Promise => { - myFireEvent(node, 'hass-action', { config, action }); + fireEvent(node, 'hass-action', { config, action }); }; type ActionParams = { config: ActionConfigParams; action: string }; diff --git a/src/helpers.ts b/src/helpers.ts index 1fc53bc..2d45b41 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -1,10 +1,16 @@ import { PropertyValues } from 'lit'; import tinycolor, { TinyColor } from '@ctrl/tinycolor'; -import { HomeAssistant, LovelaceConfig } from 'custom-card-helpers'; +import { HomeAssistant } from './types/homeassistant'; +import { LovelaceConfig } from './types/lovelace'; import { StateConfig } from './types/types'; import { HassEntity, HassEntityAttributeBase, HassEntityBase } from 'home-assistant-js-websocket'; import { OFF, UNAVAILABLE, isUnavailableState } from './common/const'; +export const atLeastVersion = (version: string, major: number, minor: number): boolean => { + const [haMajor, haMinor] = version.split('.', 2); + return Number(haMajor) > major || (Number(haMajor) === major && Number(haMinor) >= minor); +}; + export function computeDomain(entityId: string): string { return entityId.substr(0, entityId.indexOf('.')); } @@ -13,6 +19,8 @@ export function computeEntity(entityId: string): string { return entityId.substr(entityId.indexOf('.') + 1); } +export const computeStateDomain = (stateObj: HassEntity) => computeDomain(stateObj.entity_id); + export function getColorFromVariable(elt: Element, color: string): string { // eslint-disable-next-line @typescript-eslint/no-explicit-any const colorArray: string[] = []; diff --git a/yarn.lock b/yarn.lock index c063d23..f13b444 100644 --- a/yarn.lock +++ b/yarn.lock @@ -326,52 +326,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@formatjs/ecma402-abstract@1.11.4": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz#b962dfc4ae84361f9f08fbce411b4e4340930eda" - integrity sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw== - dependencies: - "@formatjs/intl-localematcher" "0.2.25" - tslib "^2.1.0" - -"@formatjs/fast-memoize@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz#e6f5aee2e4fd0ca5edba6eba7668e2d855e0fc21" - integrity sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg== - dependencies: - tslib "^2.1.0" - -"@formatjs/icu-messageformat-parser@2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz#a54293dd7f098d6a6f6a084ab08b6d54a3e8c12d" - integrity sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/icu-skeleton-parser" "1.3.6" - tslib "^2.1.0" - -"@formatjs/icu-skeleton-parser@1.3.6": - version "1.3.6" - resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz#4ce8c0737d6f07b735288177049e97acbf2e8964" - integrity sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - tslib "^2.1.0" - -"@formatjs/intl-localematcher@0.2.25": - version "0.2.25" - resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz#60892fe1b271ec35ba07a2eb018a2dd7bca6ea3a" - integrity sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA== - dependencies: - tslib "^2.1.0" - -"@formatjs/intl-utils@^3.8.4": - version "3.8.4" - resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-3.8.4.tgz#291baac91001db428fc3275c515a3e40fbe95945" - integrity sha512-j5C6NyfKevIxsfLK8KwO1C0vvP7k1+h4A9cFpc+cr6mEwCc1sPkr17dzh0Ke6k9U5pQccAQoXdcNBl3IYa4+ZQ== - dependencies: - emojis-list "^3.0.0" - "@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -2332,19 +2286,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -custom-card-helpers@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/custom-card-helpers/-/custom-card-helpers-1.9.0.tgz#dac7bb7a531101f4c83096b26a8be8ccad70d8c0" - integrity sha512-5IW4OXq3MiiCqDvqeu+MYsM1NmntKW1WfJhyJFsdP2tbzqEI4BOnqRz2qzdp08lE4QLVhYfRLwe0WAqgQVNeFg== - dependencies: - "@formatjs/intl-utils" "^3.8.4" - home-assistant-js-websocket "^6.0.1" - intl-messageformat "^9.11.1" - lit "^2.1.1" - rollup "^2.63.0" - superstruct "^0.15.3" - typescript "^4.5.4" - cyclist@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3" @@ -2631,11 +2572,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - encoding@^0.1.11, encoding@^0.1.12: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3870,11 +3806,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -home-assistant-js-websocket@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-6.1.1.tgz#87ba846753c4fb58a2e5ace6bb15a82689fd0735" - integrity sha512-TnZFzF4mn5F/v0XKUTK2GMQXrn/+eQpgaSDSELl6U0HSwSbFwRhGWLz330YT+hiKMspDflamsye//RPL+zwhDw== - home-assistant-js-websocket@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-8.2.0.tgz#3505bf004cc3026c5d0cfdae5c031a44b0fcb01b" @@ -4120,16 +4051,6 @@ internal-slot@^1.0.5: has "^1.0.3" side-channel "^1.0.4" -intl-messageformat@^9.11.1: - version "9.13.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.13.0.tgz#97360b73bd82212e4f6005c712a4a16053165468" - integrity sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw== - dependencies: - "@formatjs/ecma402-abstract" "1.11.4" - "@formatjs/fast-memoize" "1.2.1" - "@formatjs/icu-messageformat-parser" "2.1.0" - tslib "^2.1.0" - into-stream@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" @@ -5046,7 +4967,7 @@ lit-html@^2.7.0, lit-html@^2.7.5: dependencies: "@types/trusted-types" "^2.0.2" -lit@^2.1.1, lit@^2.7.6: +lit@^2.7.6: version "2.7.6" resolved "https://registry.yarnpkg.com/lit/-/lit-2.7.6.tgz#810007b876ed43e0c70124de91831921598b1665" integrity sha512-1amFHA7t4VaaDe+vdQejSVBklwtH9svGoG6/dZi9JhxtJBBlqY5D1RV7iLUYY0trCqQc4NfhYYZilZiVHt7Hxg== @@ -7253,7 +7174,7 @@ rollup-pluginutils@^2.8.2: dependencies: estree-walker "^0.6.1" -rollup@^2.33.1, rollup@^2.63.0: +rollup@^2.33.1: version "2.79.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7" integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== @@ -7913,11 +7834,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -superstruct@^0.15.3: - version "0.15.5" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" - integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -8182,7 +8098,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.5.3: +tslib@^2.5.3: version "2.6.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== @@ -8316,7 +8232,7 @@ typescript@^3.8.3, typescript@^3.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== -typescript@^4.0.5, typescript@^4.5.4: +typescript@^4.0.5: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==