diff --git a/frontend/.vscode/settings.json b/frontend/.vscode/settings.json index 23fd35f0..e6e3bb5f 100644 --- a/frontend/.vscode/settings.json +++ b/frontend/.vscode/settings.json @@ -1,3 +1,4 @@ { - "editor.formatOnSave": true -} \ No newline at end of file + "editor.formatOnSave": true, + "prettier.configPath": "../.prettierrc" +} diff --git a/frontend/package.json b/frontend/package.json index da84773d..17ae831d 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,6 +21,9 @@ "@babel/core": "^7.26.9", "@babel/preset-env": "^7.26.9", "@babel/preset-react": "^7.26.3", + "@testing-library/dom": "^8.20.1", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^12.1.5", "@types/flux": "^3.1.15", "@types/jest": "^29.5.12", "@types/minimatch": "^5.1.2", diff --git a/frontend/tests/utils/actions/MediaPageActions.test.ts b/frontend/tests/utils/actions/MediaPageActions.test.ts new file mode 100644 index 00000000..b0d89363 --- /dev/null +++ b/frontend/tests/utils/actions/MediaPageActions.test.ts @@ -0,0 +1,145 @@ +import * as MediaPageActions from '../../../src/static/js/utils/actions/MediaPageActions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by MediaPageActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('MediaPageActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + describe('loadMediaData', () => { + it('Should dispatch LOAD_MEDIA_DATA action', () => { + MediaPageActions.loadMediaData(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'LOAD_MEDIA_DATA' }); + }); + }); + + describe('likeMedia / dislikeMedia', () => { + it('Should dispatch LIKE_MEDIA action', () => { + MediaPageActions.likeMedia(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'LIKE_MEDIA' }); + }); + + it('Should dispatch DISLIKE_MEDIA action', () => { + MediaPageActions.dislikeMedia(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'DISLIKE_MEDIA' }); + }); + }); + + describe('reportMedia', () => { + it('Should dispatch REPORT_MEDIA with empty string when description is undefined', () => { + MediaPageActions.reportMedia(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REPORT_MEDIA', reportDescription: '' }); + }); + + // @todo: Revisit this behavior + it('Should dispatch REPORT_MEDIA with stripped description when provided', () => { + MediaPageActions.reportMedia(' some text '); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REPORT_MEDIA', reportDescription: 'sometext' }); + }); + + // @todo: Revisit this behavior + it('Should remove all whitespace characters including newlines and tabs', () => { + MediaPageActions.reportMedia('\n\t spaced\ntext \t'); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REPORT_MEDIA', reportDescription: 'spacedtext' }); + }); + }); + + describe('copyShareLink / copyEmbedMediaCode', () => { + it('Should dispatch COPY_SHARE_LINK carrying the provided input element', () => { + const inputElem = document.createElement('input'); + MediaPageActions.copyShareLink(inputElem); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'COPY_SHARE_LINK', inputElement: inputElem }); + }); + + it('Should dispatch COPY_EMBED_MEDIA_CODE carrying the provided textarea element', () => { + const textarea = document.createElement('textarea'); + MediaPageActions.copyEmbedMediaCode(textarea); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'COPY_EMBED_MEDIA_CODE', inputElement: textarea }); + }); + }); + + describe('removeMedia', () => { + it('Should dispatch REMOVE_MEDIA action', () => { + MediaPageActions.removeMedia(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REMOVE_MEDIA' }); + }); + }); + + describe('comments', () => { + it('Should dispatch SUBMIT_COMMENT with provided text', () => { + const commentText = 'Nice one'; + MediaPageActions.submitComment(commentText); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'SUBMIT_COMMENT', commentText }); + }); + + it('Should dispatch DELETE_COMMENT with provided comment id', () => { + const commentId = 'c-123'; + MediaPageActions.deleteComment(commentId); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'DELETE_COMMENT', commentId }); + }); + + // @todo: Revisit this behavior + it('Should dispatch DELETE_COMMENT with numeric comment id', () => { + const commentId = 42; + MediaPageActions.deleteComment(commentId); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'DELETE_COMMENT', commentId }); + }); + }); + + describe('playlists', () => { + it('Should dispatch CREATE_PLAYLIST with provided data', () => { + const payload = { title: 'My list', description: 'Desc' }; + MediaPageActions.createPlaylist(payload); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'CREATE_PLAYLIST', playlist_data: payload }); + }); + + it('Should dispatch ADD_MEDIA_TO_PLAYLIST with ids', () => { + const playlist_id = 'pl-1'; + const media_id = 'm-1'; + MediaPageActions.addMediaToPlaylist(playlist_id, media_id); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'ADD_MEDIA_TO_PLAYLIST', playlist_id, media_id }); + }); + + it('Should dispatch REMOVE_MEDIA_FROM_PLAYLIST with ids', () => { + const playlist_id = 'pl-1'; + const media_id = 'm-1'; + MediaPageActions.removeMediaFromPlaylist(playlist_id, media_id); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REMOVE_MEDIA_FROM_PLAYLIST', playlist_id, media_id }); + }); + + it('Should dispatch APPEND_NEW_PLAYLIST with provided playlist data', () => { + const playlist_data = { + playlist_id: 'pl-2', + add_date: new Date('2020-01-01T00:00:00Z'), + description: 'Cool', + title: 'T', + media_list: ['a', 'b'], + }; + MediaPageActions.addNewPlaylist(playlist_data); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'APPEND_NEW_PLAYLIST', playlist_data }); + }); + }); + }); +}); diff --git a/frontend/tests/utils/actions/PageActions.test.ts b/frontend/tests/utils/actions/PageActions.test.ts new file mode 100644 index 00000000..e9e1aff8 --- /dev/null +++ b/frontend/tests/utils/actions/PageActions.test.ts @@ -0,0 +1,55 @@ +import * as PageActions from '../../../src/static/js/utils/actions/PageActions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by PageActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('PageActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + describe('initPage', () => { + it('Should dispatch INIT_PAGE with provided page string', () => { + PageActions.initPage('home'); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'INIT_PAGE', page: 'home' }); + }); + + // @todo: Revisit this behavior + it('Should dispatch INIT_PAGE with empty string', () => { + PageActions.initPage(''); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'INIT_PAGE', page: '' }); + }); + }); + + describe('toggleMediaAutoPlay', () => { + it('Should dispatch TOGGLE_AUTO_PLAY action', () => { + PageActions.toggleMediaAutoPlay(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'TOGGLE_AUTO_PLAY' }); + }); + }); + + describe('addNotification', () => { + it('Should dispatch ADD_NOTIFICATION with message and id', () => { + const notification = 'Saved!'; + const notificationId = 'notif-1'; + PageActions.addNotification(notification, notificationId); + expect(dispatch).toHaveBeenCalledWith({ type: 'ADD_NOTIFICATION', notification, notificationId }); + }); + + // @todo: Revisit this behavior + it('Should dispatch ADD_NOTIFICATION with empty notification message', () => { + const notification = ''; + const notificationId = 'id-empty'; + PageActions.addNotification(notification, notificationId); + expect(dispatch).toHaveBeenCalledWith({ type: 'ADD_NOTIFICATION', notification, notificationId }); + }); + }); + }); +}); diff --git a/frontend/tests/utils/actions/PlaylistPageActions.test.ts b/frontend/tests/utils/actions/PlaylistPageActions.test.ts new file mode 100644 index 00000000..7c891220 --- /dev/null +++ b/frontend/tests/utils/actions/PlaylistPageActions.test.ts @@ -0,0 +1,96 @@ +import { PlaylistPageActions } from '../../../src/static/js/utils/actions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by PlaylistPageActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('PlaylistPageActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + describe('loadPlaylistData', () => { + it('Should dispatch LOAD_PLAYLIST_DATA action', () => { + PlaylistPageActions.loadPlaylistData(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'LOAD_PLAYLIST_DATA' }); + }); + }); + + describe('toggleSave', () => { + it('Should dispatch TOGGLE_SAVE action', () => { + PlaylistPageActions.toggleSave(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'TOGGLE_SAVE' }); + }); + }); + + describe('updatePlaylist', () => { + it('Should dispatch UPDATE_PLAYLIST with provided title and description', () => { + const payload = { title: 'My Playlist', description: 'A description' }; + PlaylistPageActions.updatePlaylist(payload); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'UPDATE_PLAYLIST', playlist_data: payload }); + }); + + // @todo: Revisit this behavior + it('Should dispatch UPDATE_PLAYLIST with empty strings for title and description', () => { + const payload = { title: '', description: '' }; + PlaylistPageActions.updatePlaylist(payload); + expect(dispatch).toHaveBeenCalledWith({ type: 'UPDATE_PLAYLIST', playlist_data: payload }); + }); + }); + + describe('removePlaylist', () => { + it('Should dispatch REMOVE_PLAYLIST action', () => { + PlaylistPageActions.removePlaylist(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REMOVE_PLAYLIST' }); + }); + }); + + describe('removedMediaFromPlaylist', () => { + it('Should dispatch MEDIA_REMOVED_FROM_PLAYLIST with media and playlist ids', () => { + PlaylistPageActions.removedMediaFromPlaylist('m1', 'p1'); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ + type: 'MEDIA_REMOVED_FROM_PLAYLIST', + media_id: 'm1', + playlist_id: 'p1', + }); + }); + + // @todo: Revisit this behavior + it('Should dispatch MEDIA_REMOVED_FROM_PLAYLIST with empty ids as strings', () => { + PlaylistPageActions.removedMediaFromPlaylist('', ''); + expect(dispatch).toHaveBeenCalledWith({ + type: 'MEDIA_REMOVED_FROM_PLAYLIST', + media_id: '', + playlist_id: '', + }); + }); + }); + + describe('reorderedMediaInPlaylist', () => { + it('Should dispatch PLAYLIST_MEDIA_REORDERED with provided array', () => { + const items = [ + { id: '1', url: '/1', thumbnail_url: '/t1' }, + { id: '2', url: '/2', thumbnail_url: '/t2' }, + ]; + PlaylistPageActions.reorderedMediaInPlaylist(items); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'PLAYLIST_MEDIA_REORDERED', playlist_media: items }); + }); + + // @todo: Revisit this behavior + it('Should dispatch PLAYLIST_MEDIA_REORDERED with empty array for playlist media', () => { + const items: any[] = []; + PlaylistPageActions.reorderedMediaInPlaylist(items); + expect(dispatch).toHaveBeenCalledWith({ type: 'PLAYLIST_MEDIA_REORDERED', playlist_media: items }); + }); + }); + }); +}); diff --git a/frontend/tests/utils/actions/PlaylistViewActions.test.ts b/frontend/tests/utils/actions/PlaylistViewActions.test.ts new file mode 100644 index 00000000..5ad86439 --- /dev/null +++ b/frontend/tests/utils/actions/PlaylistViewActions.test.ts @@ -0,0 +1,39 @@ +import { PlaylistViewActions } from '../../../src/static/js/utils/actions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by PlaylistViewActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('PlaylistViewActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + describe('toggleLoop', () => { + it('Should dispatch TOGGLE_LOOP action', () => { + PlaylistViewActions.toggleLoop(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'TOGGLE_LOOP' }); + }); + }); + + describe('toggleShuffle', () => { + it('Should dispatch TOGGLE_SHUFFLE action', () => { + PlaylistViewActions.toggleShuffle(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'TOGGLE_SHUFFLE' }); + }); + }); + + describe('toggleSave', () => { + it('Should dispatch TOGGLE_SAVE action', () => { + PlaylistViewActions.toggleSave(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'TOGGLE_SAVE' }); + }); + }); + }); +}); diff --git a/frontend/tests/utils/actions/ProfilePageActions.test.ts b/frontend/tests/utils/actions/ProfilePageActions.test.ts new file mode 100644 index 00000000..26c33936 --- /dev/null +++ b/frontend/tests/utils/actions/ProfilePageActions.test.ts @@ -0,0 +1,27 @@ +import { ProfilePageActions } from '../../../src/static/js/utils/actions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by ProfilePageActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('ProfilePageActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + it('Should dispatch LOAD_AUTHOR_DATA ', () => { + ProfilePageActions.load_author_data(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'LOAD_AUTHOR_DATA' }); + }); + + it('Should dispatch REMOVE_PROFILE ', () => { + ProfilePageActions.remove_profile(); + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenCalledWith({ type: 'REMOVE_PROFILE' }); + }); + }); +}); diff --git a/frontend/tests/utils/actions/SearchFieldActions.test.ts b/frontend/tests/utils/actions/SearchFieldActions.test.ts new file mode 100644 index 00000000..77168d91 --- /dev/null +++ b/frontend/tests/utils/actions/SearchFieldActions.test.ts @@ -0,0 +1,25 @@ +import { SearchFieldActions } from '../../../src/static/js/utils/actions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by SearchFieldActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('SearchFieldActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + describe('requestPredictions', () => { + it('Should dispatch REQUEST_PREDICTIONS with provided query strings', () => { + SearchFieldActions.requestPredictions('cats'); + SearchFieldActions.requestPredictions(''); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: 'REQUEST_PREDICTIONS', query: 'cats' }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: 'REQUEST_PREDICTIONS', query: '' }); + }); + }); + }); +}); diff --git a/frontend/tests/utils/actions/VideoViewerActions.test.ts b/frontend/tests/utils/actions/VideoViewerActions.test.ts new file mode 100644 index 00000000..f59e00c7 --- /dev/null +++ b/frontend/tests/utils/actions/VideoViewerActions.test.ts @@ -0,0 +1,72 @@ +import { VideoViewerActions } from '../../../src/static/js/utils/actions'; +import dispatcher from '../../../src/static/js/utils/dispatcher'; + +// Mock the dispatcher module used by VideoViewerActions +jest.mock('../../../src/static/js/utils/dispatcher', () => ({ dispatch: jest.fn() })); + +describe('utils/actions', () => { + describe('VideoViewerActions', () => { + const dispatch = dispatcher.dispatch; + + beforeEach(() => { + (dispatcher.dispatch as jest.Mock).mockClear(); + }); + + describe('set_viewer_mode', () => { + it('Should dispatch SET_VIEWER_MODE with "true" and "false" for enabling and disabling theater mode', () => { + VideoViewerActions.set_viewer_mode(true); + VideoViewerActions.set_viewer_mode(false); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: 'SET_VIEWER_MODE', inTheaterMode: true }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: 'SET_VIEWER_MODE', inTheaterMode: false }); + }); + }); + + describe('set_player_volume', () => { + it('Should dispatch SET_PLAYER_VOLUME with provided volume numbers', () => { + VideoViewerActions.set_player_volume(0); + VideoViewerActions.set_player_volume(0.75); + VideoViewerActions.set_player_volume(1); + expect(dispatch).toHaveBeenCalledTimes(3); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: 'SET_PLAYER_VOLUME', playerVolume: 0 }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: 'SET_PLAYER_VOLUME', playerVolume: 0.75 }); + expect(dispatch).toHaveBeenNthCalledWith(3, { type: 'SET_PLAYER_VOLUME', playerVolume: 1 }); + }); + }); + + describe('set_player_sound_muted', () => { + it('Should dispatch SET_PLAYER_SOUND_MUTED with "true" and "false"', () => { + VideoViewerActions.set_player_sound_muted(true); + VideoViewerActions.set_player_sound_muted(false); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: 'SET_PLAYER_SOUND_MUTED', playerSoundMuted: true }); + expect(dispatch).toHaveBeenNthCalledWith(2, { + type: 'SET_PLAYER_SOUND_MUTED', + playerSoundMuted: false, + }); + }); + }); + + describe('set_video_quality', () => { + it('Should dispatch SET_VIDEO_QUALITY with "auto" and numeric quality', () => { + VideoViewerActions.set_video_quality('auto'); + VideoViewerActions.set_video_quality(720); + expect(dispatch).toHaveBeenCalledTimes(2); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: 'SET_VIDEO_QUALITY', quality: 'auto' }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: 'SET_VIDEO_QUALITY', quality: 720 }); + }); + }); + + describe('set_video_playback_speed', () => { + it('Should dispatch SET_VIDEO_PLAYBACK_SPEED with different speeds', () => { + VideoViewerActions.set_video_playback_speed(1.5); + VideoViewerActions.set_video_playback_speed(0.5); + VideoViewerActions.set_video_playback_speed(2); + expect(dispatch).toHaveBeenCalledTimes(3); + expect(dispatch).toHaveBeenNthCalledWith(1, { type: 'SET_VIDEO_PLAYBACK_SPEED', playbackSpeed: 1.5 }); + expect(dispatch).toHaveBeenNthCalledWith(2, { type: 'SET_VIDEO_PLAYBACK_SPEED', playbackSpeed: 0.5 }); + expect(dispatch).toHaveBeenNthCalledWith(3, { type: 'SET_VIDEO_PLAYBACK_SPEED', playbackSpeed: 2 }); + }); + }); + }); +}); diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 24dced1d..3535ca6e 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.30.tgz" integrity sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg== +"@adobe/css-tools@^4.0.1": + version "4.4.4" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz" + integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== + "@asamuzakjp/css-color@^3.2.0": version "3.2.0" resolved "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz" @@ -45,7 +50,7 @@ resolved "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz" integrity sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== @@ -1002,6 +1007,11 @@ "@babel/plugin-transform-modules-commonjs" "^7.27.1" "@babel/plugin-transform-typescript" "^7.28.5" +"@babel/runtime@^7.12.5": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz" + integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== + "@babel/runtime@^7.3.4", "@babel/runtime@7.4.5": version "7.4.5" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz" @@ -1009,6 +1019,11 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.9.2": + version "7.28.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz" + integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== + "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": version "7.27.2" resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" @@ -1807,11 +1822,54 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" +"@testing-library/dom@^8.0.0", "@testing-library/dom@^8.20.1": + version "8.20.1" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== + 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" + +"@testing-library/jest-dom@^5.17.0": + version "5.17.0" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@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" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^12.1.5": + version "12.1.5" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz" + integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.0.0" + "@types/react-dom" "<18.0.0" + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@types/aria-query@^5.0.1": + version "5.0.4" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== + "@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" @@ -1977,7 +2035,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.12": +"@types/jest@*", "@types/jest@^29.5.12": version "29.5.14" resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz" integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== @@ -2046,6 +2104,11 @@ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz" integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== +"@types/react-dom@<18.0.0": + version "17.0.26" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz" + integrity sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg== + "@types/react@*", "@types/react@^19.0.10", "@types/react@^19.2.0": version "19.2.7" resolved "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz" @@ -2104,6 +2167,13 @@ resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz" integrity sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q== +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.9" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== + dependencies: + "@types/jest" "*" + "@types/tough-cookie@*": version "4.0.5" resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz" @@ -2531,6 +2601,13 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-query@^5.0.0, aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" @@ -2546,7 +2623,7 @@ arr-union@^3.1.0: resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== @@ -3273,7 +3350,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- es-errors "^1.3.0" function-bind "^1.1.2" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== @@ -3972,6 +4049,11 @@ css-what@^6.0.1: resolved "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz" integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" @@ -4191,6 +4273,30 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.5.1" +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" @@ -4363,6 +4469,11 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" @@ -4661,6 +4772,21 @@ es-errors@^1.3.0: resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-module-lexer@^1.2.1: version "1.7.0" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" @@ -5226,7 +5352,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -5778,6 +5904,11 @@ imurmurhash@^0.1.4: resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -5855,7 +5986,7 @@ is-arguments@^1.0.4, is-arguments@^1.1.1: call-bound "^1.0.2" has-tostringtag "^1.0.2" -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== @@ -6047,7 +6178,7 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-map@^2.0.3: +is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -6136,12 +6267,12 @@ is-regex@^1.1.4, is-regex@^1.2.1: has-tostringtag "^1.0.2" hasown "^2.0.2" -is-set@^2.0.3: +is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== -is-shared-array-buffer@^1.0.4: +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== @@ -6158,7 +6289,7 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.1.1: +is-string@^1.0.7, is-string@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== @@ -7077,6 +7208,11 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + magic-string@^0.25.7: version "0.25.9" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" @@ -7302,6 +7438,11 @@ mimic-response@^2.0.0: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-css-extract-plugin@^1.6.0: version "1.6.2" resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz" @@ -8400,16 +8541,16 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@^29.0.0: - version "29.7.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - "@jest/schemas" "^29.6.3" + ansi-regex "^5.0.1" ansi-styles "^5.0.0" - react-is "^18.0.0" + react-is "^17.0.1" -pretty-format@^29.7.0: +pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== @@ -8596,7 +8737,7 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -react-dom@^17.0.2, react-dom@>=16.8.0, react-dom@>=16.8.3: +react-dom@^17.0.2, react-dom@<18.0.0, react-dom@>=16.8.0, react-dom@>=16.8.3: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -8610,6 +8751,11 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0, react-is@^18.3.1: version "18.3.1" resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" @@ -8625,7 +8771,7 @@ react-mentions@^4.3.1: prop-types "^15.5.8" substyle "^9.1.0" -"react@^15.0.2 || ^16.0.0 || ^17.0.0", react@^17.0.2, react@>=16.8.0, react@>=16.8.3, react@17.0.2: +"react@^15.0.2 || ^16.0.0 || ^17.0.0", react@^17.0.2, react@<18.0.0, react@>=16.8.0, react@>=16.8.3, react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -8702,6 +8848,14 @@ readdirp@^4.0.1: resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: version "1.0.10" resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" @@ -9360,7 +9514,7 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.6, side-channel@^1.1.0: +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== @@ -9645,7 +9799,7 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stop-iteration-iterator@^1.1.0: +stop-iteration-iterator@^1.0.0, stop-iteration-iterator@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== @@ -9805,6 +9959,13 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" @@ -10670,15 +10831,7 @@ whatwg-url@^14.0.0, whatwg-url@^14.1.1: tr46 "^5.1.0" webidl-conversions "^7.0.0" -whatwg-url@^15.0.0: - version "15.1.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz" - integrity sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g== - dependencies: - tr46 "^6.0.0" - webidl-conversions "^8.0.0" - -whatwg-url@^15.1.0: +whatwg-url@^15.0.0, whatwg-url@^15.1.0: version "15.1.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz" integrity sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g== @@ -10694,7 +10847,7 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: +which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== @@ -10724,7 +10877,7 @@ which-builtin-type@^1.2.1: which-collection "^1.0.2" which-typed-array "^1.1.16" -which-collection@^1.0.2: +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -10739,7 +10892,7 @@ which-module@^2.0.0: resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.16, which-typed-array@^1.1.19, which-typed-array@^1.1.2: +which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.19, which-typed-array@^1.1.2: version "1.1.19" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== @@ -10829,12 +10982,7 @@ ws@^7.3.1: resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.18.0: - version "8.18.3" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== - -ws@^8.18.3: +ws@^8.18.0, ws@^8.18.3: version "8.18.3" resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==