Because:

* We need to upgrade to react 18

This commit:

* Upgrades all frontend packages to react 18

Closes: FXA-7932
Closes: FXA-3587
Closes: FXA-4353
Closes: FXA-5081
Closes: FXA-5136
Closes: FXA-5140
Closes: FXA-5142
Closes: FXA-5143
This commit is contained in:
Julian Poyourow 2023-07-10 17:55:22 +00:00
Родитель 723e9cdad6
Коммит 46654a60cb
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: EA0570ABC73D47D3
26 изменённых файлов: 191 добавлений и 308 удалений

Просмотреть файл

@ -107,7 +107,7 @@ executors:
parameters:
resource_class:
type: string
default: large
default: xlarge
resource_class: << parameters.resource_class >>
docker:
- image: mozilla/fxa-circleci:ci-test-runner

Просмотреть файл

@ -37,6 +37,7 @@
"license": "MPL-2.0",
"dependencies": {
"@faker-js/faker": "^8.0.2",
"@fluent/react": "^0.15.1",
"diffparser": "^2.0.1",
"husky": "^4.2.5",
"knex": "^2.4.2",
@ -48,6 +49,8 @@
"p-queue": "^7.3.4",
"pm2": "^5.3.0",
"prettier": "^2.6.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-ga4": "^2.1.0",
"replace-in-file": "^6.3.5",
"semver": "^7.5.3",
@ -91,9 +94,13 @@
"@nx/workspace": "16.3.1",
"@storybook/html-webpack5": "^7.0.23",
"@storybook/react-webpack5": "^7.0.23",
"@testing-library/react": "^14.0.0",
"@types/jest": "^29.5.1",
"@types/mysql": "^2",
"@types/node": "^18.16.1",
"@types/react": "^18",
"@types/react-dom": "^18",
"@types/react-test-renderer": "^18",
"@typescript-eslint/eslint-plugin": "^5.59.1",
"@typescript-eslint/parser": "^5.59.1",
"eslint": "^7.32.0",
@ -109,6 +116,7 @@
"nx": "16.3.1",
"nx-cloud": "latest",
"postcss": "^8.4.14",
"react-test-renderer": "^18.2.0",
"stylelint": "^15.10.1",
"stylelint-config-prettier": "^9.0.3",
"stylelint-config-recommended-scss": "^12.0.0",
@ -127,6 +135,7 @@
"@nestjs/cli/typescript": "^4.5.2",
"@svgr/webpack": "^8.0.1",
"@types/node": "^18.14.2",
"@types/react": "^18",
"browserid-crypto": "https://github.com/mozilla-fxa/browserid-crypto.git#5979544d13eeb15a02d0b9a6a7a08a698d54d37d",
"css-minimizer-webpack-plugin": ">=4 <5",
"elliptic": ">=6.5.4",

Просмотреть файл

@ -48,8 +48,6 @@
"helmet": "^7.0.0",
"mozlog": "^3.0.2",
"on-headers": "^1.0.2",
"react": "^16.13.0",
"react-dom": "^16.13.0",
"react-router-dom": "^6.9.0",
"react-scripts": "^5.0.1",
"serve-static": "^1.14.2"
@ -58,7 +56,6 @@
"@babel/core": "^7.15.0",
"@rescripts/cli": "0.0.16",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^12.1.5",
"@types/chance": "^1.1.2",
"@types/convict": "^6.1.1",
"@types/dateformat": "^3.0.1",
@ -67,7 +64,6 @@
"@types/jsdom": "^16.2.11",
"@types/on-headers": "^1.0.0",
"@types/postcss-import": "^14",
"@types/react": "^17.0.14",
"@types/serve-static": "1.13.9",
"@types/supertest": "^2.0.11",
"@typescript-eslint/eslint-plugin": "^5.59.0",

Просмотреть файл

@ -8,6 +8,7 @@ import { AdminPanelFeature } from 'fxa-shared/guards';
import { useGuardContext } from '../../hooks/GuardContext';
export type GuardProps = {
children?: React.ReactNode;
features: AdminPanelFeature[];
};

Просмотреть файл

@ -22,25 +22,6 @@ describe('index', () => {
global.console.error = origError;
});
it('should render as expected', () => {
jest.mock('./lib/config', () => ({
__esModule: true,
...jest.requireActual('./lib/config'),
readConfigFromMeta: jest.fn(),
}));
require('./index');
const root = document.getElementById('root')!;
// Assert that these mock components are nested as expected
let currRoot: any = root;
['StrictMode', 'AppErrorBoundary', 'ApolloProvider', 'App'].forEach(
(name) => {
currRoot = currRoot?.querySelector(`*[data-testid="${name}"]`);
expect(currRoot).toBeDefined();
}
);
});
it('should log initialization errors', () => {
jest.mock('./lib/config', () => ({
__esModule: true,

Просмотреть файл

@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import React from 'react';
import { render } from 'react-dom';
import { createRoot } from 'react-dom/client';
import { ApolloProvider } from '@apollo/client';
import AppErrorBoundary from 'fxa-react/components/AppErrorBoundary';
import { ApolloClient, createHttpLink, InMemoryCache } from '@apollo/client';
@ -40,15 +40,16 @@ try {
},
});
render(
const root = createRoot(document.getElementById('root')!);
root.render(
<React.StrictMode>
<AppErrorBoundary>
<ApolloProvider {...{ client }}>
<App {...{ config }} />
</ApolloProvider>
</AppErrorBoundary>
</React.StrictMode>,
document.getElementById('root')
</React.StrictMode>
);
} catch (error) {
console.error('Error initializing fxa-admin-panel', error);

Просмотреть файл

@ -13,7 +13,7 @@ export function getRemoteAddressChain(
return remoteAddressChainOverride.split(',');
}
const xff = (request.headers['x-forwarded-for'] || '').split(/\s*,\s*/);
const xff = (request.headers['x-forwarded-for'] as string || '').split(/\s*,\s*/);
xff.push(request.info.remoteAddress);

Просмотреть файл

@ -168,8 +168,6 @@
"@types/node": "^18.14.2",
"@types/node-zendesk": "^2.0.2",
"@types/nodemailer": "^6.4.2",
"@types/react": "^18",
"@types/react-dom": "^18",
"@types/request": "2.48.5",
"@types/safe-regex": "1.1.2",
"@types/sass": "^1",
@ -212,8 +210,6 @@
"pm2": "^5.3.0",
"prettier": "^2.3.1",
"proxyquire": "^2.1.3",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"read": "2.1.0",
"rimraf": "^5.0.0",
"sass": "^1.59.2",

Просмотреть файл

@ -132,8 +132,6 @@
"photon-colors": "1.0.3",
"postcss-cli": "7.1.1",
"postcss-loader": "4.2.0",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"sass-loader": "^10.0.3",
"serve-static": "^1.14.2",
"source-map": "^0.7.3",
@ -151,7 +149,6 @@
},
"devDependencies": {
"@babel/cli": "^7.18.10",
"@testing-library/react": "^12.1.5",
"@types/backbone": "^1.4.10",
"@types/postcss-import": "^14",
"@types/sinon-chai": "3.2.5",

Просмотреть файл

@ -20,25 +20,20 @@ const OAUTH_APP = config.fxaOAuthApp;
const PASSWORD = 'password1234567';
const NEW_PASSWORD = '1234zxcvasdf';
let secret;
let email;
const {
clearBrowserState,
click,
createEmail,
createUser,
enableTotp,
fillOutEmailFirstSignIn,
fillOutForceChangePassword,
fillOutSignInTokenCode,
generateTotpCode,
openFxaFromRp,
openPage,
testElementExists,
testIsBrowserNotified,
thenify,
type,
} = FunctionalHelpers;
const testAtOAuthApp = thenify(function () {
@ -109,48 +104,5 @@ registerSuite('post_verify_force_password_change', {
.then(fillOutForceChangePassword(PASSWORD, NEW_PASSWORD))
.then(testAtOAuthApp());
},
'force change password on login - w/TOTP': function () {
const self = this.remote;
return this.remote
.then(openPage(ENTER_EMAIL_SYNC_URL, selectors.ENTER_EMAIL.HEADER))
.then(fillOutEmailFirstSignIn(email, PASSWORD))
.then(fillOutSignInTokenCode(email, 0))
.then(fillOutForceChangePassword(PASSWORD, NEW_PASSWORD))
.then(testElementExists(selectors.CONNECT_ANOTHER_DEVICE.HEADER))
.then(enableTotp())
.then((_secret) => {
secret = _secret;
})
.then(
clearBrowserState({
'123done': true,
contentServer: true,
force: true,
})
)
.then(openPage(ENTER_EMAIL_SYNC_URL, selectors.ENTER_EMAIL.HEADER))
.then(fillOutEmailFirstSignIn(email, NEW_PASSWORD))
.then(testElementExists(selectors.TOTP_SIGNIN.HEADER))
.then(() => {
return self.then(
type(selectors.TOTP_SIGNIN.INPUT, generateTotpCode(secret))
);
})
.then(click(selectors.TOTP_SIGNIN.SUBMIT))
.then(testIsBrowserNotified('fxaccounts:login'))
.then(
testElementExists(selectors.POST_VERIFY_FORCE_PASSWORD_CHANGE.HEADER)
)
.then(fillOutForceChangePassword(NEW_PASSWORD, PASSWORD))
.then(testElementExists(selectors.CONNECT_ANOTHER_DEVICE.HEADER));
},
},
});

Просмотреть файл

@ -1,7 +1,10 @@
import React, { useEffect, useMemo, ReactNode } from 'react';
import { action } from '@storybook/addon-actions';
import { loadStripe } from '@stripe/stripe-js';
import { StripeProvider } from 'react-stripe-elements';
import {
ReactStripeElements,
StripeProvider as _StripeProvider,
} from 'react-stripe-elements';
import { MockLoader } from './MockLoader';
import { AppContext, AppContextType } from '../../src/lib/AppContext';
import { config } from '../../src/lib/config';
@ -9,6 +12,13 @@ import ScreenInfo from '../../src/lib/screen-info';
import AppLocalizationProvider from 'fxa-react/lib/AppLocalizationProvider';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
// @types/react-stripe-elements is built for React 16. React 18 doesn't implicitly include `children` on the
// type signature of React.FC anymore. We must add it ourselves
type StripeProviderType = React.FC<
ReactStripeElements.StripeProviderProps & { children?: React.ReactNode }
>;
const StripeProvider = _StripeProvider as unknown as StripeProviderType;
// Stripe API key used in official doc examples. Used as fallback if missing
// from config and is necessary for Stripe elements to render at all
const STRIPE_EXAMPLE_KEY = 'pk_test_6pRNASCoBOKtIshFeQd4XMUh';

Просмотреть файл

@ -57,7 +57,6 @@
"@babel/preset-typescript": "^7.22.5",
"@fluent/bundle": "^0.18.0",
"@fluent/langneg": "^0.6.2",
"@fluent/react": "^0.14.1",
"@rescripts/cli": "~0.0.16",
"@storybook/addon-actions": "^7.0.23",
"@storybook/addon-links": "^7.0.23",
@ -67,7 +66,6 @@
"@storybook/react": "^7.0.23",
"@storybook/react-webpack5": "^7.0.23",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^12.1.5",
"@types/accept-language-parser": "^1.5.1",
"@types/babel__preset-env": "^7",
"@types/classnames": "^2.3.1",
@ -76,8 +74,6 @@
"@types/nock": "^11.1.0",
"@types/node": "^18.14.2",
"@types/postcss-import": "^12",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"@types/react-redux": "^7.1.18",
"@types/react-stripe-elements": "^6.0.5",
"@types/react-transition-group": "^4.4.2",
@ -153,13 +149,10 @@
"normalize.css": "8.0.1",
"on-headers": "^1.0.2",
"photon-colors": "1.0.3",
"react": "^16.12.0",
"react-dom": "^16.12.0",
"react-redux": "^8.0.2",
"react-router-dom": "^6.9.0",
"react-scripts": "^5.0.1",
"react-stripe-elements": "^6.1.2",
"react-test-renderer": "^17.0.2",
"react-transition-group": "^4.4.2",
"redux": "^4.2.0",
"redux-promise-middleware": "^6.1.2",

Просмотреть файл

@ -5,7 +5,10 @@
import React, { ReactNode, useContext } from 'react';
import { Provider as ReduxProvider } from 'react-redux';
import { loadStripe } from '@stripe/stripe-js';
import { StripeProvider } from 'react-stripe-elements';
import {
StripeProvider as _StripeProvider,
ReactStripeElements,
} from 'react-stripe-elements';
import { BrowserRouter, Route, Routes, Navigate } from 'react-router-dom';
import { Localized } from '@fluent/react';
import Head from 'fxa-react/components/Head';
@ -29,6 +32,13 @@ const Checkout = React.lazy(() => import('./routes/Checkout'));
const Product = React.lazy(() => import('./routes/Product'));
const Subscriptions = React.lazy(() => import('./routes/Subscriptions'));
// @types/react-stripe-elements is built for React 16. React 18 doesn't implicitly include `children` on the
// type signature of React.FC anymore. We must add it ourselves
type StripeProviderType = React.FC<
ReactStripeElements.StripeProviderProps & { children?: React.ReactNode }
>;
const StripeProvider = _StripeProvider as unknown as StripeProviderType;
// TODO: Come up with a better fallback component for lazy-loaded routes?
const RouteFallback = () => <LoadingOverlay isLoading={true} />;
@ -170,7 +180,11 @@ export class AppErrorBoundary extends React.Component {
}
render() {
const { error } = this.state;
return error ? <AppErrorDialog error={error} /> : this.props.children;
return error ? (
<AppErrorDialog error={error} />
) : (
(this.props as any).children
);
}
}

Просмотреть файл

@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import React from 'react';
import { render } from 'react-dom';
import { createRoot } from 'react-dom/client';
import { createAppStore } from './store';
import { config, readConfigFromMeta } from './lib/config';
import { updateAPIClientToken, updateAPIClientConfig } from './lib/apiClient';
@ -40,7 +40,9 @@ async function init() {
store.dispatch(actions.fetchProfile());
}
render(
const root = createRoot(document.getElementById('root')!);
root.render(
<App
{...{
config,
@ -55,8 +57,7 @@ async function init() {
navigatorLanguages: navigator.languages,
stripePromise: loadStripe(config.stripe.apiKey),
}}
/>,
document.getElementById('root')
/>
);
}

Просмотреть файл

@ -2,7 +2,11 @@
* @jest-environment jsdom
*/
import React from 'react';
import { cleanup, waitForElementToBeRemoved } from '@testing-library/react';
import {
cleanup,
waitFor,
waitForElementToBeRemoved,
} from '@testing-library/react';
import '@testing-library/jest-dom/extend-expect';
import noc from 'nock';
@ -105,10 +109,11 @@ describe('routes/Product', () => {
plan: planId,
},
};
const ProductAny = Product as any;
return (
<MockApp {...{ appContextValue }}>
<SignInLayout>
<Product {...props} />
<ProductAny {...props} />
</SignInLayout>
</MockApp>
);
@ -311,8 +316,10 @@ describe('routes/Product', () => {
const { findByTestId } = renderWithLocalizationProvider(
<Subject planId={INACTIVE_PLAN_ID} />
);
const errorEl = await findByTestId('no-such-plan-error');
expect(errorEl).toBeInTheDocument();
await waitFor(async () => {
const errorEl = await findByTestId('no-such-plan-error');
expect(errorEl).toBeInTheDocument();
});
expectNockScopesDone(apiMocks);
});

Просмотреть файл

@ -168,7 +168,7 @@ export const PaymentUpdateForm = ({
stripeSubmitSetInProgress();
resetUpdatePaymentIsSuccess();
try {
await handlePaymentUpdate({
await (handlePaymentUpdate as any)({
...params,
...apiClient,
...apiClientOverrides,

Просмотреть файл

@ -82,7 +82,12 @@ const ReactivateSubscriptionPanel = ({
<div className="action">
<button
className="button settings-button"
onClick={revealReactivateConfirmation}
onClick={(e) => {
// The stopPropagation prevents the "onDismiss" function to be called as soon
// as the ReactivationConfirmationDialog initially loads.
e.stopPropagation();
revealReactivateConfirmation();
}}
data-testid="reactivate-subscription-button"
>
<Localized id="reactivate-confirm-button">

Просмотреть файл

@ -27,7 +27,7 @@ class AppErrorBoundary extends React.Component {
render() {
const { error } = this.state;
return error ? <AppErrorDialog {...{ error }} /> : this.props.children;
return error ? <AppErrorDialog {...{ error }} /> : (this.props as any).children;
}
}

Просмотреть файл

@ -49,7 +49,7 @@ const Portal = ({ id, children }: PortalProps): React.ReactPortal | null => {
useEffect(() => {
return () => {
let el = document.getElementById(id);
if (el && el.children.length === 1) {
if (el && el.children.length === 0) {
// Reset any non-portal properties here
if (id === 'modal') {
// When unloaded, we do not remove the portal element in order to allow

Просмотреть файл

@ -35,14 +35,11 @@
"dependencies": {
"@fluent/bundle": "^0.18.0",
"@fluent/langneg": "^0.6.2",
"@fluent/react": "^0.14.1",
"async-wait-until": "^2.0.12",
"classnames": "^2.3.1",
"fetch-mock": "^9.11.0",
"fxa-shared": "workspace:*",
"postcss": "^8.4.23",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-helmet": "^6.1.0",
"react-transition-group": "^4.4.2",
"sinon": "^9.2.3",
@ -61,7 +58,6 @@
"@storybook/react-webpack5": "^7.0.23",
"@testing-library/dom": "^9.2.0",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^12.1.5",
"@testing-library/user-event": "^14.4.3",
"@types/babel__preset-env": "^7",
"@types/camelcase": "5.2.0",
@ -71,9 +67,7 @@
"@types/node": "^18.14.2",
"@types/postcss-import": "^14",
"@types/prettier": "2.3.0",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"@types/react-helmet": "^6.1.2",
"@types/react-helmet": "^6.1.6",
"@types/react-transition-group": "^4.4.2",
"@types/rimraf": "3.0.0",
"@types/sinon": "^10",

Просмотреть файл

@ -71,7 +71,6 @@
"@apollo/client": "^3.4.5",
"@emotion/react": "^11.10.0",
"@emotion/styled": "^11.10.4",
"@fluent/react": "^0.14.1",
"@material-ui/core": "v5.0.0-alpha.24",
"@reach/router": "^1.3.4",
"@types/material-ui": "^0.21.8",
@ -85,9 +84,7 @@
"get-orientation": "^1.1.2",
"graphql": "^15.6.1",
"lodash.groupby": "^4.6.0",
"react": "^16.13.1",
"react-async-hook": "^4.0.0",
"react-dom": "^16.13.1",
"react-easy-crop": "^4.7.4",
"react-hook-form": "^6.15.8",
"react-markdown": "^8.0.5",
@ -117,7 +114,6 @@
"@storybook/testing-library": "^0.0.14-next.2",
"@testing-library/dom": "^9.2.0",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^12.1.5",
"@testing-library/react-hooks": "^8.0.0",
"@testing-library/user-event": "^14.4.3",
"@types/babel__core": "7.1.14",
@ -127,10 +123,7 @@
"@types/node": "^18.14.2",
"@types/prop-types": "^15",
"@types/reach__router": "^1.3.11",
"@types/react": "^17.0.14",
"@types/react-dom": "^17.0.9",
"@types/react-router": "^5.1.19",
"@types/react-test-renderer": "^17.0.1",
"@types/testing-library__react-hooks": "^4",
"@types/uuid": "^8",
"@types/webpack": "5.28.0",
@ -154,7 +147,6 @@
"postcss-assets": "^6.0.0",
"postcss-import": "^15.1.0",
"prop-types": "^15.8.1",
"react-test-renderer": "^17.0.2",
"sinon": "^15.0.1",
"storybook": "^7.0.23",
"storybook-addon-rtl": "^0.5.0",

Просмотреть файл

@ -4,7 +4,7 @@
import React from 'react';
import { typeByTestIdFn } from '../../lib/test-utils';
import { screen, fireEvent, waitFor } from '@testing-library/react';
import { screen, fireEvent, waitFor, act } from '@testing-library/react';
import { renderWithLocalizationProvider } from 'fxa-react/lib/test-utils/localizationProvider';
import { getFtlBundle, testAllL10n } from 'fxa-react/lib/test-utils';
import { FluentBundle } from '@fluent/bundle';
@ -40,7 +40,10 @@ describe('FormPasswordWithBalloons component', () => {
renderWithLocalizationProvider(<Subject passwordFormType="reset" />);
const newPasswordField = screen.getByLabelText('New password');
fireEvent.focus(newPasswordField);
act(() => {
fireEvent.focus(newPasswordField);
});
await waitFor(
() => expect(screen.getByText('Password requirements')).toBeVisible(),
{
@ -53,7 +56,10 @@ describe('FormPasswordWithBalloons component', () => {
renderWithLocalizationProvider(<Subject passwordFormType="reset" />);
const confirmPasswordField = screen.getByLabelText('Re-enter password');
fireEvent.focus(confirmPasswordField);
act(() => {
fireEvent.focus(confirmPasswordField);
});
await waitFor(() => {
expect(
screen.queryByText(
@ -67,7 +73,10 @@ describe('FormPasswordWithBalloons component', () => {
renderWithLocalizationProvider(<Subject passwordFormType="signup" />);
const confirmPasswordField = screen.getByLabelText('Repeat password');
fireEvent.focus(confirmPasswordField);
act(() => {
fireEvent.focus(confirmPasswordField);
});
await waitFor(
() =>
expect(
@ -75,10 +84,13 @@ describe('FormPasswordWithBalloons component', () => {
'You need this password to access any encrypted data you store with us.'
)
).toBeVisible(),
{ timeout: SHOW_BALLOON_TIMEOUT }
{ timeout: SHOW_BALLOON_TIMEOUT + 200 }
);
fireEvent.blur(confirmPasswordField);
act(() => {
fireEvent.blur(confirmPasswordField);
});
await waitFor(
() =>
expect(
@ -86,7 +98,7 @@ describe('FormPasswordWithBalloons component', () => {
'You need this password to access any encrypted data you store with us.'
)
).not.toBeInTheDocument(),
{ timeout: HIDE_BALLOON_TIMEOUT }
{ timeout: HIDE_BALLOON_TIMEOUT + 200 }
);
});
});

Просмотреть файл

@ -8,7 +8,7 @@ import { ReactComponent as RefreshIcon } from './refresh-icon.svg';
type ButtonIconProps = {
title: string;
icon: [FunctionComponent<SVGProps<SVGSVGElement>>, number, number];
icon: [FunctionComponent<SVGProps<SVGSVGElement & { title?: string }>>, number, number];
classNames?: string;
disabled?: boolean;
onClick?: () => void;

Просмотреть файл

@ -49,11 +49,15 @@ describe('DataCollection', () => {
const button = it.getByTestId('metrics-opt-out');
// since metricsOpt is async and uses useState the `act` here is necessary
button.click();
await act(async () => {
button.click();
});
await waitFor(() => expect(account.metricsOpt).toBeCalledWith('out'));
//@ts-ignore mock doesn't care that the prop is readonly
account.metricsEnabled = false;
button.click();
await act(async () => {
button.click();
});
await waitFor(() => expect(account.metricsOpt).toBeCalledWith('in'));
});

Просмотреть файл

@ -6,7 +6,7 @@ import React, { ChangeEvent, useCallback, useRef, useState } from 'react';
import { RouteComponentProps, useNavigate } from '@reach/router';
import { Localized, useLocalization } from '@fluent/react';
import Webcam from 'react-webcam';
import Cropper from 'react-easy-crop';
import Cropper, { Area } from 'react-easy-crop';
import { Slider } from '@material-ui/core';
import LoadingSpinner from 'fxa-react/components/LoadingSpinner';
@ -126,7 +126,7 @@ export const PageAddAvatar = (_: RouteComponentProps) => {
/* Edit Handlers */
const onCropComplete = useCallback(
(_croppedArea, croppedAreaPixels) => {
(_croppedArea: Area, croppedAreaPixels: Area) => {
setCroppedAreaPixels(croppedAreaPixels);
setSaveEnabled(true);
},

268
yarn.lock
Просмотреть файл

@ -6372,25 +6372,25 @@ __metadata:
languageName: node
linkType: hard
"@fluent/react@npm:^0.14.1":
version: 0.14.1
resolution: "@fluent/react@npm:0.14.1"
"@fluent/react@npm:^0.15.1":
version: 0.15.1
resolution: "@fluent/react@npm:0.15.1"
dependencies:
"@fluent/sequence": ^0.7.0
"@fluent/sequence": ^0.8.0
cached-iterable: ^0.3.0
peerDependencies:
"@fluent/bundle": ">=0.16.0 <0.18.0"
"@fluent/bundle": ">=0.16.0"
react: ">=16.8.0"
checksum: d2121ef267f7a3e9c2364368f121786fedea5f1d0881e15dfd78049db7f6015f789685b17584e82154e3f128c1e067c1fed2572fad52888fd2c52c0c2e2c2b6f
checksum: 0348d36f42bef691ea0a99f1476790f39de23df8f3583c5bb6f21cd7fcc920243650508749f5af7db28adf2008682e688b2f1d271407a9797db95d090ebecd20
languageName: node
linkType: hard
"@fluent/sequence@npm:^0.7.0":
version: 0.7.0
resolution: "@fluent/sequence@npm:0.7.0"
"@fluent/sequence@npm:^0.8.0":
version: 0.8.0
resolution: "@fluent/sequence@npm:0.8.0"
peerDependencies:
"@fluent/bundle": ">= 0.13.0"
checksum: 569c52674552dc735e2febcbd75056145be463b59a3e25a30575d69be2ef41af78f0be9a5bb59017ed08838a076dfb4689a2a73d5cbbe077483592736f689942
checksum: 6e046c2a9e2064e076b0235f03f62a41e38cafa60830ea230ccf0b867b8e75a572c6d1feee2a4a9c3ee10863a8662ed54c32871ae980d072a2489d332e3c871a
languageName: node
linkType: hard
@ -13763,22 +13763,6 @@ __metadata:
languageName: node
linkType: hard
"@testing-library/dom@npm:^8.0.0":
version: 8.11.1
resolution: "@testing-library/dom@npm:8.11.1"
dependencies:
"@babel/code-frame": ^7.10.4
"@babel/runtime": ^7.12.5
"@types/aria-query": ^4.2.0
aria-query: ^5.0.0
chalk: ^4.1.0
dom-accessibility-api: ^0.5.9
lz-string: ^1.4.4
pretty-format: ^27.0.2
checksum: 082104b104def94db071fe35f967124c52d387d995a61327cd60ed39c310126f4cde2fa51054c37977cd3a2082311795417413506ad1a14df1010bd1cbb02bc5
languageName: node
linkType: hard
"@testing-library/dom@npm:^8.3.0":
version: 8.20.1
resolution: "@testing-library/dom@npm:8.20.1"
@ -13795,6 +13779,22 @@ __metadata:
languageName: node
linkType: hard
"@testing-library/dom@npm:^9.0.0":
version: 9.3.1
resolution: "@testing-library/dom@npm:9.3.1"
dependencies:
"@babel/code-frame": ^7.10.4
"@babel/runtime": ^7.12.5
"@types/aria-query": ^5.0.1
aria-query: 5.1.3
chalk: ^4.1.0
dom-accessibility-api: ^0.5.9
lz-string: ^1.5.0
pretty-format: ^27.0.2
checksum: 8ee3136451644e39990edea93709c38cf1e8ce5306f3c66273ca00935963faa51ca74e8d92b02eb442ccb842cfa28ca62833e393e075eb269cf9bef6f5600663
languageName: node
linkType: hard
"@testing-library/dom@npm:^9.2.0":
version: 9.2.0
resolution: "@testing-library/dom@npm:9.2.0"
@ -13872,17 +13872,17 @@ __metadata:
languageName: node
linkType: hard
"@testing-library/react@npm:^12.1.5":
version: 12.1.5
resolution: "@testing-library/react@npm:12.1.5"
"@testing-library/react@npm:^14.0.0":
version: 14.0.0
resolution: "@testing-library/react@npm:14.0.0"
dependencies:
"@babel/runtime": ^7.12.5
"@testing-library/dom": ^8.0.0
"@types/react-dom": <18.0.0
"@testing-library/dom": ^9.0.0
"@types/react-dom": ^18.0.0
peerDependencies:
react: <18.0.0
react-dom: <18.0.0
checksum: 4abd0490405e709a7df584a0db604e508a4612398bb1326e8fa32dd9393b15badc826dcf6d2f7525437886d507871f719f127b9860ed69ddd204d1fa834f576a
react: ^18.0.0
react-dom: ^18.0.0
checksum: 4a54c8f56cc4a39b50803205f84f06280bb76521d6d5d4b3b36651d760c7c7752ef142d857d52aaf4fad4848ed7a8be49afc793a5dda105955d2f8bef24901ac
languageName: node
linkType: hard
@ -14053,13 +14053,6 @@ __metadata:
languageName: node
linkType: hard
"@types/aria-query@npm:^4.2.0":
version: 4.2.0
resolution: "@types/aria-query@npm:4.2.0"
checksum: e4a3748c5511deb88e93c6faf2acb0730233ff75018e9aaed95e3d2833880e9d0eda7e08e4315a827872471779471585671d08bae00ac8b9813fc140194b52e5
languageName: node
linkType: hard
"@types/aria-query@npm:^5.0.1":
version: 5.0.1
resolution: "@types/aria-query@npm:5.0.1"
@ -15582,16 +15575,7 @@ __metadata:
languageName: node
linkType: hard
"@types/react-dom@npm:<18.0.0":
version: 17.0.17
resolution: "@types/react-dom@npm:17.0.17"
dependencies:
"@types/react": ^17
checksum: 23caf98aa03e968811560f92a2c8f451694253ebe16b670929b24eaf0e7fa62ba549abe9db0ac028a9d8a9086acd6ab9c6c773f163fa21224845edbc00ba6232
languageName: node
linkType: hard
"@types/react-dom@npm:>=16.9.0, @types/react-dom@npm:^17.0.9":
"@types/react-dom@npm:>=16.9.0":
version: 17.0.9
resolution: "@types/react-dom@npm:17.0.9"
dependencies:
@ -15609,12 +15593,21 @@ __metadata:
languageName: node
linkType: hard
"@types/react-helmet@npm:^6.1.2":
version: 6.1.2
resolution: "@types/react-helmet@npm:6.1.2"
"@types/react-dom@npm:^18.0.0":
version: 18.2.7
resolution: "@types/react-dom@npm:18.2.7"
dependencies:
"@types/react": "*"
checksum: ee66a7b950ba9f1013fd25de32ba6322bf5206fe5de56b9556a5151c76522b892b0cc5566cc8dfd0b54cb76fedb17ed21b6b2e6577849b791c168eaed5aad5f3
checksum: e02ea908289a7ad26053308248d2b87f6aeafd73d0e2de2a3d435947bcea0422599016ffd1c3e38ff36c42f5e1c87c7417f05b0a157e48649e4a02f21727d54f
languageName: node
linkType: hard
"@types/react-helmet@npm:^6.1.6":
version: 6.1.6
resolution: "@types/react-helmet@npm:6.1.6"
dependencies:
"@types/react": "*"
checksum: 81560c56bfe854b6a43aee31360862588ac875d1177b975da5ce049ac9aa2f7c98dcde65d4397bfaa04e468f40cf3ab2975a2ef966a69d64a60493422898698d
languageName: node
linkType: hard
@ -15668,7 +15661,7 @@ __metadata:
languageName: node
linkType: hard
"@types/react-test-renderer@npm:>=16.9.0, @types/react-test-renderer@npm:^17.0.1":
"@types/react-test-renderer@npm:>=16.9.0":
version: 17.0.1
resolution: "@types/react-test-renderer@npm:17.0.1"
dependencies:
@ -15677,6 +15670,15 @@ __metadata:
languageName: node
linkType: hard
"@types/react-test-renderer@npm:^18":
version: 18.0.0
resolution: "@types/react-test-renderer@npm:18.0.0"
dependencies:
"@types/react": "*"
checksum: 6afc938a1d7618d88ab8793e251f0bd5981bf3f08c1b600f74df3f8800b92589ea534dc6dcb7c8d683893fcc740bf8d7843a42bf2dae59785cfe88f004bd7b0b
languageName: node
linkType: hard
"@types/react-transition-group@npm:^4.2.0, @types/react-transition-group@npm:^4.4.2":
version: 4.4.2
resolution: "@types/react-transition-group@npm:4.4.2"
@ -15695,18 +15697,7 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:*, @types/react@npm:>=16.9.0, @types/react@npm:^17.0.14":
version: 17.0.14
resolution: "@types/react@npm:17.0.14"
dependencies:
"@types/prop-types": "*"
"@types/scheduler": "*"
csstype: ^3.0.2
checksum: ca2eca8f33ddbcba46932efeb8affdd274ea5800ea38bf8bc8de205808d09de21ea1f3d6ab156573aca393b912f0d908826cc6ad92470a3f2b6c34e70d5f75db
languageName: node
linkType: hard
"@types/react@npm:>=16, @types/react@npm:^18":
"@types/react@npm:^18":
version: 18.2.14
resolution: "@types/react@npm:18.2.14"
dependencies:
@ -15717,17 +15708,6 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:^17":
version: 17.0.45
resolution: "@types/react@npm:17.0.45"
dependencies:
"@types/prop-types": "*"
"@types/scheduler": "*"
csstype: ^3.0.2
checksum: 3cc13a02824c13f6fa4807a83abd065ac1d9943359e76bd995cc7cd2b4148c1176ebd54a30a9f4eb8a0f141ff359d712876f256c4fee707e4290607ef8410b3e
languageName: node
linkType: hard
"@types/request@npm:2.48.5":
version: 2.48.5
resolution: "@types/request@npm:2.48.5"
@ -28595,7 +28575,6 @@ fsevents@~2.1.1:
"@rescripts/cli": 0.0.16
"@sentry/node": ^7.3.1
"@testing-library/jest-dom": ^5.16.5
"@testing-library/react": ^12.1.5
"@types/chance": ^1.1.2
"@types/convict": ^6.1.1
"@types/dateformat": ^3.0.1
@ -28604,7 +28583,6 @@ fsevents@~2.1.1:
"@types/jsdom": ^16.2.11
"@types/on-headers": ^1.0.0
"@types/postcss-import": ^14
"@types/react": ^17.0.14
"@types/serve-static": 1.13.9
"@types/supertest": ^2.0.11
"@typescript-eslint/eslint-plugin": ^5.59.0
@ -28635,8 +28613,6 @@ fsevents@~2.1.1:
postcss: ^8.4.14
postcss-import: ^15.1.0
prettier: ^2.3.1
react: ^16.13.0
react-dom: ^16.13.0
react-router-dom: ^6.9.0
react-scripts: ^5.0.1
serve-static: ^1.14.2
@ -28779,8 +28755,6 @@ fsevents@~2.1.1:
"@types/node": ^18.14.2
"@types/node-zendesk": ^2.0.2
"@types/nodemailer": ^6.4.2
"@types/react": ^18
"@types/react-dom": ^18
"@types/request": 2.48.5
"@types/safe-regex": 1.1.2
"@types/sass": ^1
@ -28874,8 +28848,6 @@ fsevents@~2.1.1:
proxyquire: ^2.1.3
punycode.js: 2.3.0
qrcode: ^1.5.1
react: ^18.2.0
react-dom: ^18.2.0
read: 2.1.0
redlock: ^5.0.0-beta.2
request: ^2.88.2
@ -28929,7 +28901,6 @@ fsevents@~2.1.1:
"@sentry/browser": ^6.19.7
"@sentry/integrations": ^6.19.1
"@sentry/node": ^6.19.1
"@testing-library/react": ^12.1.5
"@types/backbone": ^1.4.10
"@types/postcss-import": ^14
"@types/sinon-chai": 3.2.5
@ -29044,8 +29015,6 @@ fsevents@~2.1.1:
postcss-loader: 4.2.0
prettier: ^2.3.1
proxyquire: ^2.1.3
react: ^16.8.6
react-dom: ^16.8.6
request: ^2.88.2
request-promise: 4.2.6
sass-loader: ^10.0.3
@ -29363,7 +29332,6 @@ fsevents@~2.1.1:
"@babel/preset-typescript": ^7.22.5
"@fluent/bundle": ^0.18.0
"@fluent/langneg": ^0.6.2
"@fluent/react": ^0.14.1
"@rescripts/cli": ~0.0.16
"@sentry/browser": ^6.19.7
"@sentry/node": ^6.19.1
@ -29377,7 +29345,6 @@ fsevents@~2.1.1:
"@stripe/react-stripe-js": ^2.1.0
"@stripe/stripe-js": ^1.53.0
"@testing-library/jest-dom": ^5.16.5
"@testing-library/react": ^12.1.5
"@types/accept-language-parser": ^1.5.1
"@types/babel__preset-env": ^7
"@types/classnames": ^2.3.1
@ -29386,8 +29353,6 @@ fsevents@~2.1.1:
"@types/nock": ^11.1.0
"@types/node": ^18.14.2
"@types/postcss-import": ^12
"@types/react": ^17.0.14
"@types/react-dom": ^17.0.9
"@types/react-redux": ^7.1.18
"@types/react-stripe-elements": ^6.0.5
"@types/react-transition-group": ^4.4.2
@ -29446,13 +29411,10 @@ fsevents@~2.1.1:
postcss: ^8.4.14
postcss-import: 15.1.0
prettier: ^2.3.1
react: ^16.12.0
react-dom: ^16.12.0
react-redux: ^8.0.2
react-router-dom: ^6.9.0
react-scripts: ^5.0.1
react-stripe-elements: ^6.1.2
react-test-renderer: ^17.0.2
react-transition-group: ^4.4.2
redux: ^4.2.0
redux-devtools-extension: ^2.13.9
@ -29528,7 +29490,6 @@ fsevents@~2.1.1:
"@babel/preset-typescript": ^7.22.5
"@fluent/bundle": ^0.18.0
"@fluent/langneg": ^0.6.2
"@fluent/react": ^0.14.1
"@storybook/addon-actions": ^7.0.23
"@storybook/addon-links": ^7.0.23
"@storybook/addon-styling": ^1.3.0
@ -29537,7 +29498,6 @@ fsevents@~2.1.1:
"@storybook/react-webpack5": ^7.0.23
"@testing-library/dom": ^9.2.0
"@testing-library/jest-dom": ^5.16.5
"@testing-library/react": ^12.1.5
"@testing-library/user-event": ^14.4.3
"@types/babel__preset-env": ^7
"@types/camelcase": 5.2.0
@ -29547,9 +29507,7 @@ fsevents@~2.1.1:
"@types/node": ^18.14.2
"@types/postcss-import": ^14
"@types/prettier": 2.3.0
"@types/react": ^17.0.14
"@types/react-dom": ^17.0.9
"@types/react-helmet": ^6.1.2
"@types/react-helmet": ^6.1.6
"@types/react-transition-group": ^4.4.2
"@types/rimraf": 3.0.0
"@types/sinon": ^10
@ -29574,8 +29532,6 @@ fsevents@~2.1.1:
postcss: ^8.4.23
postcss-import: ^15.1.0
prettier: ^2.3.1
react: ^16.13.1
react-dom: ^16.13.1
react-helmet: ^6.1.0
react-transition-group: ^4.4.2
rimraf: ^5.0.0
@ -29599,7 +29555,6 @@ fsevents@~2.1.1:
"@babel/types": ^7.22.5
"@emotion/react": ^11.10.0
"@emotion/styled": ^11.10.4
"@fluent/react": ^0.14.1
"@material-ui/core": v5.0.0-alpha.24
"@reach/router": ^1.3.4
"@rescripts/cli": 0.0.16
@ -29618,7 +29573,6 @@ fsevents@~2.1.1:
"@storybook/testing-library": ^0.0.14-next.2
"@testing-library/dom": ^9.2.0
"@testing-library/jest-dom": ^5.16.5
"@testing-library/react": ^12.1.5
"@testing-library/react-hooks": ^8.0.0
"@testing-library/user-event": ^14.4.3
"@types/babel__core": 7.1.14
@ -29629,10 +29583,7 @@ fsevents@~2.1.1:
"@types/node": ^18.14.2
"@types/prop-types": ^15
"@types/reach__router": ^1.3.11
"@types/react": ^17.0.14
"@types/react-dom": ^17.0.9
"@types/react-router": ^5.1.19
"@types/react-test-renderer": ^17.0.1
"@types/react-webcam": ^3.0.0
"@types/testing-library__react-hooks": ^4
"@types/uuid": ^8
@ -29666,14 +29617,11 @@ fsevents@~2.1.1:
postcss-assets: ^6.0.0
postcss-import: ^15.1.0
prop-types: ^15.8.1
react: ^16.13.1
react-async-hook: ^4.0.0
react-dom: ^16.13.1
react-easy-crop: ^4.7.4
react-hook-form: ^6.15.8
react-markdown: ^8.0.5
react-scripts: ^5.0.1
react-test-renderer: ^17.0.2
react-webcam: ^7.0.0
rehype-raw: ^6.1.1
sinon: ^15.0.1
@ -29802,15 +29750,20 @@ fsevents@~2.1.1:
resolution: "fxa@workspace:."
dependencies:
"@faker-js/faker": ^8.0.2
"@fluent/react": ^0.15.1
"@nx/jest": 16.3.1
"@nx/js": ^16.3.1
"@nx/node": ^16.3.1
"@nx/workspace": 16.3.1
"@storybook/html-webpack5": ^7.0.23
"@storybook/react-webpack5": ^7.0.23
"@testing-library/react": ^14.0.0
"@types/jest": ^29.5.1
"@types/mysql": ^2
"@types/node": ^18.16.1
"@types/react": ^18
"@types/react-dom": ^18
"@types/react-test-renderer": ^18
"@typescript-eslint/eslint-plugin": ^5.59.1
"@typescript-eslint/parser": ^5.59.1
diffparser: ^2.0.1
@ -29837,7 +29790,10 @@ fsevents@~2.1.1:
pm2: ^5.3.0
postcss: ^8.4.14
prettier: ^2.6.2
react: ^18.2.0
react-dom: ^18.2.0
react-ga4: ^2.1.0
react-test-renderer: ^18.2.0
replace-in-file: ^6.3.5
semver: ^7.5.3
stylelint: ^15.10.1
@ -37942,15 +37898,6 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"lz-string@npm:^1.4.4":
version: 1.4.4
resolution: "lz-string@npm:1.4.4"
bin:
lz-string: bin/bin.js
checksum: 54e31238a61a84d8f664d9860a9fba7310c5b97a52c444f80543069bc084815eff40b8d4474ae1d93992fdf6c252dca37cf27f6adbeb4dbc3df2f3ac773d0e61
languageName: node
linkType: hard
"lz-string@npm:^1.5.0":
version: 1.5.0
resolution: "lz-string@npm:1.5.0"
@ -45339,20 +45286,6 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"react-dom@npm:^16.12.0, react-dom@npm:^16.13.0, react-dom@npm:^16.13.1, react-dom@npm:^16.8.6":
version: 16.14.0
resolution: "react-dom@npm:16.14.0"
dependencies:
loose-envify: ^1.1.0
object-assign: ^4.1.1
prop-types: ^15.6.2
scheduler: ^0.19.1
peerDependencies:
react: ^16.14.0
checksum: 5a5c49da0f106b2655a69f96c622c347febcd10532db391c262b26aec225b235357d9da1834103457683482ab1b229af7a50f6927a6b70e53150275e31785544
languageName: node
linkType: hard
"react-dom@npm:^18.2.0":
version: 18.2.0
resolution: "react-dom@npm:18.2.0"
@ -45483,10 +45416,10 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"react-is@npm:^16.12.0 || ^17.0.0, react-is@npm:^16.8.0 || ^17.0.0, react-is@npm:^17.0.1, react-is@npm:^17.0.2":
version: 17.0.2
resolution: "react-is@npm:17.0.2"
checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8
"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.2.0":
version: 18.2.0
resolution: "react-is@npm:18.2.0"
checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e
languageName: node
linkType: hard
@ -45497,6 +45430,13 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"react-is@npm:^16.8.0 || ^17.0.0, react-is@npm:^17.0.1":
version: 17.0.2
resolution: "react-is@npm:17.0.2"
checksum: 9d6d111d8990dc98bc5402c1266a808b0459b5d54830bbea24c12d908b536df7883f268a7868cfaedde3dd9d4e0d574db456f84d2e6df9c4526f99bb4b5344d8
languageName: node
linkType: hard
"react-lifecycles-compat@npm:^3.0.4":
version: 3.0.4
resolution: "react-lifecycles-compat@npm:3.0.4"
@ -45700,15 +45640,15 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"react-shallow-renderer@npm:^16.13.1":
version: 16.14.1
resolution: "react-shallow-renderer@npm:16.14.1"
"react-shallow-renderer@npm:^16.15.0":
version: 16.15.0
resolution: "react-shallow-renderer@npm:16.15.0"
dependencies:
object-assign: ^4.1.1
react-is: ^16.12.0 || ^17.0.0
react-is: ^16.12.0 || ^17.0.0 || ^18.0.0
peerDependencies:
react: ^16.0.0 || ^17.0.0
checksum: f344c663c48720d19559b4198b1f63ad47a3f11bedc92ede053a6c0706b5209e6110086f3ccc6db04eda9f0d1a415845956ddfb6ce09a922167d4831fcba9314
react: ^16.0.0 || ^17.0.0 || ^18.0.0
checksum: 6052c7e3e9627485120ebd8257f128aad8f56386fe8d42374b7743eac1be457c33506d153c7886b4e32923c0c352d402ab805ef9ca02dbcd8393b2bdeb6e5af8
languageName: node
linkType: hard
@ -45748,17 +45688,16 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"react-test-renderer@npm:^17.0.2":
version: 17.0.2
resolution: "react-test-renderer@npm:17.0.2"
"react-test-renderer@npm:^18.2.0":
version: 18.2.0
resolution: "react-test-renderer@npm:18.2.0"
dependencies:
object-assign: ^4.1.1
react-is: ^17.0.2
react-shallow-renderer: ^16.13.1
scheduler: ^0.20.2
react-is: ^18.2.0
react-shallow-renderer: ^16.15.0
scheduler: ^0.23.0
peerDependencies:
react: 17.0.2
checksum: e6b5c6ed2a0bde2c34f1ab9523ff9bc4c141a271daf730d6b852374e83acc0155d58ab71a318251e953ebfa65b8bebb9c5dce3eba1ccfcbef7cc4e1e8261c401
react: ^18.2.0
checksum: 6b6980ced93fa2b72662d5e4ab3b4896833586940047ce52ca9aca801e5432adf05fcbe28289b0af3ce6a2a7c590974e25dcc8aa43d0de658bfe8bbcd686f958
languageName: node
linkType: hard
@ -45810,17 +45749,6 @@ fsevents@~2.1.1:
languageName: node
linkType: hard
"react@npm:^16.12.0, react@npm:^16.13.0, react@npm:^16.13.1, react@npm:^16.8.6":
version: 16.14.0
resolution: "react@npm:16.14.0"
dependencies:
loose-envify: ^1.1.0
object-assign: ^4.1.1
prop-types: ^15.6.2
checksum: 8484f3ecb13414526f2a7412190575fc134da785c02695eb92bb6028c930bfe1c238d7be2a125088fec663cc7cda0a3623373c46807cf2c281f49c34b79881ac
languageName: node
linkType: hard
"react@npm:^17.0.2":
version: 17.0.2
resolution: "react@npm:17.0.2"
@ -47597,16 +47525,6 @@ resolve@1.1.7:
languageName: node
linkType: hard
"scheduler@npm:^0.19.1":
version: 0.19.1
resolution: "scheduler@npm:0.19.1"
dependencies:
loose-envify: ^1.1.0
object-assign: ^4.1.1
checksum: 73e185a59e2ff5aa3609f5b9cb97ddd376f89e1610579d29939d952411ca6eb7a24907a4ea4556569dacb931467a1a4a56d94fe809ef713aa76748642cd96a6c
languageName: node
linkType: hard
"scheduler@npm:^0.20.2":
version: 0.20.2
resolution: "scheduler@npm:0.20.2"