Bump lokalize deps + support object format for args (#9155)

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
This commit is contained in:
Bram Kragten 2021-05-14 07:47:47 +02:00 committed by GitHub
parent 6a62f05657
commit 2ad2a4b198
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 124 additions and 134 deletions

View File

@ -34,8 +34,9 @@
"@codemirror/stream-parser": "^0.18.0", "@codemirror/stream-parser": "^0.18.0",
"@codemirror/text": "^0.18.0", "@codemirror/text": "^0.18.0",
"@codemirror/view": "^0.18.0", "@codemirror/view": "^0.18.0",
"@formatjs/intl-getcanonicallocales": "^1.4.6", "@formatjs/intl-getcanonicallocales": "^1.5.10",
"@formatjs/intl-pluralrules": "^3.4.10", "@formatjs/intl-locale": "^2.4.24",
"@formatjs/intl-pluralrules": "^4.0.18",
"@fullcalendar/common": "5.1.0", "@fullcalendar/common": "5.1.0",
"@fullcalendar/core": "5.1.0", "@fullcalendar/core": "5.1.0",
"@fullcalendar/daygrid": "5.1.0", "@fullcalendar/daygrid": "5.1.0",
@ -111,7 +112,7 @@
"hls.js": "^1.0.3", "hls.js": "^1.0.3",
"home-assistant-js-websocket": "^5.10.0", "home-assistant-js-websocket": "^5.10.0",
"idb-keyval": "^3.2.0", "idb-keyval": "^3.2.0",
"intl-messageformat": "^8.3.9", "intl-messageformat": "^9.6.13",
"js-yaml": "^3.13.1", "js-yaml": "^3.13.1",
"leaflet": "^1.7.1", "leaflet": "^1.7.1",
"leaflet-draw": "^1.0.4", "leaflet-draw": "^1.0.4",

View File

@ -3,7 +3,6 @@ import IntlMessageFormat from "intl-messageformat";
import { Resources } from "../../types"; import { Resources } from "../../types";
export type LocalizeFunc = (key: string, ...args: any[]) => string; export type LocalizeFunc = (key: string, ...args: any[]) => string;
interface FormatType { interface FormatType {
[format: string]: any; [format: string]: any;
} }
@ -13,10 +12,15 @@ export interface FormatsType {
time: FormatType; time: FormatType;
} }
let loadedPolyfillLocale: Set<string> | undefined;
let polyfillLoaded = !shouldPolyfill(); let polyfillLoaded = !shouldPolyfill();
const polyfillProm = polyfillLoaded const polyfillProm = polyfillLoaded
? undefined ? undefined
: import("@formatjs/intl-pluralrules/polyfill-locales").then(() => { : import("@formatjs/intl-locale/polyfill")
.then(() => import("@formatjs/intl-pluralrules/polyfill"))
.then(() => {
loadedPolyfillLocale = new Set();
polyfillLoaded = true; polyfillLoaded = true;
}); });
@ -51,6 +55,15 @@ export const computeLocalize = async (
await polyfillProm; await polyfillProm;
} }
if (loadedPolyfillLocale && !loadedPolyfillLocale.has(language)) {
try {
loadedPolyfillLocale.add(language);
await import("@formatjs/intl-pluralrules/locale-data/en");
} catch (_e) {
// Ignore
}
}
// Everytime any of the parameters change, invalidate the strings cache. // Everytime any of the parameters change, invalidate the strings cache.
cache._localizationCache = {}; cache._localizationCache = {};
@ -68,7 +81,9 @@ export const computeLocalize = async (
} }
const messageKey = key + translatedValue; const messageKey = key + translatedValue;
let translatedMessage = cache._localizationCache[messageKey]; let translatedMessage = cache._localizationCache[messageKey] as
| IntlMessageFormat
| undefined;
if (!translatedMessage) { if (!translatedMessage) {
translatedMessage = new IntlMessageFormat( translatedMessage = new IntlMessageFormat(
@ -79,37 +94,19 @@ export const computeLocalize = async (
cache._localizationCache[messageKey] = translatedMessage; cache._localizationCache[messageKey] = translatedMessage;
} }
const argObject = {}; let argObject = {};
if (args.length === 1 && typeof args[0] === "object") {
argObject = args[0];
} else {
for (let i = 0; i < args.length; i += 2) { for (let i = 0; i < args.length; i += 2) {
argObject[args[i]] = args[i + 1]; argObject[args[i]] = args[i + 1];
} }
}
try { try {
return translatedMessage.format(argObject); return translatedMessage.format<string>(argObject) as string;
} catch (err) { } catch (err) {
return "Translation " + err; return "Translation " + err;
} }
}; };
}; };
/**
* Silly helper function that converts an object of placeholders to array so we
* can convert it back to an object again inside the localize func.
* @param localize
* @param key
* @param placeholders
*/
export const localizeKey = (
localize: LocalizeFunc,
key: string,
placeholders?: Record<string, string>
) => {
const args: [string, ...string[]] = [key];
if (placeholders) {
Object.keys(placeholders).forEach((placeholderKey) => {
args.push(placeholderKey);
args.push(placeholders[placeholderKey]);
});
}
return localize(...args);
};

