]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-17812 Upgrade intl to 6.2.5
authorstanislavh <stanislav.honcharov@sonarsource.com>
Thu, 16 Feb 2023 08:55:38 +0000 (09:55 +0100)
committersonartech <sonartech@sonarsource.com>
Mon, 20 Feb 2023 20:03:01 +0000 (20:03 +0000)
19 files changed:
server/sonar-web/package.json
server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavBgTaskNotif-test.tsx
server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/ComponentSourceSnippetGroupViewer-test.tsx
server/sonar-web/src/main/js/components/intl/DateFormatter.tsx
server/sonar-web/src/main/js/components/intl/DateFromNow.tsx
server/sonar-web/src/main/js/components/intl/DateTimeFormatter.tsx
server/sonar-web/src/main/js/components/intl/TimeFormatter.tsx
server/sonar-web/src/main/js/components/intl/__tests__/DateFormatter-test.tsx
server/sonar-web/src/main/js/components/intl/__tests__/DateFromNow-test.tsx
server/sonar-web/src/main/js/components/intl/__tests__/DateTimeFormatter-test.tsx
server/sonar-web/src/main/js/components/intl/__tests__/TimeFormatter-test.tsx
server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateFormatter-test.tsx.snap [deleted file]
server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateFromNow-test.tsx.snap [deleted file]
server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateTimeFormatter-test.tsx.snap [deleted file]
server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/TimeFormatter-test.tsx.snap [deleted file]
server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/dateUtils-test.ts [deleted file]
server/sonar-web/src/main/js/components/intl/__tests__/dateUtils-test.ts [new file with mode: 0644]
server/sonar-web/src/main/js/components/intl/dateUtils.ts
server/sonar-web/yarn.lock

index 62a5f9addda18c5ecf1a61a7cc313a28f0f67644..abcc49ffb9788aff3e7d959b48639f77bbf721b9 100644 (file)
@@ -27,7 +27,7 @@
     "react-dom": "16.14.0",
     "react-draggable": "4.4.5",
     "react-helmet-async": "1.3.0",
-    "react-intl": "3.12.1",
+    "react-intl": "6.2.5",
     "react-modal": "3.16.1",
     "react-router-dom": "6.7.0",
     "react-select": "5.7.0",
index 17e61354623a4d58bec6a3346aeab6cf288a3e39..b9386f3ea1fbeb7135b5e34349a56d103b4eda1c 100644 (file)
@@ -279,7 +279,7 @@ it.each([
         pathname: onBackgroudTaskPage ? '/project/background_tasks' : '/foo/bar',
       }),
     });
-    const messageProps = wrapper.find<FormattedMessage>(FormattedMessage).props();
+    const messageProps = wrapper.find(FormattedMessage).props();
 
     // Translation key.
     expect(messageProps.defaultMessage).toBe(expectedMessage);
index 9c97893afd89f15c88387f84a8b7c75a449cd396..a8ad63029d5c1da2d6aa736daf7e10e3836347d1 100644 (file)
@@ -177,7 +177,7 @@ it.each([
 
     await waitAndUpdate(wrapper);
 
-    expect(wrapper.find<FormattedMessage>(FormattedMessage).prop('id')).toEqual(expectedLabel);
+    expect(wrapper.find(FormattedMessage).prop('id')).toEqual(expectedLabel);
     expect(wrapper.find('ContextConsumer').exists()).toBe(false);
   }
 );
