diff --git a/package.json b/package.json index 65a2fc1a..c07b3c7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@launchpadlab/lp-components", - "version": "9.1.0", + "version": "9.2.0", "engines": { "node": "^18.12" }, @@ -71,8 +71,8 @@ "@storybook/manager-webpack5": "^6.5.14", "@storybook/react": "^6.4.22", "@testing-library/dom": "^9.3.1", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5", + "@testing-library/jest-dom": "^6.1.3", + "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", "babel-loader": "^9.1.0", "bourbon": "^7.2.0", @@ -87,8 +87,8 @@ "jest-environment-jsdom": "^29.6.2", "lint-staged": "^14.0.1", "prettier": "^3.0.0", - "react": "^17.0.0", - "react-dom": "^17.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "redux": "^4.1.2", "regenerator-runtime": "^0.14.0", "sass": "^1.56.1", @@ -98,7 +98,7 @@ "webpack": "^5.75.0" }, "peerDependencies": { - "react": "^16.14.0 || ^17.0.0" + "react": "^16.14.0 || ^17.0.0 || ^18.0.0" }, "prettier": "@launchpadlab/prettier-config", "lint-staged": { diff --git a/test/forms/inputs/cloudinary-file-input/cloudinary-uploader.test.js b/test/forms/inputs/cloudinary-file-input/cloudinary-uploader.test.js index 09289fb5..7cd8e4ce 100644 --- a/test/forms/inputs/cloudinary-file-input/cloudinary-uploader.test.js +++ b/test/forms/inputs/cloudinary-file-input/cloudinary-uploader.test.js @@ -1,5 +1,6 @@ import React from 'react' -import { render } from '@testing-library/react' +import { render, screen, waitFor, act } from '@testing-library/react' +import userEvent from '@testing-library/user-event' import cloudinaryUploader from '../../../../src/forms/inputs/cloudinary-file-input/cloudinary-uploader' class MockResponse { @@ -32,7 +33,7 @@ class MockResponse { } const mockApi = { - post: jest.fn(function (url, body, options = {}) { + post: function (url, body, options = {}) { const response = new MockResponse(url, options, body) // Simulate server response return new Promise((resolve, reject) => { @@ -41,7 +42,7 @@ const mockApi = { return resolve(response) }, 10) }) - }), + }, } const props = { @@ -57,6 +58,25 @@ const file = { const fileData = 'mockData' +const AsyncWrapper = ({ + onSuccess = () => {}, + fileData, + file, + uploadStatus, + upload, +}) => ( +
+

{uploadStatus}