View File

@ -1,6 +1,5 @@
import { html } from "lit-element"; import { html } from "lit-element";
import { caseInsensitiveCompare } from "../../common/string/compare"; import { caseInsensitiveCompare } from "../../common/string/compare";
import { localizeKey } from "../../common/translations/localize";
import { import {
createConfigFlow, createConfigFlow,
deleteConfigFlow, deleteConfigFlow,
@ -52,8 +51,7 @@ export const showConfigFlowDialog = (
deleteFlow: deleteConfigFlow, deleteFlow: deleteConfigFlow,
renderAbortDescription(hass, step) { renderAbortDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${step.handler}.config.abort.${step.reason}`, `component.${step.handler}.config.abort.${step.reason}`,
step.description_placeholders step.description_placeholders
); );
@ -74,8 +72,7 @@ export const showConfigFlowDialog = (
}, },
renderShowFormStepDescription(hass, step) { renderShowFormStepDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${step.handler}.config.step.${step.step_id}.description`, `component.${step.handler}.config.step.${step.step_id}.description`,
step.description_placeholders step.description_placeholders
); );
@ -108,8 +105,7 @@ export const showConfigFlowDialog = (
}, },
renderExternalStepDescription(hass, step) { renderExternalStepDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${step.handler}.config.${step.step_id}.description`, `component.${step.handler}.config.${step.step_id}.description`,
step.description_placeholders step.description_placeholders
); );
@ -133,8 +129,7 @@ export const showConfigFlowDialog = (
}, },
renderCreateEntryDescription(hass, step) { renderCreateEntryDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${step.handler}.config.create_entry.${ `component.${step.handler}.config.create_entry.${
step.description || "default" step.description || "default"
}`, }`,
@ -170,8 +165,7 @@ export const showConfigFlowDialog = (
}, },
renderShowFormProgressDescription(hass, step) { renderShowFormProgressDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${step.handler}.config.progress.${step.progress_action}`, `component.${step.handler}.config.progress.${step.progress_action}`,
step.description_placeholders step.description_placeholders
); );

View File

@ -1,5 +1,4 @@
import { html } from "lit-element"; import { html } from "lit-element";
import { localizeKey } from "../../common/translations/localize";
import { ConfigEntry } from "../../data/config_entries"; import { ConfigEntry } from "../../data/config_entries";
import { import {
createOptionsFlow, createOptionsFlow,
@ -43,8 +42,7 @@ export const showOptionsFlowDialog = (
deleteFlow: deleteOptionsFlow, deleteFlow: deleteOptionsFlow,
renderAbortDescription(hass, step) { renderAbortDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${configEntry.domain}.options.abort.${step.reason}`, `component.${configEntry.domain}.options.abort.${step.reason}`,
step.description_placeholders step.description_placeholders
); );
@ -69,8 +67,7 @@ export const showOptionsFlowDialog = (
}, },
renderShowFormStepDescription(hass, step) { renderShowFormStepDescription(hass, step) {
const description = localizeKey( const description = hass.localize(
hass.localize,
`component.${configEntry.domain}.options.step.${step.step_id}.description`, `component.${configEntry.domain}.options.step.${step.step_id}.description`,
step.description_placeholders step.description_placeholders
); );

View File

@ -346,8 +346,7 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
? html`<div class="active-filters"> ? html`<div class="active-filters">
${this.hass.localize( ${this.hass.localize(
"ui.panel.config.integrations.disable.disabled_integrations", "ui.panel.config.integrations.disable.disabled_integrations",
"number", { number: disabledConfigEntries.size }
disabledConfigEntries.size
)} )}
<mwc-button <mwc-button
@click=${this._toggleShowDisabled} @click=${this._toggleShowDisabled}
@ -606,11 +605,9 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
const localize = await localizePromise; const localize = await localizePromise;
if ( if (
!(await showConfirmationDialog(this, { !(await showConfirmationDialog(this, {
title: localize( title: localize("ui.panel.config.integrations.confirm_new", {
"ui.panel.config.integrations.confirm_new", integration: domainToName(localize, domain),
"integration", }),
domainToName(localize, domain)
),
})) }))
) { ) {
return; return;

View File

@ -8,7 +8,6 @@ import {
property, property,
} from "lit-element"; } from "lit-element";
import { html, TemplateResult } from "lit-html"; import { html, TemplateResult } from "lit-html";
import { localizeKey } from "../../common/translations/localize";
import "../../components/ha-circular-progress"; import "../../components/ha-circular-progress";
import "../../components/ha-form/ha-form"; import "../../components/ha-form/ha-form";
import "../../components/ha-markdown"; import "../../components/ha-markdown";
@ -112,8 +111,7 @@ class HaMfaModuleSetupFlow extends LitElement {
? html` <ha-markdown ? html` <ha-markdown
allowsvg allowsvg
breaks breaks
.content=${localizeKey( .content=${this.hass.localize(
this.hass.localize,
`component.auth.mfa_setup.${this._step!.handler}.step.${ `component.auth.mfa_setup.${this._step!.handler}.step.${
(this._step! as DataEntryFlowStepForm).step_id (this._step! as DataEntryFlowStepForm).step_id
}.description`, }.description`,

View File

@ -87,11 +87,9 @@ class HaPanelProfile extends LitElement {
<div class="content"> <div class="content">
<ha-card .header=${this.hass.user!.name}> <ha-card .header=${this.hass.user!.name}>
<div class="card-content"> <div class="card-content">
${this.hass.localize( ${this.hass.localize("ui.panel.profile.current_user", {
"ui.panel.profile.current_user", fullName: this.hass.user!.name,
"fullName", })}
this.hass.user!.name
)}
${this.hass.user!.is_owner ${this.hass.user!.is_owner
? this.hass.localize("ui.panel.profile.is_owner") ? this.hass.localize("ui.panel.profile.is_owner")
: ""} : ""}

View File

@ -62,28 +62,31 @@ class HaRefreshTokens extends LitElement {
<span slot="heading" <span slot="heading"
>${this.hass.localize( >${this.hass.localize(
"ui.panel.profile.refresh_tokens.token_title", "ui.panel.profile.refresh_tokens.token_title",
"clientId", { clientId: token.client_id }
token.client_id
)} )}
</span> </span>
<div slot="description"> <div slot="description">
${this.hass.localize( ${this.hass.localize(
"ui.panel.profile.refresh_tokens.created_at", "ui.panel.profile.refresh_tokens.created_at",
"date", {
relativeTime(new Date(token.created_at), this.hass.localize) date: relativeTime(
new Date(token.created_at),
this.hass.localize
),
}
)} )}
</div> </div>
<div slot="description"> <div slot="description">
${token.last_used_at ${token.last_used_at
? this.hass.localize( ? this.hass.localize(
"ui.panel.profile.refresh_tokens.last_used", "ui.panel.profile.refresh_tokens.last_used",
"date", {
relativeTime( date: relativeTime(
new Date(token.last_used_at), new Date(token.last_used_at),
this.hass.localize this.hass.localize
), ),
"location", location: token.last_used_ip,
token.last_used_ip }
) )
: this.hass.localize( : this.hass.localize(
"ui.panel.profile.refresh_tokens.not_used" "ui.panel.profile.refresh_tokens.not_used"
@ -119,8 +122,7 @@ class HaRefreshTokens extends LitElement {
!(await showConfirmationDialog(this, { !(await showConfirmationDialog(this, {
text: this.hass.localize( text: this.hass.localize(
"ui.panel.profile.refresh_tokens.confirm_delete", "ui.panel.profile.refresh_tokens.confirm_delete",
"name", { name: token.client_name || token.client_id }
token.client_name || token.client_id
), ),
})) }))
) { ) {

118
yarn.lock
View File

@ -1101,40 +1101,60 @@
minimatch "^3.0.4" minimatch "^3.0.4"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
"@formatjs/ecma402-abstract@^1.2.5": "@formatjs/ecma402-abstract@1.7.1":
version "1.2.5" version "1.7.1"
resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.2.5.tgz#5a61ac1990ff2df8d1348ab12e186c1ca2a2bd71" resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.7.1.tgz#1459a9dad654d5d5ec34765965b8e4f22ad6ff81"
integrity sha512-k0fqS3LBNOHueAoMdgig8Ni6TchsH+zbzWBzX2gTFm50X9mxHwnuXdCk0XLlCIbvgVVlzcO254Men/mHAheMbg== integrity sha512-FjewVLB2DVEVCvvC7IMffzXVhysvi442i6ed0H7qcrT6xtUpO4vr0oZgpOmsv6D9I4Io0GVebIuySwteS/k3gg==
dependencies: dependencies:
tslib "^2.0.1" tslib "^2.1.0"
"@formatjs/intl-getcanonicallocales@^1.4.6": "@formatjs/fast-memoize@1.1.1":
version "1.4.6" version "1.1.1"
resolved "https://registry.yarnpkg.com/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.4.6.tgz#348a0b8dd87f2b0513a4942a6273c937dd91ead0" resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.1.1.tgz#3006b58aca1e39a98aca213356b42da5d173f26b"
integrity sha512-V54a+Ks02vke2CSmuGJ4GCvrdWfN105GSH7oZRoW5QSiwuac+fmxb5Qpu4002HetuRu0rrRTm+NMUTfZ1VB2xw== integrity sha512-mIqBr5uigIlx13eZTOPSEh2buDiy3BCdMYUtewICREQjbb4xarDiVWoXSnrERM7NanZ+0TAHNXSqDe6HpEFQUg==
"@formatjs/icu-messageformat-parser@2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.1.tgz#a3b542542b92958f1cdd090f1cb475cb7cb4e21a"
integrity sha512-GXHsATo6/9OMgrfAuyX86fYPMLeQXDN93TOKXQeW7A7ULCy9eEOp3beNwhrVFxaGIjVy/haLLqHMT36iyhwvCA==
dependencies: dependencies:
cldr-core "36.0.0" "@formatjs/ecma402-abstract" "1.7.1"
tslib "^2.0.1" "@formatjs/icu-skeleton-parser" "1.2.2"
tslib "^2.1.0"
"@formatjs/intl-pluralrules@^3.4.10": "@formatjs/icu-skeleton-parser@1.2.2":
version "3.4.10" version "1.2.2"
resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-3.4.10.tgz#7ed3b03190971f21d482cb0e46791d90783a74d3" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.2.2.tgz#6e9a6eff16e3c7b69d67d40b292d4b499e37228e"
integrity sha512-KcZZv38bu0pho9+9pMUOsCAi9/Kayh4+V5QZ/I9ps5OFSQlQaFMP5sX/zHBp41SsT6HxTfrPw5CHWpGrS75NQQ== integrity sha512-peBBPIiNzJdPsvEzFGCicD7ARvlcaUYOVZ5dljvzzcHqc5OHlH58OrUNWwYgxFS6Dnb3Ncy4qFwlTdPGTTvw1g==
dependencies: dependencies:
"@formatjs/ecma402-abstract" "^1.2.5" "@formatjs/ecma402-abstract" "1.7.1"
tslib "^2.0.1" tslib "^2.1.0"
"@formatjs/intl-unified-numberformat@^3.3.5": "@formatjs/intl-getcanonicallocales@1.5.10", "@formatjs/intl-getcanonicallocales@^1.5.10":
version "3.3.5" version "1.5.10"
resolved "https://registry.yarnpkg.com/@formatjs/intl-unified-numberformat/-/intl-unified-numberformat-3.3.5.tgz#b150c25eb56c1b09a03bf24fb5d1e394b945a27c" resolved "https://registry.yarnpkg.com/@formatjs/intl-getcanonicallocales/-/intl-getcanonicallocales-1.5.10.tgz#f57f12f19fd28a241767986b081331f8b26fb18b"
integrity sha512-LdRs9OoqG8Ah6wKKAcaq9wfeZ0w+Icway63thbbOam5DLY9G3u44NReFYWAmVSU+MXOQ+VPATMB9RUXGZxBdig== integrity sha512-tFqGxZ9HkAzphupybyCKdWHzL1ge/sY8TtzEK57Hs3RCxrv/y+VxIPrE+Izw2oCFowQBz76cyi0zT6PjHuWArA==
dependencies: dependencies:
"@formatjs/intl-utils" "^2.2.4" cldr-core "38"
tslib "^2.1.0"
"@formatjs/intl-utils@^2.2.4": "@formatjs/intl-locale@^2.4.24":
version "2.2.4" version "2.4.24"
resolved "https://registry.yarnpkg.com/@formatjs/intl-utils/-/intl-utils-2.2.4.tgz#fe62a96799d1f7dbe621fd38a4bd2e5a6a16cb0e" resolved "https://registry.yarnpkg.com/@formatjs/intl-locale/-/intl-locale-2.4.24.tgz#c3f9dba15653b79ac7b377bb048a35aeedfc234d"
integrity sha512-83fsJywew0o9wQsW3VuEp33HRiFd0qbQDyFFnwZCwk59eLZ33CtKyJ5ofKMrU2KK6hk1zaIdzisrZeoNfmI3Tw== integrity sha512-+JOwvBRFS/GFuJlWiWbfAzBng0A+ANoGV1LRseXK+4uzp4Sn35GD8M/dfgU1lp2R2dTWpYie2yyoHe4k4aHF6w==
dependencies:
"@formatjs/ecma402-abstract" "1.7.1"
"@formatjs/intl-getcanonicallocales" "1.5.10"
cldr-core "38"
tslib "^2.1.0"
"@formatjs/intl-pluralrules@^4.0.18":
version "4.0.18"
resolved "https://registry.yarnpkg.com/@formatjs/intl-pluralrules/-/intl-pluralrules-4.0.18.tgz#da4bda058cce5217691836c4f46ba3e9f25b0eeb"
integrity sha512-qRFITPsNoeXfsiGc97pp8mVgqcC7aQNuXsiJjY9LpXVTkYNfjUP4ZpbYXflM4xoWCXMJNz3ilsrQhZWXy9td5g==
dependencies:
"@formatjs/ecma402-abstract" "1.7.1"
tslib "^2.1.0"
"@fullcalendar/common@5.1.0", "@fullcalendar/common@~5.1.0": "@fullcalendar/common@5.1.0", "@fullcalendar/common@~5.1.0":
version "5.1.0" version "5.1.0"
@ -2568,11 +2588,6 @@
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a"
integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==
"@types/chai@^4.2.11":
version "4.2.11"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50"
integrity sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==
"@types/chrome@*": "@types/chrome@*":
version "0.0.119" version "0.0.119"
resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.119.tgz#12a2af96886d0c7210590928729ebf622eb67a58" resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.119.tgz#12a2af96886d0c7210590928729ebf622eb67a58"
@ -4779,10 +4794,10 @@ class-utils@^0.3.5:
isobject "^3.0.0" isobject "^3.0.0"
static-extend "^0.1.1" static-extend "^0.1.1"
cldr-core@36.0.0: cldr-core@38:
version "36.0.0" version "38.1.0"
resolved "https://registry.yarnpkg.com/cldr-core/-/cldr-core-36.0.0.tgz#1d2148ed6802411845baeeb21432d7bbfde7d4f7" resolved "https://registry.yarnpkg.com/cldr-core/-/cldr-core-38.1.0.tgz#3c400436b89110e2c0584469d51b7479ef0fa70c"
integrity sha512-QLnAjt20rZe38c8h8OJ9jPND+O4o5O8Nw0TK/P3KpNn1cmOhMu0rk6Kc3ap96c5OStQ9gAngs9+Be2sum26NOw== integrity sha512-Da9xKjDp4qGGIX0VDsBqTan09iR5nuYD2a/KkfEaUyqKhu6wFVNRiCpPDXeRbpVwPBY6PgemV8WiHatMhcpy4A==
clean-css@^4.2.1: clean-css@^4.2.1:
version "4.2.3" version "4.2.3"
@ -7773,28 +7788,14 @@ interpret@^2.2.0:
resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
intl-format-cache@^4.2.26: intl-messageformat@^9.6.13:
version "4.2.26" version "9.6.13"
resolved "https://registry.yarnpkg.com/intl-format-cache/-/intl-format-cache-4.2.26.tgz#ba5e2ee6cec25217f688b68ecdd58eec3703a827" resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.6.13.tgz#7c4ace385b3b8cc5010bfd774451ed0c50a73a9b"
integrity sha512-RalEzK89R3rJrOo7vcGY8h1WLypF1ZRQQldIsrQM6FTEPixvHb+pAEhd2QkdUk972hFjAEBJR02GdHhaEw9v2g== integrity sha512-F8OHdgdZYdY3O7TSkQtIGY1qBL7ttbbfIb6g9sgjLw1SQ9SlN3rlaUa1tv9RK3sX0qVkqNLqlPVuOfHlhXpm2Q==
dependencies: dependencies:
"@types/chai" "^4.2.11" "@formatjs/fast-memoize" "1.1.1"
chai "^4.2.0" "@formatjs/icu-messageformat-parser" "2.0.1"
tslib "^2.1.0"
intl-messageformat-parser@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-5.0.2.tgz#878c0d66459b366f4135a812007a873789875b95"
integrity sha512-7logOIMKQX4cWTAGdMSPdlzlGG2aGcpdTr/Laroi3/LTgXvYqMQ8fbC7DolygSEWUxbYrzDIuQsoQGJO6Kp8Gg==
dependencies:
"@formatjs/intl-unified-numberformat" "^3.3.5"
intl-messageformat@^8.3.9:
version "8.3.9"
resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-8.3.9.tgz#fa57e6f5abdd4b5ad03dd767c965435bd38cbd78"
integrity sha512-WHIopaMiZ14UJ76d14FfqbeNE3knGJT7pJg6eJVxh1G5ziL656BqfQk6dYxPZ2VvoaY7wnT3dLlIXy1MTE0blw==
dependencies:
intl-format-cache "^4.2.26"
intl-messageformat-parser "^5.0.2"
into-stream@^4.0.0: into-stream@^4.0.0:
version "4.0.0" version "4.0.0"
@ -12532,6 +12533,11 @@ tslib@^2.0.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
tslib@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
tsparticles@^1.19.2: tsparticles@^1.19.2:
version "1.19.2" version "1.19.2"
resolved "https://registry.yarnpkg.com/tsparticles/-/tsparticles-1.19.2.tgz#056d26149e67155e99efbfb1ea8f521fcc66520c" resolved "https://registry.yarnpkg.com/tsparticles/-/tsparticles-1.19.2.tgz#056d26149e67155e99efbfb1ea8f521fcc66520c"