index 8f787ae6517457e6f85131056b93160d12bfd61c..f83b2cebf76182eaad221d18534b60ba2129547d 100644 (file)
@@ -43,7 +43,7 @@ export const longFormatterOption: FormatDateOptions = {
 export default function DateFormatter({ children, date, long }: DateFormatterProps) {
   return (
     <FormattedDate value={parseDate(date)} {...(long ? longFormatterOption : formatterOption)}>
-      {children}
+      {children ? (d) => <>{children(d)}</> : undefined}
     </FormattedDate>
   );
 }
index 5bafaa4cd8a241a8f90c015f65c19399b8e223f4..ca95cdb6c8a9cc3a6e1dfa752cd1dedd2cfc38bf 100644 (file)
@@ -58,7 +58,7 @@ export default function DateFromNow(props: DateFromNowProps) {
       {(formattedDate) => (
         <span title={formattedDate}>
           <FormattedRelativeTime {...relativeTimeProps}>
-            {children as FormattedRelativeTime['props']['children']}
+            {(d) => <>{children(d)}</>}
           </FormattedRelativeTime>
         </span>
       )}
index e8faa804a07a75f09863f6a45e64094318fbc064..6588210f500f777394101ef8e37c0579051d7cbc 100644 (file)
@@ -25,6 +25,7 @@ import { ParsableDate } from '../../types/dates';
 interface Props {
   children?: (formattedDate: string) => React.ReactNode;
   date: ParsableDate;
+  timeZone?: string;
 }
 
 export const formatterOption: FormatDateOptions = {
@@ -35,10 +36,10 @@ export const formatterOption: FormatDateOptions = {
   minute: 'numeric',
 };
 
-export default function DateTimeFormatter({ children, date }: Props) {
+export default function DateTimeFormatter({ children, date, ...rest }: Props) {
   return (
-    <FormattedDate value={parseDate(date)} {...formatterOption}>
-      {children}
+    <FormattedDate {...rest} value={parseDate(date)} {...formatterOption}>
+      {children ? (d) => <>{children(d)}</> : undefined}
     </FormattedDate>
   );
 }
index 036fdddbab63045fe9e9740e270fe967c7cb01e9..2834f11b6bd42792c80091a8791edbe62a40486c 100644 (file)
@@ -26,6 +26,7 @@ export interface TimeFormatterProps {
   children?: (formattedDate: string) => React.ReactNode;
   date: ParsableDate;
   long?: boolean;
+  timeZone?: string;
 }
 
 export const formatterOption: FormatDateOptions = { hour: 'numeric', minute: 'numeric' };
@@ -36,10 +37,14 @@ export const longFormatterOption: FormatDateOptions = {
   second: 'numeric',
 };
 
-export default function TimeFormatter({ children, date, long }: TimeFormatterProps) {
+export default function TimeFormatter({ children, date, long, ...rest }: TimeFormatterProps) {
   return (
-    <FormattedTime value={parseDate(date)} {...(long ? longFormatterOption : formatterOption)}>
-      {children}
+    <FormattedTime
+      {...rest}
+      value={parseDate(date)}
+      {...(long ? longFormatterOption : formatterOption)}
+    >
+      {children ? (d) => <>{children(d)}</> : undefined}
     </FormattedTime>
   );
 }
index 1e0ba86ea3ac14ad688bdbd9edb7bfc75d267f6f..bd752e1a9bd4cad9254f17c4a177fa389f5c895e 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { shallow } from 'enzyme';
+import { screen } from '@testing-library/react';
 import * as React from 'react';
+import { renderComponent } from '../../../helpers/testReactTestingUtils';
 import DateFormatter, { DateFormatterProps } from '../DateFormatter';
 
 it('should render correctly', () => {
-  expect(shallowRender()).toMatchSnapshot('standard');
-  expect(shallowRender({ long: true })).toMatchSnapshot('long');
+  renderDateFormatter({}, (formatted: string) => <span>{formatted}</span>);
+  expect(screen.getByText('Feb 20, 2020')).toBeInTheDocument();
+
+  renderDateFormatter({ long: true });
+  expect(screen.getByText('February 20, 2020')).toBeInTheDocument();
 });
 
-function shallowRender(overrides: Partial<DateFormatterProps> = {}) {
-  return shallow(
+function renderDateFormatter(
+  overrides: Partial<DateFormatterProps> = {},
+  children?: (d: string) => React.ReactNode
+) {
+  return renderComponent(
     <DateFormatter date={new Date('2020-02-20T20:20:20Z')} {...overrides}>
-      {(formatted) => <span>{formatted}</span>}
+      {children}
     </DateFormatter>
   );
 }
index 8c1c927da45c3cab06322975ce7bef86ee228ae7..e0eef0da53aedd59228a62c9972352ab8fdbfb02 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { shallow } from 'enzyme';
+import { screen } from '@testing-library/react';
 import * as React from 'react';
-import { FormattedRelativeTime, IntlProvider } from 'react-intl';
+import { renderComponent } from '../../../helpers/testReactTestingUtils';
 import DateFromNow, { DateFromNowProps } from '../DateFromNow';
-import DateTimeFormatter from '../DateTimeFormatter';
-
-const date = '2020-02-20T20:20:20Z';
 
 jest.mock('../dateUtils', () => ({
   getRelativeTimeProps: jest.fn().mockReturnValue({ value: -1, unit: 'year' }),
 }));
 
+const date = '2020-02-20T20:20:20Z';
+
 it('should render correctly', () => {
-  const wrapper = shallowRender();
+  renderDateFromNow({ date });
 
-  expect(wrapper).toMatchSnapshot();
-  expect(wrapper.find(DateTimeFormatter).props().children!(date)).toMatchSnapshot('children');
+  expect(screen.getByText('1 year ago')).toBeInTheDocument();
 });
 
-it('should render correctly when there is no date', () => {
-  const children = jest.fn();
-
-  shallowRender({ date: undefined }, children);
+it('should render correctly when there is no date or no children', () => {
+  renderDateFromNow({ date: undefined });
 
-  expect(children).toHaveBeenCalledWith('never');
+  expect(screen.getByText('never')).toBeInTheDocument();
 });
 
 it('should render correctly when the date is less than one hour in the past', () => {
@@ -50,27 +46,20 @@ it('should render correctly when the date is less than one hour in the past', ()
   const mockDateNow = jest
     .spyOn(Date, 'now')
     .mockImplementation(() => new Date(date) as unknown as number);
-  const children = jest.fn();
 
-  shallowRender({ date: veryCloseDate, hourPrecision: true }, children)
-    .dive() // into DateTimeFormatter
-    .dive() // into DateFormatter
-    .dive() // into rendering function
-    .find(FormattedRelativeTime)
-    .props().children!(date);
+  renderDateFromNow({ date: veryCloseDate, hourPrecision: true });
 
-  expect(children).toHaveBeenCalledWith('less_than_1_hour_ago');
+  expect(screen.getByText('less_than_1_hour_ago')).toBeInTheDocument();
   mockDateNow.mockRestore();
 });
 
-function shallowRender(overrides: Partial<DateFromNowProps> = {}, children: jest.Mock = jest.fn()) {
-  return shallow(
-    <IntlProvider defaultLocale="en-US" locale="en">
-      <DateFromNow date={date} {...overrides}>
-        {(formattedDate) => children(formattedDate)}
-      </DateFromNow>
-    </IntlProvider>
-  )
-    .dive() // into the ContextProvider generated by IntlProvider
-    .dive(); // into the DateFromNow we actually want to render
+function renderDateFromNow(
+  overrides: Partial<DateFromNowProps> = {},
+  children: jest.Mock = jest.fn((d) => <>{d}</>)
+) {
+  return renderComponent(
+    <DateFromNow date={date} {...overrides}>
+      {children}
+    </DateFromNow>
+  );
 }
index 2f2de9b3460962048843acd621fc6b9f8ef76a03..7caddd1f23e4a01f26b3517e0a505e4f156b3bff 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { shallow } from 'enzyme';
+import { screen } from '@testing-library/react';
 import * as React from 'react';
+import { renderComponent } from '../../../helpers/testReactTestingUtils';
 import DateTimeFormatter from '../DateTimeFormatter';
 
 it('should render correctly', () => {
-  expect(shallowRender()).toMatchSnapshot('standard');
+  renderDateTimeFormatter();
+  expect(screen.getByText('February 20, 2020, 8:20 PM')).toBeInTheDocument();
+
+  renderDateTimeFormatter((formatted: string) => <span>Nice date: {formatted}</span>);
+  expect(screen.getByText('Nice date: February 20, 2020, 8:20 PM')).toBeInTheDocument();
 });
 
-function shallowRender() {
-  return shallow(
-    <DateTimeFormatter date={new Date('2020-02-20T20:20:20Z')}>
-      {(formatted) => <span>{formatted}</span>}
+function renderDateTimeFormatter(children?: (d: string) => React.ReactNode) {
+  return renderComponent(
+    <DateTimeFormatter date={new Date('2020-02-20T20:20:20Z')} timeZone="UTC">
+      {children}
     </DateTimeFormatter>
   );
 }
index 4340f37afdea55b404471d6ee8d76aae265a4b60..8557b317c94db40fdc1a1ff09cc9164077d68282 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { shallow } from 'enzyme';
+import { screen } from '@testing-library/react';
 import * as React from 'react';
+import { renderComponent } from '../../../helpers/testReactTestingUtils';
 import TimeFormatter, { TimeFormatterProps } from '../TimeFormatter';
 
 it('should render correctly', () => {
-  expect(shallowRender()).toMatchSnapshot('standard');
-  expect(shallowRender({ long: true })).toMatchSnapshot('long');
+  renderTimeFormatter({}, (formatted: string) => <span>{formatted}</span>);
+  expect(screen.getByText('8:20 PM')).toBeInTheDocument();
+
+  renderTimeFormatter({ long: true });
+  expect(screen.getByText('8:20:20 PM')).toBeInTheDocument();
 });
 
-function shallowRender(overrides: Partial<TimeFormatterProps> = {}) {
-  return shallow(
-    <TimeFormatter date={new Date('2020-02-20T20:20:20Z')} {...overrides}>
-      {(formatted) => <span>{formatted}</span>}
+function renderTimeFormatter(
+  overrides: Partial<TimeFormatterProps> = {},
+  children?: (d: string) => React.ReactNode
+) {
+  return renderComponent(
+    <TimeFormatter date={new Date('2020-02-20T20:20:20Z')} timeZone="UTC" {...overrides}>
+      {children}
     </TimeFormatter>
   );
 }
diff --git a/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateFormatter-test.tsx.snap b/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateFormatter-test.tsx.snap
deleted file mode 100644 (file)
index 2f603c6..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`should render correctly: long 1`] = `
-<FormattedDate
-  day="numeric"
-  month="long"
-  value={2020-02-20T20:20:20.000Z}
-  year="numeric"
->
-  <Component />
-</FormattedDate>
-`;
-
-exports[`should render correctly: standard 1`] = `
-<FormattedDate
-  day="2-digit"
-  month="short"
-  value={2020-02-20T20:20:20.000Z}
-  year="numeric"
->
-  <Component />
-</FormattedDate>
-`;
diff --git a/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateFromNow-test.tsx.snap b/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateFromNow-test.tsx.snap
deleted file mode 100644 (file)
index f893ec9..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`should render correctly 1`] = `
-<DateTimeFormatter
-  date={2020-02-20T20:20:20.000Z}
->
-  <Component />
-</DateTimeFormatter>
-`;
-
-exports[`should render correctly: children 1`] = `
-<span
-  title="2020-02-20T20:20:20Z"
->
-  <FormattedRelativeTime
-    unit="year"
-    value={-1}
-  >
-    [Function]
-  </FormattedRelativeTime>
-</span>
-`;
diff --git a/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateTimeFormatter-test.tsx.snap b/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/DateTimeFormatter-test.tsx.snap
deleted file mode 100644 (file)
index c991112..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`should render correctly: standard 1`] = `
-<FormattedDate
-  day="numeric"
-  hour="numeric"
-  minute="numeric"
-  month="long"
-  value={2020-02-20T20:20:20.000Z}
-  year="numeric"
->
-  <Component />
-</FormattedDate>
-`;
diff --git a/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/TimeFormatter-test.tsx.snap b/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/TimeFormatter-test.tsx.snap
deleted file mode 100644 (file)
index 7c19be3..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`should render correctly: long 1`] = `
-<FormattedTime
-  hour="numeric"
-  minute="numeric"
-  second="numeric"
-  value={2020-02-20T20:20:20.000Z}
->
-  <Component />
-</FormattedTime>
-`;
-
-exports[`should render correctly: standard 1`] = `
-<FormattedTime
-  hour="numeric"
-  minute="numeric"
-  value={2020-02-20T20:20:20.000Z}
->
-  <Component />
-</FormattedTime>
-`;
diff --git a/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/dateUtils-test.ts b/server/sonar-web/src/main/js/components/intl/__tests__/__snapshots__/dateUtils-test.ts
deleted file mode 100644 (file)
index 9661ab3..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2023 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-import { getRelativeTimeProps } from '../../dateUtils';
-
-const mockDateNow = jest.spyOn(Date, 'now');
-
-describe('getRelativeTimeProps', () => {
-  mockDateNow.mockImplementation(() => new Date('2021-02-20T20:20:20Z').getTime());
-
-  it.each([
-    ['year', '2020-02-19T20:20:20Z', -1],
-    ['month', '2020-11-18T20:20:20Z', -3],
-    ['day', '2021-02-18T18:20:20Z', -2],
-  ])('should return the correct props for dates older than a %s', (unit, date, value) => {
-    expect(getRelativeTimeProps(date)).toEqual({ value, unit });
-  });
-
-  it('should return the correct props for dates from less than a day ago', () => {
-    expect(getRelativeTimeProps('2021-02-20T20:19:45Z')).toEqual({
-      value: -35,
-      unit: 'second',
-      updateIntervalInSeconds: 10,
-    });
-  });
-});
diff --git a/server/sonar-web/src/main/js/components/intl/__tests__/dateUtils-test.ts b/server/sonar-web/src/main/js/components/intl/__tests__/dateUtils-test.ts
new file mode 100644 (file)
index 0000000..2d651ce
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2023 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+import { getRelativeTimeProps } from '../dateUtils';
+
+const mockDateNow = jest.spyOn(Date, 'now');
+
+describe('getRelativeTimeProps', () => {
+  mockDateNow.mockImplementation(() => new Date('2021-02-20T20:20:20Z').getTime());
+
+  it.each([
+    ['year', '2020-02-19T20:20:20Z', -1],
+    ['month', '2020-11-18T20:20:20Z', -3],
+    ['day', '2021-02-18T18:20:20Z', -2],
+  ])('should return the correct props for dates older than a %s', (unit, date, value) => {
+    expect(getRelativeTimeProps(date)).toEqual({ value, unit });
+  });
+
+  it('should return the correct props for dates from less than a day ago', () => {
+    expect(getRelativeTimeProps('2021-02-20T20:19:45Z')).toEqual({
+      value: -35,
+      unit: 'second',
+      updateIntervalInSeconds: 10,
+    });
+  });
+});
index 110d4b57b27cb8a7efd7691d669f1db411e34e0f..513a423fb900c83d5b4a8b923914e6b26ceea490 100644 (file)
@@ -23,7 +23,7 @@ import {
   differenceInSeconds,
   differenceInYears,
 } from 'date-fns';
-import { FormattedRelativeTime } from 'react-intl';
+import { Props as FormattedRelativeTimeProps } from 'react-intl/src/components/relative';
 import { parseDate } from '../../helpers/dates';
 import { ParsableDate } from '../../types/dates';
 
@@ -31,7 +31,7 @@ const UPDATE_INTERVAL_IN_SECONDS = 10;
 
 export function getRelativeTimeProps(
   parsableDate: ParsableDate
-): Pick<FormattedRelativeTime['props'], 'unit' | 'value' | 'updateIntervalInSeconds'> {
+): Pick<FormattedRelativeTimeProps, 'unit' | 'value' | 'updateIntervalInSeconds'> {
   const date = parseDate(parsableDate);
   const y = differenceInYears(date, Date.now());
 
index c1d43e4a636aade7b7ff3f255e11935aa39c629c..6b354d93316f6046bc0f64e000f4ec98d7d6b421 100644 (file)
@@ -1297,46 +1297,94 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@formatjs/intl-displaynames@npm:^1.2.0":
-  version: 1.2.10
-  resolution: "@formatjs/intl-displaynames@npm:1.2.10"
+"@formatjs/ecma402-abstract@npm:1.14.3":
+  version: 1.14.3
+  resolution: "@formatjs/ecma402-abstract@npm:1.14.3"
   dependencies:
-    "@formatjs/intl-utils": ^2.3.0
-  checksum: 25320e00c383260c1c3c44bd8be017b8ebd1b1b7de4188d05934aa40b65adda02b102eba46bf4e01e06f9db79d2d8663a720afe7f2ee69495a3022055bea4810
+    "@formatjs/intl-localematcher": 0.2.32
+    tslib: ^2.4.0
+  checksum: 504ae9775094adec611aa0bbc6dadec2360ba30c13331f376feacd75b23f856ac1e45e3c88a572fb91ff917e726d0cc7e6e1b6c5b73af48f53896592362c91d5
   languageName: node
   linkType: hard
 
-"@formatjs/intl-listformat@npm:^1.4.1":
-  version: 1.4.8
-  resolution: "@formatjs/intl-listformat@npm:1.4.8"
+"@formatjs/fast-memoize@npm:1.2.7":
+  version: 1.2.7
+  resolution: "@formatjs/fast-memoize@npm:1.2.7"
   dependencies:
-    "@formatjs/intl-utils": ^2.3.0
-  checksum: 1e5b2ef45b7e0143fb4c809178aed00ad1d1dfbcba25c339bf54bdd5e35acee6c72a25bd30189812a3211103a58a7e0800e49bc3e973f89bc5e80c41da38f6e1
+    tslib: ^2.4.0
+  checksum: ba372a3e931bd99729d993f5b95aeb43e7d07b9f71e759722cc20c4e2faa0af11a942f0df9023a029b03230dc4dfad5354755be1e385c465750f63e4b3372b7b
   languageName: node
   linkType: hard
 
-"@formatjs/intl-relativetimeformat@npm:^4.5.9":
-  version: 4.5.16
-  resolution: "@formatjs/intl-relativetimeformat@npm:4.5.16"
+"@formatjs/icu-messageformat-parser@npm:2.1.14":
+  version: 2.1.14
+  resolution: "@formatjs/icu-messageformat-parser@npm:2.1.14"
   dependencies:
-    "@formatjs/intl-utils": ^2.3.0
-  checksum: 466268cb4f3c326b222cc0f79b176949d4cc79e29d11fe6e8d003b89b3495018728d55ba25189f3856b88c0f5657a57365f039504c32ea78a8fb555ff80e9580
+    "@formatjs/ecma402-abstract": 1.14.3
+    "@formatjs/icu-skeleton-parser": 1.3.18
+    tslib: ^2.4.0
+  checksum: 4d13230af075a353eef4725bee67d46bfc40f4873e561c141a2e62b91e377ffa7fffe61ee6df6bb187a00e15ab6fe242014958d51e4c6056032801178eb7e1c8
   languageName: node
   linkType: hard
 
-"@formatjs/intl-unified-numberformat@npm:^3.2.0":
-  version: 3.3.7
-  resolution: "@formatjs/intl-unified-numberformat@npm:3.3.7"
+"@formatjs/icu-skeleton-parser@npm:1.3.18":
+  version: 1.3.18
+  resolution: "@formatjs/icu-skeleton-parser@npm:1.3.18"
   dependencies:
-    "@formatjs/intl-utils": ^2.3.0
-  checksum: dae9c855d8b36b833ee9a71e63b13240dabc9b84ed13192411f06ac903a5c2fb002fd4736d7b71df73c4c776792255c7b2deedb94c5cddc12967fcb7c14f6133
+    "@formatjs/ecma402-abstract": 1.14.3
+    tslib: ^2.4.0
+  checksum: 19655c452ed3c45db07b03c90fbfe6172655b0babb9579f2d9397ca2b3c56e5e17a3beed1d13af12104313e6ed1f14976d7c996756f1a59c977d6f3228518fad
   languageName: node
   linkType: hard
 
-"@formatjs/intl-utils@npm:^2.2.0, @formatjs/intl-utils@npm:^2.3.0":
-  version: 2.3.0
-  resolution: "@formatjs/intl-utils@npm:2.3.0"
-  checksum: a7a6339dac796bccd738b3f0425863c79951156c5b61ed804869bd2ba064544badf3ec0bad576eb56fdbaf11585d99b8a089522a9b5829ba0f99a85d33222cfb
+"@formatjs/intl-displaynames@npm:6.2.3":
+  version: 6.2.3
+  resolution: "@formatjs/intl-displaynames@npm:6.2.3"
+  dependencies:
+    "@formatjs/ecma402-abstract": 1.14.3
+    "@formatjs/intl-localematcher": 0.2.32
+    tslib: ^2.4.0
+  checksum: 2e5fe38231858f66f44eb740a5e0576f98c9039b49ad81a02c4bcb62de6425e3951413c3fa487dd1ad42cd25c0b8d725adac6ceddf841f94b97ca22e753f3d56
+  languageName: node
+  linkType: hard
+
+"@formatjs/intl-listformat@npm:7.1.7":
+  version: 7.1.7
+  resolution: "@formatjs/intl-listformat@npm:7.1.7"
+  dependencies:
+    "@formatjs/ecma402-abstract": 1.14.3
+    "@formatjs/intl-localematcher": 0.2.32
+    tslib: ^2.4.0
+  checksum: 96b45bcf0e556c2829d40bf95a027fc3dca86abc99db2735d6030d744d28318ee21726357853794a31c6b6674e7ce5403d3519d4ea190004178d973b61ca9d06
+  languageName: node
+  linkType: hard
+
+"@formatjs/intl-localematcher@npm:0.2.32":
+  version: 0.2.32
+  resolution: "@formatjs/intl-localematcher@npm:0.2.32"
+  dependencies:
+    tslib: ^2.4.0
+  checksum: 477e18aabaf2e6e90fc12952a3cb6c0ebb40ad99414d6b9d2501c6348fbad58cacb433ec6630955cfd1491ea7630f32a9dc280bb27d0fb8a784251404a54140a
+  languageName: node
+  linkType: hard
+
+"@formatjs/intl@npm:2.6.3":
+  version: 2.6.3
+  resolution: "@formatjs/intl@npm:2.6.3"
+  dependencies:
+    "@formatjs/ecma402-abstract": 1.14.3
+    "@formatjs/fast-memoize": 1.2.7
+    "@formatjs/icu-messageformat-parser": 2.1.14
+    "@formatjs/intl-displaynames": 6.2.3
+    "@formatjs/intl-listformat": 7.1.7
+    intl-messageformat: 10.2.5
+    tslib: ^2.4.0
+  peerDependencies:
+    typescript: ^4.7
+  peerDependenciesMeta:
+    typescript:
+      optional: true
+  checksum: 1922ec1d63aed8f42bb09967fffbaa4f37f59a351dd34ccddf28b268d04b05a80c9a7790f61292cf97fec4d47e15177b52987a28b5fb10df96aed5f5008dfc5f
   languageName: node
   linkType: hard
 
@@ -2286,13 +2334,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/invariant@npm:^2.2.31":
-  version: 2.2.35
-  resolution: "@types/invariant@npm:2.2.35"
-  checksum: af1b624057c89789ed0917838fea3d42bb0c101cc22b829a24d8777c678be3bc79d6ae05992a13bdf607b94731262467a2e62a809602ea1f7eea5e8c2242660d
-  languageName: node
-  linkType: hard
-
 "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1":
   version: 2.0.1
   resolution: "@types/istanbul-lib-coverage@npm:2.0.1"
@@ -2864,7 +2905,7 @@ __metadata:
     react-dom: 16.14.0
     react-draggable: 4.4.5
     react-helmet-async: 1.3.0
-    react-intl: 3.12.1
+    react-intl: 6.2.5
     react-modal: 3.16.1
     react-router-dom: 6.7.0
     react-select: 5.7.0
@@ -6026,29 +6067,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"intl-format-cache@npm:^4.2.21":
-  version: 4.3.1
-  resolution: "intl-format-cache@npm:4.3.1"
-  checksum: d55581edaba0d083a3ff26a46e2ed953c434420918e61991db78140e3e0a7db14f924f195fcd0c01cf3de65cb18dda0c549d35f683e01dd8f062d27fe0524fae
-  languageName: node
-  linkType: hard
-
-"intl-messageformat-parser@npm:^3.6.4":
-  version: 3.6.4
-  resolution: "intl-messageformat-parser@npm:3.6.4"
-  dependencies:
-    "@formatjs/intl-unified-numberformat": ^3.2.0
-  checksum: 69e781b6fec47f1fe5b2dc9abba79ac74b8cb4e9b40da4acc3ef2e9c6140d3d90070fd2c055d16e48c3a8bce626bb1f547ad1e29df772aff468a377658e70e6e
-  languageName: node
-  linkType: hard
-
-"intl-messageformat@npm:^7.8.4":
-  version: 7.8.4
-  resolution: "intl-messageformat@npm:7.8.4"
+"intl-messageformat@npm:10.2.5":
+  version: 10.2.5
+  resolution: "intl-messageformat@npm:10.2.5"
   dependencies:
-    intl-format-cache: ^4.2.21
-    intl-messageformat-parser: ^3.6.4
-  checksum: a24fd5763c3aae450d97c4a67d95618d791f7a564996cbf6f1c4c5433c3c6fe0c141d967f94775bf9c0e70ce7791c66854987fa03a99a57f10c96186ddd90658
+    "@formatjs/ecma402-abstract": 1.14.3
+    "@formatjs/fast-memoize": 1.2.7
+    "@formatjs/icu-messageformat-parser": 2.1.14
+    tslib: ^2.4.0
+  checksum: 048d6e3e746bff5ea6d745c8cbc2d0049aadb42caf2bad0d47e0bcf9bede285ef48a1fbd3a87711b99587d270d2ab8d9488e51577b24a2227856cdf373dd25df
   languageName: node
   linkType: hard
 
@@ -8484,25 +8511,27 @@ __metadata:
   languageName: node
   linkType: hard
 
-"react-intl@npm:3.12.1":
-  version: 3.12.1
-  resolution: "react-intl@npm:3.12.1"
+"react-intl@npm:6.2.5":
+  version: 6.2.5
+  resolution: "react-intl@npm:6.2.5"
   dependencies:
-    "@formatjs/intl-displaynames": ^1.2.0
-    "@formatjs/intl-listformat": ^1.4.1
-    "@formatjs/intl-relativetimeformat": ^4.5.9
-    "@formatjs/intl-unified-numberformat": ^3.2.0
-    "@formatjs/intl-utils": ^2.2.0
+    "@formatjs/ecma402-abstract": 1.14.3
+    "@formatjs/icu-messageformat-parser": 2.1.14
+    "@formatjs/intl": 2.6.3
+    "@formatjs/intl-displaynames": 6.2.3
+    "@formatjs/intl-listformat": 7.1.7
     "@types/hoist-non-react-statics": ^3.3.1
-    "@types/invariant": ^2.2.31
+    "@types/react": 16 || 17 || 18
     hoist-non-react-statics: ^3.3.2
-    intl-format-cache: ^4.2.21
-    intl-messageformat: ^7.8.4
-    intl-messageformat-parser: ^3.6.4
-    shallow-equal: ^1.2.1
+    intl-messageformat: 10.2.5
+    tslib: ^2.4.0
   peerDependencies:
-    react: ^16.3.0
-  checksum: 4a9e9101d8d5bd60c73713b99bdad2deb2b6b21fd953f16165b5c4be64aafd503418e009736ba986ca75756c08ad41b80991090e222d80b2bebfefb027bf11eb
+    react: ^16.6.0 || 17 || 18
+    typescript: ^4.7
+  peerDependenciesMeta:
+    typescript:
+      optional: true
+  checksum: 826b6ed593b367ad0a375de4e84b3ca3c7334c6583dcf307bb90e9c45c79c7f85cf43f6d15d15b9827e1da1d13f807b802c252a6725d0af4bd5a3fd43cbd9879
   languageName: node
   linkType: hard
 
@@ -9059,13 +9088,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"shallow-equal@npm:^1.2.1":
-  version: 1.2.1
-  resolution: "shallow-equal@npm:1.2.1"
-  checksum: 4f1645cc516e7754c4438db687e1da439a5f29a7dba2ba90c5f88e5708aeb17bc4355ba45cad805b0e95dc898e37d8bf6d77d854919c7512f89939986cff8cd1
-  languageName: node
-  linkType: hard
-
 "shallowequal@npm:^1.1.0":
   version: 1.1.0
   resolution: "shallowequal@npm:1.1.0"
@@ -9692,6 +9714,13 @@ __metadata:
   languageName: node
   linkType: hard
 
+"tslib@npm:^2.4.0":
+  version: 2.5.0
+  resolution: "tslib@npm:2.5.0"
+  checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1
+  languageName: node
+  linkType: hard
+
 "tsutils@npm:^3.21.0":
   version: 3.21.0
   resolution: "tsutils@npm:3.21.0"