+ +
+) + describe('cloudinaryUploader', () => { // eslint-disable-next-line no-undef const initialEnv = process.env @@ -82,7 +102,9 @@ describe('cloudinaryUploader', () => { process.env.CLOUDINARY_CLOUD_NAME = 'foo' jest.spyOn(console, 'error').mockImplementation(() => null) // avoid console bloat const Wrapped = () =>

Hi

- const Wrapper = cloudinaryUploader({ apiAdapter: props.apiAdapter })(Wrapped) + const Wrapper = cloudinaryUploader({ apiAdapter: props.apiAdapter })( + Wrapped + ) expect(() => render()).toThrow() jest.restoreAllMocks() }) @@ -92,7 +114,9 @@ describe('cloudinaryUploader', () => { process.env.CLOUDINARY_BUCKET = 'bar' jest.spyOn(console, 'error').mockImplementation(() => null) // avoid console bloat const Wrapped = () =>

Hi

- const Wrapper = cloudinaryUploader({ apiAdapter: props.apiAdapter })(Wrapped) + const Wrapper = cloudinaryUploader({ apiAdapter: props.apiAdapter })( + Wrapped + ) expect(() => render()).toThrow() jest.restoreAllMocks() }) @@ -115,232 +139,372 @@ describe('cloudinaryUploader', () => { // eslint-disable-next-line no-undef process.env.CLOUDINARY_BUCKET = 'bar' const Wrapped = () =>

Hi

- const Wrapper = cloudinaryUploader({ apiAdapter: props.apiAdapter })(Wrapped) + const Wrapper = cloudinaryUploader({ apiAdapter: props.apiAdapter })( + Wrapped + ) expect(() => render()).not.toThrow() }) test('can receive options as props', () => { const Wrapped = () =>

Hi

const Wrapper = cloudinaryUploader()(Wrapped) - expect(() => render( - {}} /> - )).not.toThrow() + expect(() => + render( {}} />) + ).not.toThrow() }) test('adds upload props to component', () => { const Wrapped = jest.fn(() =>

Hi

) const Wrapper = cloudinaryUploader(props)(Wrapped) render() - expect(Wrapped).toHaveBeenCalledWith(expect.objectContaining({ - upload: expect.any(Function), - uploadStatus: expect.any(String), - }), {}) + expect(Wrapped).toHaveBeenCalledWith( + expect.objectContaining({ + upload: expect.any(Function), + uploadStatus: expect.any(String), + }), + {} + ) }) - test('sends the api request with the correct options', () => { - const Wrapped = jest.fn(() =>

Hi

) + test('sends the api request with the correct options', async () => { + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={file} + {...props} + /> + ) const Wrapper = cloudinaryUploader(props)(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, file).then((response) => { - const { uploadStatus } = Wrapped.mock.calls[2][0] - expect(uploadStatus).toEqual('upload-success') - const responseJson = JSON.parse(response.body) - expect(responseJson.file).toEqual(fileData) - expect(responseJson.folder).toEqual(props.bucket) - expect(responseJson.public_id).toEqual('test') - expect(responseJson.upload_preset).toEqual('default') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + + const responseJson = JSON.parse(response.body) + expect(responseJson.file).toEqual(fileData) + expect(responseJson.folder).toEqual(props.bucket) + expect(responseJson.public_id).toEqual('test') + expect(responseJson.upload_preset).toEqual('default') }) - test('sets `publicId`', () => { - const Wrapped = jest.fn(() =>

Hi

) + test('sets `publicId`', async () => { + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={file} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props, cloudinaryPublicId: 'custom-name', })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, file).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('custom-name') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('custom-name') }) - test('allows custom `publicId` creator', () => { - const Wrapped = jest.fn(() =>

Hi

) + test('allows custom `publicId` creator', async () => { + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={file} + {...props} + /> + ) const createPublicId = (file) => 'foo-' + file.name const Wrapper = cloudinaryUploader({ ...props, createPublicId })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, file).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('foo-test') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('foo-test') }) - test('overrides custom `publicId` creator with `cloudinaryPublicId`', () => { - const Wrapped = jest.fn(() =>

Hi

) + test('overrides custom `publicId` creator with `cloudinaryPublicId`', async () => { + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={file} + {...props} + /> + ) const createPublicId = (file) => 'foo-' + file.name const Wrapper = cloudinaryUploader({ ...props, createPublicId, cloudinaryPublicId: 'custom-name', })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, file).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('custom-name') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('custom-name') }) - test('adds extension to `publicId` of raw files', () => { + test('adds extension to `publicId` of raw files', async () => { const rawFile = { name: 'test.xls', type: 'application/xls' } - const Wrapped = jest.fn(() =>

Hi

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={rawFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props, cloudinaryPublicId: 'custom-name', })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, rawFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('custom-name.xls') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('custom-name.xls') }) - test('does not set an empty `publicId`', () => { + test('does not set an empty `publicId`', async () => { const rawFile = { name: 'test.xls', type: 'application/xls' } - const Wrapped = jest.fn(() =>

Hi

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={rawFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props, - createPublicId: () => '' + createPublicId: () => '', })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, rawFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toBeUndefined() + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toBeUndefined() }) - test('removes invalid characters from the default `publicId`', () => { + test('removes invalid characters from the default `publicId`', async () => { const FORBIDDEN_PATTERN = /[\s?&#\\%<>]/gi const illegallyNamedFile = { name: 'Final \\ Master %20 Schedule? #S1&S2 <100%> & finished.pdf', type: 'application/pdf', } - const Wrapped = jest.fn(() =>

Howdy

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={illegallyNamedFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - - return upload(fileData, illegallyNamedFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).not.toMatch(FORBIDDEN_PATTERN) - expect(responseJson.public_id).toEqual('Final_Master_Schedule_S1_S2_100_finished') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).not.toMatch(FORBIDDEN_PATTERN) + expect(responseJson.public_id).toEqual( + 'Final_Master_Schedule_S1_S2_100_finished' + ) }) - test('removes html escaped characters from the default `publicId`', () => { + test('removes html escaped characters from the default `publicId`', async () => { const illegallyNamedFile = { name: 'SY%20S1%26S2.pdf', type: 'application/pdf', } - const Wrapped = jest.fn(() =>

Howdy

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={illegallyNamedFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, illegallyNamedFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('SY_S1_S2') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('SY_S1_S2') }) - test('sanitizes the original `publicId` when decoding fails', () => { + test('sanitizes the original `publicId` when decoding fails', async () => { const illegallyNamedFile = { name: 'Final \\ Master %20 Schedule? #S1&S2 <100%> & finished.pdf', type: 'application/pdf', } - // eslint-disable-next-line no-undef - const spy = jest.spyOn(window, 'decodeURIComponent').mockImplementation(() => { - throw Error('Oops!') - }) - const Wrapped = jest.fn(() =>

Howdy

) + const spy = jest + .spyOn(window, 'decodeURIComponent') // eslint-disable-line no-undef + .mockImplementation(() => { + throw Error('Oops!') + }) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={illegallyNamedFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, illegallyNamedFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('Final_Master_20_Schedule_S1_S2_100_finished') - - spy.mockRestore() + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual( + 'Final_Master_20_Schedule_S1_S2_100_finished' + ) + + spy.mockRestore() }) - test('replaces spaces and removes superfluous underscores from the default `publicId`', () => { + test('replaces spaces and removes superfluous underscores from the default `publicId`', async () => { const illegallyNamedFile = { name: ' SY S1___S2.pdf', type: 'application/pdf', } - const Wrapped = jest.fn(() =>

Howdy

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={illegallyNamedFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, illegallyNamedFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('SY_S1_S2') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('SY_S1_S2') }) - test('trims spaces from the start of the default `publicId`', () => { + test('trims spaces from the start of the default `publicId`', async () => { const illegallyNamedFile = { name: ' Example.pdf', type: 'application/pdf', } - const Wrapped = jest.fn(() =>

Howdy

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={illegallyNamedFile} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] - - return upload(fileData, illegallyNamedFile).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toEqual('Example') + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toEqual('Example') }) - test('defaults file name if not provided when creating the default `publicId`', () => { + test('defaults file name if not provided when creating the default `publicId`', async () => { const fileWithNoName = { name: '', type: 'application/pdf' } - const Wrapped = jest.fn(() =>

Howdy

) + let response + const Wrapped = (props) => ( + { + response = res + }} + fileData={fileData} + file={fileWithNoName} + {...props} + /> + ) const Wrapper = cloudinaryUploader({ ...props })(Wrapped) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] // eslint-disable-next-line no-undef const spy = jest.spyOn(global.Date, 'now') - - return upload(fileData, fileWithNoName).then((response) => { - const responseJson = JSON.parse(response.body) - expect(responseJson.public_id).toContain('file_upload') - expect(spy).toHaveBeenCalled() - - spy.mockRestore() + await user.click(screen.getByText('Upload')) + await waitFor(() => { + expect(screen.getByText('upload-success')).toBeInTheDocument() }) + + const responseJson = JSON.parse(response.body) + expect(responseJson.public_id).toContain('file_upload') + expect(spy).toHaveBeenCalled() + spy.mockRestore() }) - test('throws an error if request fails', () => { + test('throws an error if request fails', async () => { const Wrapped = jest.fn(() =>

Hi

) const Wrapper = cloudinaryUploader({ ...props, endpoint: '/failure' })( Wrapped @@ -350,21 +514,31 @@ describe('cloudinaryUploader', () => { expect.assertions(1) - return expect(upload(fileData, file)).rejects.toThrow() + await act(() => expect(upload(fileData, file)).rejects.toThrow()) }) - test('updates the `uploadStatus` prop if request fails', () => { - const Wrapped = jest.fn(() =>

Hi

) + test('updates the `uploadStatus` prop if request fails', async () => { + const Wrapped = (props) => ( + { + props.upload(...args).catch(() => { + // ignore thrown error + }) + }} + /> + ) const Wrapper = cloudinaryUploader({ ...props, endpoint: '/failure' })( Wrapped ) + const user = userEvent.setup() render() - const { upload } = Wrapped.mock.calls[0][0] + await user.click(screen.getByText('Upload')) - expect.assertions(1) - return upload(fileData, file).catch(() => { - const { uploadStatus } = Wrapped.mock.calls[2][0] - expect(uploadStatus).toEqual('upload-failure') + await waitFor(() => { + expect(screen.getByText('upload-failure')).toBeInTheDocument() }) }) -}) \ No newline at end of file +}) diff --git a/test/forms/inputs/date-input.test.js b/test/forms/inputs/date-input.test.js index e0e967e6..b531d05d 100644 --- a/test/forms/inputs/date-input.test.js +++ b/test/forms/inputs/date-input.test.js @@ -1,6 +1,6 @@ import React, { useState } from 'react' import { DateInput } from '../../../src/' -import { render, screen } from '@testing-library/react' +import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' const name = 'name.of.field' @@ -38,9 +38,14 @@ test('DateInput updates the value on change', async () => { render() const input = screen.getByRole('textbox', { name: 'Field' }) - await user.type(input, '02/02/2023{Enter}') - expect(input).toHaveValue('02/02/2023') + await user.click(input) + await user.type(input, '02/02/2023') + await user.click(screen.getByRole('option', { selected: true })) + await waitFor(() => { + expect(screen.queryByLabelText('Next Month')).not.toBeInTheDocument() + expect(input).toHaveValue('02/02/2023') + }) }) test('DateInput sets the placeholder text correctly', () => { diff --git a/test/forms/labels/input-error.test.js b/test/forms/labels/input-error.test.js index 76d39bd4..f8883322 100644 --- a/test/forms/labels/input-error.test.js +++ b/test/forms/labels/input-error.test.js @@ -1,7 +1,6 @@ import React from 'react' import { InputError } from '../../../src/' import { render, screen } from '@testing-library/react' -import userEvent from '@testing-library/user-event' test('does not render when input is touched but not invalid', () => { render() diff --git a/yarn.lock b/yarn.lock index fb684008..61b07067 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@adobe/css-tools@^4.0.1": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" - integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== +"@adobe/css-tools@^4.3.0": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -36,7 +36,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== @@ -44,6 +44,14 @@ "@babel/highlight" "^7.22.10" chalk "^2.4.2" +"@babel/code-frame@^7.12.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" @@ -302,9 +310,9 @@ integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== "@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" + integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== "@babel/helper-validator-option@^7.22.5": version "7.22.5" @@ -329,10 +337,10 @@ "@babel/traverse" "^7.22.10" "@babel/types" "^7.22.10" -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== +"@babel/highlight@^7.22.10", "@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== dependencies: "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.4.2" @@ -1312,13 +1320,20 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.21.0": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" + integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.12.7", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" @@ -1615,22 +1630,15 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.3.tgz#bb02535c729393a0345b8d2c5eef94d34f7b35a3" - integrity sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA== +"@jest/environment@^29.6.3", "@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.6.3" + "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.3" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" + jest-mock "^29.7.0" "@jest/expect-utils@^29.6.3": version "29.6.3" @@ -1647,17 +1655,17 @@ expect "^29.6.3" jest-snapshot "^29.6.3" -"@jest/fake-timers@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.3.tgz#7e780b05b14ad59dca68bdc188f6cf085552a0e8" - integrity sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA== +"@jest/fake-timers@^29.6.3", "@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.6.3" - jest-mock "^29.6.3" - jest-util "^29.6.3" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" "@jest/globals@^29.6.3": version "29.6.3" @@ -1699,13 +1707,6 @@ strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1763,18 +1764,6 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -1999,11 +1988,6 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -2841,21 +2825,7 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" -"@testing-library/dom@^8.0.0": - version "8.20.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" - integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - 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" - -"@testing-library/dom@^9.3.1": +"@testing-library/dom@^9.0.0", "@testing-library/dom@^9.3.1": version "9.3.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== @@ -2869,14 +2839,13 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^5.16.5": - version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" - integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== +"@testing-library/jest-dom@^6.1.3": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.3.tgz#443118c9e4043f96396f120de2c7122504a079c5" + integrity sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ== dependencies: - "@adobe/css-tools" "^4.0.1" + "@adobe/css-tools" "^4.3.0" "@babel/runtime" "^7.9.2" - "@types/testing-library__jest-dom" "^5.9.1" aria-query "^5.0.0" chalk "^3.0.0" css.escape "^1.5.1" @@ -2884,14 +2853,14 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^12.1.5": - version "12.1.5" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" - integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== +"@testing-library/react@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c" + integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg== 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" "@testing-library/user-event@^14.4.3": version "14.4.3" @@ -3043,14 +3012,6 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" - integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - "@types/jsdom@^20.0.0": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" @@ -3101,9 +3062,9 @@ form-data "^3.0.0" "@types/node@*": - version "20.5.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.3.tgz#fa52c147f405d56b2f1dd8780d840aa87ddff629" - integrity sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA== + version "20.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.0.tgz#9d7daa855d33d4efec8aea88cd66db1c2f0ebe16" + integrity sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg== "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0": version "16.18.43" @@ -3150,17 +3111,17 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/react-dom@<18.0.0": - version "17.0.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.19.tgz#36feef3aa35d045cacd5ed60fe0eef5272f19492" - integrity sha512-PiYG40pnQRdPHnlf7tZnp0aQ6q9tspYr72vD61saO6zFCybLfMqwUCN0va1/P+86DXn18ZWeW30Bk7xlC5eEAQ== +"@types/react-dom@^18.0.0": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== dependencies: - "@types/react" "^17" + "@types/react" "*" -"@types/react@^17": - version "17.0.53" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.53.tgz#10d4d5999b8af3d6bc6a9369d7eb953da82442ab" - integrity sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw== +"@types/react@*": + version "18.2.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.21.tgz#774c37fd01b522d0b91aed04811b58e4e0514ed9" + integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3191,17 +3152,10 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== -"@types/testing-library__jest-dom@^5.9.1": - version "5.14.5" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" - integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== - dependencies: - "@types/jest" "*" - "@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" + integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== "@types/uglify-js@*": version "3.17.1" @@ -5664,11 +5618,6 @@ detect-port@^1.3.0: address "^1.0.1" debug "4" -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -6505,17 +6454,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - expect@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.3.tgz#e74b57c35a81fd93ece6b570e371309c53dc4f54" @@ -8503,16 +8441,6 @@ jest-config@^29.6.3: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - jest-diff@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.3.tgz#365c6b037ea8e67d2f2af68bc018fc18d44311f0" @@ -8542,17 +8470,17 @@ jest-each@^29.6.3: pretty-format "^29.6.3" jest-environment-jsdom@^29.6.2: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.3.tgz#c9f394f5a89f399532c794d09bd3a746d9b3e0df" - integrity sha512-nMJz/i27Moit9bv8Z323/13Melj4FEQH93yRu7GnilvBmPBMH4EGEkEfBTJXYuubyzhMO7w/VHzljIDV+Q/SeQ== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== dependencies: - "@jest/environment" "^29.6.3" - "@jest/fake-timers" "^29.6.3" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^29.6.3" - jest-util "^29.6.3" + jest-mock "^29.7.0" + jest-util "^29.7.0" jsdom "^20.0.0" jest-environment-node@^29.6.3: @@ -8567,11 +8495,6 @@ jest-environment-node@^29.6.3: jest-mock "^29.6.3" jest-util "^29.6.3" -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" @@ -8604,16 +8527,6 @@ jest-leak-detector@^29.6.3: jest-get-type "^29.6.3" pretty-format "^29.6.3" -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - jest-matcher-utils@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz#a7574092b635d96a38fa0a22d015fb596b9c2efc" @@ -8624,25 +8537,10 @@ jest-matcher-utils@^29.6.3: jest-get-type "^29.6.3" pretty-format "^29.6.3" -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.3.tgz#bce16050d86801b165f20cfde34dc01d3cf85fbf" - integrity sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA== +jest-message-util@^29.6.3, jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^29.6.3" @@ -8650,18 +8548,18 @@ jest-message-util@^29.6.3: chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.6.3" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.3.tgz#433f3fd528c8ec5a76860177484940628bdf5e0a" - integrity sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg== +jest-mock@^29.6.3, jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.6.3" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" @@ -8777,22 +8675,10 @@ jest-snapshot@^29.6.3: pretty-format "^29.6.3" semver "^7.5.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63" - integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA== +jest-util@^29.6.3, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" @@ -9272,7 +9158,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lz-string@^1.4.4, lz-string@^1.5.0: +lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== @@ -11132,19 +11018,10 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" - integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== +pretty-format@^29.6.3, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" @@ -11400,15 +11277,15 @@ react-color@^2.19.3: tinycolor2 "^1.4.1" react-datepicker@^4.8.0: - version "4.16.0" - resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.16.0.tgz#b9dd389bb5611a1acc514bba1dd944be21dd877f" - integrity sha512-hNQ0PAg/LQoVbDUO/RWAdm/RYmPhN3cz7LuQ3hqbs24OSp69QCiKOJRrQ4jk1gv1jNR5oYu8SjjgfDh8q6Q1yw== + version "4.17.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.17.0.tgz#1b3eb5d1d60709e991e4c46b049e97911993193c" + integrity sha512-z50H44XbnkYlns7gVHzHK4jWAzLfvQehh5Lvindb09J97yVJKIbsmHs98D0f77tdZc3dSYM7oAqsFY55dBeOGQ== dependencies: "@popperjs/core" "^2.11.8" classnames "^2.2.6" date-fns "^2.30.0" prop-types "^15.7.2" - react-onclickoutside "^6.12.2" + react-onclickoutside "^6.13.0" react-popper "^2.3.0" react-docgen-typescript@^2.1.1: @@ -11432,14 +11309,13 @@ react-docgen@^5.0.0: node-dir "^0.1.10" strip-indent "^3.0.0" -react-dom@^17.0.0: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== +react-dom@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" + scheduler "^0.23.0" react-element-to-jsx-string@^14.3.4: version "14.3.4" @@ -11494,7 +11370,7 @@ react-modal@^3.14.4: react-lifecycles-compat "^3.0.0" warning "^4.0.3" -react-onclickoutside@^6.12.2: +react-onclickoutside@^6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz#e165ea4e5157f3da94f4376a3ab3e22a565f4ffc" integrity sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A== @@ -11551,13 +11427,12 @@ react-syntax-highlighter@^15.4.5: prismjs "^1.27.0" refractor "^3.6.0" -react@^17.0.0: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" reactcss@^1.2.0: version "1.2.3" @@ -12164,13 +12039,12 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@2.7.0: version "2.7.0" @@ -14106,7 +13980,12 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^8.11.0, ws@^8.2.3: +ws@^8.11.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" + integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== + +ws@^8.2.3: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==