From 8a4d386f1900f5da941ca34909bf88368a6fc4cf Mon Sep 17 00:00:00 2001 From: "mend-for-github-com[bot]" <50673670+mend-for-github-com[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 10:41:16 +0000 Subject: [PATCH 1/2] Update dependency axios to v1.15.2 --- .../project/yarn.lock | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/tutorials/vonage_video_react_app-feature-config/project/yarn.lock b/tutorials/vonage_video_react_app-feature-config/project/yarn.lock index b49b5b2e..b130e4f1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/yarn.lock +++ b/tutorials/vonage_video_react_app-feature-config/project/yarn.lock @@ -5959,13 +5959,14 @@ axe-core@^4.10.0: integrity sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A== axios@^1.12.0, axios@^1.13.5, axios@^1.2.1, axios@^1.6.3, axios@^1.8.3: - version "1.13.5" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" - integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== + version "1.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.18.1.tgz#d63f9863bcd8938815c86f9e2abd380189d96dfe" + integrity sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g== dependencies: - follow-redirects "^1.15.11" + follow-redirects "^1.16.0" form-data "^4.0.5" - proxy-from-env "^1.1.0" + https-proxy-agent "^5.0.1" + proxy-from-env "^2.1.0" axobject-query@^4.1.0: version "4.1.0" @@ -7523,9 +7524,9 @@ es-module-lexer@^2.0.0: integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== dependencies: es-errors "^1.3.0" @@ -8229,11 +8230,16 @@ flatted@^3.2.7, flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -follow-redirects@^1.0.0, follow-redirects@^1.15.11: +follow-redirects@^1.0.0: version "1.15.11" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== +follow-redirects@^1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + for-each@^0.3.3, for-each@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" @@ -8654,9 +8660,9 @@ has-tostringtag@^1.0.2: has-symbols "^1.0.3" hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: function-bind "^1.1.2" @@ -12079,10 +12085,10 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== psl@^1.1.33: version "1.15.0" From 471a3fdbc6dc8b4b4b8f2c95cf377eb59406ce55 Mon Sep 17 00:00:00 2001 From: "mend-for-github-com[bot]" <50673670+mend-for-github-com[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 10:43:05 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A4=96=20Auto-generate=20tutorial=20e?= =?UTF-8?q?nvironment=20[skip=20ci]:=20Update=20dependency=20axios=20to=20?= =?UTF-8?q?v1.15.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.astro/content-modules.mjs | 5 +- .../.astro/data-store.json | 2 +- .../.astro/settings.json | 2 +- .../tutorial-config.json | 2 +- .../.astro/content-modules.mjs | 7 +- .../.astro/data-store.json | 2 +- .../.astro/settings.json | 2 +- .../project/.clinerules | 1 + .../project/.cursorrules | 1 + .../project/.github/copilot-instructions.md | 44 +- .../instructions/test-files.instructions.md | 149 + .../workflows/auto-update-dependencies.yml | 2 +- .../project/.github/workflows/lint.yml | 4 +- .../project/.github/workflows/run-tests.yml | 7 +- .../project/.gitignore | 1 + .../project/.npmrc | 1 + .../project/.vonage/catalog-info.yaml | 8 + .../project/.vscode/extensions.json | 3 +- .../project/.vscode/launch.json | 13 + .../project/.windsurfrules | 1 + .../project/AGENTS.md | 1 + .../project/CLAUDE.md | 1 + .../project/CODEX.md | 1 + .../project/GEMINI.md | 1 + .../project/MAINTAINERS.md | 44 + .../project/README.md | 194 +- .../project/backend/.env.example | 6 + .../project/backend/errors/ValidationError.ts | 35 - .../backend/helpers/__mocks__/config.ts | 1 + .../project/backend/helpers/config.ts | 27 +- .../getOrCreateSessionKeyFromRoomName.ts | 37 + .../helpers/getSessionKeyFromRoomName.ts | 16 + .../project/backend/helpers/index.ts | 4 + .../project/backend/jest.config.js | 27 +- .../project/backend/jest/setEnvVars.js | 1 + .../backend/middleware/errorHandler.ts | 37 +- .../helmetMiddleware/helmetMiddleware.test.ts | 70 + .../helmetMiddleware/helmetMiddleware.ts | 82 + .../middleware/helmetMiddleware/index.ts | 1 + .../project/backend/middleware/index.ts | 3 + .../backend/middleware/rateLimitMiddleware.ts | 37 + .../project/backend/package.json | 2 +- .../project/backend/project.json | 11 +- .../project/backend/routes/feedback.ts | 5 +- .../backend/routes/getOrCreateSession.ts | 39 - .../project/backend/routes/index.ts | 2 + .../project/backend/routes/logger.ts | 79 +- .../project/backend/routes/session.ts | 185 +- .../routes/video/VONAGE_HOOKS_CONCLUSIONS.md | 106 + .../routes/video/constants/createSession.ts | 14 + .../routes/video/constants/enableCaptions.ts | 20 + .../backend/routes/video/constants/index.ts | 4 + .../routes/video/constants/joinSession.ts | 17 + .../routes/video/constants/startArchive.ts | 21 + .../project/backend/routes/video/index.ts | 3 + .../schemas/ArchiveHookPayload.schema.ts | 52 + .../schemas/CaptionsHookPayload.schema.ts | 33 + .../video/schemas/CaptionsStatus.schema.ts | 7 + .../schemas/SessionHookPayload.schema.ts | 27 + .../backend/routes/video/schemas/index.ts | 4 + .../project/backend/routes/video/setup.ts | 85 + .../backend/routes/video/types/index.ts | 6 + .../project/backend/routes/video/video.ts | 182 + .../project/backend/server.ts | 20 +- .../backend/services/feedbackService.ts | 2 +- .../backend/services/jiraFeedbackService.ts | 18 +- .../project/backend/services/loggerService.ts | 24 +- .../tests/jiraFeedbackService.test.ts | 45 +- .../services/tests/loggerService.test.ts | 22 +- .../tests/loggerServiceWarnOnce.test.ts | 72 + .../project/backend/sessionStorageService.ts | 10 +- .../backend/storage/inMemorySessionStorage.ts | 57 - .../inMemorySessionStorage.test.ts | 107 + .../inMemorySessionStorage.ts | 113 + .../storage/inMemorySessionStorage/index.ts | 1 + .../project/backend/storage/sessionStorage.ts | 17 +- .../tests/inMemorySessionStorage.test.ts | 103 - .../backend/storage/vcrSessionStorage.ts | 78 +- .../backend/tests/ValidationError.test.ts | 54 - .../backend/tests/errorHandler.test.ts | 25 +- .../backend/tests/getOrCreateSession.test.ts | 90 - .../backend/tests/helpers/config.test.ts | 17 + .../project/backend/tests/logger.test.ts | 118 +- .../project/backend/tests/session.test.ts | 446 +- .../project/backend/tsconfig.json | 6 +- .../project/backend/types/config.ts | 9 +- .../videoService/opentokVideoService.ts | 2 +- .../tests/opentokVideoService.test.ts | 4 +- .../tests/vonageVideoService.test.ts | 23 + .../videoService/videoServiceFactory.ts | 1 + .../videoService/videoServiceInterface.ts | 2 +- .../videoService/vonageVideoService.ts | 7 +- .../project/customWordList.mjs | 9 + .../project/designTokens.example.json | 195 + .../project/designTokens.json | 195 + .../project/docs/CONTRIBUTING.md | 97 +- .../project/docs/DEPENDENCIES.md | 5 +- .../project/docs/TESTING.md | 341 - .../project/eslint.config.mjs | 1 + .../project/frontend/.storybook/preview.tsx | 3 + .../project/frontend/package.json | 2 +- .../project/frontend/project.json | 15 +- .../frontend/public/{ => assets}/sound.mp3 | Bin .../project/frontend/src/App.tsx | 42 +- .../frontend/src/AppContextProvider.tsx | 9 +- .../AdvancedSettings/AdvancedSettings.tsx | 185 + .../src/Context/AdvancedSettings/index.ts | 2 + .../useBackgroundPublisher.spec.tsx | 13 +- .../useBackgroundPublisher.tsx | 29 +- .../LoggerSynchronizer.spec.tsx | 99 + .../LoggerSynchronizer/LoggerSynchronizer.tsx | 21 + .../src/Context/LoggerSynchronizer/index.tsx | 1 + .../usePreviewPublisher.tsx | 81 +- .../applyAdvancedSettingsToPublisher.spec.ts | 110 + .../applyAdvancedSettingsToPublisher.ts | 101 + .../useApplyAdvancedSettings/index.ts | 2 + .../useApplyAdvancedSettings.spec.tsx | 92 + .../useApplyAdvancedSettings.tsx | 21 + .../useSyncPublisherDevices.ts | 2 +- .../usePublisher/usePublisher.spec.tsx | 7 +- .../usePublisher/usePublisher.tsx | 2 + .../usePublisherOptions.spec.tsx | 75 +- .../usePublisherOptions.tsx | 33 +- .../Context/SessionProvider/session.spec.tsx | 65 +- .../src/Context/SessionProvider/session.tsx | 64 +- .../src/Context/tests/RoomContext.spec.tsx | 2 - .../frontend/src/Context/tests/user.spec.tsx | 2 - .../project/frontend/src/Context/user.tsx | 6 +- .../frontend/src/VeraRoom/VeraRoom.spec.tsx | 9 +- .../src/VeraRoom/VeraRoom.stories.tsx | 12 +- .../frontend/src/VeraRoom/VeraRoom.tsx | 20 +- .../src/VeraRoom/VeraRoomElement.spec.tsx | 22 +- .../frontend/src/VeraRoom/VeraRoomElement.tsx | 35 +- .../frontend/src/VeraRoom/example/Example.tsx | 26 +- .../frontend/src/VeraRoom/example/index.html | 6 +- .../VeraRoom/example/vite.example.config.ts | 2 +- .../src/VeraRoom/hooks/useLanguageSync.ts | 29 - .../VeraRoom/hooks/useStateSynchronizer.ts | 52 + .../project/frontend/src/VeraRoom/index.ts | 3 + .../stages/GoodByeStage/GoodByeStage.spec.tsx | 15 +- .../stages/GoodByeStage/GoodByeStage.tsx | 13 +- .../MeetingRoomStage.spec.tsx | 13 +- .../MeetingRoomStage/MeetingRoomStage.tsx | 2 +- .../WaitingRoomStage.spec.tsx | 57 +- .../WaitingRoomStage/WaitingRoomStage.tsx | 13 +- .../frontend/src/VeraRoom/stores/index.ts | 2 +- .../project/frontend/src/VeraRoom/styles.css | 8 + .../src/VeraRoom/vite.veraroom.config.ts | 8 +- .../archiving/getArchives/getArchives.spec.ts | 76 + .../api/archiving/getArchives/getArchives.ts | 45 + .../src/api/archiving/getArchives/index.ts | 1 + .../frontend/src/api/archiving/index.ts | 34 +- .../frontend/src/api/archiving/routes.ts | 38 - .../frontend/src/api/archiving/tests/data.ts | 14 - .../src/api/archiving/tests/index.spec.ts | 52 +- .../project/frontend/src/api/captions.ts | 47 - .../AdvancedSettings/Dialog/index.tsx | 1 + .../AdvancedSettingsDialog.spec.tsx | 74 + .../AdvancedSettingsDialog.tsx | 67 + .../AdvancedSettingsAudioTab.spec.tsx | 69 + .../AdvancedSettingsAudioTab.tsx | 127 + .../AdvancedSettingsAudioTab/index.tsx | 1 + ...dvancedSettingsCodecPriorityField.spec.tsx | 40 + .../AdvancedSettingsCodecPriorityField.tsx | 139 + .../index.tsx | 1 + ...edSettingsCustomVideoBitrateField.spec.tsx | 51 + ...dvancedSettingsCustomVideoBitrateField.tsx | 87 + .../index.tsx | 1 + .../AdvancedSettingsGeneralTab.spec.tsx | 13 + .../AdvancedSettingsGeneralTab.tsx | 27 + .../AdvancedSettingsGeneralTab/index.tsx | 1 + .../AdvancedSettingsSidebar.spec.tsx | 29 + .../AdvancedSettingsSidebar.tsx | 41 + .../AdvancedSettingsSidebar/index.tsx | 1 + .../AdvancedSettingsStatisticsGroup.spec.tsx | 21 + .../AdvancedSettingsStatisticsGroup.tsx | 89 + .../AdvancedSettingsStatisticsGroup/index.tsx | 1 + .../AdvancedSettingsStatisticsTab.spec.tsx | 161 + .../AdvancedSettingsStatisticsTab.tsx | 55 + .../components/PublisherStatistics.tsx | 117 + .../components/SubscriberStatistics.tsx | 110 + .../AdvancedSettingsStatisticsTab/index.tsx | 1 + .../AdvancedSettingsVideoTab.spec.tsx | 54 + .../AdvancedSettingsVideoTab.tsx | 135 + .../AdvancedSettingsVideoTab/index.tsx | 1 + .../useAdvancedSettingsVideoHandlers.spec.ts | 283 + .../useAdvancedSettingsVideoHandlers.ts | 89 + .../AdvancedSettingsDialog/index.tsx | 1 + .../AdvancedSettingsDialog/types/types.ts | 49 + .../AvatarInitials/AvatarInitials.tsx | 4 + .../AddBackgroundEffectLayout.tsx | 5 +- .../BackgroundEffectOptions.spec.tsx | 1 + .../BackgroundEffectOptions.tsx | 23 +- .../BackgroundEffectsLayout.spec.tsx | 1 + .../BackgroundEffectsLayout.tsx | 28 +- .../BackgroundGallery.spec.tsx | 9 +- .../BackgroundGallery/BackgroundGallery.tsx | 24 +- .../BackgroundVideoContainer.tsx | 34 +- .../EffectOptionButtons.spec.tsx | 9 +- .../EffectOptionButtons.tsx | 2 +- .../SelectableOption/SelectableOption.tsx | 16 +- .../frontend/src/components/Banner/Banner.tsx | 42 +- .../BannerLanguage/BannerLanguage.tsx | 2 +- .../DeviceAccessAlert.spec.tsx | 14 +- .../DeviceAccessAlert/DeviceAccessAlert.tsx | 4 +- .../frontend/src/components/Footer/Footer.tsx | 37 +- .../components/GHRepoButton/GHRepoButton.tsx | 8 +- .../GoodBye/ArchiveList/ArchiveList.tsx | 50 +- .../GoodBye/GoodbyeMessage/GoodbyeMessage.tsx | 7 +- .../ReenterRoomButton.spec.tsx | 21 +- .../ReenterRoomButton/ReenterRoomButton.tsx | 24 +- .../HiddenParticipantsTile.spec.tsx | 20 +- .../HiddenParticipantsTile.tsx | 13 +- .../JoinContainerSeparator.tsx | 15 +- .../JoinExistingRoom.spec.tsx | 6 +- .../JoinExistingRoom/JoinExistingRoom.tsx | 5 +- .../JoinWaitRoomButton.spec.tsx | 26 +- .../JoinWaitRoomButton/JoinWaitRoomButton.tsx | 21 +- .../LandingPageWelcome/LandingPageWelcome.tsx | 14 +- .../LanguageSelector.spec.tsx | 2 +- .../LanguageSelector/LanguageSelector.tsx | 36 +- .../AdvancedSettingsButton.spec.tsx | 26 + .../AdvancedSettingsButton.tsx | 54 + .../AdvancedSettingsButton/index.tsx | 3 + .../ArchivingButton/ArchivingButton.spec.tsx | 34 +- .../ArchivingButton/ArchivingButton.tsx | 35 +- .../AudioIndicator/AudioIndicator.spec.tsx | 12 +- .../AudioIndicator/AudioIndicator.tsx | 19 +- .../CaptionsBox/CaptionsBox.tsx | 10 +- .../CaptionsBox/UserCaption/UserCaption.tsx | 4 +- .../CaptionsButton/CaptionsButton.spec.tsx | 35 +- .../CaptionsButton/CaptionsButton.tsx | 34 +- .../CaptionsError/CaptionsError.tsx | 5 +- .../components/MeetingRoom/Chat/Chat.spec.tsx | 12 +- .../ChatButton/ChatButton.spec.tsx | 22 +- .../MeetingRoom/ChatButton/ChatButton.tsx | 8 +- .../MeetingRoom/ChatInput/ChatInput.spec.tsx | 12 +- .../MeetingRoom/ChatInput/ChatInput.tsx | 38 +- .../MeetingRoom/ChatMessage/ChatMessage.tsx | 11 +- .../DeviceControlButton.tsx | 28 +- .../DeviceSettingsMenu/DeviceSettingsMenu.tsx | 9 +- .../DropdownSeparator/DropdownSeparator.tsx | 5 +- .../MeetingRoom/Emoji/Emoji.spec.tsx | 16 - .../components/MeetingRoom/Emoji/Emoji.tsx | 39 +- .../MeetingRoom/EmojiGrid/EmojiGrid.tsx | 5 +- .../EmojiGridButton/EmojiGridButton.tsx | 8 +- .../MeetingRoom/ExitButton/ExitButton.tsx | 22 +- .../InputAudioDevices.spec.tsx | 7 +- .../InputAudioDevices/InputAudioDevices.tsx | 58 +- .../LayoutButton/LayoutButton.spec.tsx | 12 +- .../MeetingRoom/LayoutButton/LayoutButton.tsx | 16 +- .../MutingDialog/MutingDialog.spec.tsx | 12 +- .../MeetingRoom/NameDisplay/NameDisplay.tsx | 4 +- .../OutputAudioDevices/OutputAudioDevices.tsx | 58 +- .../ParticipantList/ParticipantList.spec.tsx | 12 +- .../ParticipantList/ParticipantList.tsx | 42 +- .../ParticipantListButton.tsx | 13 +- .../ParticipantsListButton.spec.tsx | 9 +- .../ParticipantListItem.tsx | 20 +- .../ParticipantListItemMenu.spec.tsx | 12 +- .../ParticipantListItemMenu.tsx | 24 +- .../ParticipantPinMenuItem.tsx | 17 +- .../MeetingRoom/PinButton/PinButton.tsx | 21 +- .../MeetingRoom/PopupAlert/PopupAlert.tsx | 1 + .../RecordingPopupIndicator.spec.tsx | 63 +- .../RecordingPopupIndicator.tsx | 7 +- .../ReduceNoiseTestSpeakers.spec.tsx | 61 +- .../ReduceNoiseTestSpeakers.tsx | 106 +- .../ReportIssue/FeedbackForm/FeedbackForm.tsx | 28 +- .../FeedbackForm/FilePicker/FilePicker.tsx | 13 +- .../FeedbackForm/HelperText/HelperText.tsx | 2 +- .../FormSubmitted/FormSubmitted.tsx | 6 +- .../ReportIssueButton.spec.tsx | 10 - .../ReportIssueButton/ReportIssueButton.tsx | 6 +- .../MeetingRoom/RightPanel/RightPanel.tsx | 7 +- .../RightPanel/RightPanelTitle.tsx | 13 +- .../ScreenSharePublisher.spec.tsx | 28 +- .../ScreenSharePublisher.tsx | 19 +- .../ScreenshareVideoTile.tsx | 10 +- .../SendEmojiButton/SendEmojiButton.tsx | 16 +- .../SmallViewportHeader.spec.tsx | 119 +- .../SmallViewportHeader.tsx | 58 +- .../SmallViewportHeader/hooks/index.ts | 1 + .../useSwitchCameraFacingModeHandler.spec.ts | 74 + .../hooks/useSwitchCameraFacingModeHandler.ts | 120 + .../MeetingRoom/TimeRoomName/TimeRoomName.tsx | 10 +- .../MeetingRoom/Toolbar/Toolbar.spec.tsx | 16 +- .../MeetingRoom/Toolbar/Toolbar.tsx | 10 +- .../ToolbarButton/ToolbarButton.tsx | 12 +- .../ToolbarOverflowButton.spec.tsx | 12 +- .../ToolbarOverflowButton.tsx | 10 +- .../ToolbarOverflowMenu.spec.tsx | 19 +- .../ToolbarOverflowMenu.tsx | 10 +- .../UnreadMessagesBadge.spec.tsx | 14 +- .../UnreadMessagesBadge.tsx | 8 +- .../VideoDevices/VideoDevices.spec.tsx | 3 +- .../MeetingRoom/VideoDevices/VideoDevices.tsx | 59 +- .../VideoDevicesOptions.tsx | 12 +- .../MeetingRoom/VideoTile/VideoTile.tsx | 13 +- .../VideoTileCanvas/VideoTileCanvas.spec.tsx | 49 + .../VideoTileCanvas/VideoTileCanvas.tsx | 9 + .../VoiceIndicator/VoiceIndicator.tsx | 13 +- .../ZoomIndicator/ZoomIndicator.tsx | 36 +- .../src/components/MutedAlert/MutedAlert.tsx | 4 +- .../NewRoomButton/NewRoomButton.tsx | 6 +- .../src/components/Publisher/Publisher.tsx | 14 +- .../RedirectToWaitingRoom.spec.tsx | 8 +- .../RedirectToWaitingRoom.tsx | 7 +- .../RoomJoinContainer.spec.tsx | 24 +- .../RoomJoinContainer/RoomJoinContainer.tsx | 18 +- .../RoomNameInput/RoomNameInput.tsx | 6 +- .../ScreenShareNameDisplay.tsx | 27 +- .../ScreenSharingButton.tsx | 12 +- .../src/components/Separator/Separator.tsx | 4 +- .../components/SoundTest/SoundTest.spec.tsx | 2 +- .../src/components/SoundTest/SoundTest.tsx | 25 +- .../src/components/Subscriber/Subscriber.tsx | 13 +- .../SupportedBrowserListItem.tsx | 13 +- .../SupportedBrowsers/SupportedBrowsers.tsx | 4 +- .../UnsupportedBrowserMessage.tsx | 6 +- .../components/VividIcon/VividIcon.spec.tsx | 88 - .../src/components/VividIcon/VividIcon.tsx | 64 +- .../src/components/VividIcon/index.tsx | 3 - .../src/components/VividIcon/sxToStyle.ts | 33 - .../BackgroundEffectsButton.tsx | 16 +- .../BackgroundEffectsDialog.spec.tsx | 9 +- .../BackgroundEffectsDialog.tsx | 14 +- .../CameraButton/CameraButton.spec.tsx | 2 + .../WaitingRoom/CameraButton/CameraButton.tsx | 25 +- .../ControlPanel/ControlPanel.spec.tsx | 2 + .../WaitingRoom/ControlPanel/ControlPanel.tsx | 35 +- .../MenuDevices/MenuDevices.spec.tsx | 87 +- .../WaitingRoom/MenuDevices/MenuDevices.tsx | 79 +- .../MenuMoreOptions/MenuMoreOptions.spec.tsx | 90 +- .../MenuMoreOptions/MenuMoreOptions.tsx | 157 +- .../WaitingRoom/MicButton/MicButton.tsx | 25 +- .../DialogActionsRow/DialogActionsRow.tsx | 14 +- .../PrecallNetworkTestDialog.spec.tsx | 10 +- .../PrecallNetworkTestDialog.tsx | 54 +- .../PrecallNetworkTestQualityRow.tsx | 22 +- .../hooks/useNetworkTest.spec.tsx | 48 +- .../hooks/useNetworkTest.tsx | 11 +- .../PreviewAvatar/PreviewAvatar.spec.tsx | 7 +- .../PreviewAvatar/PreviewAvatar.tsx | 6 +- .../UserNameInput/UserNameInput.tsx | 13 +- .../VideoContainer.skeleton.tsx | 4 +- .../VideoContainer/VideoContainer.tsx | 12 + .../VideoContainerButton.tsx | 13 +- .../VideoStatsOverlay.spec.tsx | 109 + .../VideoStatsOverlay/VideoStatsOverlay.tsx | 30 + .../WaitingRoom/VideoStatsOverlay/index.tsx | 1 + .../VignetteEffect/VignetteEffect.tsx | 6 +- .../project/frontend/src/components/index.ts | 29 + .../project/frontend/src/css/index.css | 29 +- .../project/frontend/src/env.ts | 317 +- .../useCollectBrowserInformation.spec.tsx | 12 +- .../src/hooks/tests/useGoodByePage.spec.tsx | 107 +- .../src/hooks/tests/useMeetingRoom.spec.tsx | 32 +- .../src/hooks/tests/useRoomName.spec.tsx | 45 - .../src/hooks/tests/useRoomShareUrl.spec.tsx | 34 +- .../src/hooks/tests/useScreenShare.spec.tsx | 177 +- .../src/hooks/tests/useWaitingRoom.spec.tsx | 8 + .../frontend/src/hooks/useArchives.tsx | 82 +- .../frontend/src/hooks/useAudioLevels.tsx | 2 +- .../frontend/src/hooks/useDateTime.tsx | 2 +- .../src/hooks/useDecodedSessionKey.ts | 34 + .../src/hooks/useElementDimensions.tsx | 2 +- .../project/frontend/src/hooks/useEmoji.tsx | 2 +- .../frontend/src/hooks/useGoodByePage.ts | 16 +- .../frontend/src/hooks/useMeetingRoom.ts | 82 +- .../filterMobileCameras.spec.ts | 177 - .../filterMobileCameras.ts | 28 - .../helpers/filterMobileCameras/index.ts | 3 - .../src/hooks/usePreferredCameras/index.ts | 1 - .../usePreferredCameras.ts | 25 - .../frontend/src/hooks/useRoomName.tsx | 31 - .../frontend/src/hooks/useRoomShareUrl.tsx | 6 +- .../frontend/src/hooks/useScreenShare.tsx | 24 +- .../src/hooks/useSelectDeviceHandler/index.ts | 1 + .../useSelectDeviceHandler.test.ts | 33 + .../useSelectDeviceHandler.ts | 53 + .../frontend/src/hooks/useSessionKeyParam.ts | 42 + .../frontend/src/hooks/useToolbarButtons.tsx | 2 +- .../frontend/src/hooks/useWaitingRoom.ts | 11 + .../project/frontend/src/locales/de.json | 97 +- .../project/frontend/src/locales/en.json | 97 +- .../project/frontend/src/locales/es-MX.json | 97 +- .../project/frontend/src/locales/es.json | 97 +- .../project/frontend/src/locales/it.json | 97 +- .../logger/event/createClientEvent.spec.ts | 19 + .../src/logger/event/createClientEvent.ts | 5 +- .../logger/transport/backendLogTransport.ts | 24 +- .../project/frontend/src/main.tsx | 14 +- .../src/pages/ErrorBoundary/ErrorPage.tsx | 23 +- .../src/pages/GoodBye/GoodBye.spec.tsx | 42 +- .../frontend/src/pages/GoodBye/GoodBye.tsx | 13 +- .../MeetingRoom/MeetingRoom.skeleton.tsx | 10 +- .../pages/MeetingRoom/MeetingRoom.spec.tsx | 75 +- .../src/pages/MeetingRoom/MeetingRoom.tsx | 23 +- .../pages/WaitingRoom/WaitingRoom.spec.tsx | 4 +- .../src/pages/WaitingRoom/WaitingRoom.tsx | 2 + .../project/frontend/src/services/index.ts | 1 + .../frontend/src/services/videoClient.ts | 8 + .../project/frontend/src/setup/index.ts | 1 + .../src/setup/tryOverrideVonageVideoHost.ts | 42 + .../makeAdvancedSettingsProviderWrapper.tsx | 31 + .../providers/makeRuntimeProviderWrapper.tsx | 23 + .../src/test/providers/makeTestProvider.ts | 141 +- .../src/test/providers/makersIndex.ts | 10 + .../project/frontend/src/test/setup.ts | 47 + .../project/frontend/src/types/room.ts | 7 - .../project/frontend/src/types/session.ts | 7 +- .../activeSpeakerTracker.spec.ts | 10 +- .../activeSpeakerTracker.ts | 2 +- .../SpeakingDetector/speakingDetector.spec.ts | 6 +- .../vonageVideoClient.spec.ts | 56 +- .../VonageVideoClient/vonageVideoClient.ts | 124 +- .../applyBackgroundFilter.ts | 2 +- .../frontend/src/utils/cameraSwitch/index.ts | 2 - .../cameraSwitch/isFrontFacingLabel/index.ts | 1 - .../isFrontFacingLabel.spec.ts | 21 - .../isFrontFacingLabel/isFrontFacingLabel.ts | 10 - .../cameraSwitch/isRearFacingLabel/index.ts | 1 - .../isRearFacingLabel.spec.ts | 20 - .../isRearFacingLabel/isRearFacingLabel.ts | 10 - .../project/frontend/src/utils/constants.tsx | 10 - .../getMaxSubscriberOnScreenCount.spec.ts | 4 +- .../getMaxSubscriberOnScreenCount.ts | 2 +- .../getSubscribersInDisplayOrder.ts | 8 +- .../src/utils/isValidRoomName/index.ts | 3 - .../frontend/src/utils/mediaDeviceUtils.ts | 39 - .../frontend/src/utils/mockData/device.ts | 15 - .../project/frontend/src/utils/util.spec.tsx | 34 +- .../project/frontend/src/utils/util.ts | 22 +- .../project/frontend/tailwind.config.cjs | 4 +- .../project/frontend/tsconfig.json | 29 +- .../project/frontend/vite.config.ts | 147 +- .../project/integration-tests/package.json | 2 +- .../project/integration-tests/project.json | 1 + .../test-api/apiIntegrity.test.ts | 587 + .../integration-tests/test-api/jest.config.js | 32 + .../integration-tests/test-api/tsconfig.json | 25 + .../tests/advancedSettings.spec.ts | 105 + .../integration-tests/tests/goodbye.spec.ts | 9 +- .../integration-tests/tests/landing.spec.ts | 12 +- .../tests/multiparty.spec.ts | 4 +- .../integration-tests/tests/pinning.spec.ts | 59 +- ...st-1-Google-Chrome-Fake-Devices-darwin.png | Bin 32472 -> 32685 bytes ...ng-page-UI-test-1-Mobile-Chrome-darwin.png | Bin 16401 -> 16372 bytes .../Waiting-page-UI-test-1-firefox-darwin.png | Bin 67119 -> 66588 bytes .../tests/waitingRoom.spec.ts | 4 +- .../project/integration-tests/tsconfig.json | 5 +- .../project/libs/api/project.json | 6 +- .../project/libs/api/src/constants/index.ts | 1 + .../libs/api/src/constants/schemasByAction.ts | 28 + .../src/core/VideoClient/VideoClient.test.ts | 540 + .../api/src/core/VideoClient/VideoClient.ts | 180 + .../libs/api/src/core/VideoClient/index.ts | 2 + .../project/libs/api/src/core/index.ts | 2 + .../src/errors/ApplicationServerError.test.ts | 2 +- .../api/src/errors/ApplicationServerError.ts | 117 +- .../libs/api/src/errors/assertions/index.ts | 4 +- .../assertions/isHttpErrorLike/index.ts | 1 + .../isHttpErrorLike/isHttpErrorLike.ts | 10 + .../libs/api/src/errors/handlers/index.ts | 11 +- .../makeBadRequestErrorHandler.ts | 4 +- .../makeInternalErrorHandler.ts | 47 +- .../makeNotFoundErrorHandler/index.ts | 1 + .../makeNotFoundErrorHandler.ts | 16 + .../makeThirdPartyErrorHandler.test.ts | 8 +- .../makeThirdPartyErrorHandler.ts | 6 +- .../makeUnauthorizedErrorHandler.ts | 4 +- .../makeVideoApiErrorHandler.test.ts | 7 +- .../makeVideoApiErrorHandler.ts | 4 +- .../libs/api/src/errors/helpers/index.ts | 3 +- .../helpers/mapServerSourceToState/index.ts | 2 +- .../api/src/errors/helpers/toTRPCError.ts | 61 + .../project/libs/api/src/errors/index.ts | 5 + .../libs/api/src/errors/types/HttpError.ts | 24 + .../libs/api/src/errors/types/index.ts | 1 + .../libs/api/src/executions/assertResult.ts | 36 + .../project/libs/api/src/executions/index.ts | 1 + .../api/src/handlers/createEphemeralToken.ts | 38 + .../libs/api/src/handlers/createSession.ts | 37 + .../api/src/handlers/createSessionAndJoin.ts | 22 + .../libs/api/src/handlers/decodeSessionId.ts | 19 + .../libs/api/src/handlers/decodeSessionKey.ts | 60 + .../libs/api/src/handlers/disableCaptions.ts | 30 + .../libs/api/src/handlers/enableCaptions.ts | 28 + .../api/src/handlers/ensureCaptionsEnabled.ts | 54 + .../project/libs/api/src/handlers/index.ts | 12 + .../libs/api/src/handlers/joinSession.ts | 23 + .../libs/api/src/handlers/searchArchives.ts | 23 + .../libs/api/src/handlers/startArchive.ts | 25 + .../libs/api/src/handlers/stopArchive.ts | 24 + .../project/libs/api/src/index.ts | 3 + .../helpers/composeHandlers.test.ts | 424 + .../httpHandler/helpers/composeHandlers.ts | 78 + .../helpers/handlerErrorWrapper.ts | 36 + .../routing/httpHandler/httpHandler.test.ts | 343 + .../src/routing/httpHandler/httpHandler.ts | 85 + .../libs/api/src/routing/httpHandler/index.ts | 1 + .../project/libs/api/src/routing/index.ts | 3 + .../videoHandler/createVideoHandler.test.ts | 545 + .../videoHandler/createVideoHandler.ts | 172 + .../api/src/routing/videoHandler/index.ts | 1 + .../videoRouter/createVideoRouter.test.ts | 718 + .../routing/videoRouter/createVideoRouter.ts | 670 + .../libs/api/src/routing/videoRouter/index.ts | 2 + .../libs/api/src/schemas/ACL.schema.ts | 9 + .../libs/api/src/schemas/ACLRule.schema.ts | 9 + .../api/src/schemas/AlgorithmTypes.schema.ts | 6 + .../src/schemas/ArchiveSearchFilter.schema.ts | 20 + .../libs/api/src/schemas/AuthParams.schema.ts | 40 + .../api/src/schemas/CaptionOptions.schema.ts | 11 + .../src/schemas/ClientTokenOptions.schema.ts | 11 + .../api/src/schemas/ConfigParams.schema.ts | 15 + .../CreateEphemeralTokenPayload.schema.ts | 11 + .../CreateSessionAndJoinPayload.schema.ts | 11 + .../schemas/CreateSessionPayload.schema.ts | 18 + .../schemas/DecodeSessionIdPayload.schema.ts | 14 + .../schemas/DisableCaptionsPayload.schema.ts | 10 + .../schemas/EnableCaptionsPayload.schema.ts | 11 + .../src/schemas/GeneratorOptions.schema.ts | 18 + .../src/schemas/JoinSessionPayload.schema.ts | 15 + .../src/schemas/ListArchivesPayload.schema.ts | 8 + .../libs/api/src/schemas/Metadata.schema.ts | 7 + .../api/src/schemas/ResponseTypes.schema.ts | 6 + .../schemas/SearchArchivesPayload.schema.ts | 14 + .../api/src/schemas/SessionOptions.schema.ts | 16 + .../api/src/schemas/SessionSigning.schema.ts | 30 + .../src/schemas/SignedHashParams.schema.ts | 10 + .../src/schemas/StartArchivePayload.schema.ts | 17 + .../src/schemas/StopArchivePayload.schema.ts | 10 + .../TRPCRuntimeConfigOptions.schema.ts | 9 + .../api/src/schemas/VideoAction.schema.ts | 13 + .../src/schemas/VideoClientConfig.schema.ts | 46 + .../api/src/schemas/VideoPayload.schema.ts | 10 + .../src/schemas/VideoRouterConfig.schema.ts | 50 + .../project/libs/api/src/schemas/index.ts | 29 + .../src/types/ApplicationErrorMiddleware.ts | 21 + .../libs/api/src/types/ApplicationHandler.ts | 27 + .../libs/api/src/types/ApplicationRequest.ts | 14 + .../src/types/ApplicationRequestHandler.ts | 24 + .../libs/api/src/types/HandlerConfig.ts | 20 + .../libs/api/src/types/HandlersConfig.ts | 17 + .../libs/api/src/types/HandlersDefaults.ts | 10 + .../libs/api/src/types/IVideoClient.ts | 1 + .../libs/api/src/types/IVideoRouter.ts | 1 + .../libs/api/src/types/ParamsDictionary.ts | 5 + .../project/libs/api/src/types/Query.ts | 5 + .../project/libs/api/src/types/TokenRole.ts | 8 + .../project/libs/api/src/types/VideoAction.ts | 17 + .../project/libs/api/src/types/index.ts | 32 + .../project/libs/api/tsconfig.json | 6 +- .../project/libs/api/tsconfig.lib.json | 13 +- .../project/libs/api/tsconfig.spec.json | 7 +- .../project/libs/api/vite.config.ts | 10 + .../src/assertions/assertNotEmptyString.ts | 9 + .../assertNotNil/assertNotNil.test.ts | 15 + .../assertions/assertNotNil/assertNotNil.ts | 9 + .../src/assertions/assertNotNil/index.ts | 1 + .../assertNumericString.ts | 9 + .../assertions/assertNumericString/index.ts | 1 + .../assertSessionId/assertSessionId.test.ts | 15 + .../assertSessionId/assertSessionId.ts | 10 + .../src/assertions/assertSessionId/index.ts | 1 + .../common/src/assertions/assertString.ts | 9 + .../libs/common/src/assertions/index.ts | 12 + .../common/src/assertions/isNumber/index.ts | 1 + .../src/assertions/isNumber/isNumber.ts | 5 + .../src/assertions/isNumericString/index.ts | 1 + .../isNumericString/isNumericString.ts | 17 + .../src/assertions/isSessionIdLike/index.ts | 1 + .../isSessionIdLike/isSessionIdLike.test.ts | 11 + .../isSessionIdLike/isSessionIdLike.ts | 17 + .../src/assertions/isSessionKeyLike/index.ts | 1 + .../isSessionKeyLike/isSessionKeyLike.test.ts | 11 + .../isSessionKeyLike/isSessionKeyLike.ts | 10 + .../src/assertions/isValidRoomName/index.ts | 1 + .../isValidRoomName/isValidRoomName.spec.ts | 0 .../isValidRoomName/isValidRoomName.ts | 7 +- .../src/assertions/isValidSessionId/index.ts | 1 + .../isValidSessionId/isValidSessionId.test.ts | 16 + .../isValidSessionId/isValidSessionId.ts | 15 + .../src/assertions/isValidSessionKey/index.ts | 1 + .../isValidSessionKey/isValidSessionKey.ts | 14 + .../src/constants/frontFacingKeywords.ts | 3 + .../libs/common/src/constants/index.ts | 2 + .../src/constants/rearFacingKeywords.ts | 3 + .../src/errors/ApplicationError.test.ts | 2 +- .../common/src/errors/ApplicationError.ts | 65 +- .../common/src/errors/assertions/index.ts | 3 - .../isApplicationError.test.ts | 2 +- .../isApplicationError/isApplicationError.ts | 2 +- .../mapSourceToState/mapSourceToState.ts | 52 +- .../project/libs/common/src/errors/index.ts | 1 + .../types/ApplicationErrorFallbackConfig.ts | 11 +- .../src/errors/types/ApplicationErrorState.ts | 6 +- .../libs/common/src/errors/types/ZodIssue.ts | 9 + .../libs/common/src/errors/types/index.ts | 1 + .../libs/common/src/execution/index.ts | 1 + .../common/src/execution/throttle/index.ts | 1 + .../src/execution/throttle/throttle.test.ts | 54 + .../common/src/execution/throttle/throttle.ts | 66 + .../common/src/execution/tryCatch/tryCatch.ts | 18 +- .../src/helpers/decodeJwt/decodeJwt.test.ts | 31 + .../common/src/helpers/decodeJwt/decodeJwt.ts | 29 + .../common/src/helpers/decodeJwt/index.ts | 1 + .../decodeSessionId/decodeSessionId.ts | 33 + .../helpers/decodeSessionId/index.ts | 0 .../decodeSessionKey/decodeSessionKey.ts | 12 + .../src/helpers/decodeSessionKey/index.ts | 1 + .../project/libs/common/src/helpers/index.ts | 5 + .../src/helpers/interceptObject/index.ts | 1 + .../interceptObject/interceptObject.test.ts | 120 + .../interceptObject/interceptObject.ts | 126 + .../common/src/helpers/isZodError/index.ts | 1 + .../src/helpers/isZodError/isZodError.test.ts | 16 + .../src/helpers/isZodError/isZodError.ts | 11 + .../libs/common/src/logger/Logger.spec.ts | 76 + .../project/libs/common/src/logger/Logger.ts | 42 +- .../project/libs/common/src/logger/index.ts | 2 +- .../ClientLogEvent/ClientLogEvent.schema.ts | 1 + .../libs/common/src/schemas/FacingMode.ts | 8 + .../schemas/RoomName/RoomName.schema.spec.ts | 13 + .../src/schemas/RoomName/RoomName.schema.ts | 8 + .../libs/common/src/schemas/RoomName/index.ts | 1 + .../project/libs/common/src/schemas/index.ts | 2 + .../libs/common/src/types/DecodedSessionId.ts | 8 +- .../common/src/types/DeepPartial.ts} | 2 - .../libs/common/src/types/FacingMode.ts | 7 + .../libs/common/src/types/IsOptionalKey.ts | 10 + .../libs/common/src/types/ObjectKeys.ts | 8 + .../project/libs/common/src/types/SameKeys.ts | 5 + .../libs/common/src/types/SessionId.ts | 3 + .../libs/common/src/types/SessionKey.ts | 5 + .../common/src/types/SessionKeyPayload.ts | 6 + .../common/src/types/VideoSessionDetails.ts | 12 + .../src/types/VideoSessionDetailsWithToken.ts | 6 + .../project/libs/common/src/types/index.ts | 18 +- .../libs/common/srcBrowser/hooks/index.ts | 2 + .../hooks/useAnchorElement/index.ts | 1 + .../useAnchorElement/useAnchorElement.ts | 66 + .../srcBrowser/hooks/useRenderCount/index.ts | 1 + .../useRenderCount/useRenderCount.test.ts | 15 + .../hooks/useRenderCount/useRenderCount.ts | 7 + .../hooks/useDisposableStableRef.ts | 46 +- .../hooks/useNonDisposableStableRef.ts | 13 +- .../hooks/useStableRef/hooks/useSimpleRef.ts | 7 +- .../hooks/useStableRef/useStableRef.test.ts | 3 +- .../MediaDeviceInfo/MediaDeviceInfo.schema.ts | 10 +- .../assertVonageSessionId.test.ts | 40 - .../assertVonageSessionId.ts | 7 - .../assertions/assertVonageSessionId/index.ts | 1 - .../libs/common/srcNode/assertions/index.ts | 1 - .../decodeSessionId/decodeSessionId.ts | 36 - .../libs/common/srcNode/helpers/index.ts | 1 - .../srcNode/schemas/ArchiveLayout.schema.ts | 11 + .../ArchiveMode/ArchiveMode.schema.spec.ts | 13 + .../schemas/ArchiveMode/ArchiveMode.schema.ts | 6 + .../srcNode/schemas/ArchiveMode/index.ts | 1 + .../srcNode/schemas/ArchiveOptions.schema.ts | 19 + .../ArchiveOptionsWithMaxBitrate.schema.ts | 10 + ...OptionsWithQuantizationParameter.schema.ts | 12 + .../schemas/ArchiveOutputMode.schema.ts | 7 + .../ArchiveWithTranscription.schema.ts | 14 + .../ArchiveWithoutTranscription.schema.ts | 10 + .../schemas/BaseArchiveOptions.schema.ts | 22 + .../srcNode/schemas/LayoutType.schema.ts | 6 + .../srcNode/schemas/MediaMode.schema.ts | 6 + .../srcNode/schemas/Resolution.schema.ts | 6 + .../SessionId/SessionId.schema.spec.ts | 16 + .../schemas/SessionId/SessionId.schema.ts | 9 + .../common/srcNode/schemas/SessionId/index.ts | 1 + .../SessionKey/SessionKey.schema.spec.ts | 15 + .../schemas/SessionKey/SessionKey.schema.ts | 9 + .../srcNode/schemas/SessionKey/index.ts | 1 + .../srcNode/schemas/StreamMode.schema.ts | 6 + .../schemas/TranscriptionProperties.schema.ts | 11 + .../libs/common/srcNode/schemas/index.ts | 16 + .../libs/common/srcNode/types/index.ts | 7 + .../project/libs/common/test/helpers/index.ts | 1 + .../common/test/helpers/setupPartialMock.ts | 11 +- .../helpers/setupMuiMaterialStylesMock.ts | 30 + .../libs/common/testBrowser/fixtures/index.ts | 6 +- .../fixtures/makeMediaDeviceInfos.ts | 21 +- .../libs/common/testNode/helpers/index.ts | 3 + .../common/testNode/helpers/mockAuthModule.ts | 67 + .../testNode/helpers/mockVideoModule.ts | 70 + .../common/testNode/helpers/waitForEvent.ts | 30 + .../project/libs/common/testNode/index.ts | 1 + .../project/libs/common/tsconfig.json | 6 +- .../project/libs/common/tsconfig.lib.json | 4 +- .../project/libs/common/vite.config.ts | 3 +- .../ApplicationClientError.test.ts | 29 + .../ApplicationClientError.ts | 45 + .../errors/ApplicationClientError/index.ts | 2 + .../types/ClientErrorFallbackConfig.ts | 8 + .../project/libs/core/src/errors/ErrorCode.ts | 7 + .../project/libs/core/src/errors/index.ts | 9 + .../libs/core/src/errors/mappers/index.ts | 1 + .../makeApplicationErrorMapper/index.ts | 1 + .../makeApplicationErrorMapper.ts | 42 + .../project/libs/core/src/hooks/index.ts | 5 + .../libs/core/src/hooks/useArchives/index.ts | 2 + .../src/hooks/useArchives/useArchives.test.ts | 109 + .../core/src/hooks/useArchives/useArchives.ts | 50 + .../core/src/hooks/usePublisherStats/index.ts | 1 + .../usePublisherStats.spec.ts | 463 + .../usePublisherStats/usePublisherStats.ts | 202 + .../src/hooks/useSubscriberStats/index.ts | 1 + .../useSubscriberStats.spec.ts | 145 + .../useSubscriberStats/useSubscriberStats.ts | 161 + .../helpers/formatFrameRate.spec.ts | 18 + .../useVideoStats/helpers/formatFrameRate.ts | 11 + .../helpers/formatResolution.spec.ts | 19 + .../useVideoStats/helpers/formatResolution.ts | 11 + .../src/hooks/useVideoStats/helpers/index.ts | 2 + .../helpers/readPublisherStats.ts | 42 + .../core/src/hooks/useVideoStats/index.ts | 3 + .../core/src/hooks/useVideoStats/types.ts | 5 + .../hooks/useVideoStats/useVideoStats.spec.ts | 179 + .../src/hooks/useVideoStats/useVideoStats.ts | 46 + .../libs/core/src/interceptors/index.ts | 8 + .../src/interceptors/mediaDevicesEnvelop.ts | 11 + .../webrtc-adapter.patch/index.ts | 0 .../webrtc-adapter.patch.test.ts | 38 + .../webrtc-adapter.patch.ts | 21 + .../src/interceptors/xmlHttpRequestEnvelop.ts | 67 + .../project/libs/core/src/logger/index.ts | 2 + .../project/libs/core/src/logger/logger.ts | 3 + .../metrics/BitrateValue/BitrateValue.test.ts | 17 + .../src/metrics/BitrateValue/BitrateValue.ts | 37 + .../core/src/metrics/BitrateValue/index.ts | 1 + .../src/metrics/BytesValue/BytesValue.test.ts | 13 + .../core/src/metrics/BytesValue/BytesValue.ts | 38 + .../libs/core/src/metrics/BytesValue/index.ts | 1 + .../DurationValue/DurationValue.test.ts | 11 + .../metrics/DurationValue/DurationValue.ts | 24 + .../core/src/metrics/DurationValue/index.ts | 1 + .../FrameRateValue/FrameRateValue.test.ts | 16 + .../metrics/FrameRateValue/FrameRateValue.ts | 23 + .../core/src/metrics/FrameRateValue/index.ts | 1 + .../metrics/IntegerValue/IntegerValue.test.ts | 12 + .../src/metrics/IntegerValue/IntegerValue.ts | 17 + .../core/src/metrics/IntegerValue/index.ts | 1 + .../src/metrics/MetricValue/MetricValue.ts | 102 + .../core/src/metrics/MetricValue/index.ts | 1 + .../OptionalValue/OptionalValue.test.ts | 22 + .../metrics/OptionalValue/OptionalValue.ts | 91 + .../core/src/metrics/OptionalValue/index.ts | 1 + .../PacketLossValue/PacketLossValue.test.ts | 11 + .../PacketLossValue/PacketLossValue.ts | 20 + .../core/src/metrics/PacketLossValue/index.ts | 1 + .../ResolutionValue/ResolutionValue.test.ts | 22 + .../ResolutionValue/ResolutionValue.ts | 64 + .../core/src/metrics/ResolutionValue/index.ts | 1 + .../project/libs/core/src/metrics/index.ts | 9 + .../project/libs/core/src/services/index.ts | 1 + .../videoClient/createVideoClient.test.ts | 69 + .../services/videoClient/createVideoClient.ts | 96 + .../core/src/services/videoClient/index.ts | 1 + .../actions/getUserMedia/getUserMedia.spec.ts | 56 + .../actions/getUserMedia/getUserMedia.ts | 32 +- .../actions/selectDevice/selectDevice.ts | 2 +- .../devices/constants/frontFacingKeywords.ts | 3 + .../src/stores/devices/constants/index.ts | 2 + .../src/stores/devices/constants/metadata.ts | 4 +- .../devices/constants/rearFacingKeywords.ts | 3 + .../core/src/stores/devices/devices$.test.ts | 3 + .../helpers/assertMediaStreamAccess.ts | 31 +- .../getMediaDevicesInfo.spec.ts | 70 + .../getMediaDevicesInfo.ts | 47 +- .../helpers/getMediaDevicesInfo/index.ts | 1 + .../setupDeviceStore/setupDeviceStore.test.ts | 59 +- .../setupDeviceStore/setupDeviceStore.ts | 37 +- .../stores/devices/hooks/useMediaDevices.ts | 4 +- .../project/libs/core/src/stores/index.ts | 3 + .../actions/clearAllNotifications.ts | 9 + .../actions/dismissNotification.ts | 14 + .../src/stores/notifications/actions/index.ts | 3 + .../notifications/actions/pushNotification.ts | 28 + .../stores/notifications/constants/index.ts | 1 + .../notifications/constants/initialValue.ts | 5 + .../core/src/stores/notifications/index.ts | 2 + .../notifications/notifications$.test.ts | 23 + .../stores/notifications/notifications$.ts | 9 + .../notifications/notificationsStore.ts | 28 + .../notifications/types/NotificationEntry.ts | 12 + .../notifications/types/NotificationId.ts | 11 + .../notifications/types/NotificationType.ts | 3 + .../notifications/types/NotificationsAPI.ts | 3 + .../notifications/types/NotificationsState.ts | 5 + .../src/stores/notifications/types/index.ts | 5 + .../stores/publisher/actions/getFacingMode.ts | 54 + .../src/stores/publisher/actions/index.ts | 1 + .../libs/core/src/stores/publisher/index.ts | 1 + .../src/stores/publisher/publisher$.test.ts | 173 + .../core/src/stores/publisher/publisher$.ts | 9 + .../src/stores/runtime/RuntimeProvider.ts | 89 + .../core/src/stores/runtime/hooks/index.ts | 3 + .../src/stores/runtime/hooks/useLanguage.ts | 5 + .../core/src/stores/runtime/hooks/useQuery.ts | 35 + .../stores/runtime/hooks/useVideoClient.ts | 9 + .../libs/core/src/stores/runtime/index.ts | 2 + .../core/src/stores/runtime/runtime$.test.ts | 17 + .../libs/core/src/stores/runtime/runtime$.ts | 37 + .../core/src/stores/runtime/runtimeStore.ts | 17 + .../src/stores/runtime/types/RuntimeState.ts | 10 + .../core/src/stores/runtime/types/index.ts | 2 + .../libs/core/src/types/QueryOptions.ts | 8 + .../project/libs/core/src/types/index.ts | 1 + .../project/libs/core/test/fixtures/index.ts | 1 + .../core/test/fixtures/makeVideoClientMock.ts | 46 + .../project/libs/core/test/index.ts | 1 + .../project/libs/core/test/providers/index.ts | 6 + .../providers/makeRuntimeProviderWrapper.ts | 23 + .../core/test/providers/makeTestProvider.ts | 138 + .../libs/core/test/providers/makersIndex.ts | 4 + .../project/libs/core/tsconfig.json | 11 +- .../project/libs/core/tsconfig.lib.json | 16 +- .../project/libs/core/tsconfig.spec.json | 4 +- .../project/libs/core/vite.config.ts | 7 + .../project/libs/ui/.storybook/preview.tsx | 3 + .../project/libs/ui/src/Field/Field.tsx | 26 + .../libs/ui/src/Field/FieldDescription.tsx | 20 + .../libs/ui/src/Field/FieldInput.test.tsx | 74 + .../project/libs/ui/src/Field/FieldInput.tsx | 49 + .../project/libs/ui/src/Field/FieldLabel.tsx | 20 + .../project/libs/ui/src/Field/FieldRow.tsx | 18 + .../project/libs/ui/src/Field/index.tsx | 4 + .../src/LabeledValueList/LabeledValueList.tsx | 39 + .../libs/ui/src/LabeledValueList/index.tsx | 4 + .../libs/ui/src/PageLayout/PageLayout.tsx | 121 +- .../src/PageLayoutEmbed/PageLayoutEmbed.tsx | 7 +- .../libs/ui/src/SelectField/SelectField.tsx | 80 + .../project/libs/ui/src/SelectField/index.tsx | 4 + .../libs/ui/src/SwitchField/SwitchField.tsx | 38 + .../project/libs/ui/src/SwitchField/index.tsx | 4 + .../libs/ui/src/VividIcon/VividIcon.tsx | 49 + .../project/libs/ui/src/VividIcon/index.ts | 2 + .../Collapsible/Collapsible.spec.tsx | 55 + .../components/Collapsible/Collapsible.tsx | 105 + .../components/Collapsible/collapsible$.ts | 25 + .../Collapsible/components/Details.tsx | 26 + .../Collapsible/components/Icon.tsx | 32 + .../Collapsible/components/Summary.tsx | 57 + .../Collapsible/components/index.ts | 2 + .../Collapsible/constants/CollapsibleSlots.ts | 6 + .../components/Collapsible/constants/index.ts | 1 + .../ui/src/components/Collapsible/index.tsx | 1 + .../NotificationItem.spec.tsx | 72 + .../NotificationItem.stories.tsx | 144 + .../NotificationItem/NotificationItem.tsx | 105 + .../src/components/NotificationItem/index.ts | 1 + .../NotificationsContainer.stories.tsx | 166 + .../NotificationsContainer.tsx | 48 + .../NotificationsContainer/index.ts | 1 + .../project/libs/ui/src/components/index.ts | 3 + .../findSlotByDisplayName.ts | 24 + .../helpers/findSlotByDisplayName/index.ts | 1 + .../handleClientApplicationError.test.tsx | 44 + .../handleClientApplicationError.tsx | 101 + .../handleClientApplicationError/index.ts | 1 + .../project/libs/ui/src/helpers/index.ts | 2 + .../project/libs/ui/src/helpers/pick | 0 .../useDistinctLabelMediaDevices.spec.ts | 3 + .../project/libs/ui/src/index.ts | 16 +- .../libs/ui/src/theme/ThemeProvider.tsx | 16 + ...ontext.types.ts => ThemeProvider.types.ts} | 24 +- .../helpers/designTokens/designTokens.json | 426 +- .../helpers/designTokens/designTokens.ts | 4 +- .../designTokens/helpers/tokensToJson.ts | 252 +- .../tokens/{shape.ts => border.ts} | 6 +- .../helpers/designTokens/tokens/color.ts | 2 +- .../theme/helpers/getMuiCustomTheme.spec.ts | 20 +- .../ui/src/theme/helpers/getMuiCustomTheme.ts | 349 +- .../ui/src/theme/helpers/getTokensByMode.ts | 36 - .../theme/helpers/mergeThemeConfigurations.ts | 40 - .../tailwind/generateTailwindPlugin.ts | 629 +- .../ui/src/theme/helpers/tailwind/veraUI.cjs | 1288 +- .../libs/ui/src/theme/helpers/veraUI.types.ts | 244 + .../useSynchronizeThemeAndMedia.test.ts | 35 +- .../useSynchronizeThemeAndMedia.ts | 20 +- .../libs/ui/src/theme/hooks/useTheme/index.ts | 1 - .../theme/hooks/useTheme/useTheme.test.tsx | 63 - .../ui/src/theme/hooks/useTheme/useTheme.ts | 14 - .../project/libs/ui/src/theme/index.ts | 5 +- .../libs/ui/src/theme/themeContext.tsx | 61 - .../project/libs/ui/tailwind.config.cjs | 4 +- .../project/libs/ui/tsconfig.json | 8 +- .../project/libs/ui/tsconfig.lib.json | 15 +- .../project/libs/ui/tsconfig.spec.json | 2 + .../project/libs/ui/vite.config.ts | 7 + .../project/nx.json | 3 +- .../project/package-lock.json | 26680 ++++++++++++++++ .../project/package.json | 261 +- .../project/scripts/build.ts | 54 +- .../project/scripts/dev.ts | 67 +- .../project/scripts/generateTokens.ts | 132 +- .../project/scripts/lintFix.ts | 1 + .../project/scripts/qualityCheck.ts | 6 +- .../project/scripts/start.ts | 44 +- .../project/scripts/testBackend.ts | 36 +- .../project/scripts/testIntegration.ts | 66 +- .../project/scripts/tsCheck.ts | 67 + .../project/sonar-project.properties | 3 +- .../project/vcr-gha.yml | 4 + .../project/vcrBuild.env.sh | 7 + .../project/yarn.lock | 14608 --------- .../steps/01-backend-setup/index.html | 68 + .../steps/01-config-file-overview/index.html | 68 + .../steps/02-feature-flags/index.html | 68 + .../steps/03-display-defaults/index.html | 68 + .../steps/04-apply-changes/index.html | 68 + .../steps/05-whats-next/index.html | 68 + .../steps/404.html | 36 + ...astro_type_script_index_0_lang.hwBsy0Mo.js | 1 + ...astro_type_script_index_0_lang.EjmW2doR.js | 1 + ...astro_type_script_index_0_lang.FuRcXuRY.js | 1 + .../steps/_astro/ec.0vx5m.js | 3 + .../steps/_astro/ec.v4551.css | 1 + .../steps/_astro/index.BsKNCfOq.css | 1 + .../steps/_astro/page.B1D-nYk3.js | 1 + .../steps/_astro/print.DNXP8c50.css | 1 + .../steps/_astro/ui-core.CJyTyO9Y.js | 2 + .../steps/favicon.svg | 1 + .../steps/index.html | 81 + .../tutorial-config.json | 2 +- .../vonage_video_react_app-feature-config.zip | Bin 1251173 -> 0 bytes 931 files changed, 53212 insertions(+), 20997 deletions(-) create mode 120000 tutorials/vonage_video_react_app-feature-config/project/.clinerules create mode 120000 tutorials/vonage_video_react_app-feature-config/project/.cursorrules create mode 100644 tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md create mode 100644 tutorials/vonage_video_react_app-feature-config/project/.npmrc create mode 100644 tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json create mode 120000 tutorials/vonage_video_react_app-feature-config/project/.windsurfrules create mode 120000 tutorials/vonage_video_react_app-feature-config/project/AGENTS.md create mode 120000 tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md create mode 120000 tutorials/vonage_video_react_app-feature-config/project/CODEX.md create mode 120000 tutorials/vonage_video_react_app-feature-config/project/GEMINI.md create mode 100644 tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/middleware/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/middleware/rateLimitMiddleware.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/getOrCreateSession.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/VONAGE_HOOKS_CONCLUSIONS.md create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/constants/createSession.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/constants/enableCaptions.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/constants/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/constants/joinSession.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/constants/startArchive.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/schemas/ArchiveHookPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/schemas/CaptionsHookPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/schemas/CaptionsStatus.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/schemas/SessionHookPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/schemas/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/setup.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/types/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/routes/video/video.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/services/tests/loggerServiceWarnOnce.test.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/storage/inMemorySessionStorage.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/storage/inMemorySessionStorage/inMemorySessionStorage.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/storage/inMemorySessionStorage/inMemorySessionStorage.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/storage/inMemorySessionStorage/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/storage/tests/inMemorySessionStorage.test.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/tests/ValidationError.test.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/backend/tests/getOrCreateSession.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/designTokens.example.json create mode 100644 tutorials/vonage_video_react_app-feature-config/project/designTokens.json delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/docs/TESTING.md rename tutorials/vonage_video_react_app-feature-config/project/frontend/public/{ => assets}/sound.mp3 (100%) create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/AdvancedSettings/AdvancedSettings.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/AdvancedSettings/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/LoggerSynchronizer/LoggerSynchronizer.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/LoggerSynchronizer/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/applyAdvancedSettingsToPublisher.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/Context/PublisherProvider/useApplyAdvancedSettings/useApplyAdvancedSettings.tsx delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/AdvancedSettingsButton.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/AdvancedSettingsButton/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/SmallViewportHeader/hooks/useSwitchCameraFacingModeHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/MeetingRoom/VideoTileCanvas/VideoTileCanvas.spec.tsx delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/VividIcon/VividIcon.spec.tsx delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/VividIcon/index.tsx delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/VividIcon/sxToStyle.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/VideoStatsOverlay.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/WaitingRoom/VideoStatsOverlay/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/tests/useRoomName.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/useDecodedSessionKey.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/usePreferredCameras/helpers/filterMobileCameras/filterMobileCameras.spec.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/usePreferredCameras/helpers/filterMobileCameras/filterMobileCameras.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/usePreferredCameras/helpers/filterMobileCameras/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/usePreferredCameras/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/usePreferredCameras/usePreferredCameras.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/useRoomName.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/useSelectDeviceHandler/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/useSelectDeviceHandler/useSelectDeviceHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/hooks/useSessionKeyParam.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/services/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/services/videoClient.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/setup/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/setup/tryOverrideVonageVideoHost.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/test/providers/makeAdvancedSettingsProviderWrapper.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/test/providers/makeRuntimeProviderWrapper.tsx delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/room.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/isFrontFacingLabel/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/isFrontFacingLabel/isFrontFacingLabel.spec.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/isFrontFacingLabel/isFrontFacingLabel.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/isRearFacingLabel/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/isRearFacingLabel/isRearFacingLabel.spec.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/cameraSwitch/isRearFacingLabel/isRearFacingLabel.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/mediaDeviceUtils.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/integration-tests/test-api/apiIntegrity.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/integration-tests/test-api/jest.config.js create mode 100644 tutorials/vonage_video_react_app-feature-config/project/integration-tests/test-api/tsconfig.json create mode 100644 tutorials/vonage_video_react_app-feature-config/project/integration-tests/tests/advancedSettings.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/constants/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/constants/schemasByAction.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/core/VideoClient/VideoClient.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/core/VideoClient/VideoClient.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/core/VideoClient/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/core/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/assertions/isHttpErrorLike/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/assertions/isHttpErrorLike/isHttpErrorLike.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/handlers/makeNotFoundErrorHandler/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/handlers/makeNotFoundErrorHandler/makeNotFoundErrorHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/helpers/toTRPCError.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/errors/types/HttpError.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/executions/assertResult.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/executions/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/createEphemeralToken.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/createSession.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/createSessionAndJoin.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/decodeSessionId.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/decodeSessionKey.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/disableCaptions.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/enableCaptions.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/ensureCaptionsEnabled.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/joinSession.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/searchArchives.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/startArchive.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/handlers/stopArchive.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/httpHandler/helpers/composeHandlers.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/httpHandler/helpers/composeHandlers.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/httpHandler/helpers/handlerErrorWrapper.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/httpHandler/httpHandler.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/httpHandler/httpHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/httpHandler/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/createVideoHandler.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/createVideoHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts rename tutorials/vonage_video_react_app-feature-config/project/{frontend/src/utils => libs/common/src/assertions}/isValidRoomName/isValidRoomName.spec.ts (100%) rename tutorials/vonage_video_react_app-feature-config/project/{frontend/src/utils => libs/common/src/assertions}/isValidRoomName/isValidRoomName.ts (54%) create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts rename tutorials/vonage_video_react_app-feature-config/project/libs/common/{srcNode => src}/helpers/decodeSessionId/index.ts (100%) create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts rename tutorials/vonage_video_react_app-feature-config/project/{frontend/src/types/index.ts => libs/common/src/types/DeepPartial.ts} (80%) create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts rename tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/{ => getMediaDevicesInfo}/getMediaDevicesInfo.ts (51%) create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/SelectField.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/pick create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx rename tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/{themeContext.types.ts => ThemeProvider.types.ts} (92%) rename tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/{shape.ts => border.ts} (94%) delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts create mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx create mode 100644 tutorials/vonage_video_react_app-feature-config/project/package-lock.json create mode 100644 tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts delete mode 100644 tutorials/vonage_video_react_app-feature-config/project/yarn.lock create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/404.html create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/favicon.svg create mode 100644 tutorials/vonage_video_react_app-feature-config/steps/index.html delete mode 100644 uploads/vonage_video_react_app-feature-config.zip diff --git a/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs b/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs index 1d922d92..4773f6ec 100644 --- a/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs +++ b/sources/vonage_video_react_app-feature-config/.astro/content-modules.mjs @@ -1,11 +1,10 @@ export default new Map([ -["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")], -["src/content/docs/reference.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-backend-setup.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-backend-setup.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-config-file-overview.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-config-file-overview.mdoc&astroContentModuleFlag=true")], ["src/content/docs/02-feature-flags.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F02-feature-flags.mdoc&astroContentModuleFlag=true")], ["src/content/docs/03-display-defaults.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F03-display-defaults.mdoc&astroContentModuleFlag=true")], ["src/content/docs/04-apply-changes.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F04-apply-changes.mdoc&astroContentModuleFlag=true")], -["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")]]); +["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")], +["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")]]); \ No newline at end of file diff --git a/sources/vonage_video_react_app-feature-config/.astro/data-store.json b/sources/vonage_video_react_app-feature-config/.astro/data-store.json index e8ac27a8..618653e2 100644 --- a/sources/vonage_video_react_app-feature-config/.astro/data-store.json +++ b/sources/vonage_video_react_app-feature-config/.astro/data-store.json @@ -1 +1 @@ -[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,28,29,39,40,49,50,59,60,69,70,79,80],"index",{"id":11,"data":13,"body":25,"filePath":26,"digest":27,"deferredRender":16},{"title":14,"description":15,"editUrl":16,"head":17,"template":18,"hero":19,"sidebar":22,"pagefind":16,"draft":23},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",true,[],"splash",{"tagline":20,"actions":21},"Feature Config",[],{"hidden":23,"attrs":24},false,{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8","01-backend-setup",{"id":28,"data":30,"body":36,"filePath":37,"digest":38,"deferredRender":16},{"title":31,"editUrl":16,"head":32,"template":33,"sidebar":34,"pagefind":16,"draft":23},"Backend Credentials",[],"doc",{"hidden":23,"attrs":35},{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":39,"data":41,"body":46,"filePath":47,"digest":48,"deferredRender":16},{"title":42,"editUrl":16,"head":43,"template":33,"sidebar":44,"pagefind":16,"draft":23},"The Config File",[],{"hidden":23,"attrs":45},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":49,"data":51,"body":56,"filePath":57,"digest":58,"deferredRender":16},{"title":52,"editUrl":16,"head":53,"template":33,"sidebar":54,"pagefind":16,"draft":23},"Feature Flags",[],{"hidden":23,"attrs":55},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":59,"data":61,"body":66,"filePath":67,"digest":68,"deferredRender":16},{"title":62,"editUrl":16,"head":63,"template":33,"sidebar":64,"pagefind":16,"draft":23},"Display Defaults",[],{"hidden":23,"attrs":65},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":69,"data":71,"body":76,"filePath":77,"digest":78,"deferredRender":16},{"title":72,"editUrl":16,"head":73,"template":33,"sidebar":74,"pagefind":16,"draft":23},"Apply Your Changes",[],{"hidden":23,"attrs":75},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":79,"data":81,"body":87,"filePath":88,"digest":89,"deferredRender":16},{"title":82,"description":83,"editUrl":16,"head":84,"template":33,"sidebar":85,"pagefind":16,"draft":23},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":23,"attrs":86},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59"] \ No newline at end of file +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,24,25,34,35,44,45,54,55,64,65,75,76],"01-backend-setup",{"id":11,"data":13,"body":21,"filePath":22,"digest":23,"deferredRender":15},{"title":14,"editUrl":15,"head":16,"template":17,"sidebar":18,"pagefind":15,"draft":19},"Backend Credentials",true,[],"doc",{"hidden":19,"attrs":20},false,{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":24,"data":26,"body":31,"filePath":32,"digest":33,"deferredRender":15},{"title":27,"editUrl":15,"head":28,"template":17,"sidebar":29,"pagefind":15,"draft":19},"The Config File",[],{"hidden":19,"attrs":30},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":34,"data":36,"body":41,"filePath":42,"digest":43,"deferredRender":15},{"title":37,"editUrl":15,"head":38,"template":17,"sidebar":39,"pagefind":15,"draft":19},"Feature Flags",[],{"hidden":19,"attrs":40},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":44,"data":46,"body":51,"filePath":52,"digest":53,"deferredRender":15},{"title":47,"editUrl":15,"head":48,"template":17,"sidebar":49,"pagefind":15,"draft":19},"Display Defaults",[],{"hidden":19,"attrs":50},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":54,"data":56,"body":61,"filePath":62,"digest":63,"deferredRender":15},{"title":57,"editUrl":15,"head":58,"template":17,"sidebar":59,"pagefind":15,"draft":19},"Apply Your Changes",[],{"hidden":19,"attrs":60},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":64,"data":66,"body":72,"filePath":73,"digest":74,"deferredRender":15},{"title":67,"description":68,"editUrl":15,"head":69,"template":17,"sidebar":70,"pagefind":15,"draft":19},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":19,"attrs":71},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59","index",{"id":75,"data":77,"body":87,"filePath":88,"digest":89,"deferredRender":15},{"title":78,"description":79,"editUrl":15,"head":80,"template":81,"hero":82,"sidebar":85,"pagefind":15,"draft":19},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",[],"splash",{"tagline":83,"actions":84},"Feature Config",[],{"hidden":19,"attrs":86},{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8"] \ No newline at end of file diff --git a/sources/vonage_video_react_app-feature-config/.astro/settings.json b/sources/vonage_video_react_app-feature-config/.astro/settings.json index 113877f8..04e40263 100644 --- a/sources/vonage_video_react_app-feature-config/.astro/settings.json +++ b/sources/vonage_video_react_app-feature-config/.astro/settings.json @@ -1,5 +1,5 @@ { "_variables": { - "lastUpdateCheck": 1782159370968 + "lastUpdateCheck": 1782297484374 } } \ No newline at end of file diff --git a/sources/vonage_video_react_app-feature-config/tutorial-config.json b/sources/vonage_video_react_app-feature-config/tutorial-config.json index abe45ac4..515af57d 100644 --- a/sources/vonage_video_react_app-feature-config/tutorial-config.json +++ b/sources/vonage_video_react_app-feature-config/tutorial-config.json @@ -5,7 +5,7 @@ "terminal", "browser" ], - "repository": "https://github.com/Vonage/vonage-video-react-app", + "repository": "https://github.com/VZaphod/vonage-video-react-app", "starterFiles": [], "capabilities": [], "version": "1.0.0", diff --git a/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs b/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs index 1d922d92..ecd3fa68 100644 --- a/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs +++ b/tutorials/vonage_video_react_app-feature-config/.astro/content-modules.mjs @@ -1,11 +1,10 @@ export default new Map([ -["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")], -["src/content/docs/reference.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Freference.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-backend-setup.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-backend-setup.mdoc&astroContentModuleFlag=true")], ["src/content/docs/01-config-file-overview.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F01-config-file-overview.mdoc&astroContentModuleFlag=true")], -["src/content/docs/02-feature-flags.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F02-feature-flags.mdoc&astroContentModuleFlag=true")], ["src/content/docs/03-display-defaults.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F03-display-defaults.mdoc&astroContentModuleFlag=true")], +["src/content/docs/02-feature-flags.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F02-feature-flags.mdoc&astroContentModuleFlag=true")], ["src/content/docs/04-apply-changes.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F04-apply-changes.mdoc&astroContentModuleFlag=true")], -["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")]]); +["src/content/docs/05-whats-next.mdoc", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2F05-whats-next.mdoc&astroContentModuleFlag=true")], +["src/content/docs/index.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Findex.mdx&astroContentModuleFlag=true")]]); \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json b/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json index e8ac27a8..618653e2 100644 --- a/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json +++ b/tutorials/vonage_video_react_app-feature-config/.astro/data-store.json @@ -1 +1 @@ -[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,28,29,39,40,49,50,59,60,69,70,79,80],"index",{"id":11,"data":13,"body":25,"filePath":26,"digest":27,"deferredRender":16},{"title":14,"description":15,"editUrl":16,"head":17,"template":18,"hero":19,"sidebar":22,"pagefind":16,"draft":23},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",true,[],"splash",{"tagline":20,"actions":21},"Feature Config",[],{"hidden":23,"attrs":24},false,{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8","01-backend-setup",{"id":28,"data":30,"body":36,"filePath":37,"digest":38,"deferredRender":16},{"title":31,"editUrl":16,"head":32,"template":33,"sidebar":34,"pagefind":16,"draft":23},"Backend Credentials",[],"doc",{"hidden":23,"attrs":35},{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":39,"data":41,"body":46,"filePath":47,"digest":48,"deferredRender":16},{"title":42,"editUrl":16,"head":43,"template":33,"sidebar":44,"pagefind":16,"draft":23},"The Config File",[],{"hidden":23,"attrs":45},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":49,"data":51,"body":56,"filePath":57,"digest":58,"deferredRender":16},{"title":52,"editUrl":16,"head":53,"template":33,"sidebar":54,"pagefind":16,"draft":23},"Feature Flags",[],{"hidden":23,"attrs":55},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":59,"data":61,"body":66,"filePath":67,"digest":68,"deferredRender":16},{"title":62,"editUrl":16,"head":63,"template":33,"sidebar":64,"pagefind":16,"draft":23},"Display Defaults",[],{"hidden":23,"attrs":65},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":69,"data":71,"body":76,"filePath":77,"digest":78,"deferredRender":16},{"title":72,"editUrl":16,"head":73,"template":33,"sidebar":74,"pagefind":16,"draft":23},"Apply Your Changes",[],{"hidden":23,"attrs":75},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":79,"data":81,"body":87,"filePath":88,"digest":89,"deferredRender":16},{"title":82,"description":83,"editUrl":16,"head":84,"template":33,"sidebar":85,"pagefind":16,"draft":23},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":23,"attrs":86},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59"] \ No newline at end of file +[["Map",1,2,9,10],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.18.1","content-config-digest","a30a942a2ceda2e1","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"where\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":false,\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[],\"responsiveStyles\":false},\"devToolbar\":{\"enabled\":true},\"markdown\":{\"syntaxHighlight\":false,\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-dark\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[null,null,null],\"rehypePlugins\":[[null,{\"experimentalHeadingIdCompat\":false}],null,[null,{\"themes\":[{\"name\":\"Night Owl No Italics\",\"type\":\"dark\",\"colors\":{\"focusBorder\":\"#122d42\",\"foreground\":\"#d6deeb\",\"disabledForeground\":\"#cccccc80\",\"descriptionForeground\":\"#d6deebb3\",\"errorForeground\":\"#ef5350\",\"icon.foreground\":\"#c5c5c5\",\"contrastActiveBorder\":null,\"contrastBorder\":\"#122d42\",\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#4f4f4f\",\"textLink.activeForeground\":\"#3794ff\",\"textLink.foreground\":\"#3794ff\",\"textPreformat.foreground\":\"#d7ba7d\",\"textSeparator.foreground\":\"#ffffff2e\",\"editor.background\":\"#23262f\",\"editor.foreground\":\"#d6deeb\",\"editorLineNumber.foreground\":\"#4b6479\",\"editorLineNumber.activeForeground\":\"#c5e4fd\",\"editorActiveLineNumber.foreground\":\"#c6c6c6\",\"editor.selectionBackground\":\"#1d3b53\",\"editor.inactiveSelectionBackground\":\"#7e57c25a\",\"editor.selectionHighlightBackground\":\"#5f7e9779\",\"editorError.foreground\":\"#ef5350\",\"editorWarning.foreground\":\"#b39554\",\"editorInfo.foreground\":\"#3794ff\",\"editorHint.foreground\":\"#eeeeeeb2\",\"problemsErrorIcon.foreground\":\"#ef5350\",\"problemsWarningIcon.foreground\":\"#b39554\",\"problemsInfoIcon.foreground\":\"#3794ff\",\"editor.findMatchBackground\":\"#5f7e9779\",\"editor.findMatchHighlightBackground\":\"#1085bb5d\",\"editor.findRangeHighlightBackground\":\"#3a3d4166\",\"editorLink.activeForeground\":\"#4e94ce\",\"editorLightBulb.foreground\":\"#ffcc00\",\"editorLightBulbAutoFix.foreground\":\"#75beff\",\"diffEditor.insertedTextBackground\":\"#99b76d23\",\"diffEditor.insertedTextBorder\":\"#c5e47833\",\"diffEditor.removedTextBackground\":\"#ef535033\",\"diffEditor.removedTextBorder\":\"#ef53504d\",\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#011627\",\"editorStickyScrollHover.background\":\"#2a2d2e\",\"editorInlayHint.background\":\"#5f7e97cc\",\"editorInlayHint.foreground\":\"#ffffff\",\"editorInlayHint.typeBackground\":\"#5f7e97cc\",\"editorInlayHint.typeForeground\":\"#ffffff\",\"editorInlayHint.parameterBackground\":\"#5f7e97cc\",\"editorInlayHint.parameterForeground\":\"#ffffff\",\"editorPane.background\":\"#011627\",\"editorGroup.emptyBackground\":\"#011627\",\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-black)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#011627\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#011627\",\"editorGroup.dropBackground\":\"#7e57c273\",\"editorGroup.dropIntoPromptForeground\":\"#d6deeb\",\"editorGroup.dropIntoPromptBackground\":\"#021320\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#011627\",\"sideBySideEditor.verticalBorder\":\"#011627\",\"scrollbar.shadow\":\"#010b14\",\"scrollbarSlider.background\":\"#ffffff17\",\"scrollbarSlider.hoverBackground\":\"#ffffff40\",\"scrollbarSlider.activeBackground\":\"#084d8180\",\"panel.background\":\"#011627\",\"panel.border\":\"#5f7e97\",\"panelTitle.activeBorder\":\"#5f7e97\",\"panelTitle.activeForeground\":\"#ffffffcc\",\"panelTitle.inactiveForeground\":\"#d6deeb80\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#011627\",\"widget.shadow\":\"#011627\",\"editorWidget.background\":\"#021320\",\"editorWidget.foreground\":\"#d6deeb\",\"editorWidget.border\":\"#5f7e97\",\"quickInput.background\":\"#021320\",\"quickInput.foreground\":\"#d6deeb\",\"quickInputTitle.background\":\"#ffffff1a\",\"pickerGroup.foreground\":\"#d1aaff\",\"pickerGroup.border\":\"#011627\",\"editor.hoverHighlightBackground\":\"#7e57c25a\",\"editorHoverWidget.background\":\"#011627\",\"editorHoverWidget.foreground\":\"#d6deeb\",\"editorHoverWidget.border\":\"#5f7e97\",\"editorHoverWidget.statusBarBackground\":\"#011a2f\",\"titleBar.activeBackground\":\"var(--sl-color-black)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#010e1a\",\"titleBar.inactiveForeground\":\"#eeefff99\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#5a5d5e50\",\"toolbar.activeBackground\":\"#63666750\",\"tab.activeBackground\":\"#0b2942\",\"tab.unfocusedActiveBackground\":\"#0b2942\",\"tab.inactiveBackground\":\"#01111d\",\"tab.unfocusedInactiveBackground\":\"#01111d\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#5f7e97\",\"tab.unfocusedActiveForeground\":\"#5f7e97\",\"tab.unfocusedInactiveForeground\":\"#5f7e97\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#272b3b\",\"tab.lastPinnedBorder\":\"#585858\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":\"#262a39\",\"tab.activeBorderTop\":\"var(--sl-color-accent-high)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#3399cc\",\"tab.inactiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedActiveModifiedBorder\":\"#3399cc80\",\"tab.unfocusedInactiveModifiedBorder\":\"#3399cc40\",\"badge.background\":\"#5f7e97\",\"badge.foreground\":\"#ffffff\",\"button.background\":\"#7e57c2cc\",\"button.foreground\":\"#ffffffcc\",\"button.border\":\"#122d42\",\"button.separator\":\"#ffffff52\",\"button.hoverBackground\":\"#7e57c2\",\"button.secondaryBackground\":\"#3a3d41\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#46494e\",\"dropdown.background\":\"#011627\",\"dropdown.foreground\":\"#ffffffcc\",\"dropdown.border\":\"#5f7e97\",\"list.activeSelectionBackground\":\"#234d708c\",\"list.activeSelectionForeground\":\"#ffffff\",\"tree.indentGuidesStroke\":\"#585858\",\"input.background\":\"#0b253a\",\"input.foreground\":\"#ffffffcc\",\"input.placeholderForeground\":\"#5f7e97\",\"inputOption.activeBorder\":\"#ffffffcc\",\"inputOption.hoverBackground\":\"#5a5d5e80\",\"inputOption.activeBackground\":\"#122d4266\",\"inputOption.activeForeground\":\"#ffffff\",\"inputValidation.infoBackground\":\"#00589ef2\",\"inputValidation.infoBorder\":\"#64b5f6\",\"inputValidation.warningBackground\":\"#675700f2\",\"inputValidation.warningBorder\":\"#ffca28\",\"inputValidation.errorBackground\":\"#ab0300f2\",\"inputValidation.errorBorder\":\"#ef5350\",\"keybindingLabel.background\":\"#8080802b\",\"keybindingLabel.foreground\":\"#cccccc\",\"keybindingLabel.border\":\"#33333399\",\"keybindingLabel.bottomBorder\":\"#44444499\",\"menu.foreground\":\"#ffffffcc\",\"menu.background\":\"#011627\",\"menu.selectionForeground\":\"#ffffff\",\"menu.selectionBackground\":\"#234d708c\",\"menu.separatorBackground\":\"#606060\",\"editor.snippetTabstopHighlightBackground\":\"#7c7c74c\",\"editor.snippetFinalTabstopHighlightBorder\":\"#525252\",\"terminal.ansiBlack\":\"#011627\",\"terminal.ansiRed\":\"#ef5350\",\"terminal.ansiGreen\":\"#22da6e\",\"terminal.ansiYellow\":\"#c5e478\",\"terminal.ansiBlue\":\"#82aaff\",\"terminal.ansiMagenta\":\"#c792ea\",\"terminal.ansiCyan\":\"#21c7a8\",\"terminal.ansiWhite\":\"#ffffff\",\"terminal.ansiBrightBlack\":\"#575656\",\"terminal.ansiBrightRed\":\"#ef5350\",\"terminal.ansiBrightGreen\":\"#22da6e\",\"terminal.ansiBrightYellow\":\"#ffeb95\",\"terminal.ansiBrightBlue\":\"#82aaff\",\"terminal.ansiBrightMagenta\":\"#c792ea\",\"terminal.ansiBrightCyan\":\"#7fdbca\",\"terminal.ansiBrightWhite\":\"#ffffff\",\"selection.background\":\"#4373c2\",\"input.border\":\"#5f7e97\",\"punctuation.definition.generic.begin.html\":\"#ef5350f2\",\"progress.background\":\"#7e57c2\",\"breadcrumb.foreground\":\"#a599e9\",\"breadcrumb.focusForeground\":\"#ffffff\",\"breadcrumb.activeSelectionForeground\":\"#ffffff\",\"breadcrumbPicker.background\":\"#001122\",\"list.invalidItemForeground\":\"#975f94\",\"list.dropBackground\":\"#011627\",\"list.focusBackground\":\"#010d18\",\"list.focusForeground\":\"#ffffff\",\"list.highlightForeground\":\"#ffffff\",\"list.hoverBackground\":\"#011627\",\"list.hoverForeground\":\"#ffffff\",\"list.inactiveSelectionBackground\":\"#0e293f\",\"list.inactiveSelectionForeground\":\"#5f7e97\",\"activityBar.background\":\"#011627\",\"activityBar.dropBackground\":\"#5f7e97\",\"activityBar.foreground\":\"#5f7e97\",\"activityBar.border\":\"#011627\",\"activityBarBadge.background\":\"#44596b\",\"activityBarBadge.foreground\":\"#ffffff\",\"sideBar.background\":\"#011627\",\"sideBar.foreground\":\"#89a4bb\",\"sideBar.border\":\"#011627\",\"sideBarTitle.foreground\":\"#5f7e97\",\"sideBarSectionHeader.background\":\"#011627\",\"sideBarSectionHeader.foreground\":\"#5f7e97\",\"editorCursor.foreground\":\"#80a4c2\",\"editor.wordHighlightBackground\":\"#f6bbe533\",\"editor.wordHighlightStrongBackground\":\"#e2a2f433\",\"editor.lineHighlightBackground\":\"#0003\",\"editor.rangeHighlightBackground\":\"#7e57c25a\",\"editorIndentGuide.background\":\"#5e81ce52\",\"editorIndentGuide.activeBackground\":\"#7e97ac\",\"editorRuler.foreground\":\"#5e81ce52\",\"editorCodeLens.foreground\":\"#5e82ceb4\",\"editorBracketMatch.background\":\"#5f7e974d\",\"editorOverviewRuler.currentContentForeground\":\"#7e57c2\",\"editorOverviewRuler.incomingContentForeground\":\"#7e57c2\",\"editorOverviewRuler.commonContentForeground\":\"#7e57c2\",\"editorGutter.background\":\"#011627\",\"editorGutter.modifiedBackground\":\"#e2b93d\",\"editorGutter.addedBackground\":\"#9ccc65\",\"editorGutter.deletedBackground\":\"#ef5350\",\"editorSuggestWidget.background\":\"#2c3043\",\"editorSuggestWidget.border\":\"#2b2f40\",\"editorSuggestWidget.foreground\":\"#d6deeb\",\"editorSuggestWidget.highlightForeground\":\"#ffffff\",\"editorSuggestWidget.selectedBackground\":\"#5f7e97\",\"debugExceptionWidget.background\":\"#011627\",\"debugExceptionWidget.border\":\"#5f7e97\",\"editorMarkerNavigation.background\":\"#0b2942\",\"editorMarkerNavigationError.background\":\"#ef5350\",\"editorMarkerNavigationWarning.background\":\"#ffca28\",\"peekView.border\":\"#5f7e97\",\"peekViewEditor.background\":\"#011627\",\"peekViewEditor.matchHighlightBackground\":\"#7e57c25a\",\"peekViewResult.background\":\"#011627\",\"peekViewResult.fileForeground\":\"#5f7e97\",\"peekViewResult.lineForeground\":\"#5f7e97\",\"peekViewResult.matchHighlightBackground\":\"#ffffffcc\",\"peekViewResult.selectionBackground\":\"#2e3250\",\"peekViewResult.selectionForeground\":\"#5f7e97\",\"peekViewTitle.background\":\"#011627\",\"peekViewTitleDescription.foreground\":\"#697098\",\"peekViewTitleLabel.foreground\":\"#5f7e97\",\"merge.currentHeaderBackground\":\"#5f7e97\",\"merge.incomingHeaderBackground\":\"#7e57c25a\",\"statusBar.background\":\"#011627\",\"statusBar.foreground\":\"#5f7e97\",\"statusBar.border\":\"#262a39\",\"statusBar.debuggingBackground\":\"#202431\",\"statusBar.debuggingBorder\":\"#1f2330\",\"statusBar.noFolderBackground\":\"#011627\",\"statusBar.noFolderBorder\":\"#25293a\",\"statusBarItem.activeBackground\":\"#202431\",\"statusBarItem.hoverBackground\":\"#202431\",\"statusBarItem.prominentBackground\":\"#202431\",\"statusBarItem.prominentHoverBackground\":\"#202431\",\"notifications.background\":\"#01111d\",\"notifications.border\":\"#262a39\",\"notificationCenter.border\":\"#262a39\",\"notificationToast.border\":\"#262a39\",\"notifications.foreground\":\"#ffffffcc\",\"notificationLink.foreground\":\"#80cbc4\",\"extensionButton.prominentForeground\":\"#ffffffcc\",\"extensionButton.prominentBackground\":\"#7e57c2cc\",\"extensionButton.prominentHoverBackground\":\"#7e57c2\",\"terminal.selectionBackground\":\"#1b90dd4d\",\"terminalCursor.background\":\"#234d70\",\"debugToolBar.background\":\"#011627\",\"welcomePage.buttonBackground\":\"#011627\",\"welcomePage.buttonHoverBackground\":\"#011627\",\"walkThrough.embeddedEditorBackground\":\"#011627\",\"gitDecoration.modifiedResourceForeground\":\"#a2bffc\",\"gitDecoration.deletedResourceForeground\":\"#ef535090\",\"gitDecoration.untrackedResourceForeground\":\"#c5e478ff\",\"gitDecoration.ignoredResourceForeground\":\"#395a75\",\"gitDecoration.conflictingResourceForeground\":\"#ffeb95cc\",\"source.elm\":\"#5f7e97\",\"string.quoted.single.js\":\"#ffffff\",\"meta.objectliteral.js\":\"#82aaff\"},\"fg\":\"#d6deeb\",\"bg\":\"#23262f\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#a2bffc\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#f27775fe\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#d6deeb\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#919f9f\",\"fontStyle\":\"\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#5ca7e4\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#caece6\",\"fontStyle\":\"\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"fontStyle\":\"\",\"foreground\":\"#c5e478\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"background\":\"#ff2c83\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#d3423e\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#919f9f\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#cdebf7\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#ffffff\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#7fdbca\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#80cbc4\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#57eaf1\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#fad430\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#faf39f\",\"fontStyle\":\"\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#82aaff\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Comparison, returns, imports, and Keyword Operator Ruby\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#989da0\",\"background\":\"#F78C6C\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"background\":\"#8BD649\",\"foreground\":\"#ffffff\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#ffffff\",\"background\":\"#ec5f67\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#ef787f\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#d9f5dd\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#e2817f\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#31e1eb\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Unquoted String Zone\",\"scope\":[\"string.unquoted.preprocessor.message.cs\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C# Region\",\"scope\":[\"punctuation.separator.hash.cs\",\"keyword.preprocessor.region.cs\",\"keyword.preprocessor.endregion.cs\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"bold\"}},{\"name\":\"C# Other Variables\",\"scope\":[\"variable.other.object.cs\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"C# Enum\",\"scope\":[\"entity.name.type.enum.cs\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Dart String\",\"scope\":[\"string.interpolated.single.dart\",\"string.interpolated.double.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Dart Class\",\"scope\":[\"support.class.dart\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#ff6d6d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#dddddd\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#e0dec6\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#6ae9f0\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#78ccf0\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#8b96ea\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#ffcb8b\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#c789d6\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#ecc48d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#c792ea\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#c5e478\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#969bb7\",\"fontStyle\":\"\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#80cbc4\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#ff869a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#d6deeb\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#82b1ff\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#ff6a83\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#b2ccd6\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#8eace3\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#c5e478\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#bec5d4\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#f78c6c\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#ffeb95\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#889fb2\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#7fdbca\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#d7dbe0\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#f78c6c\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#d6deeb\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#ffcb8b\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#c792ea\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#82aaff\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-6)\",\"terminalBackground\":\"var(--sl-color-gray-6)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-6)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#ffffff17\",\"markBorderColor\":\"#ffffff40\"}}},{\"name\":\"Night Owl Light\",\"type\":\"light\",\"colors\":{\"focusBorder\":\"#93a1a1\",\"foreground\":\"#403f53\",\"disabledForeground\":\"#61616180\",\"descriptionForeground\":\"#403f53\",\"errorForeground\":\"#403f53\",\"icon.foreground\":\"#424242\",\"contrastActiveBorder\":null,\"contrastBorder\":null,\"textBlockQuote.background\":\"#7f7f7f1a\",\"textBlockQuote.border\":\"#007acc80\",\"textCodeBlock.background\":\"#dcdcdc66\",\"textLink.activeForeground\":\"#006ab1\",\"textLink.foreground\":\"#006ab1\",\"textPreformat.foreground\":\"#a31515\",\"textSeparator.foreground\":\"#0000002e\",\"editor.background\":\"#f6f7f9\",\"editor.foreground\":\"#403f53\",\"editorLineNumber.foreground\":\"#90a7b2\",\"editorLineNumber.activeForeground\":\"#403f53\",\"editorActiveLineNumber.foreground\":\"#0b216f\",\"editor.selectionBackground\":\"#e0e0e0\",\"editor.inactiveSelectionBackground\":\"#e0e0e080\",\"editor.selectionHighlightBackground\":\"#339cec33\",\"editorError.foreground\":\"#e64d49\",\"editorWarning.foreground\":\"#daaa01\",\"editorInfo.foreground\":\"#1a85ff\",\"editorHint.foreground\":\"#6c6c6c\",\"problemsErrorIcon.foreground\":\"#e64d49\",\"problemsWarningIcon.foreground\":\"#daaa01\",\"problemsInfoIcon.foreground\":\"#1a85ff\",\"editor.findMatchBackground\":\"#93a1a16c\",\"editor.findMatchHighlightBackground\":\"#93a1a16c\",\"editor.findRangeHighlightBackground\":\"#7497a633\",\"editorLink.activeForeground\":\"#0000ff\",\"editorLightBulb.foreground\":\"#ddb100\",\"editorLightBulbAutoFix.foreground\":\"#007acc\",\"diffEditor.insertedTextBackground\":\"#9ccc2c40\",\"diffEditor.insertedTextBorder\":null,\"diffEditor.removedTextBackground\":\"#ff000033\",\"diffEditor.removedTextBorder\":null,\"diffEditor.insertedLineBackground\":\"#9bb95533\",\"diffEditor.removedLineBackground\":\"#ff000033\",\"editorStickyScroll.background\":\"#fbfbfb\",\"editorStickyScrollHover.background\":\"#f0f0f0\",\"editorInlayHint.background\":\"#2aa29899\",\"editorInlayHint.foreground\":\"#f0f0f0\",\"editorInlayHint.typeBackground\":\"#2aa29899\",\"editorInlayHint.typeForeground\":\"#f0f0f0\",\"editorInlayHint.parameterBackground\":\"#2aa29899\",\"editorInlayHint.parameterForeground\":\"#f0f0f0\",\"editorPane.background\":\"#fbfbfb\",\"editorGroup.emptyBackground\":null,\"editorGroup.focusedEmptyBorder\":null,\"editorGroupHeader.tabsBackground\":\"var(--sl-color-gray-6)\",\"editorGroupHeader.tabsBorder\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"editorGroupHeader.noTabsBackground\":\"#f0f0f0\",\"editorGroupHeader.border\":null,\"editorGroup.border\":\"#f0f0f0\",\"editorGroup.dropBackground\":\"#2677cb2d\",\"editorGroup.dropIntoPromptForeground\":\"#403f53\",\"editorGroup.dropIntoPromptBackground\":\"#f0f0f0\",\"editorGroup.dropIntoPromptBorder\":null,\"sideBySideEditor.horizontalBorder\":\"#f0f0f0\",\"sideBySideEditor.verticalBorder\":\"#f0f0f0\",\"scrollbar.shadow\":\"#cccccc\",\"scrollbarSlider.background\":\"#0000001a\",\"scrollbarSlider.hoverBackground\":\"#00000055\",\"scrollbarSlider.activeBackground\":\"#00000099\",\"panel.background\":\"#f0f0f0\",\"panel.border\":\"#d9d9d9\",\"panelTitle.activeBorder\":\"#424242\",\"panelTitle.activeForeground\":\"#424242\",\"panelTitle.inactiveForeground\":\"#424242bf\",\"panelSectionHeader.background\":\"#80808051\",\"terminal.background\":\"#f6f6f6\",\"widget.shadow\":\"#d9d9d9\",\"editorWidget.background\":\"#f0f0f0\",\"editorWidget.foreground\":\"#403f53\",\"editorWidget.border\":\"#d9d9d9\",\"quickInput.background\":\"#f0f0f0\",\"quickInput.foreground\":\"#403f53\",\"quickInputTitle.background\":\"#0000000f\",\"pickerGroup.foreground\":\"#403f53\",\"pickerGroup.border\":\"#d9d9d9\",\"editor.hoverHighlightBackground\":\"#339cec33\",\"editorHoverWidget.background\":\"#f0f0f0\",\"editorHoverWidget.foreground\":\"#403f53\",\"editorHoverWidget.border\":\"#d9d9d9\",\"editorHoverWidget.statusBarBackground\":\"#e4e4e4\",\"titleBar.activeBackground\":\"var(--sl-color-gray-6)\",\"titleBar.activeForeground\":\"var(--sl-color-text)\",\"titleBar.inactiveBackground\":\"#f0f0f099\",\"titleBar.inactiveForeground\":\"#33333399\",\"titleBar.border\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"toolbar.hoverBackground\":\"#b8b8b850\",\"toolbar.activeBackground\":\"#a6a6a650\",\"tab.activeBackground\":\"#f6f6f6\",\"tab.unfocusedActiveBackground\":\"#f6f6f6\",\"tab.inactiveBackground\":\"#f0f0f0\",\"tab.unfocusedInactiveBackground\":\"#f0f0f0\",\"tab.activeForeground\":\"var(--sl-color-text)\",\"tab.inactiveForeground\":\"#403f53\",\"tab.unfocusedActiveForeground\":\"#403f53b3\",\"tab.unfocusedInactiveForeground\":\"#403f5380\",\"tab.hoverBackground\":null,\"tab.unfocusedHoverBackground\":null,\"tab.hoverForeground\":null,\"tab.unfocusedHoverForeground\":null,\"tab.border\":\"#f0f0f0\",\"tab.lastPinnedBorder\":\"#a9a9a9\",\"tab.activeBorder\":\"transparent\",\"tab.unfocusedActiveBorder\":null,\"tab.activeBorderTop\":\"var(--sl-color-accent)\",\"tab.unfocusedActiveBorderTop\":null,\"tab.hoverBorder\":null,\"tab.unfocusedHoverBorder\":null,\"tab.activeModifiedBorder\":\"#2aa298\",\"tab.inactiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedActiveModifiedBorder\":\"#93a1a1\",\"tab.unfocusedInactiveModifiedBorder\":\"#93a1a1\",\"badge.background\":\"#2aa298\",\"badge.foreground\":\"#f0f0f0\",\"button.background\":\"#2aa298\",\"button.foreground\":\"#f0f0f0\",\"button.border\":null,\"button.separator\":\"#f0f0f066\",\"button.hoverBackground\":\"#22827a\",\"button.secondaryBackground\":\"#5f6a79\",\"button.secondaryForeground\":\"#ffffff\",\"button.secondaryHoverBackground\":\"#4c5561\",\"dropdown.background\":\"#f0f0f0\",\"dropdown.foreground\":\"#403f53\",\"dropdown.border\":\"#d9d9d9\",\"list.activeSelectionBackground\":\"#d3e8f8\",\"list.activeSelectionForeground\":\"#403f53\",\"tree.indentGuidesStroke\":\"#a9a9a9\",\"input.background\":\"#f0f0f0\",\"input.foreground\":\"#403f53\",\"input.placeholderForeground\":\"#93a1a1\",\"inputOption.activeBorder\":\"#2aa298\",\"inputOption.hoverBackground\":\"#b8b8b850\",\"inputOption.activeBackground\":\"#93a1a133\",\"inputOption.activeForeground\":\"#000000\",\"inputValidation.infoBackground\":\"#f0f0f0\",\"inputValidation.infoBorder\":\"#d0d0d0\",\"inputValidation.warningBackground\":\"#daaa01\",\"inputValidation.warningBorder\":\"#e0af02\",\"inputValidation.errorBackground\":\"#f76e6e\",\"inputValidation.errorBorder\":\"#de3d3b\",\"keybindingLabel.background\":\"#dddddd66\",\"keybindingLabel.foreground\":\"#555555\",\"keybindingLabel.border\":\"#cccccc66\",\"keybindingLabel.bottomBorder\":\"#bbbbbb66\",\"menu.foreground\":\"#403f53\",\"menu.background\":\"#f0f0f0\",\"menu.selectionForeground\":\"#403f53\",\"menu.selectionBackground\":\"#d3e8f8\",\"menu.separatorBackground\":\"#d4d4d4\",\"editor.snippetTabstopHighlightBackground\":\"#0a326433\",\"editor.snippetFinalTabstopHighlightBorder\":\"#0a326480\",\"terminal.ansiBlack\":\"#403f53\",\"terminal.ansiRed\":\"#de3d3b\",\"terminal.ansiGreen\":\"#08916a\",\"terminal.ansiYellow\":\"#e0af02\",\"terminal.ansiBlue\":\"#288ed7\",\"terminal.ansiMagenta\":\"#d6438a\",\"terminal.ansiCyan\":\"#2aa298\",\"terminal.ansiWhite\":\"#f0f0f0\",\"terminal.ansiBrightBlack\":\"#403f53\",\"terminal.ansiBrightRed\":\"#de3d3b\",\"terminal.ansiBrightGreen\":\"#08916a\",\"terminal.ansiBrightYellow\":\"#daaa01\",\"terminal.ansiBrightBlue\":\"#288ed7\",\"terminal.ansiBrightMagenta\":\"#d6438a\",\"terminal.ansiBrightCyan\":\"#2aa298\",\"terminal.ansiBrightWhite\":\"#f0f0f0\",\"selection.background\":\"#7a8181ad\",\"notifications.background\":\"#f0f0f0\",\"notifications.foreground\":\"#403f53\",\"notificationLink.foreground\":\"#994cc3\",\"notifications.border\":\"#cccccc\",\"notificationCenter.border\":\"#cccccc\",\"notificationToast.border\":\"#cccccc\",\"notificationCenterHeader.foreground\":\"#403f53\",\"notificationCenterHeader.background\":\"#f0f0f0\",\"input.border\":\"#d9d9d9\",\"progressBar.background\":\"#2aa298\",\"list.inactiveSelectionBackground\":\"#e0e7ea\",\"list.inactiveSelectionForeground\":\"#403f53\",\"list.focusBackground\":\"#d3e8f8\",\"list.hoverBackground\":\"#d3e8f8\",\"list.focusForeground\":\"#403f53\",\"list.hoverForeground\":\"#403f53\",\"list.highlightForeground\":\"#403f53\",\"list.errorForeground\":\"#e64d49\",\"list.warningForeground\":\"#daaa01\",\"activityBar.background\":\"#f0f0f0\",\"activityBar.foreground\":\"#403f53\",\"activityBar.dropBackground\":\"#d0d0d0\",\"activityBarBadge.background\":\"#403f53\",\"activityBarBadge.foreground\":\"#f0f0f0\",\"activityBar.border\":\"#f0f0f0\",\"sideBar.background\":\"#f0f0f0\",\"sideBar.foreground\":\"#403f53\",\"sideBarTitle.foreground\":\"#403f53\",\"sideBar.border\":\"#f0f0f0\",\"editorGroup.background\":\"#f6f6f6\",\"editorCursor.foreground\":\"#90a7b2\",\"editor.wordHighlightBackground\":\"#339cec33\",\"editor.wordHighlightStrongBackground\":\"#007dd659\",\"editor.lineHighlightBackground\":\"#f0f0f0\",\"editor.rangeHighlightBackground\":\"#7497a633\",\"editorWhitespace.foreground\":\"#d9d9d9\",\"editorIndentGuide.background\":\"#d9d9d9\",\"editorCodeLens.foreground\":\"#403f53\",\"editorBracketMatch.background\":\"#d3e8f8\",\"editorBracketMatch.border\":\"#2aa298\",\"editorError.border\":\"#fbfbfb\",\"editorWarning.border\":\"#daaa01\",\"editorGutter.addedBackground\":\"#49d0c5\",\"editorGutter.modifiedBackground\":\"#6fbef6\",\"editorGutter.deletedBackground\":\"#f76e6e\",\"editorRuler.foreground\":\"#d9d9d9\",\"editorOverviewRuler.errorForeground\":\"#e64d49\",\"editorOverviewRuler.warningForeground\":\"#daaa01\",\"editorSuggestWidget.background\":\"#f0f0f0\",\"editorSuggestWidget.foreground\":\"#403f53\",\"editorSuggestWidget.highlightForeground\":\"#403f53\",\"editorSuggestWidget.selectedBackground\":\"#d3e8f8\",\"editorSuggestWidget.border\":\"#d9d9d9\",\"debugExceptionWidget.background\":\"#f0f0f0\",\"debugExceptionWidget.border\":\"#d9d9d9\",\"editorMarkerNavigation.background\":\"#d0d0d0\",\"editorMarkerNavigationError.background\":\"#f76e6e\",\"editorMarkerNavigationWarning.background\":\"#daaa01\",\"debugToolBar.background\":\"#f0f0f0\",\"extensionButton.prominentBackground\":\"#2aa298\",\"extensionButton.prominentForeground\":\"#f0f0f0\",\"statusBar.background\":\"#f0f0f0\",\"statusBar.border\":\"#f0f0f0\",\"statusBar.debuggingBackground\":\"#f0f0f0\",\"statusBar.debuggingForeground\":\"#403f53\",\"statusBar.foreground\":\"#403f53\",\"statusBar.noFolderBackground\":\"#f0f0f0\",\"statusBar.noFolderForeground\":\"#403f53\",\"peekView.border\":\"#d9d9d9\",\"peekViewEditor.background\":\"#f6f6f6\",\"peekViewEditorGutter.background\":\"#f6f6f6\",\"peekViewEditor.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.background\":\"#f0f0f0\",\"peekViewResult.fileForeground\":\"#403f53\",\"peekViewResult.lineForeground\":\"#403f53\",\"peekViewResult.matchHighlightBackground\":\"#49d0c5\",\"peekViewResult.selectionBackground\":\"#e0e7ea\",\"peekViewResult.selectionForeground\":\"#403f53\",\"peekViewTitle.background\":\"#f0f0f0\",\"peekViewTitleLabel.foreground\":\"#403f53\",\"peekViewTitleDescription.foreground\":\"#403f53\",\"terminal.foreground\":\"#403f53\"},\"fg\":\"#403f53\",\"bg\":\"#f6f7f9\",\"semanticHighlighting\":false,\"settings\":[{\"name\":\"Changed\",\"scope\":[\"markup.changed\",\"meta.diff.header.git\",\"meta.diff.header.from-file\",\"meta.diff.header.to-file\"],\"settings\":{\"foreground\":\"#556484\"}},{\"name\":\"Deleted\",\"scope\":[\"markup.deleted.diff\"],\"settings\":{\"foreground\":\"#ae3c3afd\"}},{\"name\":\"Inserted\",\"scope\":[\"markup.inserted.diff\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Global settings\",\"settings\":{\"background\":\"#011627\",\"foreground\":\"#403f53\"}},{\"name\":\"Comment\",\"scope\":[\"comment\"],\"settings\":{\"foreground\":\"#5f636f\"}},{\"name\":\"String\",\"scope\":[\"string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"String Quoted\",\"scope\":[\"string.quoted\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Support Constant Math\",\"scope\":[\"support.constant.math\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Number\",\"scope\":[\"constant.numeric\",\"constant.character.numeric\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Built-in constant\",\"scope\":[\"constant.language\",\"punctuation.definition.constant\",\"variable.other.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"User-defined constant\",\"scope\":[\"constant.character\",\"constant.other\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Constant Character Escape\",\"scope\":[\"constant.character.escape\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"RegExp String\",\"scope\":[\"string.regexp\",\"string.regexp keyword.other\"],\"settings\":{\"foreground\":\"#3a688f\"}},{\"name\":\"Comma in functions\",\"scope\":[\"meta.function punctuation.separator.comma\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Variable\",\"scope\":[\"variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword\",\"scope\":[\"punctuation.accessor\",\"keyword\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage\",\"scope\":[\"storage\",\"meta.var.expr\",\"meta.class meta.method.declaration meta.var.expr storage.type.js\",\"storage.type.property.js\",\"storage.type.property.ts\",\"storage.type.property.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Storage type\",\"scope\":[\"storage.type.function.arrow.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Class name\",\"scope\":[\"entity.name.class\",\"meta.class entity.name.type.class\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Inherited class\",\"scope\":[\"entity.other.inherited-class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Function name\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Meta Tag\",\"scope\":[\"punctuation.definition.tag\",\"meta.tag\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Tag names\",\"scope\":[\"entity.name.tag\",\"meta.tag.other.html\",\"meta.tag.other.js\",\"meta.tag.other.tsx\",\"entity.name.tag.tsx\",\"entity.name.tag.js\",\"entity.name.tag\",\"meta.tag.js\",\"meta.tag.tsx\",\"meta.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Tag attribute\",\"scope\":[\"entity.other.attribute-name\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Entity Name Tag Custom\",\"scope\":[\"entity.name.tag.custom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Library (function & constant)\",\"scope\":[\"support.function\",\"support.constant\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Constant Property Value meta\",\"scope\":[\"support.constant.meta.property-value\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Library class/type\",\"scope\":[\"support.type\",\"support.class\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Support Variable DOM\",\"scope\":[\"support.variable.dom\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid\",\"scope\":[\"invalid\"],\"settings\":{\"foreground\":\"#bb2060\"}},{\"name\":\"Invalid deprecated\",\"scope\":[\"invalid.deprecated\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Keyword Operator\",\"scope\":[\"keyword.operator\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Keyword Operator Relational\",\"scope\":[\"keyword.operator.relational\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Assignment\",\"scope\":[\"keyword.operator.assignment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Arithmetic\",\"scope\":[\"keyword.operator.arithmetic\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Bitwise\",\"scope\":[\"keyword.operator.bitwise\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Increment\",\"scope\":[\"keyword.operator.increment\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Operator Ternary\",\"scope\":[\"keyword.operator.ternary\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Double-Slashed Comment\",\"scope\":[\"comment.line.double-slash\"],\"settings\":{\"foreground\":\"#5d6376\"}},{\"name\":\"Object\",\"scope\":[\"object\"],\"settings\":{\"foreground\":\"#58656a\"}},{\"name\":\"Null\",\"scope\":[\"constant.language.null\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Meta Brace\",\"scope\":[\"meta.brace\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Meta Delimiter Period\",\"scope\":[\"meta.delimiter.period\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition String\",\"scope\":[\"punctuation.definition.string\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuation Definition String Markdown\",\"scope\":[\"punctuation.definition.string.begin.markdown\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Boolean\",\"scope\":[\"constant.language.boolean\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Object Comma\",\"scope\":[\"object.comma\"],\"settings\":{\"foreground\":\"#646464\"}},{\"name\":\"Variable Parameter Function\",\"scope\":[\"variable.parameter.function\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Support Type Property Name & entity name tags\",\"scope\":[\"support.type.vendor.property-name\",\"support.constant.vendor.property-value\",\"support.type.property-name\",\"meta.property-list entity.name.tag\"],\"settings\":{\"foreground\":\"#096e72\",\"fontStyle\":\"\"}},{\"name\":\"Entity Name tag reference in stylesheets\",\"scope\":[\"meta.property-list entity.name.tag.reference\"],\"settings\":{\"foreground\":\"#286d70\"}},{\"name\":\"Constant Other Color RGB Value Punctuation Definition Constant\",\"scope\":[\"constant.other.color.rgb-value punctuation.definition.constant\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Constant Other Color\",\"scope\":[\"constant.other.color\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Keyword Other Unit\",\"scope\":[\"keyword.other.unit\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Selector\",\"scope\":[\"meta.selector\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Entity Other Attribute Name Id\",\"scope\":[\"entity.other.attribute-name.id\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Meta Property Name\",\"scope\":[\"meta.property-name\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Doctypes\",\"scope\":[\"entity.name.tag.doctype\",\"meta.tag.sgml.doctype\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Punctuation Definition Parameters\",\"scope\":[\"punctuation.definition.parameters\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Keyword Control Operator\",\"scope\":[\"keyword.control.operator\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Keyword Operator Logical\",\"scope\":[\"keyword.operator.logical\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Variable Instances\",\"scope\":[\"variable.instance\",\"variable.other.instance\",\"variable.readwrite.instance\",\"variable.other.readwrite.instance\",\"variable.other.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Property Other object property\",\"scope\":[\"variable.other.object.property\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Variable Property Other object\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"fontStyle\":\"\"}},{\"name\":\"Entity Name Function\",\"scope\":[\"entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Keyword Operator Comparison, imports, returns and Keyword Operator Ruby\",\"scope\":[\"keyword.operator.comparison\",\"keyword.control.flow.js\",\"keyword.control.flow.ts\",\"keyword.control.flow.tsx\",\"keyword.control.ruby\",\"keyword.control.module.ruby\",\"keyword.control.class.ruby\",\"keyword.control.def.ruby\",\"keyword.control.loop.js\",\"keyword.control.loop.ts\",\"keyword.control.import.js\",\"keyword.control.import.ts\",\"keyword.control.import.tsx\",\"keyword.control.from.js\",\"keyword.control.from.ts\",\"keyword.control.from.tsx\",\"keyword.operator.instanceof.js\",\"keyword.operator.expression.instanceof.ts\",\"keyword.operator.expression.instanceof.tsx\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Keyword Control Conditional\",\"scope\":[\"keyword.control.conditional.js\",\"keyword.control.conditional.ts\",\"keyword.control.switch.js\",\"keyword.control.switch.ts\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"\"}},{\"name\":\"Support Constant, `new` keyword, Special Method Keyword, `debugger`, other keywords\",\"scope\":[\"support.constant\",\"keyword.other.special-method\",\"keyword.other.new\",\"keyword.other.debugger\",\"keyword.control\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Function\",\"scope\":[\"support.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Invalid Broken\",\"scope\":[\"invalid.broken\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Invalid Unimplemented\",\"scope\":[\"invalid.unimplemented\"],\"settings\":{\"foreground\":\"#486e26\"}},{\"name\":\"Invalid Illegal\",\"scope\":[\"invalid.illegal\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Language Variable\",\"scope\":[\"variable.language\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Support Variable Property\",\"scope\":[\"support.variable.property\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Variable Function\",\"scope\":[\"variable.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variable Interpolation\",\"scope\":[\"variable.interpolation\"],\"settings\":{\"foreground\":\"#a64348\"}},{\"name\":\"Meta Function Call\",\"scope\":[\"meta.function-call\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Punctuation Section Embedded\",\"scope\":[\"punctuation.section.embedded\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Punctuation Tweaks\",\"scope\":[\"punctuation.terminator.expression\",\"punctuation.definition.arguments\",\"punctuation.definition.array\",\"punctuation.section.array\",\"meta.array\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"More Punctuation Tweaks\",\"scope\":[\"punctuation.definition.list.begin\",\"punctuation.definition.list.end\",\"punctuation.separator.arguments\",\"punctuation.definition.list\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Template Strings\",\"scope\":[\"string.template meta.template.expression\"],\"settings\":{\"foreground\":\"#b23834\"}},{\"name\":\"Backticks(``) in Template Strings\",\"scope\":[\"string.template punctuation.definition.string\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Italics\",\"scope\":[\"italic\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Bold\",\"scope\":[\"bold\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Quote\",\"scope\":[\"quote\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Raw Code\",\"scope\":[\"raw\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CoffeeScript Variable Assignment\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#186e73\"}},{\"name\":\"CoffeeScript Parameter Function\",\"scope\":[\"variable.parameter.function.coffee\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"CoffeeScript Assignments\",\"scope\":[\"variable.assignment.coffee\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C# Readwrite Variables\",\"scope\":[\"variable.other.readwrite.cs\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C# Classes & Storage types\",\"scope\":[\"entity.name.type.class.cs\",\"storage.type.cs\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"C# Namespaces\",\"scope\":[\"entity.name.type.namespace.cs\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Tag names in Stylesheets\",\"scope\":[\"entity.name.tag.css\",\"entity.name.tag.less\",\"entity.name.tag.custom.css\",\"support.constant.property-value.css\"],\"settings\":{\"foreground\":\"#984e4d\",\"fontStyle\":\"\"}},{\"name\":\"Wildcard(*) selector in Stylesheets\",\"scope\":[\"entity.name.tag.wildcard.css\",\"entity.name.tag.wildcard.less\",\"entity.name.tag.wildcard.scss\",\"entity.name.tag.wildcard.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"CSS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Attribute Name for CSS\",\"scope\":[\"meta.attribute-selector.css entity.other.attribute-name.attribute\",\"variable.other.readwrite.js\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Elixir Classes\",\"scope\":[\"source.elixir support.type.elixir\",\"source.elixir meta.module.elixir entity.name.class.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Functions\",\"scope\":[\"source.elixir entity.name.function\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Constants\",\"scope\":[\"source.elixir constant.other.symbol.elixir\",\"source.elixir constant.other.keywords.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir String Punctuations\",\"scope\":[\"source.elixir punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir\",\"scope\":[\"source.elixir variable.other.readwrite.module.elixir\",\"source.elixir variable.other.readwrite.module.elixir punctuation.definition.variable.elixir\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Elixir Binary Punctuations\",\"scope\":[\"source.elixir .punctuation.binary.elixir\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Closure Constant Keyword\",\"scope\":[\"constant.keyword.clojure\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Function Calls\",\"scope\":[\"source.go meta.function-call.go\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Go Keywords\",\"scope\":[\"source.go keyword.package.go\",\"source.go keyword.import.go\",\"source.go keyword.function.go\",\"source.go keyword.type.go\",\"source.go keyword.struct.go\",\"source.go keyword.interface.go\",\"source.go keyword.const.go\",\"source.go keyword.var.go\",\"source.go keyword.map.go\",\"source.go keyword.channel.go\",\"source.go keyword.control.go\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"Go Constants e.g. nil, string format (%s, %d, etc.)\",\"scope\":[\"source.go constant.language.go\",\"source.go constant.other.placeholder.go\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Functions\",\"scope\":[\"entity.name.function.preprocessor.cpp\",\"entity.scope.name.cpp\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"C++ Meta Namespace\",\"scope\":[\"meta.namespace-block.cpp\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"C++ Language Primitive Storage\",\"scope\":[\"storage.type.language.primitive.cpp\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"C++ Preprocessor Macro\",\"scope\":[\"meta.preprocessor.macro.cpp\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"C++ Variable Parameter\",\"scope\":[\"variable.parameter\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Powershell Variables\",\"scope\":[\"variable.other.readwrite.powershell\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Powershell Function\",\"scope\":[\"support.function.powershell\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"ID Attribute Name in HTML\",\"scope\":[\"entity.other.attribute-name.id.html\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"HTML Punctuation Definition Tag\",\"scope\":[\"punctuation.definition.tag.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"HTML Doctype\",\"scope\":[\"meta.tag.sgml.doctype.html\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"JavaScript Classes\",\"scope\":[\"meta.class entity.name.type.class.js\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.js\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JavaScript Terminator\",\"scope\":[\"terminator.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Meta Punctuation Definition\",\"scope\":[\"meta.js punctuation.definition.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Entity Names in Code Documentations\",\"scope\":[\"entity.name.type.instance.jsdoc\",\"entity.name.type.instance.phpdoc\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"Other Variables in Code Documentations\",\"scope\":[\"variable.other.jsdoc\",\"variable.other.phpdoc\"],\"settings\":{\"foreground\":\"#3e697c\"}},{\"name\":\"JavaScript module imports and exports\",\"scope\":[\"variable.other.meta.import.js\",\"meta.import.js variable.other\",\"variable.other.meta.export.js\",\"meta.export.js variable.other\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variable Parameter Function\",\"scope\":[\"variable.parameter.function.js\"],\"settings\":{\"foreground\":\"#555ea2\"}},{\"name\":\"JavaScript[React] Variable Other Object\",\"scope\":[\"variable.other.object.js\",\"variable.other.object.jsx\",\"variable.object.property.js\",\"variable.object.property.jsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Variables\",\"scope\":[\"variable.js\",\"variable.other.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JavaScript Entity Name Type\",\"scope\":[\"entity.name.type.js\",\"entity.name.type.module.js\"],\"settings\":{\"foreground\":\"#111111\",\"fontStyle\":\"\"}},{\"name\":\"JavaScript Support Classes\",\"scope\":[\"support.class.js\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"JSON Property Names\",\"scope\":[\"support.type.property-name.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"JSON Support Constants\",\"scope\":[\"support.constant.json\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"JSON Property values (string)\",\"scope\":[\"meta.structure.dictionary.value.json string.quoted.double\"],\"settings\":{\"foreground\":\"#7c5686\"}},{\"name\":\"Strings in JSON values\",\"scope\":[\"string.quoted.double.json punctuation.definition.string.json\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Specific JSON Property values like null\",\"scope\":[\"meta.structure.dictionary.json meta.structure.dictionary.value constant.language\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"JavaScript Other Variable\",\"scope\":[\"variable.other.object.js\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Variables\",\"scope\":[\"variable.other.ruby\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Ruby Class\",\"scope\":[\"entity.name.type.class.ruby\"],\"settings\":{\"foreground\":\"#984e4d\"}},{\"name\":\"Ruby Hashkeys\",\"scope\":[\"constant.language.symbol.hashkey.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Ruby Symbols\",\"scope\":[\"constant.language.symbol.ruby\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"LESS Tag names\",\"scope\":[\"entity.name.tag.less\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"LESS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.css\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Attribute Name for LESS\",\"scope\":[\"meta.attribute-selector.less entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Markdown Headings\",\"scope\":[\"markup.heading.markdown\",\"markup.heading.setext.1.markdown\",\"markup.heading.setext.2.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Italics\",\"scope\":[\"markup.italic.markdown\"],\"settings\":{\"foreground\":\"#8844ae\",\"fontStyle\":\"italic\"}},{\"name\":\"Markdown Bold\",\"scope\":[\"markup.bold.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\",\"fontStyle\":\"bold\"}},{\"name\":\"Markdown Quote + others\",\"scope\":[\"markup.quote.markdown\"],\"settings\":{\"foreground\":\"#5c6285\"}},{\"name\":\"Markdown Raw Code + others\",\"scope\":[\"markup.inline.raw.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown Links\",\"scope\":[\"markup.underline.link.markdown\",\"markup.underline.link.image.markdown\"],\"settings\":{\"foreground\":\"#954f5a\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Link Title and Description\",\"scope\":[\"string.other.link.title.markdown\",\"string.other.link.description.markdown\"],\"settings\":{\"foreground\":\"#403f53\",\"fontStyle\":\"underline\"}},{\"name\":\"Markdown Punctuation\",\"scope\":[\"punctuation.definition.string.markdown\",\"punctuation.definition.string.begin.markdown\",\"punctuation.definition.string.end.markdown\",\"meta.link.inline.markdown punctuation.definition.string\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown MetaData Punctuation\",\"scope\":[\"punctuation.definition.metadata.markdown\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Markdown List Punctuation\",\"scope\":[\"beginning.punctuation.definition.list.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Markdown Inline Raw String\",\"scope\":[\"markup.inline.raw.string.markdown\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"PHP Variables\",\"scope\":[\"variable.other.php\",\"variable.other.property.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Support Classes in PHP\",\"scope\":[\"support.class.php\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Punctuations in PHP function calls\",\"scope\":[\"meta.function-call.php punctuation\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"PHP Global Variables\",\"scope\":[\"variable.other.global.php\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Declaration Punctuation in PHP Global Variables\",\"scope\":[\"variable.other.global.php punctuation.definition.variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Language Constants in Python\",\"scope\":[\"constant.language.python\"],\"settings\":{\"foreground\":\"#a24848\"}},{\"name\":\"Python Function Parameter and Arguments\",\"scope\":[\"variable.parameter.function.python\",\"meta.function-call.arguments.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Function Call\",\"scope\":[\"meta.function-call.python\",\"meta.function-call.generic.python\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"Punctuations in Python\",\"scope\":[\"punctuation.python\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Decorator Functions in Python\",\"scope\":[\"entity.name.function.decorator.python\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Python Language Variable\",\"scope\":[\"source.python variable.language.special\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Python import control keyword\",\"scope\":[\"keyword.control\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"SCSS Variable\",\"scope\":[\"variable.scss\",\"variable.sass\",\"variable.parameter.url.scss\",\"variable.parameter.url.sass\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"Variables in SASS At-Rules\",\"scope\":[\"source.css.scss meta.at-rule variable\",\"source.css.sass meta.at-rule variable\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"Attribute Name for SASS\",\"scope\":[\"meta.attribute-selector.scss entity.other.attribute-name.attribute\",\"meta.attribute-selector.sass entity.other.attribute-name.attribute\"],\"settings\":{\"foreground\":\"#aa0982\"}},{\"name\":\"Tag names in SASS\",\"scope\":[\"entity.name.tag.scss\",\"entity.name.tag.sass\"],\"settings\":{\"foreground\":\"#096e72\"}},{\"name\":\"SASS Keyword Other Unit\",\"scope\":[\"keyword.other.unit.scss\",\"keyword.other.unit.sass\"],\"settings\":{\"foreground\":\"#8844ae\"}},{\"name\":\"TypeScript[React] Variables and Object Properties\",\"scope\":[\"variable.other.readwrite.alias.ts\",\"variable.other.readwrite.alias.tsx\",\"variable.other.readwrite.ts\",\"variable.other.readwrite.tsx\",\"variable.other.object.ts\",\"variable.other.object.tsx\",\"variable.object.property.ts\",\"variable.object.property.tsx\",\"variable.other.ts\",\"variable.other.tsx\",\"variable.tsx\",\"variable.ts\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Entity Name Types\",\"scope\":[\"entity.name.type.ts\",\"entity.name.type.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript[React] Node Classes\",\"scope\":[\"support.class.node.ts\",\"support.class.node.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Entity Name Types as Parameters\",\"scope\":[\"meta.type.parameters.ts entity.name.type\",\"meta.type.parameters.tsx entity.name.type\"],\"settings\":{\"foreground\":\"#4d667b\"}},{\"name\":\"TypeScript[React] Import/Export Punctuations\",\"scope\":[\"meta.import.ts punctuation.definition.block\",\"meta.import.tsx punctuation.definition.block\",\"meta.export.ts punctuation.definition.block\",\"meta.export.tsx punctuation.definition.block\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.decorator punctuation.decorator.ts\",\"meta.decorator punctuation.decorator.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"TypeScript[React] Punctuation Decorators\",\"scope\":[\"meta.tag.js meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"YAML Entity Name Tags\",\"scope\":[\"entity.name.tag.yaml\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"JavaScript Variable Other ReadWrite\",\"scope\":[\"variable.other.readwrite.js\",\"variable.parameter\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"Support Class Component\",\"scope\":[\"support.class.component.js\",\"support.class.component.tsx\"],\"settings\":{\"foreground\":\"#aa0982\",\"fontStyle\":\"\"}},{\"name\":\"Text nested in React tags\",\"scope\":[\"meta.jsx.children\",\"meta.jsx.children.js\",\"meta.jsx.children.tsx\"],\"settings\":{\"foreground\":\"#403f53\"}},{\"name\":\"TypeScript Classes\",\"scope\":[\"meta.class entity.name.type.class.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Entity Name Type\",\"scope\":[\"entity.name.type.tsx\",\"entity.name.type.module.tsx\"],\"settings\":{\"foreground\":\"#111111\"}},{\"name\":\"TypeScript Class Variable Keyword\",\"scope\":[\"meta.class.ts meta.var.expr.ts storage.type.ts\",\"meta.class.tsx meta.var.expr.tsx storage.type.tsx\"],\"settings\":{\"foreground\":\"#76578b\"}},{\"name\":\"TypeScript Method Declaration e.g. `constructor`\",\"scope\":[\"meta.method.declaration storage.type.ts\",\"meta.method.declaration storage.type.tsx\"],\"settings\":{\"foreground\":\"#3b61b0\"}},{\"name\":\"normalize font style of certain components\",\"scope\":[\"meta.property-list.css meta.property-value.css variable.other.less\",\"meta.property-list.scss variable.scss\",\"meta.property-list.sass variable.sass\",\"meta.brace\",\"keyword.operator.operator\",\"keyword.operator.or.regexp\",\"keyword.operator.expression.in\",\"keyword.operator.relational\",\"keyword.operator.assignment\",\"keyword.operator.comparison\",\"keyword.operator.type\",\"keyword.operator\",\"keyword\",\"punctuation.definition.string\",\"punctuation\",\"variable.other.readwrite.js\",\"storage.type\",\"source.css\",\"string.quoted\"],\"settings\":{\"fontStyle\":\"\"}}],\"styleOverrides\":{\"frames\":{\"editorBackground\":\"var(--sl-color-gray-7)\",\"terminalBackground\":\"var(--sl-color-gray-7)\",\"editorActiveTabBackground\":\"var(--sl-color-gray-7)\",\"terminalTitlebarDotsForeground\":\"color-mix(in srgb, var(--sl-color-gray-5), transparent 25%)\",\"terminalTitlebarDotsOpacity\":\"0.75\",\"inlineButtonForeground\":\"var(--sl-color-text)\",\"frameBoxShadowCssValue\":\"none\"},\"textMarkers\":{\"markBackground\":\"#0000001a\",\"markBorderColor\":\"#00000055\"}}}],\"defaultLocale\":\"en\",\"cascadeLayer\":\"starlight.components\",\"styleOverrides\":{\"borderRadius\":\"0px\",\"borderWidth\":\"1px\",\"codePaddingBlock\":\"0.75rem\",\"codePaddingInline\":\"1rem\",\"codeFontFamily\":\"var(--__sl-font-mono)\",\"codeFontSize\":\"var(--sl-text-code)\",\"codeLineHeight\":\"var(--sl-line-height)\",\"uiFontFamily\":\"var(--__sl-font)\",\"textMarkers\":{\"lineDiffIndicatorMarginLeft\":\"0.25rem\",\"defaultChroma\":\"45\",\"backgroundOpacity\":\"60%\"}},\"plugins\":[{\"name\":\"Starlight Plugin\",\"hooks\":{}},{\"name\":\"astro-expressive-code\",\"hooks\":{}}]}]],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"security\":{\"checkOrigin\":true,\"allowedDomains\":[],\"actionBodySizeLimit\":1048576},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"headingIdCompat\":false,\"preserveScriptOrder\":false,\"liveContentCollections\":false,\"csp\":false,\"staticImportMetaEnv\":false,\"chromeDevtoolsWorkspace\":false,\"failOnPrerenderConflict\":false,\"svgo\":false},\"legacy\":{\"collections\":false},\"prefetch\":{\"prefetchAll\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":false,\"fallbackType\":\"redirect\"}}}","docs",["Map",11,12,24,25,34,35,44,45,54,55,64,65,75,76],"01-backend-setup",{"id":11,"data":13,"body":21,"filePath":22,"digest":23,"deferredRender":15},{"title":14,"editUrl":15,"head":16,"template":17,"sidebar":18,"pagefind":15,"draft":19},"Backend Credentials",true,[],"doc",{"hidden":19,"attrs":20},false,{},"Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a `.env` file inside the `backend/` folder that **you must create manually** — they cannot be generated for you.\n\n## Create the File\n\nThe repo includes a `backend/.env.example` with all the required variables already listed. Copy it to create your own `.env`:\n\n```sh\ncp backend/.env.example backend/.env\n```\n\nThen open `backend/.env` and replace the placeholder values with your own:\n\n```sh\n# backend/.env\nVONAGE_APP_ID=your-vonage-application-id\nVONAGE_PRIVATE_KEY=./private.key\n```\n\n{% aside type=\"caution\" %}\nNever commit `backend/.env` to source control. The repo's `.gitignore` already excludes it, but double-check before pushing.\n{% /aside %}\n\n## Where to Get the Values\n\n| Variable | Where to find it |\n|----------|-----------------|\n| `VONAGE_APP_ID` | [Vonage Dashboard](https://dashboard.vonage.com) → Your Applications → the app you created for this project |\n| `VONAGE_PRIVATE_KEY` | The `private.key` file downloaded when you created the Vonage Application. Place it in the `backend/` folder and set the path to `./private.key` |\n\n## Verify\n\nOnce the file is saved, confirm its contents look correct:\n\n```sh\ncat backend/.env\n```\n\nYou should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.","src/content/docs/01-backend-setup.mdoc","82e037cbc96786a5","01-config-file-overview",{"id":24,"data":26,"body":31,"filePath":32,"digest":33,"deferredRender":15},{"title":27,"editUrl":15,"head":28,"template":17,"sidebar":29,"pagefind":15,"draft":19},"The Config File",[],{"hidden":19,"attrs":30},{},"All frontend settings for the Vonage Video React App live in a single file at the project root: **`vcrBuild.env.sh`**. This is the one place you need to go to control features, display defaults, and other frontend behaviour.\n\n## Where It Lives\n\n{% filetree %}\n\n- vcrBuild.env.sh ← All frontend configuration goes here\n- backend/\n - .env ← Backend credentials (separate)\n- frontend/\n- libs/\n\n{% /filetree %}\n\n{% aside %}\nBackend credentials (`VONAGE_APP_ID`, `VONAGE_PRIVATE_KEY`) live in `backend/.env`. This tutorial covers only **frontend** configuration in `vcrBuild.env.sh`.\n{% /aside %}\n\n## How It Works\n\n`vcrBuild.env.sh` is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=true\nexport ALLOW_ARCHIVING=true\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n## Opening the File\n\nOpen `vcrBuild.env.sh` in your editor:\n\n```sh\ncode vcrBuild.env.sh\n```\n\nThe defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.\n\n{% aside type=\"caution\" %}\nAfter editing `vcrBuild.env.sh` you must restart the app (`yarn dev`) or trigger a new build for the changes to take effect.\n{% /aside %}\n\nNow let's look at the feature flags you can control.","src/content/docs/01-config-file-overview.mdoc","52ff691e61eb09f2","02-feature-flags",{"id":34,"data":36,"body":41,"filePath":42,"digest":43,"deferredRender":15},{"title":37,"editUrl":15,"head":38,"template":17,"sidebar":39,"pagefind":15,"draft":19},"Feature Flags",[],{"hidden":19,"attrs":40},{},"Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean `true` / `false` value in `vcrBuild.env.sh`.\n\n## Media Controls\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle |\n| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining |\n| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle |\n| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining |\n| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle |\n| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects |\n\n## Device Selection\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room |\n| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room |\n\n## In-Call Features\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ALLOW_ARCHIVING` | `true` | Enable meeting recording |\n| `ALLOW_CAPTIONS` | `true` | Enable live captions |\n| `ALLOW_CHAT` | `true` | Enable the in-call group chat |\n| `ALLOW_EMOJIS` | `true` | Enable emoji reactions |\n| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing |\n| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel |\n\n## Room Behaviour\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool |\n| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly |\n| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup |\n\n## Example: Minimal Read-Only Viewer\n\nTo create a stripped-down experience with no interactive tools, you might disable several flags at once:\n\n```bash\n# vcrBuild.env.sh\nexport ALLOW_CHAT=false\nexport ALLOW_EMOJIS=false\nexport ALLOW_SCREEN_SHARE=false\nexport ALLOW_ARCHIVING=false\nexport ALLOW_CAPTIONS=false\nexport ENABLE_REPORT_ISSUE=false\nexport SHOW_PARTICIPANT_LIST=false\n```\n\n{% aside type=\"tip\" %}\nBackground effects (`ALLOW_BACKGROUND_EFFECTS`) are only supported in Chromium-based browsers. If your audience uses Firefox or Safari, consider disabling this flag to avoid showing an unsupported feature.\n{% /aside %}\n\nYou have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.","src/content/docs/02-feature-flags.mdoc","964d0b09d64d3f3b","03-display-defaults",{"id":44,"data":46,"body":51,"filePath":52,"digest":53,"deferredRender":15},{"title":47,"editUrl":15,"head":48,"template":17,"sidebar":49,"pagefind":15,"draft":19},"Display Defaults",[],{"hidden":19,"attrs":50},{},"Beyond feature flags, `vcrBuild.env.sh` also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.\n\n## Video Resolution\n\n`DEFAULT_RESOLUTION` sets the outgoing video resolution when a participant joins.\n\n| Value | Description |\n|-------|-------------|\n| `1920x1080` | Full HD |\n| `1280x960` | HD (4:3) |\n| `1280x720` | HD 720p **(default)** |\n| `640x480` | SD (4:3) |\n| `640x360` | SD 360p |\n| `320x240` | Low (4:3) |\n| `320x180` | Low 180p |\n\n```bash\nexport DEFAULT_RESOLUTION='1280x720'\n```\n\n## Room Layout\n\n`DEFAULT_LAYOUT_MODE` controls which layout is shown when a participant first enters the room.\n\n| Value | Description |\n|-------|-------------|\n| `active-speaker` | Highlights the current speaker **(default)** |\n| `grid` | Shows all participants in an equal grid |\n\n```bash\nexport DEFAULT_LAYOUT_MODE='active-speaker'\n```\n\n{% aside type=\"caution\" %}\nChanging `DEFAULT_LAYOUT_MODE` requires the participant to **rejoin the room** to take effect — a running session does not update dynamically.\n{% /aside %}\n\n## Custom Video Bitrate Range\n\nThese settings control the minimum and maximum selectable bitrate in the **Advanced Settings** dialog.\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Minimum selectable bitrate in bps |\n| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Maximum selectable bitrate in bps |\n\n```bash\nexport MIN_CUSTOM_VIDEO_BITRATE_BPS=5000\nexport MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000\n```\n\n## Supported Frame Rates\n\n`SUPPORTED_FRAME_RATES` defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by `|`.\n\n```bash\nexport SUPPORTED_FRAME_RATES='30|15|7|1'\n```\n\n{% aside type=\"tip\" %}\nLowering `DEFAULT_RESOLUTION` or restricting `SUPPORTED_FRAME_RATES` can significantly reduce bandwidth usage — useful when you know participants may be on slower connections.\n{% /aside %}\n\nYou have configured the display defaults. In the next step, you will apply all your changes and verify them.","src/content/docs/03-display-defaults.mdoc","4d0ef6db3474a83b","04-apply-changes",{"id":54,"data":56,"body":61,"filePath":62,"digest":63,"deferredRender":15},{"title":57,"editUrl":15,"head":58,"template":17,"sidebar":59,"pagefind":15,"draft":19},"Apply Your Changes",[],{"hidden":19,"attrs":60},{},"With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.\n\n## Save and Restart\n\nAfter editing `vcrBuild.env.sh`, save the file and restart the development server:\n\n```sh\nyarn dev\n```\n\nThis reloads both the backend server (port **3345**) and the frontend Vite dev server (port **5173**) with the updated configuration.\n\n{% aside type=\"caution\" %}\nSimply saving the file is not enough — the dev server must be restarted to pick up the new environment variable values.\n{% /aside %}\n\n## Verify in the Browser\n\nOpen [http://localhost:5173](http://localhost:5173) and check that your changes are reflected:\n\n{% steps %}\n\n1. Navigate to the **waiting room** — confirm device selectors appear or are hidden based on `WAITING_ROOM_ALLOW_DEVICE_SELECTION`.\n\n2. Join a meeting room — confirm the initial layout matches `DEFAULT_LAYOUT_MODE`.\n\n3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.\n\n4. Open **Advanced Settings** — confirm the resolution options and bitrate range reflect your `DEFAULT_RESOLUTION` and bitrate values.\n\n{% /steps %}\n\n## Flags That Require a Rejoin\n\nSome settings only take effect when a participant **rejoins** the room (not on live reload):\n\n- `DEFAULT_LAYOUT_MODE`\n- `ALLOW_AUDIO_ON_JOIN`\n- `ALLOW_VIDEO_ON_JOIN`\n\nIf you changed any of these, leave the room and re-enter to see the updated behaviour.\n\n## Iterating Quickly\n\nA typical configure-test cycle:\n\n{% steps %}\n\n1. Edit `vcrBuild.env.sh`.\n\n2. Stop the server with **Ctrl+C**.\n\n3. Run `yarn dev` to restart.\n\n4. Open the app and verify.\n\n{% /steps %}\n\nYour configuration is live. Head to the final step for further resources.","src/content/docs/04-apply-changes.mdoc","d2386412057c2165","05-whats-next",{"id":64,"data":66,"body":72,"filePath":73,"digest":74,"deferredRender":15},{"title":67,"description":68,"editUrl":15,"head":69,"template":17,"sidebar":70,"pagefind":15,"draft":19},"What's Next","Further resources for configuring and extending the Vonage Video React App.",[],{"hidden":19,"attrs":71},{},"Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using `vcrBuild.env.sh`. The app is now tailored to your specific use case.\n\n## What You Accomplished\n\n- Understood how all frontend configuration flows through `vcrBuild.env.sh`\n- Enabled and disabled feature flags for media controls, in-call tools, and room behaviour\n- Configured display defaults including resolution, layout mode, bitrate, and frame rates\n- Applied your changes by restarting the dev server and verified them in the browser\n\n## Resources\n\n- [Vonage Developer Portal](https://developer.vonage.com) — Documentation, guides, and API references for all Vonage products.\n- [Vonage Video API Documentation](https://developer.vonage.com/en/video/overview) — In-depth guides for the Video API.\n- [vonage-video-react-app on GitHub](https://github.com/Vonage/vonage-video-react-app) — Source code, full README with all configuration options, and contribution guidelines.\n\n{% aside type=\"tip\" %}\nThe full list of frontend environment variables — including defaults, accepted values, and descriptions — is always available in the `vcrBuild.env.sh` file itself and in the project README.\n{% /aside %}","src/content/docs/05-whats-next.mdoc","7b6c777a7dd76a59","index",{"id":75,"data":77,"body":87,"filePath":88,"digest":89,"deferredRender":15},{"title":78,"description":79,"editUrl":15,"head":80,"template":81,"hero":82,"sidebar":85,"pagefind":15,"draft":19},"Vonage Video React App","Learn how to control the features and display settings of the Vonage Video React App using a single configuration file.",[],"splash",{"tagline":83,"actions":84},"Feature Config",[],{"hidden":19,"attrs":86},{},"The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: **`vcrBuild.env.sh`**.\n\nIn this tutorial you will:\n\n- Understand how frontend configuration works in the app\n- Enable and disable feature flags to tailor the experience for your use case\n- Adjust display defaults such as video resolution and room layout\n- Apply your changes and verify them in the running app\n\n---\n\n## Tutorial structure\n\n| # | Page | What you'll do |\n| --- | --------------------------- | ------------------------------------------------------------- |\n| 01 | Backend credentials | Create `backend/.env` with your Vonage App ID and private key |\n| 02 | Configuration file overview | Explore `vcrBuild.env.sh` and understand its structure |\n| 03 | Feature flags | Enable and disable individual features |\n| 04 | Display settings | Adjust video resolution and default room layout |\n| 05 | Apply and verify | Rebuild the app and confirm your changes in the browser |","src/content/docs/index.mdx","bc349f319ac949f8"] \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/.astro/settings.json b/tutorials/vonage_video_react_app-feature-config/.astro/settings.json index 113877f8..04e40263 100644 --- a/tutorials/vonage_video_react_app-feature-config/.astro/settings.json +++ b/tutorials/vonage_video_react_app-feature-config/.astro/settings.json @@ -1,5 +1,5 @@ { "_variables": { - "lastUpdateCheck": 1782159370968 + "lastUpdateCheck": 1782297484374 } } \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.clinerules b/tutorials/vonage_video_react_app-feature-config/project/.clinerules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.clinerules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.cursorrules b/tutorials/vonage_video_react_app-feature-config/project/.cursorrules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.cursorrules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md b/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md index f622d15a..d2522d97 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/copilot-instructions.md @@ -46,6 +46,7 @@ TypeScript version: `^5.8.3` - `libs/ui` for visual components - `libs/core` if it is faceless (non-visual logic). - `libs/common` for helpers, utilities, and hooks that are agnostic of the project. +- **Rule:** If the code is **backend-oriented** and represents **agnostic Vonage Video API orchestration**, it must be placed in `libs/api`. - **Rule:** Vera-specific business logic (roles, permissions, product policy/decisions) must stay in the app layer (`frontend`/`backend`). - **Rule:** This is **especially enforced** for video-related components such as publishers, subscribers, sessions, `videoView`s, etc. - **Rule:** Helpers, utilities, and hooks that are agnostic of the project must be placed in `libs/common`. @@ -54,23 +55,10 @@ TypeScript version: `^5.8.3` - **Rule:** Do not add new state management libraries. Use only existing tooling. - **Rule:** Components must be kept small, focused, and composable. -## Import rules +## Testing Guidelines -- **Rule:** Always prefer specific imports over deep namespace imports. - -**Violation:** - -```tsx -// Bad -import { isNil } from 'lodash'; -``` - -**Correct:** - -```tsx -// Good -import isNil from 'lodash/isNil'; -``` +- **Rule:** Avoid overtesting. Simple helpers should be covered by only a couple of high-value use cases. +- **Rule:** Prefer tests that validate real functionality and behavior over redundant input permutations. --- @@ -151,13 +139,13 @@ if (isUserEligible(user)) { if (isNil(data)) return; ``` -- **Rule:** Acronyms in names are banned across the codebase, except `req` and `res` when working with Express `Request` and `Response`. +- **Rule:** Abbreviated or shortened names are banned across the codebase, except `req` and `res` when working with Express `Request` and `Response`. - **Rule:** Use fully descriptive names, even if they are longer. Minification handles bundle size. **Violation:** ```tsx -// Bad +// Bad: abbreviating "User Details" to "UsrDtls" function fetchUsrDtls() { // ... } @@ -166,7 +154,7 @@ function fetchUsrDtls() { **Correct:** ```tsx -// Good +// Good: fully spelled out words function fetchUserDetails() { // ... } @@ -175,14 +163,14 @@ function fetchUserDetails() { **Violation:** ```tsx -// Bad +// Bad: abbreviating "VideoClient" to "vc" const vc = new VideoClient(); ``` **Correct:** ```tsx -// Good +// Good: fully spelled out variable name const videoClient = new VonageVideoClient(); ``` @@ -687,13 +675,11 @@ export const SurveyForm = () => { # Async Logic & Suspense Usage Rules -- **Rule:** `setState` + `useEffect` patterns must not be used for async operations. +- **Rule:** `setState` + `useEffect` patterns should be rather used and strongly justified. Prefer linear non reactive code. - **Rule:** Native `React.Suspense` and `React.use` must not be used directly. - Only `Suspense$` and `use$`/suspense-specific hooks provided by Vera are allowed. -- **Rule:** Asynchronous operations must be handled through: - - `Suspense$` component - - `use$`, `useSuspenseMemo`, or compatible Vera hooks -- **Rule:** `use$` must only be used inside a `Suspense$` boundary; by design it will throw an explicit error otherwise. + Only `SuspenseBoundary` and `use$` which are boundary aware. +- **Rule:** Asynchronous operations must be handle gracefully, consider using skeletons or placeholders instead of spinners or loading indicators. Take also advantage of tools like `Suspense` and `useSuspenseMemo`. +- **Rule:** `use$` must only be used inside a `SuspenseBoundary` boundary; by design it will throw an explicit error otherwise. **Violation (async with state/effect):** @@ -812,7 +798,7 @@ const ParentComponent = () => { - **Rule:** Context state should either: - be stable enough that you do not need fine-grained granularity, or - be granular enough that consumers can subscribe to specific portions of the state. -- **Rule:** Context APIs must not be reactive. They should not re-render consumers unnecessarily. +- **Rule:** Context APIs must not be reactive highly reactive. They should not re-render consumers unnecessarily. **Violation (manual React context for simple use case):** @@ -1586,7 +1572,7 @@ const useComplexLogic = () => { ``` - **Rule:** Reactive effect architectures are banned. - - Effects must be used only for component lifecycle, not as a state reaction graph for side effects like fetching. + - Effects must be preferred for component lifecycle, not as a state reaction graph for side effects like fetching. **Violation (reactive effect fetching):** diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md b/tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md new file mode 100644 index 00000000..ab37b1a7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/instructions/test-files.instructions.md @@ -0,0 +1,149 @@ +--- +applyTo: "**/*.{spec,test}.{ts,tsx}" +--- + +# Test Authoring Instructions + +These instructions apply to all test files across the codebase (unit, integration, backend, libs). + +## Testing philosophy + +- Do not overtest. +- Small helpers/components with one or two relevant behaviors should usually have one condensed, high-value test that validates the behavior end-to-end. +- Prefer business logic tests with clear input and expected output. +- Do not add snapshot tests. Screenshot-based assertions in integration tests (Playwright `toHaveScreenshot`) are the only allowed exception. +- After writing a test, evaluate quality: + - Does it validate real functionality? + - Or is it mostly validating test tooling, mocks, or framework internals? +- Avoid tests that only check a mocked value was returned because it was mocked. + +## What to mock + +| Mock | Do not mock | +|------|-------------| +| External SDKs (e.g. `@vonage/client-sdk-video`) | Application contexts | +| Browser APIs (e.g. `navigator.mediaDevices`) | Custom hooks | +| | Components | + +## Mocking rules + +- Do not overmock. +- Prefer spies over full module mocking whenever possible. +- Avoid mocking our own logic when the scenario can be prepared using real parameters, real state, or real providers. +- Keep mocking minimal and focused on third-party dependencies or APIs not available in the test environment. +- For typed mocked functions, always use `vi.mocked(...)`. +- `as Mocked<...>` type-casting in test files is banned. + +## Provider/context testing rules + +- Do not mock context for our own providers when #sym:makeTestProvider can be used. +- Compose only the providers strictly necessary for the scenario. Every extra provider increases test setup cost and coupling. +- Initialize provider state using provider options to prepare the use case. +- Use returned public contexts to inspect values and interact with exposed actions. + +When a component requires providers, compose only what is needed: + +```tsx +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render( + ui: ReactElement, + { userContext, sessionContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session], + { userContext, sessionContext } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} +``` + +For hooks, the same principle applies: + +```tsx +type RenderOptions = { + userContext?: ProviderOptions['UserContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { userContext }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider([providers.user], { + userContext, + }); + + return { + ...context, + ...renderHookBase(render, { wrapper }), + }; +} +``` + +## Async test rules + +- Do not use `setTimeout` or arbitrary `waitForTimeout` calls to make async tests pass. They slow the suite and hide real timing issues. +- Use `waitFor` from `@testing-library/react` to wait for observable state changes instead only when necessary. +- Every async test must declare an explicit assertion count with `expect.assertions(n)`. +- Place `expect.assertions(n)` at the start of the async test body so tests fail if execution exits before assertions run. + +## Shared test helpers + +Before adding custom setup, check and reuse existing helpers in: + +- `libs/common/test` +- `libs/common/testNode` +- `libs/common/testBrowser` + +Useful existing helpers include: + +- `libs/common/test/setup.ts` + - Already clears mocks, restores spies, and unstubs globals after each test. Already included in the global test setup — do not duplicate. +- `libs/common/testNode/helpers/waitForEvent.ts` + +### Banned boilerplate — already provided globally + +Do not call any of the following in individual test files. They are already invoked for every test run via the global setup files (`frontend/src/test/setup.ts`, `libs/*/test/setup.ts`): + +```ts +// Global cleanup — already runs after each test via mandatoryAfterEachCleanup() +cleanup(); +vi.clearAllMocks(); +vi.restoreAllMocks(); +vi.unstubAllGlobals(); +cancelablePromiseTracker.mockClear(); + +// Browser environment setup — already runs before each suite via setupFrontendTestEnvironment() +setupResizeObserverMock(); +setupScrollIntoViewMock(); +setupHtmlMediaElementGuards(); +setupHtmlCanvasElementGuards(); +setupCancelablePromiseHook(); +``` + +Duplicating these calls in test files adds noise and can cause double-invocation side effects. + - Useful for event-driven async tests. +- `libs/common/testBrowser/renderAsyncComponent.ts` + - Use for components that resolve async behavior with Suspense boundaries. +- `libs/common/testBrowser/renderAsyncHook.ts` + - Use for hooks that need async/Suspense-aware rendering. +- `libs/common/testBrowser/makeGenericProviderWrapper.tsx` + - Generic provider/context wrapper utility for reusable context testing. +- `libs/common/testBrowser/fixtures/setupWindowNavigatorMock` + - Browser navigator setup helpers for web media-related tests. + +Do not duplicate setup that these helpers already provide. + +## Test data setup + +- Avoid high-level shared variables when possible. +- Prefer creating scenario-specific inputs inside each test. +- Prefer fewer, more robust tests instead of many tiny tests that increase suite runtime with low value. +- Keep tests explicit and linear, with clear Arrange/Act/Assert intent. diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml index 884b75c1..31a759ab 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/auto-update-dependencies.yml @@ -26,7 +26,7 @@ jobs: with: node-version: 22 - name: Install dependencies - run: yarn install + run: yarn install --ignore-scripts --frozen-lockfile - name: Run dependency update script run: node scripts/generateDependenciesList.js - name: Auto-commit updated dependencies file diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml index 02289f22..1f6628ed 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/lint.yml @@ -37,7 +37,7 @@ jobs: cache: yarn - name: Install Dependencies - run: yarn + run: yarn install --ignore-scripts --frozen-lockfile - name: Run ${{ matrix.check.name }} run: ${{ matrix.check.command }} @@ -76,7 +76,7 @@ jobs: cache: yarn - name: Install Dependencies - run: yarn + run: yarn install --ignore-scripts --frozen-lockfile - name: Run license check run: | diff --git a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml index 9659216f..bbe05069 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/.github/workflows/run-tests.yml @@ -12,6 +12,7 @@ env: OT_API_SECRET: ${{secrets.API_SECRET}} VONAGE_APP_ID: ${{secrets.VONAGE_APP_ID}} VONAGE_PRIVATE_KEY: ${{secrets.VONAGE_PRIVATE_KEY}} + SESSION_KEY_SECRET: ${{secrets.SESSION_KEY_SECRET}} jobs: # ---------------------------------------------------- @@ -40,7 +41,7 @@ jobs: cache: yarn - name: Install Dependencies - run: yarn --ignore-scripts + run: yarn install --ignore-scripts --frozen-lockfile - name: Run ${{ matrix.project }} unit tests run: NX_DAEMON=false yarn nx test ${{ matrix.project }} --configuration=coverage @@ -99,7 +100,7 @@ jobs: - name: Install Dependencies run: | node -v - yarn --ignore-scripts + yarn install --ignore-scripts --frozen-lockfile - name: Cache Playwright browsers uses: actions/cache@v4 @@ -150,7 +151,7 @@ jobs: - name: Install Dependencies run: | node -v - yarn --ignore-scripts + yarn install --ignore-scripts --frozen-lockfile - name: Download all coverage artifacts uses: actions/download-artifact@v4 diff --git a/tutorials/vonage_video_react_app-feature-config/project/.gitignore b/tutorials/vonage_video_react_app-feature-config/project/.gitignore index 6b5c288e..6aa07aac 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.gitignore +++ b/tutorials/vonage_video_react_app-feature-config/project/.gitignore @@ -63,3 +63,4 @@ vitest.config.*.timestamp* vcr-dev.yml /frontend/distRoom +room.zip diff --git a/tutorials/vonage_video_react_app-feature-config/project/.npmrc b/tutorials/vonage_video_react_app-feature-config/project/.npmrc new file mode 100644 index 00000000..521a9f7c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true diff --git a/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml b/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml index 2d3b03b0..aedf61b2 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml +++ b/tutorials/vonage_video_react_app-feature-config/project/.vonage/catalog-info.yaml @@ -7,6 +7,10 @@ metadata: description: Vonage Video API JS React reference application annotations: vonage.com/jira-id: VPF # video general projects + vonage.com/maintainers: | + - Hossein Movahed @Hossein-Movahed + - Johnny Esteban Quesada @johnny-quesada-developer + - Oscar Fava @OscarFava spec: type: library owner: group:orgdata/vdk # helm "owner" orgdata squad id or general orgdata/vid @@ -19,6 +23,10 @@ metadata: description: Video React Ref App Component annotations: github.com/project-slug: Vonage/vonage-video-react-app # GH repo + vonage.com/maintainers: | + - Hossein Movahed @Hossein-Movahed + - Johnny Esteban Quesada @johnny-quesada-developer + - Oscar Fava @OscarFava spec: type: library owner: group:orgdata/vdk diff --git a/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json b/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json index b277d51d..2018509b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json +++ b/tutorials/vonage_video_react_app-feature-config/project/.vscode/extensions.json @@ -7,7 +7,6 @@ "ms-playwright.playwright", "esbenp.prettier-vscode", "bradlc.vscode-tailwindcss", - "github.copilot-chat", - "github.copilot" + "github.copilot-chat" ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json b/tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json new file mode 100644 index 00000000..cefbee98 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Attach to Backend", + "port": 9229, + "restart": true, + "skipFiles": ["/**", "**/node_modules/**"] + } + ] +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/.windsurfrules b/tutorials/vonage_video_react_app-feature-config/project/.windsurfrules new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/.windsurfrules @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/AGENTS.md b/tutorials/vonage_video_react_app-feature-config/project/AGENTS.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/AGENTS.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md b/tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/CLAUDE.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/CODEX.md b/tutorials/vonage_video_react_app-feature-config/project/CODEX.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/CODEX.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/GEMINI.md b/tutorials/vonage_video_react_app-feature-config/project/GEMINI.md new file mode 120000 index 00000000..02dd1341 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/GEMINI.md @@ -0,0 +1 @@ +.github/copilot-instructions.md \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md b/tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md new file mode 100644 index 00000000..fe1ec4ed --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/MAINTAINERS.md @@ -0,0 +1,44 @@ +# Maintainers + +This repository is actively maintained by Vonage engineers. + +## Current Maintainers + +| Role | Name | +|---|---| +| Full Stack | Hossein Movahed ([@Hossein-Movahed](https://github.com/Hossein-Movahed)) | +| Full Stack | Johnny Esteban Quesada ([@johnny-quesada-developer](https://github.com/johnny-quesada-developer)) | +| Full Stack | Oscar Fava ([@OscarFava](https://github.com/OscarFava)) | + +## Responsibilities + +Maintainers are responsible for: + +- Reviewing and approving pull requests +- Maintaining code quality, consistency, and CI stability +- Managing releases and dependency updates +- Triaging issues and discussions +- Ensuring contributions align with the goals and long-term direction of the project +- Evaluating architectural, performance, operational, and product impact of proposed changes + +## Pull Request Expectations + +- At least one maintainer approval is required before merge +- CI must pass before merge +- Breaking changes should be discussed before implementation +- Pull requests should align with the project's scope, maintainability standards, and long-term goals +- Large features should be submitted in isolated pull requests when possible +- Maintainers may request scope reduction or architectural changes to keep the project maintainable and lightweight + +## Project Direction + +Maintainers are responsible not only for reviewing code correctness, but also for evaluating the broader impact of changes on: + +- Bundle size and application performance +- Mobile and low-bandwidth user experience +- Dependency footprint and operational complexity +- Distribution and embeddability constraints +- Developer experience and maintainability +- Product consistency and UI/UX direction + +Contributions may be declined or requested to be re-scoped if they introduce significant architectural, performance, or product tradeoffs that do not align with the current direction of the project. \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/README.md b/tutorials/vonage_video_react_app-feature-config/project/README.md index 5cc61171..316d867f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/README.md +++ b/tutorials/vonage_video_react_app-feature-config/project/README.md @@ -18,6 +18,8 @@ If you're new to Vonage, you can [sign up for a Vonage API account](https://dash - [Requirements](#requirements) - [Running Locally](#running-locally) - [Storybook](#storybook) +- [UI Customization](#ui-customization) +- [Environment Configuration](#environment-configuration) - [Testing on Multiple Devices](#testing-on-multiple-devices) - [Deployment to Vonage Cloud Runtime](#deployment-to-vonage-cloud-runtime) - [Testing](#testing) @@ -32,6 +34,7 @@ If you're new to Vonage, you can [sign up for a Vonage API account](https://dash - [File names](#file-names) - [Documentation Generation](#documentation-generation) - [Code of Conduct](#code-of-conduct) +- [Maintainers](#maintainers) - [Getting Involved](#getting-involved) - [Known Issues](#known-issues) - [Report Issues](#report-issues) @@ -81,11 +84,6 @@ This application provides features for common conferencing use cases, such as: Screenshot of video effects --
- - Configurable features: adapt the app to your specific use cases and roles. - Configuration is handled through environment variables defined in vcrBuild.env.sh. Edit that file to enable or disable features such as camera control, microphone control, background effects, screen sharing, chat, emojis, archiving, captions, device selection, default resolution, layout mode, and more. Some settings (for example: "default layout" or "audio on join") require rejoining the room to take effect. - -
Composed archiving capabilities to record your meetings. Screenshot of archiving dialog box @@ -182,10 +180,10 @@ These reference apps share the same backend infrastructure and demonstrate consi - **Environment Variables** - In the root project directory, create the environment files by running: + In the root project directory, create the backend environment file by running: ``` bash - cp backend/.env.example backend/.env && cp frontend/.env.example frontend/.env + cp backend/.env.example backend/.env ``` Then, open **backend/.env** and fill in the required configuration: @@ -193,6 +191,8 @@ These reference apps share the same backend infrastructure and demonstrate consi - **VONAGE_APP_ID** – This is the ID of your Vonage application. You can find it on the [Applications page](https://dashboard.vonage.com/applications). - **VONAGE_PRIVATE_KEY** – If you've already generated a private key, use that. Otherwise, use the key you downloaded when creating the app. + Frontend feature flags and display settings are configured in [`vcrBuild.env.sh`](vcrBuild.env.sh). The defaults work out of the box — edit that file only when you need to customise behaviour. See [Environment Configuration](#environment-configuration) for the full list of available options. +
- **Start in Development Mode** @@ -225,6 +225,166 @@ yarn storybook:ui This will start the Storybook dev server at [http://localhost:6007](http://localhost:6007). +## UI Customization + +The app theme is configured through the root `designTokens.json` file. + +### Customize your theme + +1. Edit `designTokens.json` at the project root with your palette/theme values. +2. Sync theme artifacts: + +```bash +yarn sync:theme-tokens +``` + +This command always regenerates `designTokens.example.json`, syncs `libs/ui/src/theme/helpers/designTokens/designTokens.json` from root `designTokens.json` when present, creates root `designTokens.json` from defaults when missing, rebuilds the Tailwind plugin, and formats the generated plugin file. + +--- + +## Environment Configuration + +The app has two parts — a **backend** server and a **frontend** UI. The backend is configured through `backend/.env`. Frontend settings are configured through [`vcrBuild.env.sh`](vcrBuild.env.sh), which is the single place for all frontend configuration. + +Create the backend configuration file by running: + +```bash +cp backend/.env.example backend/.env +``` + +Then open it in a text editor and fill in the values described below. + +--- + +### Backend (`backend/.env`) + +Open `backend/.env` and configure the following variables. + +#### Video service provider + +Exactly one provider block must be configured. + +**Vonage Video API (default)** + +| Variable | Required | Description | +|----------|----------|-------------| +| `VIDEO_SERVICE_PROVIDER` | ✅ | Must be `vonage` | +| `VONAGE_APP_ID` | ✅ | Your Vonage application ID from the [dashboard](https://dashboard.vonage.com/applications) | +| `VONAGE_PRIVATE_KEY` | ✅ | Contents of the private key file downloaded when creating the application | + +```ini +VIDEO_SERVICE_PROVIDER='vonage' +VONAGE_APP_ID='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' +VONAGE_PRIVATE_KEY='-----BEGIN PRIVATE KEY----- +... +-----END PRIVATE KEY-----' +``` + +**OpenTok (TokBox) SDK** + +| Variable | Required | Description | +|----------|----------|-------------| +| `VIDEO_SERVICE_PROVIDER` | ✅ | Must be `opentok` | +| `OT_API_KEY` | ✅ | Your OpenTok API key | +| `OT_API_SECRET` | ✅ | Your OpenTok API secret | + +```ini +VIDEO_SERVICE_PROVIDER='opentok' +OT_API_KEY='your-api-key' +OT_API_SECRET='your-api-secret' +``` + +#### Vonage Cloud Runtime (VCR) + +| Variable | Required | Description | +|----------|----------|-------------| +| `VCR_PORT` | ⚠️ VCR only | Port exposed by VCR (typically `3345`). **Do not set this locally** — its presence switches the app to VCR storage. | + +#### Jira feedback integration (optional) + +Enables the in-call issue reporting tool to file tickets directly into Jira. + +| Variable | Description | +|----------|-------------| +| `JIRA_URL` | Base URL of your Jira instance | +| `JIRA_API_URL` | Jira REST API base URL | +| `JIRA_TOKEN` | API token for authentication | +| `JIRA_PROJECT_KEY` | Target project key | +| `JIRA_COMPONENT_ID` | Default component ID for filed issues | +| `JIRA_iOS_COMPONENT_ID` | Component ID for iOS issues | +| `JIRA_ANDROID_COMPONENT_ID` | Component ID for Android issues | +| `JIRA_EPIC_LINK` | Epic link field value | +| `JIRA_EPIC_URL` | URL to the target epic | + +--- + +### Frontend + +Frontend settings control which features are visible, what language the app uses, and how the video room behaves by default. **All frontend configuration lives in a single file: [`vcrBuild.env.sh`](vcrBuild.env.sh).** + +This file is loaded automatically whenever the app is built or deployed. To change a setting, open [`vcrBuild.env.sh`](vcrBuild.env.sh), update the relevant `export` line, and restart or rebuild: + +```bash +# vcrBuild.env.sh +export ALLOW_CHAT=false +export DEFAULT_LAYOUT_MODE='grid' +export I18N_SUPPORTED_LANGUAGES='en|es' +``` + +> **Note:** After editing [`vcrBuild.env.sh`](vcrBuild.env.sh) you need to restart the app (`yarn dev`) or trigger a new build for the changes to take effect. + +#### Network + +| Variable | Default | Description | +|----------|---------|-------------| +| `API_URL` | `http://localhost:3345` (local) / `window.location.origin` (production) | URL of the backend API server | +| `TUNNEL_DOMAIN` | — | ngrok (or similar) domain used when testing across devices. See [Testing on Multiple Devices](#testing-on-multiple-devices) | + +#### Internationalisation + +| Variable | Default | Accepted values | Description | +|----------|---------|-----------------|-------------| +| `I18N_FALLBACK_LANGUAGE` | `en` | `en` \| `en-US` \| `es` \| `es-MX` \| `it` | Language used when the user's locale is not supported | +| `I18N_SUPPORTED_LANGUAGES` | `en` | Pipe-separated list, e.g. `en\|es\|it` | Languages offered in the UI | + +#### Feature flags + +All feature flags are **boolean** (`true` / `false`). + +| Variable | Default | Description | +|----------|---------|-------------| +| `ALLOW_BACKGROUND_EFFECTS` | `true` | Enable virtual background and blur effects | +| `ALLOW_CAMERA_CONTROL` | `true` | Show the camera on/off toggle | +| `ALLOW_VIDEO_ON_JOIN` | `true` | Start with camera enabled when joining | +| `ALLOW_ADVANCED_NOISE_SUPPRESSION` | `true` | Enable the advanced noise-suppression toggle | +| `ALLOW_AUDIO_ON_JOIN` | `true` | Start with microphone enabled when joining | +| `ALLOW_MICROPHONE_CONTROL` | `true` | Show the microphone on/off toggle | +| `WAITING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors in the waiting room | +| `MEETING_ROOM_ALLOW_DEVICE_SELECTION` | `true` | Show device selectors inside the meeting room | +| `ALLOW_ARCHIVING` | `true` | Enable meeting recording (archiving) | +| `ALLOW_CAPTIONS` | `true` | Enable live captions | +| `ALLOW_CHAT` | `true` | Enable the in-call group chat | +| `ALLOW_EMOJIS` | `true` | Enable emoji reactions | +| `ALLOW_SCREEN_SHARE` | `true` | Enable screen sharing | +| `SHOW_PARTICIPANT_LIST` | `true` | Show the participant list panel | +| `ENABLE_REPORT_ISSUE` | `false` | Show the in-call issue reporting tool | +| `BYPASS_WAITING_ROOM` | `false` | Skip the waiting room and join directly | +| `AVOID_FETCHING_APP_CONFIG` | `true` | Skip fetching remote app configuration on startup | + +#### Display defaults + +| Variable | Default | Accepted values | Description | +|----------|---------|-----------------|-------------| +| `DEFAULT_RESOLUTION` | `1280x720` | `1920x1080` \| `1280x960` \| `1280x720` \| `640x480` \| `640x360` \| `320x240` \| `320x180` | Default outgoing video resolution | +| `DEFAULT_LAYOUT_MODE` | `active-speaker` | `active-speaker` \| `grid` | Default in-room layout when a participant joins | +| `MIN_CUSTOM_VIDEO_BITRATE_BPS` | `5000` | Positive integer (bps) | Minimum selectable custom video bitrate in the Advanced Settings dialog | +| `MAX_CUSTOM_VIDEO_BITRATE_BPS` | `10000000` | Positive integer (bps) | Maximum selectable custom video bitrate in the Advanced Settings dialog | +| `SUPPORTED_FRAME_RATES` | `30\|15\|7\|1` | `\|`-separated positive integers (fps) | Frame rate options shown in the Advanced Settings video tab | + +> **Note:** `DEFAULT_LAYOUT_MODE` and `ALLOW_AUDIO_ON_JOIN` / `ALLOW_VIDEO_ON_JOIN` require the participant to **rejoin the room** to take effect after being changed. + +--- + ## Testing on Multiple Devices To test the video API across multiple devices on your local network, you can use **ngrok** to expose your frontend and backend publicly. @@ -277,16 +437,14 @@ To test the video API across multiple devices on your local network, you can use
-5. Copy the domains from both outputs and update your **frontend/.env** file: +5. Copy the domains from both outputs and update [`vcrBuild.env.sh`](vcrBuild.env.sh): - ``` ini - # Frontend tunnel domain - TUNNEL_DOMAIN=your-frontend-domain.ngrok.io - # Backend tunnel domain - API_URL=https://your-backend-domain.ngrok.io + ``` bash + export TUNNEL_DOMAIN=your-frontend-domain.ngrok.io + export API_URL=https://your-backend-domain.ngrok.io ``` - **Note:** ngrok assigns temporary domains. You'll need to update your environment variables each time the domains change. + **Note:** ngrok assigns temporary domains. You'll need to update these values each time the domains change.
@@ -390,7 +548,7 @@ yarn test:backend ### Frontend Suite We have frontend tests using [vitest](https://vitest.dev/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro). We recommend using the [vitest VSCode integration]( https://marketplace.visualstudio.com/items?itemName=vitest.explorer) to run tests. -For guidance on writing frontend unit tests, see the [Frontend Unit Testing Guide](./docs/TESTING.md). +For guidance on writing unit tests, see the [Test Instructions](./.github/instructions/test-files.instructions.md). Alternatively you can run the tests in the terminal: - To run frontend tests once: @@ -442,6 +600,12 @@ yarn nx run frontend:docs Please read our [Code of Conduct](CODE_OF_CONDUCT.md). +## Maintainers + +This repository is actively maintained by the Vonage Video team. + +For maintainer responsibilities, review expectations, and project ownership guidelines, see [MAINTAINERS.md](./MAINTAINERS.md). + ## Getting Involved If you wish to contribute to this project, read how in [Contributing](./docs/CONTRIBUTING.md). diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example b/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example index 9ca6eb49..cf5a9694 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/.env.example @@ -24,6 +24,9 @@ VONAGE_PRIVATE_KEY='' # OT_API_KEY=api-key # OT_API_SECRET=api-secret +# Secret used to sign and verify session key JWTs. +SESSION_KEY_SECRET='' + # If deploying to Vonage Cloud Runtime (https://developer.vonage.com/en/vonage-cloud-runtime/overview) # enter your port here; the default is 3345. # DO NOT SET THIS VARIABLE IN LOCAL ENV: @@ -36,3 +39,6 @@ VONAGE_PRIVATE_KEY='' # JIRA_TOKEN=jira-token # JIRA_PROJECT_KEY=jira-project-key # JIRA_COMPONENT_ID=jira-component-id +# JIRA_EPIC_URL='jira-epic-url' +# JIRA_EPIC_LINK='jira-epic-link' +# JIRA_SEVERITY_ID='jira-severity-id' diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts deleted file mode 100644 index 12fdce79..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/errors/ValidationError.ts +++ /dev/null @@ -1,35 +0,0 @@ -import StatusCodeEnum from 'status-code-enum'; -import ApplicationError from '@common/errors/ApplicationError'; - -export type ValidationIssue = { - path: (string | number)[]; - message: string; -}; - -export class ValidationError extends ApplicationError { - public readonly code = 'VALIDATION_ERROR'; - public readonly issues: ValidationIssue[]; - - constructor(issues: ValidationIssue[], message = 'Invalid request') { - super({ - src: new Error(message), - fallbackConfig: { - fallbackMessage: message, - statusCode: StatusCodeEnum.ClientErrorBadRequest, - severity: 'error', - }, - }); - this.name = 'ValidationError'; - this.issues = issues; - } - - public override exportSafely = () => { - const base = this.exportSafelyBase(); - return { - ...base, - code: 'VALIDATION_ERROR', - issues: this.issues, - statusCode: base.statusCode ?? this.statusCode ?? 400, - }; - }; -} diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts index 394c7479..1def333a 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/__mocks__/config.ts @@ -10,6 +10,7 @@ const mockOpentokConfig = () => { privateKey: 'test-private-key', provider: 'opentok', gollumUrl: 'https://example.com', + loggerVerbose: false, }; }), }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts index 6c072fe4..610a8ae1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/config.ts @@ -18,6 +18,9 @@ dotenv.config({ path: path.join(runtimeDir, '.env') }); const loadConfig = (): Config => { const provider = process.env.VIDEO_SERVICE_PROVIDER ?? ''; + const sessionKeySecret = process.env.SESSION_KEY_SECRET ?? ''; + + const loggerVerbose = process.env.LOGGER_VERBOSE === 'true'; const feedbackConfig: FeedbackConfig = { url: process.env.JIRA_URL, @@ -29,18 +32,30 @@ const loadConfig = (): Config => { androidComponentId: process.env.JIRA_ANDROID_COMPONENT_ID, epicLink: process.env.JIRA_EPIC_LINK, epicUrl: process.env.JIRA_EPIC_URL, + severityId: process.env.JIRA_SEVERITY_ID, gollumUrl: process.env.GOLLUM_BASE_URL, }; + if (provider === 'vonage') { const applicationId = process.env.VONAGE_APP_ID ?? ''; const privateKey = process.env.VONAGE_PRIVATE_KEY ?? ''; + const videoHost = process.env.VONAGE_VIDEO_HOST; if (!applicationId || !privateKey) { throw new Error('Missing config values for Vonage'); } - return { ...feedbackConfig, applicationId, privateKey, provider: 'vonage' }; + return { + ...feedbackConfig, + applicationId, + privateKey, + provider: 'vonage', + videoHost, + sessionKeySecret, + loggerVerbose, + }; } + if (provider === 'opentok') { const apiKey = process.env.OT_API_KEY ?? ''; const apiSecret = process.env.OT_API_SECRET ?? ''; @@ -49,8 +64,16 @@ const loadConfig = (): Config => { throw new Error('Missing config values for OpenTok'); } - return { ...feedbackConfig, apiKey, apiSecret, provider: 'opentok' }; + return { + ...feedbackConfig, + apiKey, + apiSecret, + provider: 'opentok', + sessionKeySecret, + loggerVerbose, + }; } + throw new Error(`Unknown video service provider: ${provider || 'undefined'}`); }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts new file mode 100644 index 00000000..7c5573fb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getOrCreateSessionKeyFromRoomName.ts @@ -0,0 +1,37 @@ +import { VideoClient } from '../routes/video'; +import getSessionStorageService from '../sessionStorageService'; +import blockCallsForArgs from './blockCallsForArgs'; +import { isValidRoomName } from '@common/assertions'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; + +const sessionService = getSessionStorageService(); + +const getOrCreateSessionKeyFromRoomName = async ({ + videoClient, + roomName, +}: { + roomName: string; + videoClient: VideoClient; +}) => { + return blockCallsForArgs(async () => { + const storedSessionKey = await sessionService.getSessionKeyByRoomName({ roomName }); + if (storedSessionKey) return storedSessionKey; + + if (!isValidRoomName(roomName)) { + throw makeBadRequestErrorHandler(`Invalid room name: ${roomName}.`)(null); + } + + const session = await videoClient.createSession({ roomName }); + const { sessionKey, sessionId } = session; + + await sessionService.setSession({ + roomName, + sessionKey, + sessionId, + }); + + return session.sessionKey; + })(roomName); +}; + +export default getOrCreateSessionKeyFromRoomName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts new file mode 100644 index 00000000..19ecf5d6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/getSessionKeyFromRoomName.ts @@ -0,0 +1,16 @@ +import { makeNotFoundErrorHandler } from '@api-lib/errors'; +import getSessionStorageService from '../sessionStorageService'; + +const sessionService = getSessionStorageService(); + +const getSessionKeyFromRoomName = async ({ roomName }: { roomName: string }): Promise => { + const storedSessionKey = await sessionService.getSessionKeyByRoomName({ roomName }); + + if (!storedSessionKey) { + throw makeNotFoundErrorHandler(`No session found for room name: ${roomName}`)(null); + } + + return storedSessionKey; +}; + +export default getSessionKeyFromRoomName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts new file mode 100644 index 00000000..6a3e710f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/helpers/index.ts @@ -0,0 +1,4 @@ +export { default as blockCallsForArgs } from './blockCallsForArgs'; +export { default as loadConfig } from './config'; +export { default as getOrCreateSessionKeyFromRoomName } from './getOrCreateSessionKeyFromRoomName'; +export { default as getSessionKeyFromRoomName } from './getSessionKeyFromRoomName'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js b/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js index a2e344b8..3dc769cb 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/jest.config.js @@ -4,16 +4,31 @@ export default { testEnvironment: 'node', clearMocks: true, moduleDirectories: ['ts', 'tsx', 'node_modules'], - moduleNameMapper: { - '^@common/(.*)$': '/../libs/common/src/$1', - '^@common$': '/../libs/common/src', - '^@api-lib/(.*)$': '/../libs/api/src/$1', - '^@api-lib$': '/../libs/api/src', - }, coverageProvider: 'v8', roots: ['/'], + modulePaths: [''], testMatch: ['**/tests/**/*.+(ts|tsx)', '**/?(*.)+(test).+(ts|tsx)'], setupFiles: ['/jest/documentPolyfill.js', '/jest/setEnvVars.js'], + coveragePathIgnorePatterns: ['/node_modules/', '/tests/', '/index\\.ts$'], + collectCoverageFrom: [ + '**/*.{ts,tsx}', + '!**/node_modules/**', + '!**/tests/**', + '!**/index.ts', + + // interfaces/types files, don't need to be tested + '!**/storage/sessionStorage.ts', + ], + moduleNameMapper: { + '^@api-lib$': '/../libs/api/src', + '^@api-lib/(.*)$': '/../libs/api/src/$1', + '^@common$': '/../libs/common/src', + '^@common/(.*)$': '/../libs/common/src/$1', + '^@common-test$': '/../libs/common/test', + '^@common-test/(.*)$': '/../libs/common/test/$1', + '^@node$': '/../libs/common/srcNode', + '^@node/(.*)$': '/../libs/common/srcNode/$1', + }, transform: { '^.+\\.tsx?$': [ 'ts-jest', diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js b/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js index 553e0077..eb30685f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/jest/setEnvVars.js @@ -10,4 +10,5 @@ process.env.VONAGE_APP_ID = 'vonageAppId'; process.env.VONAGE_PRIVATE_KEY = 'vonagePrivateKey'; process.env.OT_API_KEY = 'someOpenTokKey'; process.env.OT_API_SECRET = 'opentokAPISecret'; +process.env.SESSION_KEY_SECRET = 'test-session-key-secret-for-jwt-signing'; process.env.GOLLUM_BASE_URL = 'https://example.com'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts index 926eb2c4..2742e0d6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/errorHandler.ts @@ -2,7 +2,6 @@ import type { Request, Response, NextFunction } from 'express'; import StatusCodeEnum from 'status-code-enum'; import { isApplicationError } from '@common/errors/assertions'; import ApplicationServerError from '@api-lib/errors/ApplicationServerError'; -import { ValidationError } from '../errors/ValidationError'; const isDevelopment = process.env.NODE_ENV !== 'production'; @@ -12,8 +11,6 @@ function tryToLogApplicationError(error: unknown): void { console.error('[ApplicationServerError]', error.retrieveErrorLogDetails()); } else if (isApplicationError(error)) { console.error('[ApplicationError]', error.message); - } else if (error instanceof ValidationError) { - console.error('[ValidationError]', JSON.stringify({ issues: error.issues })); } else { console.error('[Error]', error); } @@ -50,23 +47,8 @@ export function errorHandler( }); // avoids exposing sensitive information while still providing useful error information - let safeError = applicationError.exportSafely(); - let statusCode = - applicationError.statusCode ?? (safeError as { statusCode?: number }).statusCode ?? 500; - - // ValidationError: use its exportSafely for proper statusCode and issues (avoids ESM/instanceof quirks) - if ( - typeof error === 'object' && - error !== null && - (error as { code?: string }).code === 'VALIDATION_ERROR' && - Array.isArray((error as { issues?: unknown }).issues) - ) { - const validationSafe = (error as ValidationError).exportSafely(); - safeError = validationSafe; - statusCode = validationSafe.statusCode ?? 400; - } - - const safeErrorWithStatus = { ...safeError, statusCode }; + const safeError = applicationError.exportSafely(); + const { statusCode } = safeError; const accepts = req.headers.accept ?? ''; @@ -76,16 +58,23 @@ export function errorHandler( req.headers?.['content-type']?.includes('application/json'); if (isJsonRequest) { - res.status(statusCode).json(safeErrorWithStatus); + res.status(safeError.statusCode).json(safeError); return; } const isHtmlRequest = accepts.includes('text/html'); if (isHtmlRequest) { - res.status(statusCode).render('index', { - error: safeErrorWithStatus, - }); + const safeMessage = safeError.message + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + + res + .status(statusCode) + .send(`

${statusCode}

${safeMessage}

`); return; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts new file mode 100644 index 00000000..60834149 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.test.ts @@ -0,0 +1,70 @@ +import type { Request, Response } from 'express'; +import { beforeEach, describe, expect, it, jest } from '@jest/globals'; + +const helmetHandlerMock = jest.fn(); + +const helmetMock = jest.fn(() => helmetHandlerMock) as jest.Mock & { + contentSecurityPolicy: { + getDefaultDirectives: jest.Mock; + }; +}; + +helmetMock.contentSecurityPolicy = { + getDefaultDirectives: jest.fn(() => ({ + 'default-src': ["'self'"], + })), +}; + +jest.unstable_mockModule('helmet', () => ({ + default: helmetMock, +})); + +describe('helmetMiddleware', () => { + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + process.env.NODE_ENV = 'production'; + }); + + it('should call the helmet handler', async () => { + const { default: helmetMiddleware } = await import('./helmetMiddleware'); + + const { req, res, next } = createRequestParameters(); + + helmetMiddleware(req, res, next); + + expect(helmetHandlerMock).toHaveBeenCalledWith(req, res, next); + }); + + it('should disable contentSecurityPolicy in development', async () => { + process.env.NODE_ENV = 'development'; + + const { default: helmetMiddleware } = await import('./helmetMiddleware'); + + const { req, res, next } = createRequestParameters(); + + helmetMiddleware(req, res, next); + + expect(helmetMock).toHaveBeenCalledWith( + expect.objectContaining({ + contentSecurityPolicy: false, + hsts: false, + }) + ); + + expect(helmetHandlerMock).toHaveBeenCalledWith(req, res, next); + }); +}); + +function createRequestParameters() { + const req = {} as Request; + + const res = { + setHeader: jest.fn(), + removeHeader: jest.fn(), + } as unknown as Response; + + const next = jest.fn(); + + return { req, res, next }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts new file mode 100644 index 00000000..58076791 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/backend/middleware/helmetMiddleware/helmetMiddleware.ts @@ -0,0 +1,82 @@ +import helmet from 'helmet'; +import { RequestHandler } from 'express'; + +const isDevelopment = process.env.NODE_ENV !== 'production'; + +const helmetHandler = helmet({ + contentSecurityPolicy: isDevelopment + ? false + : { + directives: { + // Allow scripts from self and Vonage/OpenTok static assets. + // Needed by the Vonage/OpenTok SDK to load MediaPipe transformer assets, + // including task-vision.js and worker-side scripts loaded through importScripts(...). + 'script-src': [ + "'self'", + // required for web assembly + "'unsafe-eval'", + 'blob:', + 'data:', + 'https://static.opentok.com', + ], + + // Allow connections to self and Vonage/OpenTok backend services. + // Needed for signaling, logging, REST calls, and WebSocket traffic. + 'connect-src': [ + "'self'", + 'https://*.opentok.com', + 'https://*.tokbox.com', + 'https://*.vonage.com', + 'wss://*.opentok.com', + 'wss://*.tokbox.com', + 'wss://*.vonage.com', + 'https://static.opentok.com', + ], + + // Allow images from self, inline/base64 images, blob URLs, and any HTTPS image source. + 'img-src': ["'self'", 'data:', 'blob:', 'https:'], + + // Allow workers created by the SDK/app, including blob-based and inline data: workers. + // Also allow Vonage/OpenTok static assets because MediaPipe may load worker-side + // scripts from static.opentok.com. + 'worker-src': ["'self'", 'blob:', 'data:', 'https://static.opentok.com'], + + // Allow media resources from self, blob URLs, and HTTPS sources. + 'media-src': ["'self'", 'blob:', 'https:'], + }, + }, + + // Disabled so this page can consume external resources without requiring CORP/COEP headers. + // This helps avoid breaking third-party fonts, CDNs, workers, and integrations. + crossOriginEmbedderPolicy: false, + + // Allow external sites to load resources served by this app. + // Needed when the VeraRoom web component/assets are embedded on third-party sites. + crossOriginResourcePolicy: { policy: 'cross-origin' }, + + // Prevent clickjacking by allowing this page to be framed only by the same origin. + // This does not affect usage as a custom element via + diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts index 4dc4fffb..80a74d7b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/example/vite.example.config.ts @@ -28,7 +28,7 @@ export default defineConfig((env) => { plugins: [renameOutputHtml()], build: { outDir: path.resolve(__dirname, '../../../distRoom'), - emptyOutDir: false, // Don't clear - vera-room.js should already be there + emptyOutDir: false, // Don't clear - room.js should already be there rollupOptions: { input: path.resolve(__dirname, './index.html'), }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts deleted file mode 100644 index 78325363..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useLanguageSync.ts +++ /dev/null @@ -1,29 +0,0 @@ -import i18n from '../../i18n'; -import bridge$ from '../stores/bridge'; -import { useMountEffect } from '@web/hooks'; - -/** - * Syncs the `language` bridge attribute to i18next whenever it changes. - * - * When a host page sets or updates the `language` attribute on , - * the value flows into bridge$ via attributeChangedCallback. This hook - * subscribes to that value and forwards it to i18n.changeLanguage so the - * entire UI re-renders in the requested locale. - * - * An empty string means "no override" — in that case we leave i18n alone - * so the browser-detected language (set during i18n.init) remains active. - */ -const useLanguageSync = () => { - const bridge = bridge$.use.api(); - - useMountEffect(() => { - return bridge.subscribe( - ({ language }) => language, - (language) => { - void i18n.changeLanguage(language); - } - ); - }); -}; - -export default useLanguageSync; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts new file mode 100644 index 00000000..6d658aee --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/hooks/useStateSynchronizer.ts @@ -0,0 +1,52 @@ +import { createVideoClient } from '@core/services'; +import i18n from '../../i18n'; +import bridge$ from '../stores/bridge'; +import { runtime$ } from '@core/stores'; +import { useMountEffect } from '@web/hooks'; + +/** + * Syncs the html element with the internal react state + */ +const useStateSynchronizer = () => { + const bridge = bridge$.use.api(); + const runtime = runtime$.use.api(); + const { setLanguage } = runtime$.use.actions(); + + useMountEffect(() => { + const subscriptions = [ + // language changes from the bridge should update i18n and the runtime store + bridge.subscribe( + ({ language }) => language, + (language) => { + void i18n.changeLanguage(language); + setLanguage(language); + }, + { + skipFirst: true, + } + ), + + // clientUrl changes from the bridge should update the video client in the runtime store + bridge.subscribe( + ({ entryPoint }) => entryPoint, + (entryPoint) => { + runtime.setState((state) => ({ + ...state, + videoClient: createVideoClient({ + url: entryPoint, + }), + })); + }, + { + skipFirst: true, + } + ), + ]; + + return () => { + subscriptions.forEach((unsubscribe) => unsubscribe()); + }; + }); +}; + +export default useStateSynchronizer; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts index bcee003b..7a2f0840 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/index.ts @@ -1,2 +1,5 @@ +// runs interceptors before vonage sdk initialize resources (XHR, navigator.mediaDevices clones, etc) +import '@core/interceptors'; + import '../i18n'; import './VeraRoomElement'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx index fc3b211c..99e1964e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.spec.tsx @@ -19,9 +19,7 @@ vi.mock('@components/GoodBye/GoodbyeMessage', () => ({ })); vi.mock('@components/GoodBye/ReenterRoomButton', () => ({ - default: ({ roomName }: { roomName: string }) => ( -
- ), + default: () =>
, })); vi.mock('@ui', async () => { @@ -46,7 +44,7 @@ const mockUseGoodByePage = useGoodByePage as Mock; describe('GoodByeStage', () => { beforeEach(() => { mockUseGoodByePage.mockReturnValue({ - roomName: 'test-room', + sessionKey: 'test-session-key', archives: [], header: 'You have left the meeting', caption: 'Thank you for joining!', @@ -60,16 +58,15 @@ describe('GoodByeStage', () => { expect(message).toHaveAttribute('data-message', 'Thank you for joining!'); }); - it('renders the ReenterRoomButton with the roomName from the hook', () => { + it('renders the ReenterRoomButton', () => { renderStage(); - const button = screen.getByTestId('reenter-room-button'); - expect(button).toHaveAttribute('data-room', 'test-room'); + expect(screen.getByTestId('reenter-room-button')).toBeInTheDocument(); }); it('renders the ArchiveList with archives from the hook', () => { const archives = [{ id: 'archive-1', status: 'available' }]; mockUseGoodByePage.mockReturnValue({ - roomName: 'test-room', + sessionKey: 'test-session-key', archives, header: 'Gone', caption: 'Bye', @@ -82,7 +79,7 @@ describe('GoodByeStage', () => { it('renders the ArchiveList with "error" when archives failed to load', () => { mockUseGoodByePage.mockReturnValue({ - roomName: 'test-room', + sessionKey: 'test-session-key', archives: 'error', header: 'Gone', caption: 'Bye', diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx index 5438c799..4bd66f1d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/GoodByeStage/GoodByeStage.tsx @@ -2,7 +2,6 @@ import ArchiveList from '@components/GoodBye/ArchiveList'; import GoodByeMessage from '@components/GoodBye/GoodbyeMessage'; import ReenterRoomButton from '@components/GoodBye/ReenterRoomButton'; import useGoodByePage from '@hooks/useGoodByePage'; -import { Stack } from '@mui/material'; import { Card, PageLayoutEmbed } from '@ui'; import type { FC } from 'react'; import { useTranslation } from 'react-i18next'; @@ -19,7 +18,7 @@ import { useTranslation } from 'react-i18next'; */ const GoodByeStage: FC = () => { const { t } = useTranslation(); - const { roomName, archives, header, caption } = useGoodByePage(); + const { archives, header, caption } = useGoodByePage(); return ( @@ -27,21 +26,21 @@ const GoodByeStage: FC = () => { - +
-

+

{t('goodBye.title')}

- +
-

+

{t('archiveList.label')}

- +
); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx index ebd1b6ee..0507388e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.spec.tsx @@ -19,10 +19,15 @@ type RenderOptions = { }; function render(ui: ReactElement, { sessionContext, userContext }: RenderOptions = {}) { - const { wrapper, ...context } = makeTestProvider([providers.user, providers.session], { - sessionContext, - userContext, - }); + const { wrapper, ...context } = makeTestProvider( + [providers.user, providers.session, providers.runtime], + + { + sessionContext, + userContext, + runtimeContext: undefined, + } + ); return { ...context, diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx index 71904bd9..606d3693 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/MeetingRoomStage/MeetingRoomStage.tsx @@ -9,7 +9,7 @@ import MeetingRoom from '@pages/MeetingRoom'; * Embeddable version of the meeting room. Provides SessionProvider and PublisherProvider. */ const MeetingRoomStage: FC = () => ( - + diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx index c90f912e..d325ceaf 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.spec.tsx @@ -66,11 +66,24 @@ vi.mock('@ui', async () => { type RenderOptions = { userContext?: ProviderOptions['UserContext']; initialRoute?: string; + sessionIdentifier?: string; }; +function SetBridgeState({ sessionIdentifier }: { sessionIdentifier?: string }) { + const actions = bridge$.use.actions(); + if (sessionIdentifier) { + actions.partialUpdate({ sessionIdentifier }); + } + return null; +} + function render( ui: ReactElement, - { userContext, initialRoute = '/waiting-room/my-room' }: RenderOptions = {} + { + userContext, + initialRoute = '/waiting-room/my-room', + sessionIdentifier = 'my-room', + }: RenderOptions = {} ) { const { wrapper: ProvidersWrapper, ...context } = makeTestProvider([providers.user], { userContext, @@ -80,10 +93,11 @@ function render( ...context, ...renderBase( + - + } /> @@ -105,8 +119,8 @@ describe('WaitingRoomStage', () => { localStorage.clear(); }); - it('renders content when roomName is in URL params', () => { - render(, { initialRoute: '/waiting-room/my-room' }); + it('renders content when sessionIdentifier is set', () => { + render(, { sessionIdentifier: 'my-room' }); expect(screen.getByTestId('video-container')).toBeInTheDocument(); expect(screen.getByTestId('username-input')).toBeInTheDocument(); expect(screen.getByTestId('control-panel')).toBeInTheDocument(); @@ -114,43 +128,20 @@ describe('WaitingRoomStage', () => { it('renders skeletons when isRoomReady is false', () => { localStorage.setItem('videoSourceEnabled', 'true'); - render(, { initialRoute: '/waiting-room/my-room' }); + render(, { sessionIdentifier: 'my-room' }); expect(screen.getByTestId('video-container-skeleton')).toBeInTheDocument(); expect(screen.getByTestId('username-input-skeleton')).toBeInTheDocument(); expect(screen.queryByTestId('video-container')).not.toBeInTheDocument(); }); - it('shows config error message when no roomName and no sessionIdentifier', () => { - render(, { initialRoute: '/waiting-room' }); + it('shows config error message when no sessionIdentifier is set', () => { + render(, { initialRoute: '/waiting-room', sessionIdentifier: '' }); expect(screen.getByText(/session-identifier/i)).toBeInTheDocument(); }); - it('redirects to /waiting-room/:sessionIdentifier when roomName is absent but bridge has a sessionIdentifier', () => { - const Wrapper = () => { - // Set bridge state inside a component rendered within the provider - const actions = bridge$.use.actions(); - actions.partialUpdate({ sessionIdentifier: 'bridge-room' }); - - return ( - - - } - /> - } /> - - - ); - }; - - renderBase( - - - - ); - - expect(screen.getByTestId('redirected-to-room')).toBeInTheDocument(); + it('renders content when bridge has a sessionIdentifier', () => { + render(, { sessionIdentifier: 'bridge-room' }); + expect(screen.getByTestId('video-container')).toBeInTheDocument(); }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx index 6ecadeb8..ecab056c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stages/WaitingRoomStage/WaitingRoomStage.tsx @@ -1,5 +1,5 @@ import { type FC } from 'react'; -import { Navigate, useParams } from 'react-router-dom'; +import { Navigate } from 'react-router-dom'; import Typography from '@mui/material/Typography'; import bridge$ from '../../stores/bridge'; import { PreviewPublisherProvider } from '@Context/PreviewPublisherProvider'; @@ -25,16 +25,15 @@ import { PageLayoutEmbed } from '@ui'; * Navigation to the meeting room is handled by UsernameInput via react-router-dom, * which resolves against the parent MemoryRouter in VeraRoom. * - * If mounted at /waiting-room (no :roomName param) but bridge$ has a sessionIdentifier, + * If mounted at /waiting-room (no :roomIdentifier param) but bridge$ has a sessionIdentifier, * redirects to /waiting-room/:sessionIdentifier so useRoomName() resolves correctly. */ const WaitingRoomStage: FC = () => { - const { roomName } = useParams<{ roomName?: string }>(); const sessionIdentifier = bridge$.use.select((state) => state.sessionIdentifier); - const missingRoomName = !roomName; - const canRedirect = missingRoomName && !!sessionIdentifier; - const isConfigError = missingRoomName && !sessionIdentifier; + const missingRoomIdentifier = !sessionIdentifier; + const canRedirect = missingRoomIdentifier && !!sessionIdentifier; + const isConfigError = missingRoomIdentifier && !sessionIdentifier; if (canRedirect) { return ; @@ -67,6 +66,7 @@ function WaitingRoomStageContent() { setUsername, accessStatus, isRoomReady, + roomName, handleAudioInputOpen, handleVideoInputOpen, handleAudioOutputOpen, @@ -109,6 +109,7 @@ function WaitingRoomStageContent() { className={`flex-col sm:inline-flex h-auto animate-fade-in`} username={username} setUsername={setUsername} + roomName={roomName} /> )} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts index a32db2c4..38179330 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/stores/index.ts @@ -1 +1 @@ -export { default as htmlAttributes$ } from './bridge'; +export { default as bridge$ } from './bridge'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css index 79285e5a..f9b48a6e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/styles.css @@ -1,5 +1,13 @@ @import 'tailwindcss'; +/* Keeps output pixel exact after migration from muiV5 to muiV9 */ +@layer base { + * { + letter-spacing: 0.15008px; + -webkit-font-smoothing: antialiased; + } +} + /* Tailwind CSS v4 config directive */ @config '../../tailwind.config.cjs'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts index 5f0d100c..c491aa78 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/VeraRoom/vite.veraroom.config.ts @@ -4,12 +4,14 @@ import * as path from 'node:path'; export default defineConfig((env) => { const baseConfig = baseConfigFn(env); - const isDevelopment = env.mode === 'development'; return mergeConfig(baseConfig, { base: './', define: { - 'process.env.NODE_ENV': isDevelopment ? '"development"' : '"production"', + 'process.env.NODE_ENV': '"production"', + }, + esbuild: { + jsxDev: false, }, build: { outDir: path.resolve(__dirname, '../../distRoom'), @@ -19,7 +21,7 @@ export default defineConfig((env) => { entry: path.resolve(__dirname, './index.ts'), name: 'VeraRoom', formats: ['iife'], - fileName: () => 'vera-room.js', + fileName: () => 'room.js', }, rollupOptions: { diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts new file mode 100644 index 00000000..5e780574 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.spec.ts @@ -0,0 +1,76 @@ +import { describe, expect, it, vi } from 'vitest'; +import { serverArchives } from '../tests/data'; +import getArchives from './getArchives'; +import type { ServerArchive } from '../model'; +import type { VideoClient } from '@core/services'; + +const mockSearchArchivesQuery = vi.fn((_args?: unknown) => + Promise.resolve({ items: [] as ServerArchive[] }) +); + +const mockVideoClient = { + searchArchives: (...args: unknown[]) => mockSearchArchivesQuery(...args), +} as unknown as VideoClient; + +describe('getArchives', () => { + it('returns an object with array of Archives and hasPending flag', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: serverArchives }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [ + { + createdAt: 1725268594000, + createdAtFormatted: 'Mon, Sep 2 5:16 AM', + duration: 0, + id: 'dc91ede6-0d1a-4de6-90d8-692c2113b34a', + size: 0, + status: 'pending', + url: null, + }, + { + createdAt: 1725268141000, + createdAtFormatted: 'Mon, Sep 2 5:09 AM', + duration: 56, + id: 'c32509e3-24a9-4d1f-98a0-66a0f0fdbca6', + size: 278545, + status: 'available', + url: 'https://example.com.com/tokbox.com.archive2.eu/46969164/c32509e3-24a9-4d1f-98a0-66a0f0fdbca6/archive.mp4', + }, + { + createdAt: 1725268111000, + createdAtFormatted: 'Mon, Sep 2 5:08 AM', + duration: 13, + id: '88417e46-6459-435b-b1a4-8524db79946c', + size: 911104, + status: 'failed', + url: null, + }, + ], + hasPending: true, + }); + }); + + it('returns object with empty array when no archives', async () => { + mockSearchArchivesQuery.mockResolvedValue({ items: [] }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); + expect(archives).toEqual({ + archives: [], + hasPending: false, + }); + }); + + it('throws with error when api call throws', async () => { + mockSearchArchivesQuery.mockRejectedValue(new Error('Network Error')); + await expect( + getArchives({ locale: 'en', sessionKey: 'test-session-id', videoClient: mockVideoClient }) + ).rejects.toThrowError(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts new file mode 100644 index 00000000..5ac165b3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/getArchives.ts @@ -0,0 +1,45 @@ +import { type VideoClient } from '@core/services'; +import { Archive, createArchiveFromServer, hasPending, type ServerArchive } from '../model'; + +export type ArchiveResponse = { + archives: Archive[]; + hasPending: boolean; +}; + +/** + * Returns a list of archives and the status of the archives for a given meeting room. + * @param {string} locale - current locale + * @param {string} sessionId - The session ID to search archives for + * @param {VideoClient} videoClient - The video client instance to use for searching archives + * @returns {Promise} The archives from the meeting room (if any) and whether any archives are pending. + */ +const getArchives = async ({ + locale, + sessionKey, + videoClient, +}: { + locale: string; + sessionKey: string; + videoClient: VideoClient; +}): Promise => { + const response = await videoClient.searchArchives({ sessionKey }); + const archivesFromServer = response?.items; + + if (archivesFromServer instanceof Array) { + const archives = archivesFromServer.map((archiveFromServer) => { + return createArchiveFromServer(locale, archiveFromServer as ServerArchive); + }); + + return { + archives, + hasPending: hasPending(archives), + }; + } + + return { + archives: [], + hasPending: false, + }; +}; + +export default getArchives; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts new file mode 100644 index 00000000..1353304c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/getArchives/index.ts @@ -0,0 +1 @@ +export { default as getArchives, type ArchiveResponse } from './getArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts index d31e238b..8b13c86b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/index.ts @@ -1,33 +1 @@ -import { Archive, createArchiveFromServer, hasPending, type ServerArchive } from './model'; -import { listArchives, startArchiving, stopArchiving } from './routes'; - -export type ArchiveResponse = { - archives: Archive[]; - hasPending: boolean; -}; - -/** - * Returns a list of archives and the status of the archives for a given meeting room. - * @param {string} locale - current locale - * @param {string} roomName - The roomName we check for archives - * @returns {Promise} The archives from the meeting room (if any) and whether any archives are pending. - */ -const getArchives = async (locale: string, roomName: string): Promise => { - const response = await listArchives(roomName); - const archivesFromServer = response?.data?.archives; - if (archivesFromServer instanceof Array) { - const archives = archivesFromServer.map((archiveFromServer: ServerArchive) => - createArchiveFromServer(locale, archiveFromServer) - ); - return { - archives, - hasPending: hasPending(archives), - }; - } - return { - archives: [], - hasPending: false, - }; -}; - -export { startArchiving, stopArchiving, getArchives }; +export { getArchives, type ArchiveResponse } from './getArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts deleted file mode 100644 index 7a3aeb48..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/routes.ts +++ /dev/null @@ -1,38 +0,0 @@ -import axios, { AxiosResponse } from 'axios'; -import { API_URL } from '../../utils/constants'; - -/** - * Send a request to start archiving. - * See https://developer.vonage.com/en/use-cases/multiparty-with-archiving-with-vonage-video-api#handling-archives - * @param {string} roomName - The name of the meeting room - * @returns {Promise>} The response from the archiving session. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const startArchiving = async (roomName: string): Promise> => { - return axios.post(`${API_URL}/session/${roomName}/startArchive`); -}; - -/** - * Send a request to stop archiving. - * See https://developer.vonage.com/en/use-cases/multiparty-with-archiving-with-vonage-video-api#handling-archives - * @param {string} roomName - The name of the meeting room - * @param {string} archiveId - The ID for the currently recording archive. - * @returns {Promise>} The response from the archiving session. - */ -export const stopArchiving = async ( - roomName: string, - archiveId: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any -): Promise> => { - return axios.post(`${API_URL}/session/${roomName}/${archiveId}/stopArchive`); -}; - -/** - * Get list of all of the archives from the meeting room. - * See https://developer.vonage.com/en/use-cases/multiparty-with-archiving-with-vonage-video-api#handling-archives - * @param {string} roomName - The name of the meeting room - * @returns {Promise>} The response from the archiving session. - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const listArchives = (roomName: string): Promise> => - axios.get(`${API_URL}/session/${roomName}/archives`); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts index 8e8b3f3e..cc0e5949 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/data.ts @@ -1,4 +1,3 @@ -import { AxiosResponse } from 'axios'; import { Archive, ServerArchive } from '../model'; export const startedServerArchive: ServerArchive = { @@ -109,16 +108,3 @@ export const serverArchives: ServerArchive[] = [ availableServerArchive, failedServerArchive, ]; - -export const mockResponse = { - headers: { - 'content-length': '28', - 'content-type': 'application/json; charset=utf-8', - }, - status: 200, - statusText: 'OK', - data: { - archives: serverArchives, - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any -} as unknown as AxiosResponse; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts index 50c56802..c9d3efc5 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/archiving/tests/index.spec.ts @@ -1,16 +1,25 @@ -import { describe, expect, it, Mock, vi } from 'vitest'; -import { AxiosError, AxiosResponse } from 'axios'; -import { listArchives } from '../routes'; -import { mockResponse } from './data'; +import { describe, expect, it, vi } from 'vitest'; +import { serverArchives } from './data'; import { getArchives } from '..'; +import type { ServerArchive } from '../model'; +import type { VideoClient } from '@core/services'; -vi.mock('../routes.ts'); -const mockListArchives = listArchives as Mock<[], ReturnType>; +const mockSearchArchivesQuery = vi.fn((_args?: unknown) => + Promise.resolve({ items: [] as ServerArchive[] }) +); + +const mockVideoClient = { + searchArchives: (...args: unknown[]) => mockSearchArchivesQuery(...args), +} as unknown as VideoClient; describe('getArchives', () => { it('it returns an object with array of Archives and hasPending flag', async () => { - mockListArchives.mockResolvedValue(mockResponse); - const archives = await getArchives('en', 'roomName'); + mockSearchArchivesQuery.mockResolvedValue({ items: serverArchives }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); expect(archives).toEqual({ archives: [ { @@ -46,27 +55,22 @@ describe('getArchives', () => { }); it('it returns object with empty array when no archives', async () => { - mockListArchives.mockResolvedValue({ - headers: { - 'content-length': '28', - 'content-type': 'application/json; charset=utf-8', - }, - status: 200, - statusText: 'OK', - data: { - archives: [], - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as unknown as AxiosResponse); - const archives = await getArchives('en', 'roomName'); + mockSearchArchivesQuery.mockResolvedValue({ items: [] }); + const archives = await getArchives({ + locale: 'en', + sessionKey: 'test-session-id', + videoClient: mockVideoClient, + }); expect(archives).toEqual({ archives: [], hasPending: false, }); }); - it('it throws with error when api call throws', () => { - mockListArchives.mockRejectedValue(new AxiosError('Network Error', 'ERR_NETWORK')); - void expect(getArchives('en', 'roomName')).rejects.toThrowError(); + it('it throws with error when api call throws', async () => { + mockSearchArchivesQuery.mockRejectedValue(new Error('Network Error')); + await expect( + getArchives({ locale: 'en', sessionKey: 'test-session-id', videoClient: mockVideoClient }) + ).rejects.toThrowError(); }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts deleted file mode 100644 index 2f062e94..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/api/captions.ts +++ /dev/null @@ -1,47 +0,0 @@ -import axios, { AxiosResponse } from 'axios'; -import { API_URL } from '../utils/constants'; - -/** - * Type definitions for enabling captions. - * @typedef {object} EnableCaptionsType - * @property {string} captionsId - The ID for the currently-enabled captions. - * @property {string} message (optional) - An error message. - */ -export type EnableCaptionsType = { - captionsId: string; - message?: string; -}; - -/** - * Type definitions for disabling captions. - * @typedef {object} DisableCaptionsType - * @property {string} disableResponse - The response message from disabling captions request. - * @property {string} errorMessage (optional) - An error message. - */ -export type DisableCaptionsType = { - messageResponse: string; - message?: string; -}; - -/** - * Send a request to start captions. - * More about enabling captions can be found here: https://developer.vonage.com/en/video/guides/live-caption#steps-to-enable-live-captions - * @param {string} roomName - The name of the meeting room - * @returns {Promise>} The response from starting the captions request. - */ -export const enableCaptions = async (roomName: string) => { - return await axios.post(`${API_URL}/session/${roomName}/enableCaptions`); -}; - -/** - * Send a request to stop captions. - * @param {string} roomName - The name of the meeting room - * @param {string} captionsId - The ID for the currently-enabled captions. - * @returns {Promise>} The response message from disabling captions request. - */ -export const disableCaptions = async ( - roomName: string, - captionsId: string -): Promise> => { - return await axios.post(`${API_URL}/session/${roomName}/${captionsId}/disableCaptions`); -}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx new file mode 100644 index 00000000..3d759331 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettings/Dialog/index.tsx @@ -0,0 +1 @@ +export { AdvancedSettingsDialog as default } from '../../AdvancedSettingsDialog'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx new file mode 100644 index 00000000..bad02f1b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.spec.tsx @@ -0,0 +1,74 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { beforeEach, afterEach, describe, expect, it } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsDialog from './AdvancedSettingsDialog'; + +describe('AdvancedSettingsDialog', () => { + beforeEach(() => { + advancedSettings$.setState((state) => ({ ...state, isOpen: true })); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders dialog when open', async () => { + render(); + + await waitFor(() => { + expect(screen.getByRole('dialog')).toBeInTheDocument(); + }); + + expect(screen.getByText(/^settings$/i)).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /general/i })).toBeInTheDocument(); + }); + + it('switches to the video tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /video/i })); + + expect(screen.getByLabelText(/bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/codec/i)).toBeInTheDocument(); + }); + + it('switches to the audio tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /audio/i })); + + expect(screen.getByRole('heading', { name: /^audio$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/audio bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/enable opus dtx/i)).toBeInTheDocument(); + }); + + it('switches to the statistics tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /statistics/i })); + + expect(screen.getByRole('heading', { name: /^statistics$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/enable publisher bandwidth estimate/i)).toBeInTheDocument(); + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + }); + + it('closes the dialog through context on close', async () => { + render(); + + await userEvent.click(screen.getByLabelText(/close/i)); + + await waitFor(() => { + expect(screen.queryByRole('dialog')).not.toBeInTheDocument(); + }); + }); +}); + +function render(ui: ReactElement) { + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx new file mode 100644 index 00000000..025097b3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/AdvancedSettingsDialog.tsx @@ -0,0 +1,67 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import Dialog from '@mui/material/Dialog'; +import classNames from 'classnames'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import VividIcon from '@ui/VividIcon'; +import { AdvancedSettingsAudioTab } from './components/AdvancedSettingsAudioTab'; +import { AdvancedSettingsGeneralTab } from './components/AdvancedSettingsGeneralTab'; +import { AdvancedSettingsSidebar } from './components/AdvancedSettingsSidebar'; +import { AdvancedSettingsStatisticsTab } from './components/AdvancedSettingsStatisticsTab'; +import { AdvancedSettingsVideoTab } from './components/AdvancedSettingsVideoTab'; + +const AdvancedSettingsDialog = (): ReactElement => { + const { t } = useTranslation(); + const isOpen = advancedSettings$.use.select(({ isOpen }) => isOpen); + const selectedTab = advancedSettings$.use.select(({ selectedTab }) => selectedTab); + + const tabContent = (() => { + if (selectedTab === 'general') return ; + if (selectedTab === 'video') return ; + if (selectedTab === 'audio') return ; + return ; + })(); + + return ( + +
+
+

+ {t('advancedSettings.title')} +

+ +
+ +
+ + +
{tabContent}
+
+
+
+ ); +}; + +export default AdvancedSettingsDialog; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx new file mode 100644 index 00000000..bcf09aa6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.spec.tsx @@ -0,0 +1,69 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it } from 'vitest'; +import { MemoryRouter } from 'react-router-dom'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsAudioTab from './AdvancedSettingsAudioTab'; + +describe('AdvancedSettingsAudioTab', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders all audio controls with automatic bitrate selected by default', () => { + render(); + + expect(screen.getByRole('heading', { name: /^audio$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/audio bitrate/i)).toBeInTheDocument(); + expect(screen.getByRole('combobox')).toHaveValue('automatic'); + expect( + screen.queryByTestId('advanced-settings-custom-audio-bitrate-slider') + ).not.toBeInTheDocument(); + expect(screen.getByLabelText(/enable opus dtx/i)).toBeChecked(); + expect(screen.getByLabelText(/publisher audio fallback/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/subscriber audio fallback/i)).toBeInTheDocument(); + }); + + it('renders the custom audio bitrate slider when custom mode is selected', () => { + render(, { dialogState: { audioBitrateMode: 'custom' } }); + + expect(screen.getByTestId('advanced-settings-custom-audio-bitrate-slider')).toBeInTheDocument(); + expect(screen.getByText(/6 kbps/i)).toBeInTheDocument(); + expect(screen.getByText(/510 kbps/i)).toBeInTheDocument(); + expect(screen.getByText(/128 kbps/i)).toBeInTheDocument(); + }); + + it('shows custom slider after selecting custom bitrate mode', async () => { + const user = userEvent.setup(); + render(); + + await user.selectOptions(screen.getByRole('combobox'), 'custom'); + + expect(screen.getByTestId('advanced-settings-custom-audio-bitrate-slider')).toBeInTheDocument(); + }); + + it('toggles enable opus dtx checkbox', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('checkbox', { name: /enable opus dtx/i })); + + expect(screen.getByRole('checkbox', { name: /enable opus dtx/i })).not.toBeChecked(); + }); +}); +type RenderOptions = { + dialogState?: Partial; + initialPath?: string; +}; +function render( + ui: ReactElement, + { dialogState, initialPath = '/waiting-room' }: RenderOptions = {} +) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx new file mode 100644 index 00000000..7719c693 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/AdvancedSettingsAudioTab.tsx @@ -0,0 +1,127 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { useLocation } from 'react-router-dom'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import SelectField from '@ui/SelectField'; +import SwitchField from '@ui/SwitchField'; +import { ADVANCED_SETTINGS_AUDIO_BITRATE_MODE } from '../../types/types'; + +const { + setAudioBitrateMode, + setCustomAudioBitrate, + setEnableDtx, + setPublisherAudioFallbackEnabled, + setSubscriberAudioFallbackEnabled, +} = advancedSettings$.actions; + +const AdvancedSettingsAudioTab = (): ReactElement => { + const { t } = useTranslation(); + const { pathname } = useLocation(); + const isInWaitingRoom = pathname.startsWith('/waiting-room'); + const nextCallWarningKey = isInWaitingRoom + ? 'advancedSettings.audio.nextCallWarningWaitingRoom' + : 'advancedSettings.audio.nextCallWarningMeetingRoom'; + const audioBitrateMode = advancedSettings$.use.select(({ audioBitrateMode }) => audioBitrateMode); + const customAudioBitrate = advancedSettings$.use.select( + ({ customAudioBitrate }) => customAudioBitrate + ); + const enableDtx = advancedSettings$.use.select(({ enableDtx }) => enableDtx); + const publisherAudioFallbackEnabled = advancedSettings$.use.select( + ({ publisherAudioFallbackEnabled }) => publisherAudioFallbackEnabled + ); + const subscriberAudioFallbackEnabled = advancedSettings$.use.select( + ({ subscriberAudioFallbackEnabled }) => subscriberAudioFallbackEnabled + ); + + const audioBitrateOptions = [ + { + value: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.automatic, + label: t('advancedSettings.audio.bitrate.options.automatic'), + }, + { + value: ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.custom, + label: t('advancedSettings.audio.bitrate.options.custom'), + }, + ]; + + return ( +
+

+ {t('advancedSettings.tabs.audio')} +

+ +

+ {t(nextCallWarningKey)} +

+ +
+ + + {audioBitrateMode === ADVANCED_SETTINGS_AUDIO_BITRATE_MODE.custom && ( +
+

+ {t('advancedSettings.audio.bitrate.customLabel')} +

+ +
+ { + setCustomAudioBitrate(Number(event.target.value)); + }} + data-testid="advanced-settings-custom-audio-bitrate-slider" + aria-label={t('advancedSettings.audio.bitrate.customLabel')} + /> +
+ {t('advancedSettings.audio.bitrate.minimum')} + + {t('advancedSettings.audio.bitrate.currentValue', { + value: customAudioBitrate, + })} + + {t('advancedSettings.audio.bitrate.maximum')} +
+
+
+ )} +
+ + + + + + +
+ ); +}; + +export default AdvancedSettingsAudioTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx new file mode 100644 index 00000000..ce91d797 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsAudioTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsAudioTab } from './AdvancedSettingsAudioTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx new file mode 100644 index 00000000..6302e208 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.spec.tsx @@ -0,0 +1,40 @@ +import { fireEvent, render, screen, within } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import AdvancedSettingsCodecPriorityField from './AdvancedSettingsCodecPriorityField'; + +describe('AdvancedSettingsCodecPriorityField', () => { + it('reorders codecs through drag and drop', () => { + const setCodecPriority = vi.fn(); + + render( + + ); + + const vp9Item = screen.getByTestId('advanced-settings-codec-priority-item-vp9'); + const h264Item = screen.getByTestId('advanced-settings-codec-priority-item-h264'); + + fireEvent.dragStart(vp9Item); + fireEvent.dragOver(h264Item); + fireEvent.drop(h264Item); + + expect(setCodecPriority).toHaveBeenCalledWith(['vp8', 'h264', 'vp9']); + }); + + it('renders the codec labels in SDK order by default', () => { + render( + + ); + + const codecItems = within(screen.getByTestId('advanced-settings-codec-priority-list')) + .getAllByRole('listitem') + .map((item) => item.textContent); + + expect(codecItems).toEqual(expect.arrayContaining(['1VP9', '2VP8', '3H.264'])); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx new file mode 100644 index 00000000..3b221c3a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/AdvancedSettingsCodecPriorityField.tsx @@ -0,0 +1,139 @@ +import { useState } from 'react'; +import type { DragEvent, ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import type { + AdvancedSettingsManualCodecOrder, + AdvancedSettingsVideoCodec, +} from '../../types/types'; + +type AdvancedSettingsCodecPriorityFieldProps = { + codecPriority: AdvancedSettingsManualCodecOrder; + setCodecPriority: (value: AdvancedSettingsManualCodecOrder) => void; +}; + +const AdvancedSettingsCodecPriorityField = ({ + codecPriority, + setCodecPriority, +}: AdvancedSettingsCodecPriorityFieldProps): ReactElement => { + const { t } = useTranslation(); + const [draggedCodec, setDraggedCodec] = useState(null); + const [dropTargetCodec, setDropTargetCodec] = useState(null); + + const handleDragStart = (event: DragEvent, codec: AdvancedSettingsVideoCodec) => { + if (event.dataTransfer) { + event.dataTransfer.effectAllowed = 'move'; + event.dataTransfer.setData('text/plain', codec); + } + + setDraggedCodec(codec); + setDropTargetCodec(codec); + }; + + const handleDragEnd = () => { + setDraggedCodec(null); + setDropTargetCodec(null); + }; + + const handleDragOver = ( + event: DragEvent, + targetCodec: AdvancedSettingsVideoCodec + ) => { + event.preventDefault(); + + if (!draggedCodec || draggedCodec === targetCodec) return; + + setDropTargetCodec(targetCodec); + }; + + const handleDrop = (event: DragEvent, targetCodec: AdvancedSettingsVideoCodec) => { + event.preventDefault(); + + const draggedCodecFromEvent = event.dataTransfer?.getData('text/plain') as + | AdvancedSettingsVideoCodec + | undefined; + const activeDraggedCodec = draggedCodec ?? draggedCodecFromEvent; + + if (!activeDraggedCodec || activeDraggedCodec === targetCodec) { + handleDragEnd(); + return; + } + + const reorderedCodecs = reorderCodecPriority({ + codecPriority, + draggedCodec: activeDraggedCodec, + targetCodec, + }); + + setCodecPriority(reorderedCodecs); + handleDragEnd(); + }; + + return ( +
+

+ {t('advancedSettings.video.codec.priority.label')} +

+ +

+ {t('advancedSettings.video.codec.priority.description')} +

+ +
    + {codecPriority.map((codec, index) => { + const isDraggedCodec = draggedCodec === codec; + const isDropTarget = dropTargetCodec === codec && draggedCodec !== codec; + + return ( +
  1. { + handleDragStart(event, codec); + }} + onDragEnd={handleDragEnd} + onDragOver={(event) => { + handleDragOver(event, codec); + }} + onDrop={(event) => { + handleDrop(event, codec); + }} + className={classNames( + 'flex cursor-grab items-center gap-3 rounded-vera-medium border bg-vera-surface px-4 py-3', + isDraggedCodec ? 'border-vera-primary opacity-60' : 'border-vera-border', + isDropTarget ? 'border-vera-primary' : null + )} + data-testid={`advanced-settings-codec-priority-item-${codec}`} + > + + {index + 1} + + + + {t(`advancedSettings.video.codec.priority.options.${codec}`)} + +
  2. + ); + })} +
+
+ ); +}; + +function reorderCodecPriority(args: { + codecPriority: AdvancedSettingsManualCodecOrder; + draggedCodec: AdvancedSettingsVideoCodec; + targetCodec: AdvancedSettingsVideoCodec; +}): AdvancedSettingsManualCodecOrder { + const { codecPriority, draggedCodec, targetCodec } = args; + const reorderedCodecs = [...codecPriority]; + const draggedCodecIndex = reorderedCodecs.indexOf(draggedCodec); + const targetCodecIndex = reorderedCodecs.indexOf(targetCodec); + + reorderedCodecs.splice(draggedCodecIndex, 1); + reorderedCodecs.splice(targetCodecIndex, 0, draggedCodec); + + return reorderedCodecs as AdvancedSettingsManualCodecOrder; +} + +export default AdvancedSettingsCodecPriorityField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx new file mode 100644 index 00000000..488e84d7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCodecPriorityField/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsCodecPriorityField } from './AdvancedSettingsCodecPriorityField'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx new file mode 100644 index 00000000..7034aa8f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.spec.tsx @@ -0,0 +1,51 @@ +import { fireEvent, render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsCustomVideoBitrateField from './AdvancedSettingsCustomVideoBitrateField'; + +describe('AdvancedSettingsCustomVideoBitrateField', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders the current bitrate and range labels', () => { + render(); + + expect(screen.getByText(/custom bitrate/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-custom-video-bitrate-slider')).toHaveAttribute( + 'type', + 'range' + ); + expect(screen.getAllByText(/5 kbps/i).length).toBeGreaterThan(0); + expect(screen.getByText(/^10 Mbps$/i)).toBeInTheDocument(); + expect(screen.getByText(/^500 kbps$/i)).toBeInTheDocument(); + }); + + it('calls onChange with the clamped value when slider exceeds the maximum', () => { + const handleChange = vi.fn(); + + render(, { + dialogState: { customVideoBitrate: 9_995_000 }, + }); + + const slider = screen.getByTestId('advanced-settings-custom-video-bitrate-slider'); + + fireEvent.change(slider, { target: { value: '20000000' } }); + + expect(handleChange).toHaveBeenCalledWith(10_000_000); + }); +}); + +type RenderOptions = { + dialogState?: Partial; +}; + +function render(ui: ReactElement, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase(ui); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx new file mode 100644 index 00000000..ccdabcf1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/AdvancedSettingsCustomVideoBitrateField.tsx @@ -0,0 +1,87 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env } from '../../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import type { AdvancedSettingsCustomVideoBitrate } from '../../types/types'; + +const CUSTOM_VIDEO_BITRATE_STEP_BPS = 5_000; + +type Props = { + onChange: (value: AdvancedSettingsCustomVideoBitrate) => void; +}; + +const AdvancedSettingsCustomVideoBitrateField = ({ onChange }: Props): ReactElement => { + const { t } = useTranslation(); + const customVideoBitrate = advancedSettings$.use.select((state) => state.customVideoBitrate); + const currentCustomVideoBitrate = Number(customVideoBitrate); + + return ( +
+

+ {t('advancedSettings.video.customBitrate.label')} +

+ +

+ {t('advancedSettings.video.customBitrate.description')} +

+ +
+ { + onChange(clampCustomVideoBitrate(Number(event.target.value))); + }} + className="w-full accent-vera-primary" + data-testid="advanced-settings-custom-video-bitrate-slider" + aria-label={t('advancedSettings.video.customBitrate.label')} + /> + +
+ {t('advancedSettings.video.customBitrate.minimum')} + + {formatVideoBitrateLabel({ + customVideoBitrate: currentCustomVideoBitrate, + lowerUnitLabel: t('advancedSettings.video.customBitrate.units.lower'), + higherUnitLabel: t('advancedSettings.video.customBitrate.units.higher'), + })} + + {t('advancedSettings.video.customBitrate.maximum')} +
+
+
+ ); +}; + +function clampCustomVideoBitrate(customVideoBitrate: number): number { + if (customVideoBitrate < env.MIN_CUSTOM_VIDEO_BITRATE_BPS) { + return Number(env.MIN_CUSTOM_VIDEO_BITRATE_BPS); + } + + if (customVideoBitrate > env.MAX_CUSTOM_VIDEO_BITRATE_BPS) { + return Number(env.MAX_CUSTOM_VIDEO_BITRATE_BPS); + } + + return customVideoBitrate; +} + +function formatVideoBitrateLabel({ + customVideoBitrate, + lowerUnitLabel, + higherUnitLabel, +}: { + customVideoBitrate: number; + lowerUnitLabel: string; + higherUnitLabel: string; +}): string { + if (customVideoBitrate >= 1_000_000) { + return `${customVideoBitrate / 1_000_000} ${higherUnitLabel}`; + } + + return `${Math.round(customVideoBitrate / 1_000)} ${lowerUnitLabel}`; +} + +export default AdvancedSettingsCustomVideoBitrateField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx new file mode 100644 index 00000000..d81b6d94 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsCustomVideoBitrateField/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsCustomVideoBitrateField } from './AdvancedSettingsCustomVideoBitrateField'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx new file mode 100644 index 00000000..e2264000 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.spec.tsx @@ -0,0 +1,13 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsGeneralTab from './AdvancedSettingsGeneralTab'; + +describe('AdvancedSettingsGeneralTab', () => { + it('renders the general tab content', () => { + render(); + + expect(screen.getByRole('heading', { name: /general/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /reset default values/i })).toBeInTheDocument(); + expect(screen.getByText(/restore all settings to their default values/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx new file mode 100644 index 00000000..32a85788 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/AdvancedSettingsGeneralTab.tsx @@ -0,0 +1,27 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; + +const AdvancedSettingsGeneralTab = (): ReactElement => { + const { t } = useTranslation(); + + return ( +
+

+ {t('advancedSettings.tabs.general')} +

+
+ +

+ {t('advancedSettings.general.resetDescription')} +

+
+
+ ); +}; + +export default AdvancedSettingsGeneralTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx new file mode 100644 index 00000000..fce95ded --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsGeneralTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsGeneralTab } from './AdvancedSettingsGeneralTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx new file mode 100644 index 00000000..3fa311b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.spec.tsx @@ -0,0 +1,29 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import type { ReactElement } from 'react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsSidebar from './AdvancedSettingsSidebar'; + +describe('AdvancedSettingsSidebar', () => { + it('renders all tabs', () => { + render(); + + expect(screen.getByRole('button', { name: /general/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /audio/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /statistics/i })).toBeInTheDocument(); + }); + + it('updates selected tab when clicking another tab', async () => { + const user = userEvent.setup(); + render(); + + await user.click(screen.getByRole('button', { name: /statistics/i })); + + expect(screen.getByRole('button', { name: /statistics/i })).toHaveClass('bg-vera-surface'); + }); +}); + +function render(ui: ReactElement) { + return renderBase(ui); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx new file mode 100644 index 00000000..3d38f6aa --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/AdvancedSettingsSidebar.tsx @@ -0,0 +1,41 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import type { AdvancedSettingsTab } from '../../types/types'; + +const tabs: AdvancedSettingsTab[] = ['general', 'video', 'audio', 'statistics']; +const { setSelectedTab } = advancedSettings$.actions; + +const AdvancedSettingsSidebar = (): ReactElement => { + const { t } = useTranslation(); + const selectedTab = advancedSettings$.use.select((state) => state.selectedTab); + + return ( +
+ {tabs.map((tab) => { + const isSelected = selectedTab === tab; + + return ( + + ); + })} +
+ ); +}; + +export default AdvancedSettingsSidebar; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx new file mode 100644 index 00000000..d3f7c8b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsSidebar/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsSidebar } from './AdvancedSettingsSidebar'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx new file mode 100644 index 00000000..cd1a5bad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.spec.tsx @@ -0,0 +1,21 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import AdvancedSettingsStatisticsGroup from './AdvancedSettingsStatisticsGroup'; + +describe('AdvancedSettingsStatisticsGroup', () => { + it('renders only the statistics sections that have items', () => { + render( + + ); + + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + expect(screen.queryByRole('heading', { name: /audio/i })).not.toBeInTheDocument(); + expect(screen.getByRole('heading', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByText(/bytes received/i)).toBeInTheDocument(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx new file mode 100644 index 00000000..0cf5ac3a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/AdvancedSettingsStatisticsGroup.tsx @@ -0,0 +1,89 @@ +import { useMemo, type ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Collapsible } from '@ui/components'; +import LabeledValueList from '@ui/LabeledValueList'; +import type { IMetricValue } from '@core/metrics'; +import type { Any } from '@common/types'; + +type AdvancedSettingsStatisticItem = { + label: string; + value: IMetricValue | string; +}; + +type AdvancedSettingsStatisticsGroupProps = { + title: string; + audioItems: AdvancedSettingsStatisticItem[]; + videoItems: AdvancedSettingsStatisticItem[]; + defaultExpanded?: boolean; +}; + +const AdvancedSettingsStatisticsGroup = ({ + title, + audioItems, + videoItems, + defaultExpanded = false, +}: AdvancedSettingsStatisticsGroupProps): ReactElement => { + const { t } = useTranslation(); + const hasStatistics = audioItems.length > 0 || videoItems.length > 0; + + const formattedAudioItems = useMemo( + () => + audioItems.map(({ label, value }) => ({ + label, + value: value.toString(), + })), + [audioItems] + ); + + const formattedVideoItems = useMemo( + () => + videoItems.map(({ label, value }) => ({ + label, + value: value.toString(), + })), + [videoItems] + ); + + return ( + + + + {title} + + + + + + + {hasStatistics && ( +
+ {audioItems.length > 0 && ( + + )} + + {videoItems.length > 0 && ( + + )} +
+ )} + + {!hasStatistics && ( +

+ {t('advancedSettings.statistics.empty')} +

+ )} +
+
+ ); +}; + +export default AdvancedSettingsStatisticsGroup; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx new file mode 100644 index 00000000..913d618f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsGroup/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsStatisticsGroup } from './AdvancedSettingsStatisticsGroup'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx new file mode 100644 index 00000000..8736f1c1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.spec.tsx @@ -0,0 +1,161 @@ +import { render as renderBase, screen, waitFor } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { describe, expect, it, vi } from 'vitest'; +import type { Publisher, Subscriber } from '@vonage/client-sdk-video'; +import type { SubscriberWrapper } from '@app-types/session'; +import AdvancedSettingsStatisticsTab from './AdvancedSettingsStatisticsTab'; +import makeTestProvider, { ProviderOptions, providers } from '@test/providers/makeTestProvider'; +import { DEVICE_ACCESS_STATUS } from '@utils/constants'; + +describe('AdvancedSettingsStatisticsTab', () => { + vi.mock('@hooks/usePermissions', () => ({ + default: () => ({ + accessStatus: DEVICE_ACCESS_STATUS.ACCEPTED, + setAccessStatus: vi.fn(), + }), + })); + + it('renders collection and an empty publisher statistics group', () => { + render(); + + expect(screen.getByRole('heading', { name: /^statistics$/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/enable publisher bandwidth estimate/i)).toBeInTheDocument(); + expect(screen.getAllByText(/publisher/i).length).toBeGreaterThan(0); + expect(screen.getByText(/statistics/i)).toBeInTheDocument(); + }); + + it('renders live publisher stats when statistics are enabled', async () => { + const publisher = { + videoWidth: vi.fn(() => 1280), + videoHeight: vi.fn(() => 720), + getStats: vi.fn((callback) => { + callback(undefined, [ + { + stats: { + audio: { packetsSent: 10, packetsLost: 0, bytesSent: 1024 }, + video: { + packetsSent: 50, + packetsLost: 1, + bytesSent: 51200, + frameRate: 30, + bitrate: 3_000_000, + connectionEstimatedBandwidthBps: 3_000_000, + layers: [], + }, + mediaLink: { transport: { connectionEstimatedBandwidth: 3_000_000 } }, + }, + }, + ]); + }), + } as unknown as Publisher; + + render(, { + publisherContext: { + __interceptor: (context) => { + if (context) { + context.publisher = publisher; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByText('30 fps')).toBeInTheDocument(); + expect(screen.getByText('1280x720')).toBeInTheDocument(); + // expect(screen.getByText('3.00 Mbps')).toBeInTheDocument(); + }); + }); + + it('renders subscriber group with codec, decoded frame rate and freeze count', async () => { + const subscriberWrapper: SubscriberWrapper = { + id: 'sub-1', + element: document.createElement('video'), + isScreenshare: false, + isPinned: false, + subscriber: { + stream: { name: 'Bob' }, + getStats: vi.fn((callback) => { + callback(undefined, { + audio: { packetsReceived: 10, packetsLost: 0, bytesReceived: 500 }, + video: { + packetsReceived: 40, + packetsLost: 0, + bytesReceived: 20000, + width: 640, + height: 480, + codec: 'VP9', + frameRate: 24, + decodedFrameRate: 23, + bitrate: 600_000, + freezeCount: 5, + totalFreezesDuration: 1200, + }, + mediaLink: { + transport: { connectionEstimatedBandwidth: 1_000_000 }, + remotePublisherTransport: { connectionEstimatedBandwidth: 900_000 }, + }, + }); + }), + } as unknown as Subscriber, + }; + + render(, { + sessionContext: { + __interceptor: (context) => { + if (context) { + context.subscriberWrappers = [subscriberWrapper]; + } + }, + }, + }); + + await waitFor(() => { + expect(screen.getByText('Bob')).toBeInTheDocument(); + expect(screen.getByText('VP9')).toBeInTheDocument(); + expect(screen.getByText('5')).toBeInTheDocument(); + }); + }); +}); + +type RenderOptions = { + advancedSettingsContext?: ProviderOptions['AdvancedSettingsContext']; + userContext?: ProviderOptions['UserContext']; + publisherContext?: ProviderOptions['PublisherContext']; + previewPublisherContext?: ProviderOptions['PreviewPublisherContext']; + sessionContext?: ProviderOptions['SessionContext']; +}; + +function render( + ui: ReactElement, + { + advancedSettingsContext, + userContext, + publisherContext, + previewPublisherContext, + sessionContext, + }: RenderOptions = {} +) { + const { wrapper, ...context } = makeTestProvider( + [ + providers.advancedSettings, + providers.runtime, + providers.user, + providers.publisher, + providers.previewPublisher, + providers.session, + ], + { + advancedSettingsContext, + runtimeContext: undefined, + userContext, + sessionContext, + publisherContext, + previewPublisherContext, + } + ); + + return { + ...context, + ...renderBase(ui, { wrapper }), + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx new file mode 100644 index 00000000..17cb5ad7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/AdvancedSettingsStatisticsTab.tsx @@ -0,0 +1,55 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import usePublisherContext from '@hooks/usePublisherContext'; +import SwitchField from '@ui/SwitchField'; +import PublisherStatistics from './components/PublisherStatistics'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import SubscriberStatistics from './components/SubscriberStatistics'; +import useSessionContext from '@hooks/useSessionContext'; + +const { setPublisherStatisticsEnabled } = advancedSettings$.actions; + +const AdvancedSettingsStatisticsTab = (): ReactElement => { + const { t } = useTranslation(); + const { publisher: meetingPublisher } = usePublisherContext(); + const { publisher: previewPublisher } = usePreviewPublisherContext(); + const { subscriberWrappers } = useSessionContext(); + + const publisher = meetingPublisher ?? previewPublisher; + + const publisherStatisticsEnabled = advancedSettings$.use.select( + (state) => state.publisherStatisticsEnabled + ); + + return ( +
+

+ {t('advancedSettings.tabs.statistics')} +

+ + +
+ {publisher && } + + {subscriberWrappers.length > 0 && ( +

+ {t('advancedSettings.statistics.groups.subscribers')} +

+ )} + + {subscriberWrappers.map(({ subscriber }, index) => ( + + ))} +
+
+ ); +}; + +export default AdvancedSettingsStatisticsTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx new file mode 100644 index 00000000..382f105b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/PublisherStatistics.tsx @@ -0,0 +1,117 @@ +import { type ReactElement, useMemo } from 'react'; +import { usePublisherStats } from '@core/hooks'; +import { useTranslation } from 'react-i18next'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { AdvancedSettingsStatisticsGroup } from '../../AdvancedSettingsStatisticsGroup'; +import { Publisher } from '@vonage/client-sdk-video'; +import { BitrateValue, FrameRateValue, optionalValue, ResolutionValue } from '@core/metrics'; + +interface PublisherStatisticsProps { + publisher: Publisher; +} + +const optionalValueArgs = { fallback: '–' }; + +const PublisherStatistics = ({ publisher }: PublisherStatisticsProps): ReactElement => { + const { t } = useTranslation(); + + const publisherStatisticsEnabled = advancedSettings$.use.select( + (state) => state.publisherStatisticsEnabled + ); + const fixedFrameRate = advancedSettings$.use.select((state) => state.frameRate); + + const { data } = usePublisherStats({ + publisher, + publisherStatisticsEnabled, + fixedFrameRate: fixedFrameRate ?? null, + }); + + const publisherAudioStatistics = useMemo(() => { + if (!data?.audio) { + return []; + } + + return [ + { + label: t('advancedSettings.statistics.metrics.packetsSent'), + value: data.audio.packetsSent, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostSent'), + value: data.audio.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesSent'), + value: data.audio.bytesSent, + }, + ]; + }, [data, t]); + + const publisherVideoStatistics = useMemo(() => { + if (!data?.video) { + return []; + } + + return [ + { + label: t('advancedSettings.statistics.metrics.resolution'), + value: data.resolution, + }, + { + label: t('advancedSettings.statistics.metrics.frameRate'), + value: data.frameRate, + }, + { + label: t('advancedSettings.statistics.metrics.bitrate'), + value: data.bitrateBps, + }, + { + label: t('advancedSettings.statistics.metrics.packetLoss'), + value: data.packetLossRatio, + }, + { + label: t('advancedSettings.statistics.metrics.packetsSent'), + value: data.video.packetsSent, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostSent'), + value: data.video.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesSent'), + value: data.video.bytesSent, + }, + { + label: t('advancedSettings.statistics.metrics.estimatedBandwidth'), + value: data.connectionEstimatedBandwidthBps, + }, + + ...(data.videoLayers ?? []).map((layer, index) => ({ + label: t('advancedSettings.statistics.metrics.videoLayer', { + index: index + 1, + codec: layer.codec, + }), + + value: [ + optionalValue(ResolutionValue, layer, optionalValueArgs), + optionalValue(FrameRateValue, layer.encodedFrameRate, optionalValueArgs), + optionalValue(BitrateValue, layer.bitrate, optionalValueArgs), + layer.qualityLimitationReason !== 'none' ? layer.qualityLimitationReason : null, + ] + .filter(Boolean) + .join(' · '), + })), + ]; + }, [data, t]); + + return ( + + ); +}; + +export default PublisherStatistics; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx new file mode 100644 index 00000000..211aebbc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/components/SubscriberStatistics.tsx @@ -0,0 +1,110 @@ +import { useMemo, type ReactElement } from 'react'; +import { useSubscriberStats } from '@core/hooks'; +import { useTranslation } from 'react-i18next'; +import { AdvancedSettingsStatisticsGroup } from '../../AdvancedSettingsStatisticsGroup'; +import { Subscriber } from '@vonage/client-sdk-video'; + +interface SubscriberStatisticsProps { + subscriber: Subscriber; +} + +const SubscriberStatistics = ({ subscriber }: SubscriberStatisticsProps): ReactElement => { + const { t } = useTranslation(); + + const { data } = useSubscriberStats({ subscriber }); + + const subscriberStatisticsGroups = useMemo(() => { + if (!data) { + return { + id: 'no-stats', + title: '...', + audioItems: [], + videoItems: [], + }; + } + + return { + id: data.id, + title: data?.title, + audioItems: [ + { + label: t('advancedSettings.statistics.metrics.packetsReceived'), + value: data.audio.packetsReceived, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostReceived'), + value: data.audio.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesReceived'), + value: data.audio.bytesReceived, + }, + ], + videoItems: [ + { + label: t('advancedSettings.statistics.metrics.resolution'), + value: data.video.resolution, + }, + { + label: t('advancedSettings.statistics.metrics.codec'), + value: data.video.codec ?? '–', + }, + { + label: t('advancedSettings.statistics.metrics.frameRate'), + value: data.video.frameRate, + }, + { + label: t('advancedSettings.statistics.metrics.decodedFrameRate'), + value: data.video.decodedFrameRate, + }, + { + label: t('advancedSettings.statistics.metrics.bitrate'), + value: data.video.bitrateBps, + }, + { + label: t('advancedSettings.statistics.metrics.packetLoss'), + value: data.packetLossRatio, + }, + { + label: t('advancedSettings.statistics.metrics.freezeCount'), + value: data.video.freezeCount, + }, + { + label: t('advancedSettings.statistics.metrics.totalFreezesDuration'), + value: data.video.totalFreezesDuration, + }, + { + label: t('advancedSettings.statistics.metrics.packetsReceived'), + value: data.video.packetsReceived, + }, + { + label: t('advancedSettings.statistics.metrics.packetsLostReceived'), + value: data.video.packetsLost, + }, + { + label: t('advancedSettings.statistics.metrics.bytesReceived'), + value: data.video.bytesReceived, + }, + { + label: t('advancedSettings.statistics.metrics.estimatedBandwidth'), + value: data.connectionEstimatedBandwidthBps, + }, + { + label: t('advancedSettings.statistics.metrics.remotePublisherEstimatedBandwidth'), + value: data.remotePublisherConnectionEstimatedBandwidthBps, + }, + ], + }; + }, [data, t]); + + return ( + + ); +}; + +export default SubscriberStatistics; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx new file mode 100644 index 00000000..86d768f9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsStatisticsTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsStatisticsTab } from './AdvancedSettingsStatisticsTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx new file mode 100644 index 00000000..2069b2d3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.spec.tsx @@ -0,0 +1,54 @@ +import { render as renderBase, screen } from '@testing-library/react'; +import type { ReactElement } from 'react'; +import { afterEach, describe, expect, it } from 'vitest'; +import type { advancedSettings } from '@Context/AdvancedSettings'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import AdvancedSettingsVideoTab from './AdvancedSettingsVideoTab'; + +type RenderOptions = { + dialogState?: Partial; +}; + +describe('AdvancedSettingsVideoTab', () => { + afterEach(() => { + advancedSettings$.reset(); + }); + + it('renders all video sections', () => { + render(); + + expect(screen.getByRole('heading', { name: /video/i })).toBeInTheDocument(); + expect(screen.getByLabelText(/bitrate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/codec/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/frame rate/i)).toBeInTheDocument(); + expect(screen.getByLabelText(/resolution/i)).toBeInTheDocument(); + }); + + it('renders codec priority drag and drop when codec mode is manual', () => { + render(, { + dialogState: { codecMode: 'manual', codecPriority: ['vp9', 'vp8', 'h264'] }, + }); + + expect(screen.getByText(/codec priority/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-vp9')).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-vp8')).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-codec-priority-item-h264')).toBeInTheDocument(); + }); + + it('renders custom video bitrate controls when bitrate mode is custom', () => { + render(, { dialogState: { bitrateMode: 'custom' } }); + + expect(screen.getByText(/custom bitrate/i)).toBeInTheDocument(); + expect(screen.getByTestId('advanced-settings-custom-video-bitrate-slider')).toBeInTheDocument(); + expect(screen.getAllByText(/5 kbps/i).length).toBeGreaterThan(0); + expect(screen.getByText(/^10 Mbps$/i)).toBeInTheDocument(); + }); +}); + +function render(ui: ReactElement, { dialogState }: RenderOptions = {}) { + if (dialogState) { + advancedSettings$.setState((state) => ({ ...state, ...dialogState })); + } + + return renderBase(ui); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx new file mode 100644 index 00000000..bbfab1dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/AdvancedSettingsVideoTab.tsx @@ -0,0 +1,135 @@ +import type { ReactElement } from 'react'; +import { useTranslation } from 'react-i18next'; +import { env, RESOLUTIONS } from '../../../../env'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import SelectField from '@ui/SelectField'; +import { AdvancedSettingsCodecPriorityField } from '../AdvancedSettingsCodecPriorityField'; +import { AdvancedSettingsCustomVideoBitrateField } from '../AdvancedSettingsCustomVideoBitrateField'; +import type { + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, + AdvancedSettingsSelectOption, +} from '../../types/types'; +import { ADVANCED_SETTINGS_BITRATE_MODE, ADVANCED_SETTINGS_CODEC_MODE } from '../../types/types'; +import useAdvancedSettingsVideoHandlers from './useAdvancedSettingsVideoHandlers'; + +const { setCodecMode, setCodecPriority } = advancedSettings$.actions; + +const AdvancedSettingsVideoTab = (): ReactElement => { + const { t } = useTranslation(); + const bitrateMode = advancedSettings$.use.select(({ bitrateMode }) => bitrateMode); + const codecMode = advancedSettings$.use.select(({ codecMode }) => codecMode); + const codecPriority = advancedSettings$.use.select(({ codecPriority }) => codecPriority); + const frameRate = advancedSettings$.use.select(({ frameRate }) => frameRate); + const resolution = advancedSettings$.use.select(({ resolution }) => resolution); + const customVideoBitrate = advancedSettings$.use.select( + ({ customVideoBitrate }) => customVideoBitrate + ); + + const { + handleFrameRateChange, + handleResolutionChange, + handleBitrateModeChange, + handleCustomVideoBitrateChange, + } = useAdvancedSettingsVideoHandlers({ bitrateMode, customVideoBitrate }); + + const bitrateOptions = [ + { + value: ADVANCED_SETTINGS_BITRATE_MODE.default, + label: t('advancedSettings.video.bitrate.options.default'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.bwSaver, + label: t('advancedSettings.video.bitrate.options.bw_saver'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.extraBwSaver, + label: t('advancedSettings.video.bitrate.options.extra_bw_saver'), + }, + { + value: ADVANCED_SETTINGS_BITRATE_MODE.custom, + label: t('advancedSettings.video.bitrate.options.custom'), + }, + ]; + + const codecOptions = [ + { + value: ADVANCED_SETTINGS_CODEC_MODE.automatic, + label: t('advancedSettings.video.codec.options.automatic'), + }, + { + value: ADVANCED_SETTINGS_CODEC_MODE.manual, + label: t('advancedSettings.video.codec.options.manual'), + }, + ]; + + const frameRateOptions: AdvancedSettingsSelectOption[] = ( + env.SUPPORTED_FRAME_RATES as AdvancedSettingsFrameRate[] + ).map((supportedFrameRate) => ({ + value: supportedFrameRate, + label: t(`advancedSettings.video.frameRate.options.${supportedFrameRate}`), + })); + + const resolutionOptions: AdvancedSettingsSelectOption[] = + RESOLUTIONS.map((supportedResolution) => ({ + value: supportedResolution, + label: supportedResolution, + })); + + return ( +
+

+ {t('advancedSettings.tabs.video')} +

+ +
+ + + {bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom && ( + + )} + + + + {codecMode === ADVANCED_SETTINGS_CODEC_MODE.manual && ( + + )} + + + + +
+
+ ); +}; + +export default AdvancedSettingsVideoTab; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx new file mode 100644 index 00000000..5c01c3b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsVideoTab } from './AdvancedSettingsVideoTab'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts new file mode 100644 index 00000000..d06fdb14 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.spec.ts @@ -0,0 +1,283 @@ +import { act, renderHook, waitFor } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi, beforeEach } from 'vitest'; +import type { Mock } from 'vitest'; +import type { Publisher } from '@vonage/client-sdk-video'; +import type { PublisherContextType } from '@Context/PublisherProvider'; +import type { PreviewPublisherContextType } from '@Context/PreviewPublisherProvider'; +import usePublisherContext from '@hooks/usePublisherContext'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { handleClientApplicationError } from '@ui/helpers'; +import useAdvancedSettingsVideoHandlers from './useAdvancedSettingsVideoHandlers'; + +vi.mock('@hooks/usePublisherContext'); +vi.mock('@hooks/usePreviewPublisherContext'); +vi.mock('@ui/helpers', () => ({ + handleClientApplicationError: vi.fn(), +})); + +const mockUsePublisherContext = usePublisherContext as Mock<[], PublisherContextType>; +const mockUsePreviewPublisherContext = usePreviewPublisherContext as Mock< + [], + PreviewPublisherContextType +>; +const mockHandleClientApplicationError = vi.mocked(handleClientApplicationError); + +const createMockPublisher = () => + ({ + getVideoSource: vi.fn().mockReturnValue({ track: {} }), + setPreferredFrameRate: vi.fn().mockResolvedValue(undefined), + setPreferredResolution: vi.fn().mockResolvedValue(undefined), + setMaxVideoBitrate: vi.fn().mockResolvedValue(undefined), + setVideoBitratePreset: vi.fn().mockResolvedValue(undefined), + }) as unknown as Publisher; + +describe('useAdvancedSettingsVideoHandlers', () => { + beforeEach(() => { + vi.restoreAllMocks(); + mockUsePublisherContext.mockReturnValue({ publisher: null } as PublisherContextType); + mockUsePreviewPublisherContext.mockReturnValue({ + publisher: null, + } as unknown as PreviewPublisherContextType); + }); + + afterEach(() => { + advancedSettings$.reset(); + }); + + describe('handleFrameRateChange', () => { + it('applies frame rate to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + expect(advancedSettings$.getState().frameRate).toBe(15); + }); + }); + + it('still updates store when no publisher is active', async () => { + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(7); + }); + + await waitFor(() => { + expect(advancedSettings$.getState().frameRate).toBe(7); + }); + }); + + it('does not update store when publisher call fails', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredFrameRate as Mock).mockRejectedValue(new Error('hardware error')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const initialFrameRate = advancedSettings$.getState().frameRate; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(publisher.setPreferredFrameRate).toHaveBeenCalledWith(15); + }); + + expect(advancedSettings$.getState().frameRate).toBe(initialFrameRate); + }); + + it('reports a notification after a failed frame rate update', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredFrameRate as Mock).mockRejectedValue(new Error('hardware error')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleFrameRateChange(15); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe('handleResolutionChange', () => { + it('applies resolution to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleResolutionChange('640x480'); + }); + + await waitFor(() => { + expect(publisher.setPreferredResolution).toHaveBeenCalledWith({ width: 640, height: 480 }); + expect(advancedSettings$.getState().resolution).toBe('640x480'); + }); + }); + + it('does not update store when resolution update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setPreferredResolution as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialResolution = advancedSettings$.getState().resolution; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleResolutionChange('640x480'); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().resolution).toBe(initialResolution); + }); + }); + + describe('handleBitrateModeChange', () => { + it('applies bitrate preset to publisher then updates store', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(publisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + expect(advancedSettings$.getState().bitrateMode).toBe('bw_saver'); + }); + }); + + it('uses preview publisher when no meeting room publisher is active', async () => { + const previewPublisher = createMockPublisher(); + mockUsePreviewPublisherContext.mockReturnValue({ + publisher: previewPublisher, + } as unknown as PreviewPublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(previewPublisher.setVideoBitratePreset).toHaveBeenCalledWith('bw_saver'); + }); + }); + + it('does not update store when bitrate preset update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setVideoBitratePreset as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialBitrateMode = advancedSettings$.getState().bitrateMode; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleBitrateModeChange('bw_saver'); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().bitrateMode).toBe(initialBitrateMode); + }); + }); + + describe('handleCustomVideoBitrateChange', () => { + it('applies custom bitrate to publisher then updates store when mode is custom', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'custom', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(publisher.setMaxVideoBitrate).toHaveBeenCalledWith(750_000); + expect(advancedSettings$.getState().customVideoBitrate).toBe(750_000); + }); + }); + + it('updates store without calling the publisher when mode is not custom', async () => { + const publisher = createMockPublisher(); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'default', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(advancedSettings$.getState().customVideoBitrate).toBe(750_000); + }); + + expect(publisher.setMaxVideoBitrate).not.toHaveBeenCalled(); + expect(publisher.setVideoBitratePreset).not.toHaveBeenCalled(); + }); + + it('does not update store when custom bitrate update fails', async () => { + const publisher = createMockPublisher(); + (publisher.setMaxVideoBitrate as Mock).mockRejectedValue(new Error('unsupported')); + mockUsePublisherContext.mockReturnValue({ publisher } as PublisherContextType); + const initialCustomVideoBitrate = advancedSettings$.getState().customVideoBitrate; + + const { result } = renderHook(() => + useAdvancedSettingsVideoHandlers({ bitrateMode: 'custom', customVideoBitrate: 500_000 }) + ); + + await act(async () => { + await result.current.handleCustomVideoBitrateChange(750_000); + }); + + await waitFor(() => { + expect(mockHandleClientApplicationError).toHaveBeenCalledTimes(1); + }); + + expect(advancedSettings$.getState().customVideoBitrate).toBe(initialCustomVideoBitrate); + }); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts new file mode 100644 index 00000000..a5a966a3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/components/AdvancedSettingsVideoTab/useAdvancedSettingsVideoHandlers.ts @@ -0,0 +1,89 @@ +import usePublisherContext from '@hooks/usePublisherContext'; +import usePreviewPublisherContext from '@hooks/usePreviewPublisherContext'; +import advancedSettings$ from '@Context/AdvancedSettings'; +import { makeApplicationErrorMapper } from '@core/errors'; +import { handleClientApplicationError } from '@ui/helpers'; +import { + applyFrameRate, + applyResolution, + applyBitrate, +} from '@Context/PublisherProvider/useApplyAdvancedSettings'; +import { t } from 'i18next'; +import type { + AdvancedSettingsBitrateMode, + AdvancedSettingsCustomVideoBitrate, + AdvancedSettingsFrameRate, + AdvancedSettingsResolution, +} from '../../types/types'; +import { ADVANCED_SETTINGS_BITRATE_MODE } from '../../types/types'; + +const { setBitrateMode, setCustomVideoBitrate, setFrameRate, setResolution } = + advancedSettings$.actions; + +type UseAdvancedSettingsVideoHandlersArgs = { + bitrateMode: AdvancedSettingsBitrateMode; + customVideoBitrate: AdvancedSettingsCustomVideoBitrate; +}; + +type UseAdvancedSettingsVideoHandlers = { + handleFrameRateChange: (value: AdvancedSettingsFrameRate) => Promise; + handleResolutionChange: (value: AdvancedSettingsResolution) => Promise; + handleBitrateModeChange: (value: AdvancedSettingsBitrateMode) => Promise; + handleCustomVideoBitrateChange: (value: AdvancedSettingsCustomVideoBitrate) => Promise; +}; + +const useAdvancedSettingsVideoHandlers = ({ + bitrateMode, + customVideoBitrate, +}: UseAdvancedSettingsVideoHandlersArgs): UseAdvancedSettingsVideoHandlers => { + const { publisher: meetingRoomPublisher } = usePublisherContext(); + const { publisher: previewPublisher } = usePreviewPublisherContext(); + const publisher = meetingRoomPublisher ?? previewPublisher ?? null; + + const handleFrameRateChange = async (value: AdvancedSettingsFrameRate) => { + try { + await applyFrameRate(publisher, value); + setFrameRate(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleResolutionChange = async (value: AdvancedSettingsResolution) => { + try { + await applyResolution(publisher, value); + setResolution(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleBitrateModeChange = async (value: AdvancedSettingsBitrateMode) => { + try { + await applyBitrate(publisher, value, customVideoBitrate); + setBitrateMode(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + const handleCustomVideoBitrateChange = async (value: AdvancedSettingsCustomVideoBitrate) => { + try { + if (bitrateMode === ADVANCED_SETTINGS_BITRATE_MODE.custom) { + await applyBitrate(publisher, bitrateMode, value); + } + setCustomVideoBitrate(value); + } catch (error) { + handleClientApplicationError(makeApplicationErrorMapper(t('errors.unknown'))(error)); + } + }; + + return { + handleFrameRateChange, + handleResolutionChange, + handleBitrateModeChange, + handleCustomVideoBitrateChange, + }; +}; + +export default useAdvancedSettingsVideoHandlers; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx new file mode 100644 index 00000000..c24c46ba --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/index.tsx @@ -0,0 +1 @@ +export { default as AdvancedSettingsDialog } from './AdvancedSettingsDialog'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts new file mode 100644 index 00000000..4859d66b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AdvancedSettingsDialog/types/types.ts @@ -0,0 +1,49 @@ +import type { Resolution } from '../../../env'; + +export type AdvancedSettingsTab = 'general' | 'video' | 'audio' | 'statistics'; + +export type AdvancedSettingsBitrateMode = 'default' | 'bw_saver' | 'extra_bw_saver' | 'custom'; + +export const ADVANCED_SETTINGS_BITRATE_MODE = { + default: 'default', + bwSaver: 'bw_saver', + extraBwSaver: 'extra_bw_saver', + custom: 'custom', +} as const satisfies Record; + +export type AdvancedSettingsCustomVideoBitrate = number; + +export type AdvancedSettingsCodecMode = 'automatic' | 'manual'; + +export const ADVANCED_SETTINGS_CODEC_MODE = { + automatic: 'automatic' as AdvancedSettingsCodecMode, + manual: 'manual' as AdvancedSettingsCodecMode, +}; + +export type AdvancedSettingsVideoCodec = 'vp8' | 'vp9' | 'h264'; + +export type AdvancedSettingsManualCodecOrder = [ + AdvancedSettingsVideoCodec, + AdvancedSettingsVideoCodec, + AdvancedSettingsVideoCodec, +]; + +export type AdvancedSettingsFrameRate = NonNullable< + import('@vonage/client-sdk-video').GetUserMediaProperties['frameRate'] +>; + +export type AdvancedSettingsResolution = Resolution; + +export type AdvancedSettingsAudioBitrateMode = 'automatic' | 'custom'; + +export const ADVANCED_SETTINGS_AUDIO_BITRATE_MODE = { + automatic: 'automatic' as AdvancedSettingsAudioBitrateMode, + custom: 'custom' as AdvancedSettingsAudioBitrateMode, +}; + +export type AdvancedSettingsCustomAudioBitrate = number; + +export type AdvancedSettingsSelectOption = { + value: TValue; + label: string; +}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx index c5097e05..46240185 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/AvatarInitials/AvatarInitials.tsx @@ -9,6 +9,7 @@ export type InitialsProps = { sx?: SxProps; height?: number; width?: number; + 'data-testid'?: string; }; /** @@ -29,11 +30,14 @@ const AvatarInitials = ({ sx = {}, height = 80, width = 80, + 'data-testid': dataTestId, }: InitialsProps): ReactElement => { const diameter = Math.min(height, width) * 0.5; return ( diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx index 874f9ca1..4ce68f1d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.spec.tsx @@ -48,6 +48,7 @@ function render(ui: ReactElement) { providers.session, providers.publisher, providers.backgroundPublisher, + providers.runtime, ]); return { diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx index d0c05602..870cfcaa 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectOptions/BackgroundEffectOptions.tsx @@ -1,6 +1,6 @@ import { ReactElement } from 'react'; +import classNames from 'classnames'; import Box from '@mui/material/Box'; -import useTheme from '@ui/theme'; import EffectOptionButtons from '../EffectOptionButtons/EffectOptionButtons'; import BackgroundGallery from '../BackgroundGallery/BackgroundGallery'; import { DEFAULT_SELECTABLE_OPTION_WIDTH } from '@utils/constants'; @@ -19,8 +19,6 @@ type BackgroundEffectOptionsProps = { * @returns {ReactElement} The background effect tabs component. */ const BackgroundEffectOptions = ({ mode }: BackgroundEffectOptionsProps): ReactElement => { - const theme = useTheme(); - return ( diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx index 3946aedb..e0585ac0 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.spec.tsx @@ -182,6 +182,7 @@ function render(ui: ReactElement) { providers.publisher, providers.backgroundPublisher, providers.previewPublisher, + providers.runtime, ]); const wrapper = composeProviders(SuspenseBoundary, roomWrapper); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx index b76aa716..75db6854 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/BackgroundEffects/BackgroundEffectsLayout/BackgroundEffectsLayout.tsx @@ -3,7 +3,6 @@ import { useTranslation } from 'react-i18next'; import useMediaQuery from '@mui/material/useMediaQuery'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; -import useTheme from '@ui/theme'; import usePublisherContext from '../../../hooks/usePublisherContext'; import BackgroundVideoContainer from '../BackgroundVideoContainer'; import BackgroundEffectOptions from '../BackgroundEffectOptions/BackgroundEffectOptions'; @@ -35,7 +34,6 @@ const BackgroundEffectsLayout = ({ mode, }: BackgroundEffectsLayoutProps): ReactElement | false => { const { t } = useTranslation(); - const theme = useTheme(); const isShortScreen = useMediaQuery('(max-height:825px)'); const publisherContext = usePublisherContext(); @@ -80,7 +78,7 @@ const BackgroundEffectsLayout = ({ ); diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx index 59355e23..b0adcb98 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LandingPageWelcome/LandingPageWelcome.tsx @@ -1,8 +1,8 @@ import { ReactElement } from 'react'; import { useTranslation } from 'react-i18next'; +import classNames from 'classnames'; import Box from '@mui/material/Box'; import Typography from '@mui/material/Typography'; -import useTheme from '@ui/theme'; /** * LandingPageWelcome Component @@ -11,7 +11,6 @@ import useTheme from '@ui/theme'; */ const LandingPageWelcome = (): ReactElement => { const { t } = useTranslation(); - const theme = useTheme(); const primaryWord = t('landing.primary.word'); const renderTitle = (titleKey: string) => { @@ -22,9 +21,10 @@ const LandingPageWelcome = (): ReactElement => { {text} @@ -42,10 +42,10 @@ const LandingPageWelcome = (): ReactElement => { }} > { ({ +vi.mock('@ui/VividIcon', () => ({ default: ({ name, customSize }: { name: string; customSize: number }) => (
{name} diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx index 892697af..795ab99a 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/frontend/src/components/LanguageSelector/LanguageSelector.tsx @@ -5,10 +5,9 @@ import MenuItem from '@mui/material/MenuItem'; import FormControl from '@mui/material/FormControl'; import Select from '@mui/material/Select'; import type { SelectChangeEvent } from '@mui/material/Select'; -import useTheme from '@ui/theme'; import { LanguageOption, LanguageSelectorProps } from './LanguageSelector.types'; import useIsSmallViewport from '../../hooks/useIsSmallViewport'; -import VividIcon from '../VividIcon/VividIcon'; +import VividIcon from '@ui/VividIcon'; import { env } from '../../env'; const languageOptions: LanguageOption[] = [ @@ -20,13 +19,23 @@ const languageOptions: LanguageOption[] = [ { code: 'es-MX', name: 'Español (México)', flag: 'flag-mexico' }, ]; -const ChevronIcon = ({ color, ...props }: { color: string } & Record) => ( - +const ChevronIcon = ({ className, ...props }: { className?: string } & Record) => ( + + + ); const SelectIconComponent = - (themeColor: string) => - (props: Record): ReactElement => ; + (_iconClassName: string) => + (props: Record): ReactElement => ; /** * LanguageSelector Component @@ -38,7 +47,6 @@ const SelectIconComponent = */ const LanguageSelector = ({ showFlag = true }: LanguageSelectorProps): ReactElement => { const { i18n } = useTranslation(); - const theme = useTheme(); const isSmallViewport = useIsSmallViewport(); const supportedLanguages = languageOptions.filter((option) => @@ -57,19 +65,9 @@ const LanguageSelector = ({ showFlag = true }: LanguageSelectorProps): ReactElem + ) { + transform$(actionKey, transform); + return middleware as VideoHandler; + }, + + /** + * Use this callback to completely override the handler of a specific action. + */ + override$< + ActionKey extends PublicActionKey, + Input = InputOf, + Output = Awaited>, + >( + actionKey: ActionKey, + handler: (opts: ProcedureResolverOptions) => Output | Promise + ) { + override$(actionKey, handler); + return middleware as VideoHandler; + }, + + use$, + + onSettled$, + + makeVideoClient$: (...args: Parameters) => { + return makeVideoClient$(...args); + }, + + router$, + }; + + return Object.assign(middleware, extensions); +} + +export default createVideoHandler; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts new file mode 100644 index 00000000..15cb1436 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoHandler/index.ts @@ -0,0 +1 @@ +export { default } from './createVideoHandler'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts new file mode 100644 index 00000000..92bead6b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.test.ts @@ -0,0 +1,718 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import express from 'express'; +import request from 'supertest'; +import { MediaMode, type SingleArchiveResponse, ArchiveMode } from '@vonage/video'; +import jwt from 'jsonwebtoken'; +import createVideoHandler from '../videoHandler/createVideoHandler'; +import { TokenRole } from '@api-lib/types'; + +const mockApiKey = 'test-api-key'; +const mockSessionId = '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE'; +const mockSessionKey = jwt.sign({ sessionId: mockSessionId }, mockApiKey, { algorithm: 'HS256' }); + +const h = vi.hoisted(() => ({ + createSessionSpy: vi.fn(), + startArchiveSpy: vi.fn(), + stopArchiveSpy: vi.fn(), + searchArchivesSpy: vi.fn(), + enableCaptionsSpy: vi.fn(), + disableCaptionsSpy: vi.fn(), + generateClientTokenSpy: vi.fn(() => 'mock-token-12345'), +})); + +vi.mock('@vonage/video', async () => { + const mockVideoModule = (await import('@node-test/helpers/mockVideoModule')).default; + const actual = await vi.importActual('@vonage/video'); + + return mockVideoModule(actual, () => ({ + Video: ({ spyOn }) => { + spyOn({ + createSession: h.createSessionSpy, + startArchive: h.startArchiveSpy, + stopArchive: h.stopArchiveSpy, + searchArchives: h.searchArchivesSpy, + enableCaptions: h.enableCaptionsSpy, + disableCaptions: h.disableCaptionsSpy, + generateClientToken: h.generateClientTokenSpy, + }); + }, + })); +}); + +beforeEach(() => { + h.createSessionSpy.mockReset(); + h.startArchiveSpy.mockReset(); + h.stopArchiveSpy.mockReset(); + h.searchArchivesSpy.mockReset(); + h.enableCaptionsSpy.mockReset(); + h.disableCaptionsSpy.mockReset(); + h.generateClientTokenSpy.mockReset(); + h.generateClientTokenSpy.mockReturnValue('mock-token-12345'); +}); + +describe('createVideoHandler', () => { + describe('createSession', () => { + it('should create a session successfully', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp(); + + const response = await request(app).post('/video/createSession').send({}).expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + sessionId: mockSessionId, + }); + + expect(h.createSessionSpy).toHaveBeenCalledWith(undefined); + }); + + it('should create a session and join it successfully', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp(); + + await request(app).post('/video/createSession').send({}).expect(200); + + const joinResponse = await request(app) + .post('/video/joinSession') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const joinData = extractResponseData(joinResponse.body); + + expect(joinData).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should create a session with custom options', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: '12.34.56.78', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp(); + + const customOptions = { + location: '12.34.56.78', + archiveMode: 'manual' as const, + }; + + await request(app) + .post('/video/createSession') + .send({ sessionOptions: customOptions }) + .expect(200); + + expect(h.createSessionSpy).toHaveBeenCalledWith(customOptions); + }); + + it('should return an error response when creating a session fails', async () => { + h.createSessionSpy.mockRejectedValue(new Error('Failed to create session on Vonage side')); + + const app = createTestApp(); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('decodeSessionId', () => { + it('should decode a valid sessionId via VideoClient method (not a TRPC route)', async () => { + const app = createTestApp(); + + const input = encodeURIComponent(JSON.stringify({ sessionId: mockSessionId })); + + // decodeSessionId is not exposed as a TRPC route + const response = await request(app).get(`/video/decodeSessionId?input=${input}`); + expect(response.status).toBeGreaterThanOrEqual(400); + }); + + it('should return an error response for invalid sessionId', async () => { + const app = createTestApp(); + + const input = encodeURIComponent(JSON.stringify({ sessionId: 'invalid-session-id' })); + + const response = await request(app).get(`/video/decodeSessionId?input=${input}`); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('joinSession', () => { + it('should join a session and return token', async () => { + const app = createTestApp(); + + const response = await request(app) + .post('/video/joinSession') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should join session with custom client token options', async () => { + const app = createTestApp(); + + const clientTokenOptions = { + role: TokenRole.PUBLISHER, + data: 'custom-data', + }; + + const response = await request(app) + .post('/video/joinSession') + .send({ + sessionKey: mockSessionKey, + clientTokenOptions, + }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + token: expect.any(String), + }); + }); + }); + + describe('startArchive', () => { + it('should start an archive successfully', async () => { + const mockArchive: SingleArchiveResponse = { + id: 'archive-id-123', + sessionId: mockSessionId, + name: 'test-archive', + status: 'started', + createdAt: Date.now(), + size: 0, + duration: 0, + hasAudio: true, + hasVideo: true, + outputMode: 'composed', + resolution: '640x480', + } as SingleArchiveResponse; + + h.startArchiveSpy.mockResolvedValue(mockArchive); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/startArchive') + .send({ + sessionKey: mockSessionKey, + archiveOptions: { name: 'test-archive' }, + }) + .expect(200); + + expect(h.startArchiveSpy).toHaveBeenCalledWith(mockSessionId, { + name: 'test-archive', + }); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + id: 'archive-id-123', + sessionId: mockSessionId, + name: 'test-archive', + }); + }); + + it('should return an error response when starting archive fails', async () => { + h.startArchiveSpy.mockRejectedValue(new Error('Failed to start archive')); + + const app = createTestApp(); + + const response = await request(app).post('/video/startArchive').send({ + sessionKey: mockSessionKey, + archiveOptions: {}, + }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('stopArchive', () => { + it('should stop an archive successfully', async () => { + const mockArchive: SingleArchiveResponse = { + id: 'archive-id-123', + sessionId: mockSessionId, + status: 'stopped', + } as SingleArchiveResponse; + + h.stopArchiveSpy.mockResolvedValue(mockArchive); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/stopArchive') + .send({ + sessionKey: mockSessionKey, + archiveId: 'archive-id-123', + }) + .expect(200); + + expect(h.stopArchiveSpy).toHaveBeenCalledWith('archive-id-123'); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + id: 'archive-id-123', + status: 'stopped', + }); + }); + + it('should return an error response when stopping archive fails', async () => { + h.stopArchiveSpy.mockRejectedValue(new Error('Failed to stop archive')); + + const app = createTestApp(); + + const response = await request(app).post('/video/stopArchive').send({ + sessionKey: mockSessionKey, + archiveId: 'archive-id-123', + }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('searchArchives', () => { + it('should search archives successfully', async () => { + const mockArchives = { + items: [ + { + id: 'archive-1', + sessionId: mockSessionId, + name: 'archive-1', + createdAt: Date.now(), + duration: 100, + hasAudio: true, + hasVideo: true, + outputMode: 'composed' as const, + resolution: '640x480', + status: 'available' as const, + size: 12345, + }, + { + id: 'archive-2', + sessionId: mockSessionId, + name: 'archive-2', + createdAt: Date.now(), + duration: 200, + hasAudio: true, + hasVideo: true, + outputMode: 'composed' as const, + resolution: '640x480', + status: 'available' as const, + size: 23456, + }, + ], + count: 2, + }; + + h.searchArchivesSpy.mockResolvedValue(mockArchives); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + expect(h.searchArchivesSpy).toHaveBeenCalledWith({ + sessionId: mockSessionId, + }); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + items: expect.arrayContaining([ + expect.objectContaining({ id: 'archive-1' }), + expect.objectContaining({ id: 'archive-2' }), + ]), + count: 2, + }); + }); + + it('should return an error response when searching archives fails', async () => { + h.searchArchivesSpy.mockRejectedValue(new Error('Failed to search archives')); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ sessionKey: mockSessionKey }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('enableCaptions', () => { + it('should enable captions successfully', async () => { + h.enableCaptionsSpy.mockResolvedValue({ + captionsId: 'caption-id-123', + }); + + const app = createTestApp(); + + await request(app) + .post('/video/enableCaptions') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + expect(h.enableCaptionsSpy).toHaveBeenCalledWith( + mockSessionId, + expect.any(String), + undefined + ); + }); + + it('should enable captions with custom options', async () => { + h.enableCaptionsSpy.mockResolvedValue({ + captionsId: 'caption-id-456', + }); + + const app = createTestApp(); + + const captionOptions = { + languageCode: 'en-US', + maxDuration: 300, + partialCaptions: 'false' as const, + statusCallbackUrl: 'https://example.com/callback', + }; + + await request(app) + .post('/video/enableCaptions') + .send({ + sessionKey: mockSessionKey, + captionOptions, + }) + .expect(200); + + expect(h.enableCaptionsSpy).toHaveBeenCalledWith( + mockSessionId, + expect.any(String), + captionOptions + ); + }); + + it('should return an error response when enabling captions fails', async () => { + h.enableCaptionsSpy.mockRejectedValue(new Error('Failed to enable captions')); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/enableCaptions') + .send({ sessionKey: mockSessionKey }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('ensureCaptionsEnabled', () => { + it('should ensure captions are enabled, treat idempotent failures as success, and fail when session does not exist', async () => { + expect.assertions(6); + + const app = createTestApp(); + const requestEnsureCaptionsEnabled = () => { + return request(app) + .post('/video/ensureCaptionsEnabled') + .send({ sessionKey: mockSessionKey }); + }; + + h.enableCaptionsSpy + .mockResolvedValueOnce({ captionsId: 'caption-id-789' }) + .mockRejectedValueOnce(new Error('Live captions have already started for this session')) + .mockRejectedValueOnce(new Error('Session does not exist')); + + const successfulResponse = await requestEnsureCaptionsEnabled().expect(200); + const alreadyStartedResponse = await requestEnsureCaptionsEnabled().expect(200); + const missingSessionResponse = await requestEnsureCaptionsEnabled(); + + expect(missingSessionResponse.status).toBeGreaterThanOrEqual(400); + expect(missingSessionResponse.body.error).toBeDefined(); + expect(h.enableCaptionsSpy).toHaveBeenCalledTimes(3); + expect(h.enableCaptionsSpy).toHaveBeenCalledWith( + mockSessionId, + expect.any(String), + undefined + ); + + const successfulData = extractResponseData<{ captionsId: string | null }>( + successfulResponse.body + ); + + const alreadyStartedData = extractResponseData<{ captionsId: string | null }>( + alreadyStartedResponse.body + ); + + expect(successfulData).toMatchObject({ captionsId: 'caption-id-789' }); + expect(alreadyStartedData).toMatchObject({ captionsId: null }); + }); + }); + + describe('disableCaptions', () => { + it('should disable captions successfully', async () => { + h.disableCaptionsSpy.mockResolvedValue(undefined); + + const app = createTestApp(); + + await request(app) + .post('/video/disableCaptions') + .send({ + sessionKey: mockSessionKey, + captionsId: 'caption-id-123', + }) + .expect(200); + + expect(h.disableCaptionsSpy).toHaveBeenCalledWith('caption-id-123'); + }); + + it('should return an error response when disabling captions fails', async () => { + h.disableCaptionsSpy.mockRejectedValue(new Error('Failed to disable captions')); + + const app = createTestApp(); + + const response = await request(app).post('/video/disableCaptions').send({ + sessionKey: mockSessionKey, + captionsId: 'caption-id-123', + }); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('error handling', () => { + it('should format errors in the response body', async () => { + h.createSessionSpy.mockRejectedValue(new Error('Vonage API error: Unauthorized')); + + const app = createTestApp(); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + expect(response.body.error).toBeDefined(); + }); + }); + + describe('onSettled$', () => { + it('should execute global onSettled after createSession success', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const onSettledSpy = vi.fn(); + const app = createTestApp((videoHandler) => { + videoHandler.onSettled$(onSettledSpy); + }); + + await request(app).post('/video/createSession').send({}).expect(200); + + expect(onSettledSpy).toHaveBeenCalledTimes(1); + expect(onSettledSpy).toHaveBeenCalledWith( + expect.objectContaining({ + videoAction: 'createSession', + error: null, + result: expect.objectContaining({ sessionId: mockSessionId }), + }) + ); + }); + + it('should execute action onSettled when createSession fails', async () => { + h.createSessionSpy.mockRejectedValue(new Error('Failed to create session in onSettled test')); + + const onSettledSpy = vi.fn(); + const app = createTestApp((videoHandler) => { + videoHandler.onSettled$('createSession', onSettledSpy); + }); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + expect(onSettledSpy).toHaveBeenCalledTimes(1); + expect(onSettledSpy).toHaveBeenCalledWith( + expect.objectContaining({ + videoAction: 'createSession', + result: null, + error: expect.any(Error), + }) + ); + + const settledCall = onSettledSpy.mock.calls[0]?.[0] as { error: Error }; + expect(settledCall.error.message).toContain('Failed to create session'); + }); + }); + + describe('use$', () => { + it('should allow middleware to transform createSession input', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp((videoHandler) => { + videoHandler.use$('createSession', ({ input, next }) => { + const baseInput = (input ?? {}) as Record; + + return next({ + input: { + ...baseInput, + sessionOptions: { + location: '12.34.56.78', + archiveMode: ArchiveMode.MANUAL, + }, + }, + }); + }); + }); + + await request(app).post('/video/createSession').send({}).expect(200); + + expect(h.createSessionSpy).toHaveBeenCalledWith({ + location: '12.34.56.78', + archiveMode: 'manual', + }); + }); + + it('should fail when middleware does not return next()', async () => { + h.createSessionSpy.mockResolvedValue({ + sessionId: mockSessionId, + location: 'US', + mediaMode: MediaMode.ROUTED, + archiveMode: 'manual', + }); + + const app = createTestApp((videoHandler) => { + videoHandler.use$('createSession', () => { + return {} as never; + }); + }); + + const response = await request(app).post('/video/createSession').send({}); + + expect(response.status).toBeGreaterThanOrEqual(400); + }); + }); + + describe('TRPC client compatibility', () => { + it('should accept mutations with TRPC json-wrapped body', async () => { + const app = createTestApp(); + + const response = await request(app) + .post('/video/joinSession') + .send({ json: { sessionKey: mockSessionKey } }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should accept mutations with raw body', async () => { + const app = createTestApp(); + + const response = await request(app) + .post('/video/joinSession') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + location: expect.any(String), + token: expect.any(String), + }); + }); + + it('should accept mutations with TRPC json-wrapped body for searchArchives', async () => { + h.searchArchivesSpy.mockResolvedValue({ items: [], count: 0 }); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ json: { sessionKey: mockSessionKey } }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + items: expect.any(Array), + count: 0, + }); + }); + + it('should accept mutations with raw body for searchArchives', async () => { + h.searchArchivesSpy.mockResolvedValue({ items: [], count: 0 }); + + const app = createTestApp(); + + const response = await request(app) + .post('/video/searchArchives') + .send({ sessionKey: mockSessionKey }) + .expect(200); + + const data = extractResponseData(response.body); + + expect(data).toMatchObject({ + items: expect.any(Array), + count: 0, + }); + }); + }); +}); + +function createTestApp( + setupHandler?: (videoHandler: ReturnType) => void +) { + const app = express(); + + const handler = createVideoHandler({ + auth: { + authType: 'apiKey', + apiKey: mockApiKey, + apiSecret: 'test-api-secret', + }, + }); + + if (setupHandler) { + setupHandler(handler); + } + + app.use('/video', handler); + + return app; +} + +/** + * Extracts the response data from the TRPC JSON response body. + */ +function extractResponseData(body: unknown): T { + return (body as { result: { data: T } }).result.data; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts new file mode 100644 index 00000000..d90c63fb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/createVideoRouter.ts @@ -0,0 +1,670 @@ +import { initTRPC, TRPCBuilder, type AnyMutationProcedure } from '@trpc/server'; +import { + assertVideoRouterConfig, + CreateSessionAndJoinPayloadSchema, + JoinSessionPayloadSchema, + type VideoRouterConfig, +} from '@api-lib/schemas'; +import { VideoClient } from '@api-lib/core'; +import type { HandlerConfig, HandlersConfig, HandlersDefaults } from '@api-lib/types'; +import { VideoAction } from '@api-lib/types'; +import { Any, Prettify } from '@common/types'; +import { makeBadRequestErrorHandler, makeInternalErrorHandler } from '@api-lib/errors'; +import { toTRPCError } from '@api-lib/errors/helpers'; +import { schemasByAction } from '@api-lib/constants'; +import { assertResult, tryCatch } from '@common/execution'; +import { isFunction } from '@common/assertions'; + +export const OKAY = Symbol('OKAY'); + +const OKAY_RESULT = { [OKAY]: true } as NextResult; + +function createVideoRouter< + TContext extends Record, + TMeta extends object, + Context extends { + videoClient: VideoClient; + } = Prettify< + TContext & { + videoClient: VideoClient; + } + >, +>(routerConfig: VideoRouterConfig) { + assertVideoRouterConfig(routerConfig); + + const { auth, videoParams, routerOptions, handlersConfig } = routerConfig; + + const handlersDefaults: HandlersDefaults = Object.fromEntries( + Object.entries(handlersConfig ?? {}).map(([action, config]) => [action, config?.addDefaults]) + ); + + const trpcRoot = (initTRPC as unknown as TRPCBuilder).create({ + errorFormatter: ({ error: unsafeError }) => { + const error = makeInternalErrorHandler('An internal error occurred')( + unsafeError.cause ?? unsafeError + ); + + return toTRPCError(error); + }, + ...routerOptions, + }); + + // prettify is necessary to hide the internal TRPC types and prevent d.ts errors. + type TRPCRouter = Prettify; + + type Middleware = Parameters[0]; + + /** + * These maps are used to store the custom logic added by the transform$, override$ and use$ callbacks. + * The keys are the action names and the values are the corresponding callbacks. + * When a request is made, we check if there's a custom callback for the action and execute it if it exists. + */ + const transforms = new Map unknown>(); + const overrides = new Map< + PublicActionKey, + (opts: ProcedureResolverOptions) => Any + >(); + + const middlewaresPerAction = new Map< + PublicActionKey | null, + ((opts: CustomMiddlewareParameters) => NextResult | Promise)[] + >(); + + const settledPerAction = new Map< + PublicActionKey | null, + ((opts: OnSettledParameters) => void | Promise)[] + >(); + + const tryAssertInput = ( + actionKey: ActionKey, + input: unknown + ) => { + return assertResult( + () => schemasByAction[actionKey].parse(input), + makeBadRequestErrorHandler(`Invalid input for action ${actionKey}`) + ); + }; + + const setupPipeline: Middleware = async (opts) => { + const { ctx, next } = opts; + + if (!ctx.videoClient) ctx.videoClient = makeVideoClient$(); + + const actionKey = extractProcedureKey(opts.path); + const globalMiddlewares = middlewaresPerAction.get(null) ?? []; + const actionMiddlewares = middlewaresPerAction.get(actionKey) ?? []; + const middlewares = [...globalMiddlewares, ...actionMiddlewares]; + + if (!middlewares.length) return next(); + + try { + const rawInput = await opts.getRawInput(); + const unwrappedInput = unwrapTrpcInput(rawInput); + + const args = Object.assign(opts, { + input: unwrappedInput, + assertInput: (input: unknown) => tryAssertInput(actionKey, input), + next: innerNextFn, + videoAction: actionKey, + videoClient: ctx.videoClient, + }) as CustomMiddlewareParameters; + + function innerNextFn(opts$?: InnerNextParameters): NextResult { + if (!opts$) return OKAY_RESULT; + + if (opts$.ctx) { + args.ctx = { + ...args.ctx, + ...opts$.ctx, + }; + } + + if (Object.hasOwn(opts$, 'input')) { + args.input = opts$.input; + } + + return OKAY_RESULT; + } + + for (const middleware of middlewares) { + const result = await middleware(args); + + if (!result[OKAY]) { + throw makeInternalErrorHandler( + `Middleware for action ${actionKey} did not return next()` + )(null); + } + } + + return next({ + getRawInput: () => Promise.resolve(args.input), + }); + } catch (error) { + throw makeInternalErrorHandler(`Failed to initialize pipeline for action ${actionKey}`)( + error + ); + } + }; + + // We used callbacks to easily track the videoClient methods and their types + const router = trpcRoot.router({ + createSession: makeMutation({ + key: VideoAction.createSession, + config: handlersConfig?.createSession, + callback: (videoClient, input) => { + return videoClient.createSession(input); + }, + }), + + startArchive: makeMutation({ + key: VideoAction.startArchive, + config: handlersConfig?.startArchive, + callback: (videoClient, input) => { + return videoClient.startArchive(input); + }, + }), + + stopArchive: makeMutation({ + key: VideoAction.stopArchive, + config: handlersConfig?.stopArchive, + callback: (videoClient, input) => { + return videoClient.stopArchive(input); + }, + }), + + searchArchives: makeMutation({ + key: VideoAction.searchArchives, + config: handlersConfig?.searchArchives, + callback: (videoClient, input) => { + return videoClient.searchArchives(input); + }, + }), + + enableCaptions: makeMutation({ + key: VideoAction.enableCaptions, + config: handlersConfig?.enableCaptions, + callback: (videoClient, input) => { + return videoClient.enableCaptions(input); + }, + }), + + ensureCaptionsEnabled: makeMutation({ + key: VideoAction.ensureCaptionsEnabled, + config: handlersConfig?.enableCaptions, + callback: (videoClient, input) => { + return videoClient.ensureCaptionsEnabled(input); + }, + }), + + disableCaptions: makeMutation({ + key: VideoAction.disableCaptions, + config: handlersConfig?.disableCaptions, + callback: (videoClient, input) => { + return videoClient.disableCaptions(input); + }, + }), + + joinSession: makeMutation({ + key: VideoAction.joinSession, + config: { + transformInput: (opts) => { + // potentially allow extra properties as long as the basic schema is valid + const { + clientTokenOptions: { + // remove sensitive options from the input + role: _role, + expireTime: _expireTime, + + ...clientTokenOptions + } = {}, + ...rest + } = JoinSessionPayloadSchema.loose().parse(opts.input); + + const input = { + ...rest, + clientTokenOptions, + }; + + return handlersConfig?.joinSession?.transformInput?.({ ...opts, input }) ?? input; + }, + defaults: handlersConfig?.joinSession?.addDefaults, + }, + callback: (videoClient, input) => { + return videoClient.joinSession(input); + }, + }), + + createSessionAndJoin: makeMutation({ + key: VideoAction.createSessionAndJoin, + config: { + transformInput: (opts) => { + // potentially allow extra properties as long as the basic schema is valid + const { + clientTokenOptions: { + // remove sensitive options from the input + role: _role, + expireTime: _expireTime, + + ...clientTokenOptions + } = {}, + ...rest + } = CreateSessionAndJoinPayloadSchema.loose().optional().parse(opts.input) ?? {}; + + const input = { + ...rest, + clientTokenOptions, + }; + + return ( + handlersConfig?.createSessionAndJoin?.transformInput?.({ ...opts, input }) ?? input + ); + }, + + /** + * Combines the defaults of createSession and joinSession handlers + */ + addDefaults: (() => { + if (handlersConfig?.createSessionAndJoin?.addDefaults) { + return handlersConfig.createSessionAndJoin.addDefaults; + } + + if (!handlersConfig?.createSession && !handlersConfig?.joinSession) { + return undefined; + } + + const createSessionDefaults = ( + isFunction(handlersConfig?.createSession?.addDefaults) + ? handlersConfig.createSession.addDefaults + : (payload: unknown) => payload + ) as (payload: unknown) => Record; + + const joinSessionDefaults = ( + isFunction(handlersConfig?.joinSession?.addDefaults) + ? handlersConfig.joinSession.addDefaults + : (payload: unknown) => payload + ) as (payload: unknown) => Record; + + return (input) => ({ + ...input, + ...(createSessionDefaults(input) ?? {}), + ...(joinSessionDefaults(input) ?? {}), + }); + })() as HandlersConfig['createSessionAndJoin']['addDefaults'], + }, + callback: async (videoClient, input) => { + return videoClient.createSessionAndJoin(input); + }, + }), + }) satisfies IVideoRouterContract; + + function unwrapTrpcInput(rawInput: unknown): unknown { + if ( + rawInput && + typeof rawInput === 'object' && + 'json' in rawInput && + Object.keys(rawInput).length === 1 + ) { + return (rawInput as { json: unknown }).json; + } + + return rawInput; + } + + function makeInput< + ActionKey extends PublicActionKey, + Config extends HandlerConfig, Parameters[0]>, + >(videoAction: ActionKey, config: Config | undefined) { + type Input = Parameters[0]; + + // input validation is performed by video videoClient handlers + // trpc requires an input schema to parse the request body, so we provide dummy parser with the correct type + const parser = (input: unknown): Input => { + if (!config?.transformInput) return input as Input; + + return config.transformInput({ + input, + assertInput: (val: unknown) => tryAssertInput(videoAction, val), + }) as Input; + }; + + const input = trpcRoot.procedure.use(setupPipeline).input(async (rawInput) => { + try { + const unwrappedInput = unwrapTrpcInput(rawInput); + const transform = transforms.get(videoAction); + if (transform) return parser(await transform(unwrappedInput)); + + return parser(unwrappedInput); + } catch (error) { + throw makeInternalErrorHandler(`Failed to parse input for action ${videoAction}`)(error); + } + }); + + return { input, parser }; + } + + function makeMutation< + ActionKey extends PublicActionKey, + Action extends ( + videoClient: VideoClient, + input: Parameters[0] + ) => ReturnType, + Config extends HandlerConfig, Parameters[0]>, + >({ key, callback, config }: { key: ActionKey; callback: Action; config: Config | undefined }) { + const { input, parser } = makeInput(key, config); + + return input.mutation(async (opts) => { + const handleSettledError = makeInternalErrorHandler((error) => ({ + fallbackMessage: `Failed to execute onSettled$ for action ${key}`, + issues: [ + !error + ? 'The action executed successfully, but the onSettled$ callback threw an error.' + : 'The action threw an error, and the onSettled$ callback also threw.', + ], + })); + + const executeOnSettledAndResolve = async ({ + result, + error, + didFail, + }: { + result: unknown; + error: unknown; + didFail: boolean; + }): Promise> => { + const globalSettled = settledPerAction.get(null) ?? []; + const actionSettled = settledPerAction.get(key) ?? []; + + // onSettled$ callbacks execute here — after the action, before responding to the client. + // Runs even if the action threw an error. If a callback throws, it is wrapped and re-thrown, + // preventing the response from being sent. + for (const settled of [...globalSettled, ...actionSettled]) { + await Promise.resolve( + settled({ + result, + error, + ctx: opts.ctx as Context, + videoAction: key as unknown as VideoAction, + input, + }) + ).catch((settledError: unknown) => { + throw handleSettledError(settledError); + }); + } + + if (didFail) throw error; + + return result as ReturnType; + }; + + try { + const override = overrides.get(key); + + if (override) { + const args = Object.assign(opts, { + assertInput: (input: unknown) => tryAssertInput(key, input), + videoClient: opts.ctx.videoClient, + }) as ProcedureResolverOptions; + + const { result, error, didFail } = await tryCatch( + () => override(args) as ReturnType + ); + + return executeOnSettledAndResolve({ result, error, didFail }); + } + + const input = parser(opts.input) as Parameters[0]; + + const onSettleArgs = await tryCatch(() => callback(opts.ctx.videoClient, input)); + + const result = await executeOnSettledAndResolve(onSettleArgs); + + return result as ReturnType; + } catch (error) { + throw makeInternalErrorHandler(`Failed to execute mutation ${key}`)(error); + } + }); + } + + function extractProcedureKey(path: string): PublicActionKey { + const i = path.lastIndexOf('.'); + return (i === -1 ? path : path.slice(i + 1)) as PublicActionKey; + } + + function makeVideoClient$() { + return new VideoClient({ + auth, + videoParams, + handlersDefaults, + }); + } + + /** + * Use this callback to run custom code before the original handlers, for example to implement custom authorization logic. + * + * @example Middleware for all actions + * ```ts + * videoHandler.use$(async ({ videoAction, ctx, input, next }) => { + * ... + * }); + * ``` + */ + function use$( + this: typeof extensions, + middleware: (opts: CustomMiddlewareParameters) => NextResult | Promise + ): typeof extensions; + + /** + * Use this callback to run custom code before the original handlers, for example to implement custom authorization logic. + * + * @example Middleware for a specific action + * ```ts + * videoHandler.use$('joinSession', async ({ ctx, input, next }) => { + * ... + * }); + * ``` + */ + function use$>( + this: typeof extensions, + actionKey: ActionKey, + handler: (opts: CustomMiddlewareParameters) => NextResult | Promise + ): typeof extensions; + + function use$( + this: typeof extensions, + arg1: + | ActionKey + | ((opts: CustomMiddlewareParameters) => NextResult | Promise), + arg2?: (opts: CustomMiddlewareParameters) => NextResult | Promise + ) { + const actionKey = arg2 ? (arg1 as ActionKey) : null; + const handler = (arg2 ?? arg1) as ( + opts: CustomMiddlewareParameters + ) => NextResult | Promise; + + let middlewares = middlewaresPerAction.get(actionKey); + if (!middlewares) middlewaresPerAction.set(actionKey, (middlewares = [])); + + middlewares.push( + handler as ( + opts: CustomMiddlewareParameters + ) => NextResult | Promise + ); + + return this; + } + + function onSettled$( + this: typeof extensions, + handler: (opts: OnSettledParameters) => void | Promise + ): typeof extensions; + + function onSettled$< + ActionKey extends PublicActionKey, + Output = OutputOf, + Input = InputOf, + >( + this: typeof extensions, + actionKey: ActionKey, + handler: (opts: OnSettledParameters) => void | Promise + ): typeof extensions; + + function onSettled$( + this: typeof extensions, + arg1: ActionKey | ((opts: OnSettledParameters) => void | Promise), + arg2?: (opts: OnSettledParameters) => void | Promise + ) { + const actionKey = arg2 ? (arg1 as ActionKey) : null; + const handler = (arg2 ?? arg1) as ( + opts: OnSettledParameters + ) => void | Promise; + + let settled = settledPerAction.get(actionKey); + if (!settled) settledPerAction.set(actionKey, (settled = [])); + + settled.push(handler); + + return this; + } + + const extensions = { + /** + * Use this callback if you need to transform the raw input before it's evaluated by the handlers, + * For example adding extra properties to the input + */ + transform$>( + actionKey: ActionKey, + transform: (input: unknown) => Input | Promise + ) { + transforms.set(actionKey, transform); + return extensions; + }, + + /** + * Use this callback to completely override the handler of a specific action. + */ + override$< + ActionKey extends PublicActionKey, + Input = InputOf, + Output = Awaited>, + >( + actionKey: ActionKey, + handler: (opts: ProcedureResolverOptions) => Output | Promise + ) { + overrides.set(actionKey, handler); + return extensions; + }, + + /** + * Use this callback to run custom code before the original handlers, for example to implement custom authorization logic. + */ + use$, + + /** + * Use this callback to run custom code after the action executes but before the response is sent. + * Receives both the result and any error from the action, runs even if the action threw. + * Errors thrown inside onSettled$ callbacks will propagate and prevent the response from being sent. + * + * @example For all actions + * ```ts + * videoHandler.onSettled$(({ videoAction, input, result, error }) => { ... }); + * ``` + * + * @example For a specific action + * ```ts + * videoHandler.onSettled$('createSession', ({ input, result, error }) => { ... }); + * ``` + */ + onSettled$, + + /** + * Make a vonage client instance with the configuration provided to the router. + */ + makeVideoClient$, + } as const; + + return Object.assign(router as TRPCRouter, extensions); +} + +export type IVideoRouter = ReturnType; + +type IVideoRouterContract = { + // exclude private handlers + [K in Exclude<`${VideoAction}`, 'createEphemeralToken'>]: AnyMutationProcedure; +}; + +export type PublicActionKey = keyof IVideoRouterContract; + +export type AsActionKey = T extends VideoAction ? T : never; + +export type NextResult = { + [OKAY]: true; +}; + +export type ProcedureResolverOptions< + Input, + Context extends { + videoClient: VideoClient; + }, +> = { + ctx: Context; + path: string; + signal: AbortSignal | undefined; + batchIndex?: number | undefined; + input: unknown; + + /** + * Use this function to validate the input against the Zod schema for the given action. It will throw a TRPCError with code 'BAD_REQUEST' if the validation fails. + * + * @example + * ```ts + * const { assertInput } = opts; + * const input = assertInput(opts.input); // input is now correctly typed and validated + * ``` + */ + assertInput(input: unknown): Input; + + /** + * Contains known video client methods + */ + videoClient: VideoClient; +}; + +export type InnerNextFn = { + (): NextResult; + + (opts: { ctx?: Context; input?: Input }): NextResult; +}; + +export type InnerNextParameters = Parameters< + InnerNextFn +>[0]; + +export type CustomMiddlewareParameters< + Result, + Context extends { videoClient: VideoClient }, +> = Prettify< + ProcedureResolverOptions & { + next: InnerNextFn; + videoAction: VideoAction; + } +>; + +export type InputOf = Parameters[0]; + +export type OutputOf = Awaited< + ReturnType +>; + +export type OnSettledParameters< + Output, + Input, + Context extends { videoClient: VideoClient }, +> = Prettify<{ + videoAction: VideoAction; + input: Input; + result: Output | null; + error: unknown; + ctx: Context; +}>; + +export default createVideoRouter; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts new file mode 100644 index 00000000..24ec6623 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/routing/videoRouter/index.ts @@ -0,0 +1,2 @@ +export { default } from './createVideoRouter'; +export * from './createVideoRouter'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts new file mode 100644 index 00000000..9b8189d8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACL.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import type { ACL } from '@vonage/jwt'; +import ACLRuleSchema from './ACLRule.schema'; + +export const ACLSchema = z.object({ + paths: z.record(z.string(), ACLRuleSchema), +}) satisfies z.ZodType; + +export default ACLSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts new file mode 100644 index 00000000..956a5c2b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ACLRule.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import type { ACLRule } from '@vonage/jwt'; + +export const ACLRuleSchema = z.object({ + methods: z.array(z.enum(['POST', 'PUT', 'PATCH', 'GET', 'DELETE'])).optional(), + filters: z.record(z.string(), z.unknown()).optional(), +}) satisfies z.ZodType; + +export default ACLRuleSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts new file mode 100644 index 00000000..a4e45236 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AlgorithmTypes.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { AlgorithmTypes } from '@vonage/auth'; + +export const AlgorithmTypesSchema = z.enum(AlgorithmTypes) satisfies z.ZodType; + +export default AlgorithmTypesSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts new file mode 100644 index 00000000..78149be8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ArchiveSearchFilter.schema.ts @@ -0,0 +1,20 @@ +import type { ArchiveSearchFilter } from '@vonage/video'; +import z from 'zod'; + +/** + * Schema for filtering archive search results + */ +export const ArchiveSearchFilterSchema = z.object({ + /** + * The start offset in the list of existing archives. + */ + offset: z.number().int().nonnegative().optional(), + + /** + * The number of archives to retrieve starting at the offset. + * Default is 50, with a maximum of 1000. + */ + count: z.number().int().min(1).max(1000).optional(), +}) satisfies z.ZodType; + +export default ArchiveSearchFilterSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts new file mode 100644 index 00000000..8ad4d4c2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/AuthParams.schema.ts @@ -0,0 +1,40 @@ +import { z } from 'zod'; +import type { AuthParams as AuthParamsVonage } from '@vonage/auth'; +import SignedHashParamsSchema from './SignedHashParams.schema'; +import GeneratorOptionsSchema from './GeneratorOptions.schema'; + +/** + * We use our own AuthParams to force using a discriminated union which avoids confusion around which fields are required for each auth type + */ +export type AuthParams = z.infer; + +const ApiKeyAuthSchema = z.object({ + authType: z.literal('apiKey'), + apiKey: z.string(), + apiSecret: z.string(), +}); + +const JwtAuthSchema = z.object({ + authType: z.literal('jwt'), + applicationId: z.string(), + privateKey: z.union([z.string(), z.instanceof(Buffer)]), + jwtOptions: GeneratorOptionsSchema.optional(), +}); + +const SignatureAuthSchema = z.object({ + authType: z.literal('signature'), + apiKey: z.string(), + signature: SignedHashParamsSchema, +}); + +export const AuthParamsSchema = z.discriminatedUnion('authType', [ + ApiKeyAuthSchema, + JwtAuthSchema, + SignatureAuthSchema, +]) satisfies z.ZodType; + +export function assertAuthParams(params: unknown): asserts params is AuthParams { + AuthParamsSchema.parse(params); +} + +export default AuthParamsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts new file mode 100644 index 00000000..873299df --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CaptionOptions.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import type { CaptionOptions } from '@vonage/video'; + +export const CaptionOptionsSchema = z.object({ + languageCode: z.string().optional(), + maxDuration: z.number().optional(), + partialCaptions: z.enum(['true', 'false']).optional(), + statusCallbackUrl: z.string().optional(), +}) satisfies z.ZodType; + +export default CaptionOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts new file mode 100644 index 00000000..f5d34f90 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ClientTokenOptions.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import type { ClientTokenOptions } from '@vonage/video'; + +export const ClientTokenOptionsSchema = z.object({ + role: z.string().optional(), + data: z.string().optional(), + expireTime: z.number().optional(), + initialLayoutClassList: z.array(z.string()).optional(), +}) satisfies z.ZodType; + +export default ClientTokenOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts new file mode 100644 index 00000000..20880296 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ConfigParams.schema.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import type { ConfigParams } from '@vonage/server-client'; +import ResponseTypesSchema from './ResponseTypes.schema'; + +export const ConfigParamsSchema = z.object({ + restHost: z.string().optional(), + apiHost: z.string().optional(), + videoHost: z.string().optional(), + responseType: ResponseTypesSchema.optional(), + timeout: z.number().optional(), + meetingsHost: z.string().optional(), + appendUserAgent: z.string().optional(), +}) satisfies z.ZodType; + +export default ConfigParamsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts new file mode 100644 index 00000000..065e926b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateEphemeralTokenPayload.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import ClientTokenOptionsSchema from './ClientTokenOptions.schema'; + +export const CreateEphemeralTokenPayloadSchema = VideoPayloadSchema.extend({ + clientTokenOptions: ClientTokenOptionsSchema.optional(), +}); + +export type CreateEphemeralTokenPayload = z.infer; + +export default CreateEphemeralTokenPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts new file mode 100644 index 00000000..74c44749 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionAndJoinPayload.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import CreateSessionPayloadSchema from './CreateSessionPayload.schema'; +import ClientTokenOptionsSchema from './ClientTokenOptions.schema'; + +export const CreateSessionAndJoinPayloadSchema = CreateSessionPayloadSchema.extend({ + clientTokenOptions: ClientTokenOptionsSchema.optional(), +}); + +export type CreateSessionAndJoinPayload = z.infer; + +export default CreateSessionAndJoinPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts new file mode 100644 index 00000000..7b1a60c4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/CreateSessionPayload.schema.ts @@ -0,0 +1,18 @@ +import z from 'zod'; +import SessionOptionsSchema from './SessionOptions.schema'; +import { RoomNameSchema } from '@common/schemas'; + +export const CreateSessionPayloadSchema = z.object({ + roomName: RoomNameSchema.optional().nullable(), + sessionOptions: SessionOptionsSchema.optional(), +}); + +export type CreateSessionPayload = z.infer; + +export function assertCreateSessionPayload( + payload: unknown +): asserts payload is CreateSessionPayload { + CreateSessionPayloadSchema.parse(payload); +} + +export default CreateSessionPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts new file mode 100644 index 00000000..fd81b7c0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DecodeSessionIdPayload.schema.ts @@ -0,0 +1,14 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const DecodeSessionIdPayloadSchema = VideoPayloadSchema; + +export type DecodeSessionIdPayload = z.infer; + +export function assertDecodeSessionIdPayload( + payload: unknown +): asserts payload is DecodeSessionIdPayload { + DecodeSessionIdPayloadSchema.parse(payload); +} + +export default DecodeSessionIdPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts new file mode 100644 index 00000000..a58ed5bf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/DisableCaptionsPayload.schema.ts @@ -0,0 +1,10 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const DisableCaptionsPayloadSchema = VideoPayloadSchema.extend({ + captionsId: z.string(), +}); + +export type DisableCaptionsPayload = z.infer; + +export default DisableCaptionsPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts new file mode 100644 index 00000000..dc5748cb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/EnableCaptionsPayload.schema.ts @@ -0,0 +1,11 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import CaptionOptionsSchema from './CaptionOptions.schema'; + +export const EnableCaptionsPayloadSchema = VideoPayloadSchema.extend({ + captionOptions: CaptionOptionsSchema.optional(), +}); + +export type EnableCaptionsPayload = z.infer; + +export default EnableCaptionsPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts new file mode 100644 index 00000000..df2e3c3f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/GeneratorOptions.schema.ts @@ -0,0 +1,18 @@ +import { z } from 'zod'; +import type { GeneratorOptions } from '@vonage/jwt'; +import ACLSchema from './ACL.schema'; + +export const GeneratorOptionsSchema = z + .object({ + ttl: z.number().optional(), + issued_at: z.number().optional(), + subject: z.string().optional(), + jti: z.string().optional(), + notBefore: z.number().optional(), + acl: ACLSchema.optional(), + key: z.string().optional(), + exp: z.number().optional(), + }) + .catchall(z.unknown()) satisfies z.ZodType; + +export default GeneratorOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts new file mode 100644 index 00000000..cff427a4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/JoinSessionPayload.schema.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import ClientTokenOptionsSchema from './ClientTokenOptions.schema'; + +export const JoinSessionPayloadSchema = VideoPayloadSchema.extend({ + clientTokenOptions: ClientTokenOptionsSchema.optional(), +}); + +export type JoinSessionPayload = z.infer; + +export function assertJoinSessionPayload(payload: unknown): asserts payload is JoinSessionPayload { + JoinSessionPayloadSchema.parse(payload); +} + +export default JoinSessionPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts new file mode 100644 index 00000000..daa9d129 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ListArchivesPayload.schema.ts @@ -0,0 +1,8 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const SearchArchivesPayloadSchema = VideoPayloadSchema; + +export type SearchArchivesPayload = z.infer; + +export default SearchArchivesPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts new file mode 100644 index 00000000..5fc4914b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/Metadata.schema.ts @@ -0,0 +1,7 @@ +import z from 'zod'; + +export const MetadataSchema = z.object({}).loose().optional(); + +export type Metadata = z.infer; + +export default MetadataSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts new file mode 100644 index 00000000..bb7806ac --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/ResponseTypes.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { ResponseTypes } from '@vonage/vetch'; + +export const ResponseTypesSchema = z.enum(ResponseTypes) satisfies z.ZodType; + +export default ResponseTypesSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts new file mode 100644 index 00000000..6d71b5cc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SearchArchivesPayload.schema.ts @@ -0,0 +1,14 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import ArchiveSearchFilterSchema from './ArchiveSearchFilter.schema'; + +export const SearchArchivesPayloadSchema = VideoPayloadSchema.omit({ + sessionKey: true, +}).extend({ + ...ArchiveSearchFilterSchema.shape, + sessionKey: VideoPayloadSchema.shape.sessionKey.optional(), +}); + +export type SearchArchivesPayload = z.infer; + +export default SearchArchivesPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts new file mode 100644 index 00000000..90587bab --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionOptions.schema.ts @@ -0,0 +1,16 @@ +import { z } from 'zod'; +import { ArchiveModeSchema, MediaModeSchema } from '@node/schemas'; + +export const SessionOptionsSchema = z.object({ + archiveMode: ArchiveModeSchema.optional(), + location: z.string().optional(), + mediaMode: MediaModeSchema.optional(), +}); + +export type SessionOptions = z.infer; + +export function assertSessionOptions(options: unknown): asserts options is SessionOptions { + SessionOptionsSchema.parse(options); +} + +export default SessionOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts new file mode 100644 index 00000000..d81ad817 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SessionSigning.schema.ts @@ -0,0 +1,30 @@ +import z from 'zod'; +import type { Algorithm } from 'jsonwebtoken'; + +export const SessionSigningSchema = z.object({ + secret: z.string().nonempty(), + algorithm: z + .enum([ + 'HS256', + 'HS384', + 'HS512', + 'RS256', + 'RS384', + 'RS512', + 'ES256', + 'ES384', + 'ES512', + 'PS256', + 'PS384', + 'PS512', + 'none', + ]) + .optional(), +}) satisfies z.ZodType; + +export type SessionSigning = { + secret: string; + algorithm?: Algorithm; +}; + +export default SessionSigningSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts new file mode 100644 index 00000000..59948ba7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/SignedHashParams.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import type { SignedHashParams } from '@vonage/auth'; +import AlgorithmTypesSchema from './AlgorithmTypes.schema'; + +export const SignedHashParamsSchema = z.object({ + secret: z.string(), + algorithm: AlgorithmTypesSchema, +}) satisfies z.ZodType; + +export default SignedHashParamsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts new file mode 100644 index 00000000..11b01cfa --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StartArchivePayload.schema.ts @@ -0,0 +1,17 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; +import { ArchiveOptionsSchema } from '@node/schemas'; + +export const StartArchivePayloadSchema = VideoPayloadSchema.extend({ + archiveOptions: ArchiveOptionsSchema.optional(), +}); + +export type StartArchivePayload = z.infer; + +export function assertStartArchivePayload( + payload: unknown +): asserts payload is StartArchivePayload { + StartArchivePayloadSchema.parse(payload); +} + +export default StartArchivePayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts new file mode 100644 index 00000000..867c48ba --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/StopArchivePayload.schema.ts @@ -0,0 +1,10 @@ +import z from 'zod'; +import VideoPayloadSchema from './VideoPayload.schema'; + +export const StopArchivePayloadSchema = VideoPayloadSchema.extend({ + archiveId: z.string(), +}); + +export type StopArchivePayload = z.infer; + +export default StopArchivePayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts new file mode 100644 index 00000000..1069df27 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/TRPCRuntimeConfigOptions.schema.ts @@ -0,0 +1,9 @@ +import { z } from 'zod'; +import type { TRPCRuntimeConfigOptions } from '@trpc/server'; +import type { Any } from '@common/types'; + +export const TRPCRuntimeConfigOptionsSchema: z.ZodType> = z + .object({}) + .loose(); + +export default TRPCRuntimeConfigOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts new file mode 100644 index 00000000..b4707d9d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoAction.schema.ts @@ -0,0 +1,13 @@ +import { VideoAction } from '@api-lib/types'; +import z from 'zod'; + +/** + * All known Vera actions + */ +export const VideoActionSchema = z.enum(VideoAction); + +export function assertVideoAction(action: unknown): asserts action is VideoAction { + VideoActionSchema.parse(action); +} + +export default VideoActionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts new file mode 100644 index 00000000..1e287527 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoClientConfig.schema.ts @@ -0,0 +1,46 @@ +import z from 'zod'; +import { AuthParamsSchema, AuthParams } from './AuthParams.schema'; +import ConfigParamsSchema from './ConfigParams.schema'; +import { SessionSigningSchema, type SessionSigning } from './SessionSigning.schema'; +import { Auth } from '@vonage/auth'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; +import type { HandlersDefaults } from '@api-lib/types'; + +export const VideoClientConfigSchema = z.object({ + auth: AuthParamsSchema.or(z.instanceof(Auth)), + videoParams: ConfigParamsSchema.optional(), + handlersDefaults: z.object({}).loose().optional(), + sessionSigning: SessionSigningSchema.optional(), +}) satisfies z.ZodType; + +export type VideoClientConfig = { + /** + * Vonage API authentication parameters + */ + auth: AuthParams | Auth; + + /** + * Vonage Video API configuration parameters + */ + videoParams?: z.infer; + + /** + * Allows you to define defaults values for the video actions + */ + handlersDefaults?: Partial; + + /** + * Optional configuration for signing session keys. This provides lightweight integrity verification of session keys, + * Helps ensure consistency when associating sessions with an application. + * Not intended for authentication or authorization. + */ + sessionSigning?: SessionSigning; +}; + +export function assertVideoClientConfig(config: unknown): asserts config is VideoClientConfig { + const { error } = VideoClientConfigSchema.safeParse(config); + + if (error) { + throw makeBadRequestErrorHandler('Invalid video client config')(error); + } +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts new file mode 100644 index 00000000..8d417e67 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoPayload.schema.ts @@ -0,0 +1,10 @@ +import z from 'zod'; +import { SessionKeySchema } from '@node/schemas'; + +export const VideoPayloadSchema = z.object({ + sessionKey: SessionKeySchema, +}); + +export type VideoPayload = z.infer; + +export default VideoPayloadSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts new file mode 100644 index 00000000..eca6de75 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/VideoRouterConfig.schema.ts @@ -0,0 +1,50 @@ +import { z } from 'zod'; +import { AuthParamsSchema } from './AuthParams.schema'; +import ConfigParamsSchema from './ConfigParams.schema'; +import TRPCRuntimeConfigOptionsSchema from './TRPCRuntimeConfigOptions.schema'; +import { Auth } from '@vonage/auth'; +import type { Any, Prettify } from '@common/types'; +import { makeBadRequestErrorHandler } from '@api-lib/errors'; +import { SessionSigningSchema } from './SessionSigning.schema'; +import type { HandlersConfig, VideoClientConfig } from '@api-lib/types'; +import { TRPCRuntimeConfigOptions } from '@trpc/server'; + +type IVideoClientConfig = Omit; + +// Forces the VideoRouterConfigSchema to match the VideoClientConfig type +type IVideoClientConfigSchema = { + [K in keyof IVideoClientConfig]-?: z.ZodType; +}; + +const BaseVideoRouterConfigSchema = z.object({ + routerOptions: TRPCRuntimeConfigOptionsSchema.optional(), + handlersConfig: z.object({}).loose().optional(), +}); + +export const VideoRouterConfigSchema = BaseVideoRouterConfigSchema.extend({ + auth: AuthParamsSchema.or(z.instanceof(Auth)), + videoParams: ConfigParamsSchema.optional(), + sessionSigning: SessionSigningSchema.optional(), +} satisfies IVideoClientConfigSchema) satisfies z.ZodType>; + +export type VideoRouterConfig = Prettify< + { + [K in keyof IVideoClientConfig]: IVideoClientConfig[K]; + } & { + // extensions + handlersConfig?: Partial; + routerOptions?: TRPCRuntimeConfigOptions; + } +>; + +export function assertVideoRouterConfig( + config: unknown +): asserts config is VideoRouterConfig { + const { error } = VideoRouterConfigSchema.safeParse(config); + + if (error) { + throw makeBadRequestErrorHandler('Invalid video router configuration')(error); + } +} + +export default VideoRouterConfigSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts new file mode 100644 index 00000000..41bd8c2d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/schemas/index.ts @@ -0,0 +1,29 @@ +export * from './Metadata.schema'; +export * from './VideoPayload.schema'; +export * from './VideoRouterConfig.schema'; +export * from './EnableCaptionsPayload.schema'; +export * from './DisableCaptionsPayload.schema'; +export * from './CreateSessionPayload.schema'; +export * from './CreateSessionAndJoinPayload.schema'; +export * from './DecodeSessionIdPayload.schema'; +export * from './SearchArchivesPayload.schema'; +export * from './StartArchivePayload.schema'; +export * from './StopArchivePayload.schema'; +export * from './ArchiveSearchFilter.schema'; +export * from './VideoAction.schema'; +export * from './VideoClientConfig.schema'; +export * from './AlgorithmTypes.schema'; +export * from './SignedHashParams.schema'; +export * from './ACLRule.schema'; +export * from './ACL.schema'; +export * from './GeneratorOptions.schema'; +export * from './AuthParams.schema'; +export * from './ResponseTypes.schema'; +export * from './ConfigParams.schema'; +export * from './CaptionOptions.schema'; +export * from './ClientTokenOptions.schema'; +export * from './SessionOptions.schema'; +export * from './CreateEphemeralTokenPayload.schema'; +export * from './JoinSessionPayload.schema'; +export * from './TRPCRuntimeConfigOptions.schema'; +export * from './SessionSigning.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts new file mode 100644 index 00000000..87664610 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationErrorMiddleware.ts @@ -0,0 +1,21 @@ +import type { NextFunction, Response as ExpressResponse } from 'express'; +import ApplicationRequest from './ApplicationRequest'; +import ParamsDictionary from './ParamsDictionary'; +import Query from './Query'; +import type { Any } from '@common/types/Any'; + +export type ApplicationErrorMiddleware< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = Query, + LocalsObj extends Record = Record, +> = ( + error: Any, + // brings an application request which could contain metadata like the session or the user + req: ApplicationRequest, + res: ExpressResponse, + next: NextFunction +) => void | Promise; + +export default ApplicationErrorMiddleware; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts new file mode 100644 index 00000000..b87a54dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationHandler.ts @@ -0,0 +1,27 @@ +import type { + NextFunction, + Response as ExpressResponse, + RequestHandler as ExpressRequestHandler, +} from 'express'; +import ApplicationRequest from './ApplicationRequest'; +import ParamsDictionary from './ParamsDictionary'; +import Query from './Query'; +import type { Any } from '@common/types'; + +export type ApplicationHandler< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = Query, + LocalsObj extends Record = Record, +> = ( + // brings an application request which could contain metadata like the session or the user + req: ApplicationRequest, + res: ExpressResponse, + next: NextFunction, + error?: Any +) => + | ReturnType> + | Promise>>; + +export default ApplicationHandler; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts new file mode 100644 index 00000000..1ea46ff8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequest.ts @@ -0,0 +1,14 @@ +import type { Request as ExpressRequest } from 'express'; +import ParamsDictionary from './ParamsDictionary'; +import type { Any } from '@common/types'; +import type { ParsedQs } from 'qs'; + +export type ApplicationRequest< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = ParsedQs, + Locals extends Record = Record, +> = ExpressRequest; + +export default ApplicationRequest; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts new file mode 100644 index 00000000..e58de200 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ApplicationRequestHandler.ts @@ -0,0 +1,24 @@ +import type { NextFunction, Response as ExpressResponse } from 'express'; +import ApplicationRequest from './ApplicationRequest'; +import ParamsDictionary from './ParamsDictionary'; +import Query from './Query'; +import type { Any } from '@common/types'; + +export type ApplicationRequestHandler< + P = ParamsDictionary, + ResBody = Any, + ReqBody = Any, + ReqQuery = Query, + LocalsObj extends Record = Record, +> = ( + // brings an application request which could contain metadata like the session or the user + req: ApplicationRequest, + res: ExpressResponse, + next: NextFunction + + /** + * forces the handler to return an ExpressResponse, this prevent dead ends + */ +) => ExpressResponse | Promise; + +export default ApplicationRequestHandler; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts new file mode 100644 index 00000000..dbad670e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlerConfig.ts @@ -0,0 +1,20 @@ +import type { VideoAction } from './VideoAction'; +import type { IVideoClient } from './IVideoClient'; + +export type HandlerConfig< + Action extends VideoAction, + Input = Parameters[0], + Defaults = Partial>, +> = { + /** + * Optional function to transform the input before it's passed to the the videoClient instance. + */ + transformInput?: (args: { input: unknown; assertInput(input: unknown): Input }) => Partial; + + /** + * Optional default values for the specific video action + */ + addDefaults?: Defaults | ((input: Input) => Defaults); +}; + +export default HandlerConfig; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts new file mode 100644 index 00000000..20b5f657 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersConfig.ts @@ -0,0 +1,17 @@ +import type { VideoAction } from './VideoAction'; +import type HandlerConfig from './HandlerConfig'; + +type AllowedKeys = Exclude< + VideoAction, + /** + * This are non methods which are not accessible through the api or which configuration is inherited from other handlers + */ + 'createEphemeralToken' | 'ensureCaptionsEnabled' +>; + +export type HandlersConfig = { + // exclude private handlers + [K in AllowedKeys]: HandlerConfig; +}; + +export default HandlersConfig; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts new file mode 100644 index 00000000..f021c803 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/HandlersDefaults.ts @@ -0,0 +1,10 @@ +import type HandlersConfig from './HandlersConfig'; + +/** + * Defines the default values for the handlers in the video API + */ +export type HandlersDefaults = { + [key in keyof HandlersConfig]?: HandlersConfig[key]['addDefaults']; +}; + +export default HandlersDefaults; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts new file mode 100644 index 00000000..779c88c6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoClient.ts @@ -0,0 +1 @@ +export type IVideoClient = import('../core/VideoClient').default; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts new file mode 100644 index 00000000..8fa07dad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/IVideoRouter.ts @@ -0,0 +1 @@ +export type IVideoRouter = import('../routing/videoRouter/createVideoRouter').IVideoRouter; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts new file mode 100644 index 00000000..6f23422b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/ParamsDictionary.ts @@ -0,0 +1,5 @@ +export interface ParamsDictionary { + [key: string]: string; +} + +export default ParamsDictionary; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts new file mode 100644 index 00000000..bf2f50f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/Query.ts @@ -0,0 +1,5 @@ +export interface Query { + [key: string]: undefined | string | Query | (string | Query)[]; +} + +export default Query; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts new file mode 100644 index 00000000..9ac8f772 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/TokenRole.ts @@ -0,0 +1,8 @@ +export enum TokenRole { + PUBLISHER = 'publisher', + PUBLISHER_ONLY = 'publisheronly', + SUBSCRIBER = 'subscriber', + MODERATOR = 'moderator', +} + +export default TokenRole; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts new file mode 100644 index 00000000..8a588dda --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/VideoAction.ts @@ -0,0 +1,17 @@ +/** + * Public api actions to export through the video router. + */ +export enum VideoAction { + createEphemeralToken = 'createEphemeralToken', + createSession = 'createSession', + createSessionAndJoin = 'createSessionAndJoin', + startArchive = 'startArchive', + stopArchive = 'stopArchive', + searchArchives = 'searchArchives', + enableCaptions = 'enableCaptions', + disableCaptions = 'disableCaptions', + joinSession = 'joinSession', + ensureCaptionsEnabled = 'ensureCaptionsEnabled', +} + +export default VideoAction; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts new file mode 100644 index 00000000..46652a4e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/src/types/index.ts @@ -0,0 +1,32 @@ +export type * from './IVideoClient'; + +// Schema types +export type { + VideoClientConfig, + CreateSessionPayload, + CreateSessionAndJoinPayload, + DecodeSessionIdPayload, + CreateEphemeralTokenPayload, + StartArchivePayload, + StopArchivePayload, + SearchArchivesPayload, + EnableCaptionsPayload, + JoinSessionPayload, + SessionOptions, + VideoPayload, + VideoRouterConfig, + SessionSigning, +} from '../schemas'; + +export type * from './IVideoRouter'; +export type * from './ApplicationErrorMiddleware'; +export type * from './ApplicationHandler'; +export type * from './ApplicationRequest'; +export type * from './ApplicationRequestHandler'; +export type * from './ParamsDictionary'; +export type * from './Query'; +export * from './TokenRole'; +export * from './VideoAction'; +export type * from './HandlerConfig'; +export type * from './HandlersConfig'; +export type * from './HandlersDefaults'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json index 5cfec05b..656f84b5 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.json @@ -21,7 +21,11 @@ "@common": ["../common/src"], "@common/*": ["../common/src/*"], "@node": ["../common/srcNode"], - "@node/*": ["../common/srcNode/*"] + "@node/*": ["../common/srcNode/*"], + "@common-test": ["../common/test"], + "@common-test/*": ["../common/test/*"], + "@node-test": ["../common/testNode"], + "@node-test/*": ["../common/testNode/*"] }, "lib": ["ESNext"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json index 45c0cab3..a18f6335 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.lib.json @@ -1,5 +1,5 @@ { - "extends": ["./tsconfig.json"], + "extends": "./tsconfig.json", "compilerOptions": { "composite": true, "outDir": "dist", @@ -8,6 +8,13 @@ "types": ["node"], "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo" }, - "include": ["src/**/*.ts", "../common/src/**/*.ts"], - "exclude": ["**/*.spec.*", "**/*.test.*"] + "include": [ + "src/**/*.ts", + "../common/src/**/*.ts", + "../common/srcNode/**/*.ts", + "../common/test/**/*.ts", + "../common/testNode/**/*.ts", + "../common/src/types/FacingMode.ts" + ], + "exclude": ["**/*.spec.*", "**/*.test.*", "../common/**/*.spec.*", "../common/**/*.test.*"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json index 5e269da8..c3852cf4 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/tsconfig.spec.json @@ -11,6 +11,11 @@ "test/**/*.ts", "src/**/*.ts", "src/**/*.test.ts", - "src/**/*.spec.ts" + "src/**/*.spec.ts", + "../common/src/**/*.ts", + "../common/srcNode/**/*.ts", + "../common/test/**/*.ts", + "../common/testNode/**/*.ts", + "../common/src/types/FacingMode.ts" ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts index 3638ee45..3057ca85 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/api/vite.config.ts @@ -9,6 +9,9 @@ export default defineConfig(() => ({ alias: { '@api-lib': path.resolve(__dirname, './src'), '@common': path.resolve(__dirname, '../common/src'), + '@node': path.resolve(__dirname, '../common/srcNode'), + '@common-test': path.resolve(__dirname, '../common/test'), + '@node-test': path.resolve(__dirname, '../common/testNode'), }, }, test: { @@ -23,6 +26,13 @@ export default defineConfig(() => ({ reportsDirectory: './coverage', provider: 'v8' as const, reporter: ['text', 'lcov'], + allowExternal: true, + include: [ + `${path.resolve(__dirname, 'src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/srcNode')}/**/*.{ts,tsx}`, + ], + exclude: ['test/**', '**/index.ts'], }, }, })); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts new file mode 100644 index 00000000..e3d08fbe --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotEmptyString.ts @@ -0,0 +1,9 @@ +import isString from './isString'; + +function assertNotEmptyString(value: unknown, message?: string): asserts value is string { + if (!isString(value) || value.length === 0) { + throw new TypeError(message ?? `Expected a non-empty string but received ${typeof value}`); + } +} + +export default assertNotEmptyString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts new file mode 100644 index 00000000..341255d4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import assertNotNil from './assertNotNil'; + +describe('assertNotNil', () => { + it('should not throw for a non-nil value', () => { + expect(() => assertNotNil({ key: 'value' })).not.toThrow(); + }); + + it('should throw for nil values with default message', () => { + expect(() => assertNotNil(null)).toThrow(TypeError); + expect(() => assertNotNil(undefined)).toThrow( + 'Expected value to be non-null and non-undefined' + ); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts new file mode 100644 index 00000000..95dad6f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/assertNotNil.ts @@ -0,0 +1,9 @@ +import isNil from '../isNil'; + +function assertNotNil(value: T, message?: string): asserts value is NonNullable { + if (isNil(value)) { + throw new TypeError(message || 'Expected value to be non-null and non-undefined'); + } +} + +export default assertNotNil; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts new file mode 100644 index 00000000..eb9c935e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNotNil/index.ts @@ -0,0 +1 @@ +export { default } from './assertNotNil'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts new file mode 100644 index 00000000..e392a4ae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/assertNumericString.ts @@ -0,0 +1,9 @@ +import isNumericString from '../isNumericString'; + +function assertNumericString(value: unknown, message?: string): asserts value is string { + if (!isNumericString(value)) { + throw new TypeError(message ?? `${String(value)} is not a valid number string`); + } +} + +export default assertNumericString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts new file mode 100644 index 00000000..120257c0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertNumericString/index.ts @@ -0,0 +1 @@ +export { default } from './assertNumericString'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts new file mode 100644 index 00000000..50f1e738 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { VALID_SESSION_ID } from '@common-test/fixtures'; +import assertSessionId from '.'; + +describe('assertSessionId', () => { + it('should not throw for a valid session ID', () => { + expect(() => assertSessionId(VALID_SESSION_ID)).not.toThrow(); + }); + + it('should throw for invalid values', () => { + expect(() => assertSessionId('invalid-session-id')).toThrow(); + expect(() => assertSessionId(null)).toThrow(); + expect(() => assertSessionId(undefined)).toThrow(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts new file mode 100644 index 00000000..2b483409 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/assertSessionId.ts @@ -0,0 +1,10 @@ +import { assertString } from '@common/assertions'; +import type { SessionId } from '../../types'; +import decodeSessionId from '../../helpers/decodeSessionId'; + +function assertSessionId(value: unknown): asserts value is SessionId { + assertString(value, 'SessionId must be a string'); + decodeSessionId({ sessionId: value }); +} + +export default assertSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts new file mode 100644 index 00000000..7208c8ce --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertSessionId/index.ts @@ -0,0 +1 @@ +export { default } from './assertSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts new file mode 100644 index 00000000..021b94ad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/assertString.ts @@ -0,0 +1,9 @@ +import isString from './isString'; + +function assertString(value: unknown, message?: string): asserts value is string { + if (!isString(value)) { + throw new TypeError(message ?? `Expected a string but received ${typeof value}`); + } +} + +export default assertString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts index 430e3f92..43ea8a57 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/index.ts @@ -1,4 +1,6 @@ +export { default as assertNotEmptyString } from './assertNotEmptyString'; export { default as assertRecord } from './assertRecord'; +export { default as assertNotNil } from './assertNotNil'; export { default as isErrorLike } from './isErrorLike'; export { default as isFunction } from './isFunction'; export { default as isNil } from './isNil'; @@ -8,3 +10,13 @@ export { default as isRecord } from './isRecord'; export { default as isString } from './isString'; export { default as isUndefined } from './isUndefined'; export { default as isNotNil } from './isNotNil'; +export { default as assertString } from './assertString'; +export { default as isValidRoomName } from './isValidRoomName'; +export { default as isSessionKeyLike } from './isSessionKeyLike'; +export { default as isSessionIdLike } from './isSessionIdLike'; +export { default as assertSessionId } from './assertSessionId'; +export { default as isValidSessionId } from './isValidSessionId'; +export { default as isValidSessionKey } from './isValidSessionKey'; +export { default as isNumber } from './isNumber'; +export { default as isNumericString } from './isNumericString'; +export { default as assertNumericString } from './assertNumericString'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts new file mode 100644 index 00000000..442986ee --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/index.ts @@ -0,0 +1 @@ +export { default } from './isNumber'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts new file mode 100644 index 00000000..83a3b265 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumber/isNumber.ts @@ -0,0 +1,5 @@ +function isNumber(value: unknown): value is number { + return typeof value === 'number' && Number.isFinite(value); +} + +export default isNumber; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts new file mode 100644 index 00000000..733100ef --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/index.ts @@ -0,0 +1 @@ +export { default } from './isNumericString'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts new file mode 100644 index 00000000..e39d3076 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isNumericString/isNumericString.ts @@ -0,0 +1,17 @@ +import isString from '../isString'; + +function isNumericString(value: unknown): value is string { + if (!isString(value)) { + return false; + } + + const trimmed = value.trim(); + + if (!trimmed) { + return false; + } + + return Number.isFinite(Number(trimmed)); +} + +export default isNumericString; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts new file mode 100644 index 00000000..34b3736c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/index.ts @@ -0,0 +1 @@ +export { default } from './isSessionIdLike'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts new file mode 100644 index 00000000..4f7c8e90 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import isSessionIdLike from './isSessionIdLike'; + +describe('isSessionIdLike', () => { + it('should distinguish session ids from plain room names', () => { + expect( + isSessionIdLike('1_MX4xMjM0NTY3OH4VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE') + ).toBe(true); + expect(isSessionIdLike('my-room')).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts new file mode 100644 index 00000000..80992d62 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionIdLike/isSessionIdLike.ts @@ -0,0 +1,17 @@ +/** + * Determines whether a given string is a Vonage Video API sessionId-like string. + * A sessionId-like string has the format `prefix_base64data` (exactly two parts split by `_`). + * @param {string} value - The value to check. + * @returns {boolean} True if the value matches the sessionId-like format. + */ +const isSessionIdLike = (value: string): boolean => { + const parts = value.split('_'); + const looksLikeBase64 = /^[a-z0-9+/=-]+$/i.test(parts[1]); + + const isSessionId = + parts.length === 2 && parts[0].length > 0 && parts[1].length > 50 && looksLikeBase64; + + return Boolean(isSessionId); +}; + +export default isSessionIdLike; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts new file mode 100644 index 00000000..45c0edc4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/index.ts @@ -0,0 +1 @@ +export { default } from './isSessionKeyLike'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts new file mode 100644 index 00000000..3ce95e6d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import isSessionKeyLike from './isSessionKeyLike'; + +describe('isSessionKeyLike', () => { + it('should distinguish session keys from plain room names', () => { + expect(isSessionKeyLike('eyJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uSWQiOiIxX01YNH0.abc123def456')).toBe( + true + ); + expect(isSessionKeyLike('my-room')).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts new file mode 100644 index 00000000..adae7e9f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isSessionKeyLike/isSessionKeyLike.ts @@ -0,0 +1,10 @@ +const isSessionKeyLike = (value: string) => { + const parts = value.split('.'); + const hasThreeParts = parts.length === 3; + const allPartsNonEmpty = hasThreeParts && parts.every((part) => part.length > 0); + const looksLikeBase64Url = hasThreeParts && parts.every((part) => /^[a-z0-9_-]+$/i.test(part)); + + return Boolean(allPartsNonEmpty && looksLikeBase64Url); +}; + +export default isSessionKeyLike; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts new file mode 100644 index 00000000..52f3537c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/index.ts @@ -0,0 +1 @@ +export { default } from './isValidRoomName'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.spec.ts similarity index 100% rename from tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.spec.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.spec.ts diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts similarity index 54% rename from tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts index 475b47e8..187b7e60 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/utils/isValidRoomName/isValidRoomName.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidRoomName/isValidRoomName.ts @@ -1,7 +1,12 @@ +/** + * Eventually we are going to remove roomNames as identifiers + */ const isValidRoomName = (name: string) => { // Regular expression to allow letters, numbers, underscores, hyphens, and plus sign only const regex = /^[a-z0-9_+-]+$/; - return regex.test(name) && name.length >= 1 && name.length <= 100; + const isRoomName = regex.test(name) && name.length >= 1 && name.length <= 100; + + return isRoomName; }; export default isValidRoomName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts new file mode 100644 index 00000000..fd3e5347 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/index.ts @@ -0,0 +1 @@ +export { default } from './isValidSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts new file mode 100644 index 00000000..686f2096 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import isValidSessionId from '.'; + +describe('isValidSessionId', () => { + it('should return true for a valid session ID', () => { + expect( + isValidSessionId('1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE') + ).toBe(true); + }); + + it('should return false for invalid values', () => { + expect(isValidSessionId('invalid-session-id')).toBe(false); + expect(isValidSessionId(null)).toBe(false); + expect(isValidSessionId(undefined)).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts new file mode 100644 index 00000000..de163e14 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionId/isValidSessionId.ts @@ -0,0 +1,15 @@ +import { tryCatch } from '@common/execution'; +import type { SessionId } from '../../types'; +import { assertString } from '@common/assertions'; +import assertSessionId from '../assertSessionId'; + +function isValidSessionId(value: unknown): value is SessionId { + const { error } = tryCatch(() => { + assertString(value); + assertSessionId(value); + }); + + return !error; +} + +export default isValidSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts new file mode 100644 index 00000000..e65bbe10 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/index.ts @@ -0,0 +1 @@ +export { default } from './isValidSessionKey'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts new file mode 100644 index 00000000..65f04f45 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/assertions/isValidSessionKey/isValidSessionKey.ts @@ -0,0 +1,14 @@ +import { tryCatch } from '@common/execution'; +import { assertString } from '@common/assertions'; +import { decodeSessionKey } from '@common/helpers'; + +function isValidSessionKey(value: unknown): value is string { + const { error } = tryCatch(() => { + assertString(value); + decodeSessionKey({ sessionKey: value }); + }); + + return !error; +} + +export default isValidSessionKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts new file mode 100644 index 00000000..363b120b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/frontFacingKeywords.ts @@ -0,0 +1,3 @@ +const frontFacingKeywords = ['front', 'user', 'facetime', 'selfie', 'face'] as const; + +export default frontFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts new file mode 100644 index 00000000..2263b10c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/index.ts @@ -0,0 +1,2 @@ +export { default as frontFacingKeywords } from './frontFacingKeywords'; +export { default as rearFacingKeywords } from './rearFacingKeywords'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts new file mode 100644 index 00000000..a36597b0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/constants/rearFacingKeywords.ts @@ -0,0 +1,3 @@ +const rearFacingKeywords = ['rear', 'back', 'environment', 'world', 'main'] as const; + +export default rearFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts index 47bd9bcf..33b8416c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.test.ts @@ -20,7 +20,7 @@ describe('ApplicationError', () => { expect(error.message).toBe('Test error'); expect(error.severity).toBe('validation'); - expect(error.values).toEqual(['Email is required', 'Password too short']); + expect(error.issues).toEqual(['Email is required', 'Password too short']); expect(error.statusCode).toBe(StatusCodeEnum.ClientErrorUnauthorized); expect(() => error.assert()).toThrow(ApplicationError); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts index 8ecb8d3c..de537f23 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/ApplicationError.ts @@ -1,16 +1,34 @@ -import StatusCodeEnum from 'status-code-enum'; +import { StatusCode } from 'status-code-enum'; import type { ApplicationErrorState, ApplicationErrorFallbackConfig, ErrorSeverity } from './types'; import mapSourceToState from './helpers/mapSourceToState'; +import { Any } from '@common/types'; +import { removeUndefinedProps } from '@common/helpers'; class ApplicationError extends Error { - public values: string[] = []; + /** + * An array to hold any specific issues related to the error, such as validation errors, zod issues etc + */ + public issues: Any[] = []; public severity: ErrorSeverity; - public statusCode: StatusCodeEnum; + public statusCode: StatusCode; public fallbackConfig: ApplicationErrorFallbackConfig; + /** + * A string to categorize the error, useful for error tracking and analytics. + */ + public type?: string; + + public get fallbackMessage() { + return this.fallbackConfig.fallbackMessage; + } + + public set fallbackMessage(message: string) { + this.fallbackConfig.fallbackMessage = message; + } + /** * Creates a new instance of the custom application error. * @param src - The source of the error, can be a string, an instance of `IApplicationError`, or an `Error` object. @@ -23,7 +41,7 @@ class ApplicationError extends Error { src: unknown; fallbackConfig: ApplicationErrorFallbackConfig; }) { - const state: Partial & { + const state: ApplicationErrorState & { message: string; fallbackConfig: ApplicationErrorFallbackConfig; } = { @@ -37,16 +55,20 @@ class ApplicationError extends Error { * If the message is already in the values array * We replace it with the fallback message to provide more context and avoid redundancy. */ - const hasMessageRedundancy = state.message === state.values?.[0]; + const hasMessageRedundancy = state.message === state.issues?.[0]; const message = hasMessageRedundancy ? state.fallbackConfig.fallbackMessage : state.message; super(message); this.stack = state.stack ?? this.stack; this.severity = state.severity ?? 'error'; - this.values = state.values ?? []; + this.issues = state.issues ?? []; this.fallbackConfig = state.fallbackConfig; - this.statusCode = state.statusCode ?? StatusCodeEnum.ServerErrorInternal; + this.statusCode = state.statusCode ?? StatusCode.ServerErrorInternal; + + // optional properties + this.name = state.name ?? this.constructor.name; + this.type = state.type ?? this.fallbackConfig.type ?? this.type; } /** @@ -61,12 +83,12 @@ class ApplicationError extends Error { */ add = (message: string, map?: Record) => { if (!map) { - this.values.push(message); + this.issues.push(message); return this; } - this.values.push( + this.issues.push( message.replace(/{(\w+)}/g, (match, propName) => { const propValue = map[propName]; if (propValue === undefined) return match; @@ -78,7 +100,7 @@ class ApplicationError extends Error { return this; }; - setStatusCode(statusCode: StatusCodeEnum): this { + setStatusCode(statusCode: StatusCode): this { this.statusCode = statusCode; return this; @@ -88,7 +110,7 @@ class ApplicationError extends Error { * Check if the custom validation has any violations and throw the error if it does. */ assert = () => { - if (this.values.length) throw this; + if (this.issues.length) throw this; }; public exportSafely = () => { @@ -98,31 +120,42 @@ class ApplicationError extends Error { public exportSafelyBase = (): { message: string; severity: ErrorSeverity; - values?: string[]; + issues?: string[]; stack?: string; fallbackMessage?: string; - statusCode: StatusCodeEnum; + statusCode: StatusCode; + type: string | undefined; + name: string; } => { - const { fallbackConfig, message, severity, stack, values, statusCode } = this; + const { fallbackConfig, message, severity, stack, statusCode, type, name } = this; + + const optionals = removeUndefinedProps({ + issues: this.issues.length ? this.issues : undefined, + type, + }); // Prevent disclosure of private sensitive info if (globalThis.process?.env?.NODE_ENV === 'development') { return { + name, fallbackMessage: fallbackConfig.fallbackMessage, message, severity, stack, - values, statusCode, + ...optionals, }; } return { + name, + // prevent disclosing unhandled messages on production message: fallbackConfig.fallbackMessage, severity, - values, statusCode, + + ...optionals, }; }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts index 85d29a61..8fc7ff01 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/index.ts @@ -1,5 +1,2 @@ export { default as isApplicationError } from './isApplicationError'; -export * from './isApplicationError'; - export { default as isApplicationErrorLike } from './isApplicationErrorLike'; -export * from './isApplicationErrorLike'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts index 2f61a8ad..90a85c08 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.test.ts @@ -19,7 +19,7 @@ describe('isApplicationError', () => { it('should return true for objects with fallbackConfig', () => { const plainObject: ApplicationErrorState = { - values: [], + issues: [], message: 'Test error', statusCode: StatusCodeEnum.ServerErrorInternal, severity: 'error', diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts index 5ab78ebd..1d2af522 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/assertions/isApplicationError/isApplicationError.ts @@ -7,7 +7,7 @@ import type ApplicationError from '../../ApplicationError'; export const isApplicationError = (source: unknown): source is ApplicationError => isRecord(source) && [ - source.values, + source.issues, source.severity, source.statusCode, source.fallbackConfig, diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts index 3ae0f09f..47b2d81e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/helpers/mapSourceToState/mapSourceToState.ts @@ -6,30 +6,34 @@ import isApplicationErrorLike from '../../assertions/isApplicationErrorLike'; export type ApplicationErrorState = import('../../types').ApplicationErrorState; export const mapSourceToState = (src: unknown): Partial => { - return removeUndefinedProps>( - (() => { - if (isString(src)) { - return { - message: src, - }; - } - - if (isApplicationError(src) || isApplicationErrorLike(src)) { - const copy: Partial = { - message: src.message, - fallbackConfig: src.fallbackConfig, - severity: src.severity, - stack: src.stack, - values: src.values, - statusCode: src.statusCode, - }; - - return copy; - } - - return {}; - })() - ); + const props = (() => { + if (isString(src)) { + return { + message: src, + }; + } + + if (isApplicationError(src) || isApplicationErrorLike(src)) { + const copy: Partial = { + message: src.message, + }; + + // avoid adding non present properties + if (Object.hasOwn(src, 'fallbackConfig')) copy.fallbackConfig = src.fallbackConfig; + if (Object.hasOwn(src, 'severity')) copy.severity = src.severity; + if (Object.hasOwn(src, 'stack')) copy.stack = src.stack; + if (Object.hasOwn(src, 'issues')) copy.issues = src.issues; + if (Object.hasOwn(src, 'statusCode')) copy.statusCode = src.statusCode; + if (Object.hasOwn(src, 'type')) copy.type = src.type; + if (Object.hasOwn(src, 'name')) copy.name = src.name; + + return copy; + } + + return {}; + })(); + + return removeUndefinedProps>(props); }; export default mapSourceToState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts index a5422b7c..da4bb819 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/index.ts @@ -2,3 +2,4 @@ export * from './types'; export * from './helpers'; export * from './assertions'; export { default } from './ApplicationError'; +export { default as ApplicationError } from './ApplicationError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts index 09999798..460003ae 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorFallbackConfig.ts @@ -1,5 +1,6 @@ -import StatusCodeEnum from 'status-code-enum'; +import { StatusCode } from 'status-code-enum'; import type { ErrorSeverity } from './ErrorSeverity'; +import { Any } from '@common/types'; export type ApplicationErrorFallbackConfig = { /** @@ -11,17 +12,17 @@ export type ApplicationErrorFallbackConfig = { * Collection of validation error values * This is used to group validation errors together */ - values?: string[]; + issues?: Any[]; severity?: ErrorSeverity; /** * The HTTP status code associated with the error. */ - statusCode: StatusCodeEnum; + statusCode: StatusCode; /** - * Indicates if the error is recoverable. + * Type of the error, used for categorization and handling logic. */ - recoverable?: boolean | null; + type?: string; }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts index b4886c43..3364bed6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ApplicationErrorState.ts @@ -13,4 +13,8 @@ export type ApplicationErrorState = { * This includes the fallbackMessage and default error properties. */ fallbackConfig: ApplicationErrorFallbackConfig; -} & Pick; + + type?: string; + + name?: string; +} & Pick; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts new file mode 100644 index 00000000..977500e5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/ZodIssue.ts @@ -0,0 +1,9 @@ +type ZodIssue = { + code: string; + path: (string | number)[]; + message: string; + expected?: string; + received?: string; +}; + +export type { ZodIssue }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts index a4621fe2..473a8d61 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/errors/types/index.ts @@ -1,3 +1,4 @@ export * from './ErrorSeverity'; export * from './ApplicationErrorFallbackConfig'; export * from './ApplicationErrorState'; +export * from './ZodIssue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts index 35b9c39b..52f834f6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/index.ts @@ -4,5 +4,6 @@ export { default as debounce } from './debounce'; export { default as defer, type Deferred } from './defer'; export { default as enqueue } from './enqueue'; export { default as idempotentCallbackWithRetry } from './idempotentCallbackWithRetry'; +export { default as throttle } from './throttle'; export { default as tryCatch } from './tryCatch'; export { default as wait } from './wait'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts new file mode 100644 index 00000000..01f60eaf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/index.ts @@ -0,0 +1 @@ +export { default } from './throttle'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts new file mode 100644 index 00000000..7b3dcd62 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.test.ts @@ -0,0 +1,54 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import throttle from './'; + +describe('throttle', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('invokes leading call immediately, throttles rapid calls, fires trailing with latest args, then resets', () => { + const callback = vi.fn(); + const throttled = throttle(callback, 500, { leading: true, trailing: true }); + + // Leading call fires immediately with correct args + throttled('a', 'b', 'c'); + expect(callback).toHaveBeenCalledTimes(1); + expect(callback).toHaveBeenCalledWith('a', 'b', 'c'); + + // Rapid calls within wait are suppressed; only latest args are kept for trailing + throttled('second'); + throttled('third'); + expect(callback).toHaveBeenCalledTimes(1); + + // Trailing call fires after wait with the latest args + vi.advanceTimersByTime(500); + expect(callback).toHaveBeenCalledTimes(2); + expect(callback).toHaveBeenLastCalledWith('third'); + + // After the full wait cycle the throttle resets — next call fires immediately again + vi.advanceTimersByTime(500); + throttled('reset'); + expect(callback).toHaveBeenCalledTimes(3); + expect(callback).toHaveBeenLastCalledWith('reset'); + + // leading: false — first call must not fire until wait elapses + const trailingOnly = throttle(callback, 500, { leading: false, trailing: true }); + trailingOnly('delayed'); + expect(callback).toHaveBeenCalledTimes(3); + vi.advanceTimersByTime(500); + expect(callback).toHaveBeenCalledTimes(4); + expect(callback).toHaveBeenLastCalledWith('delayed'); + + // trailing: false — suppressed calls are never fired + const leadingOnly = throttle(callback, 500, { leading: true, trailing: false }); + leadingOnly('lead'); + leadingOnly('ignored'); + expect(callback).toHaveBeenCalledTimes(5); + vi.advanceTimersByTime(500); + expect(callback).toHaveBeenCalledTimes(5); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts new file mode 100644 index 00000000..0ae40243 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/throttle/throttle.ts @@ -0,0 +1,66 @@ +import type { Any } from '@common/types'; + +type ThrottleOptions = { + leading?: boolean; + trailing?: boolean; +}; + +function throttle void>( + callback: T, + wait: number, + options: ThrottleOptions = {} +): (...args: Parameters) => void { + const { leading = true, trailing = true } = options; + + let trailingCallTimer: ReturnType | null = null; + let latestTrailingArgs: Parameters | null = null; + let lastCallbackExecutionTime = 0; + + const executeCallback = (args: Parameters) => { + lastCallbackExecutionTime = Date.now(); + latestTrailingArgs = null; + + callback(...args); + }; + + const cancelTrailingCall = () => { + if (!trailingCallTimer) return; + + clearTimeout(trailingCallTimer); + trailingCallTimer = null; + }; + + const scheduleTrailingCall = (delay: number) => { + if (trailingCallTimer) return; + + trailingCallTimer = setTimeout(() => { + trailingCallTimer = null; + + if (latestTrailingArgs) { + executeCallback(latestTrailingArgs); + } + }, delay); + }; + + return (...args: Parameters) => { + const now = Date.now(); + const timeSinceLastExecution = now - lastCallbackExecutionTime; + const canExecuteImmediately = timeSinceLastExecution >= wait; + + if (canExecuteImmediately && leading) { + cancelTrailingCall(); + executeCallback(args); + return; + } + + if (!trailing) return; + + latestTrailingArgs = args; + + const remainingWaitTime = canExecuteImmediately ? wait : wait - timeSinceLastExecution; + + scheduleTrailingCall(remainingWaitTime); + }; +} + +export default throttle; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts index dd43e7f3..6c5f91ce 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/execution/tryCatch/tryCatch.ts @@ -5,10 +5,15 @@ type TryCatchResult< T extends (...args: any) => any, Fallback extends ReturnType | undefined, > = T extends () => Promise - ? Promise<{ result: Fallback extends undefined ? R | null : NonNullable; error: any }> + ? Promise<{ + result: Fallback extends undefined ? R | null : NonNullable; + error: any; + didFail: boolean; + }> : { result: Fallback extends undefined ? ReturnType | null : NonNullable>; error: any; + didFail: boolean; }; type AnyFunction = (...args: any[]) => any; @@ -32,13 +37,16 @@ function tryCatch> if (isPromise(result)) { return result - .then((res) => ({ result: res, error: null })) - .catch((error) => ({ result: fallback ?? null, error })) as TryCatchResult; + .then((res) => ({ result: res, error: null, didFail: false })) + .catch((error) => ({ result: fallback ?? null, error, didFail: true })) as TryCatchResult< + T, + Fallback + >; } - return { result, error: null } as TryCatchResult; + return { result, error: null, didFail: false } as TryCatchResult; } catch (error) { - return { result: fallback ?? null, error } as TryCatchResult; + return { result: fallback ?? null, error, didFail: true } as TryCatchResult; } } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts new file mode 100644 index 00000000..3060d76f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.test.ts @@ -0,0 +1,31 @@ +import { describe, it, expect } from 'vitest'; +import decodeJwt from './decodeJwt'; + +const validJwt = [ + btoa(JSON.stringify({ alg: 'none' })), + btoa(JSON.stringify({ sessionId: 'some-session-id', roomName: 'my-room' })), + 'mock-sig', +].join('.'); + +describe('decodeJwt', () => { + it('should decode a valid JWT payload', () => { + const result = decodeJwt<{ sessionId: string; roomName: string }>(validJwt); + + expect(result).toEqual({ + sessionId: 'some-session-id', + roomName: 'my-room', + }); + }); + + it('should throw for a string without three dot-separated parts', () => { + expect(() => decodeJwt('invalidToken')).toThrow('Invalid token format'); + }); + + it('should throw for an empty string', () => { + expect(() => decodeJwt('')).toThrow('Invalid token format'); + }); + + it('should throw for a token with invalid base64 payload', () => { + expect(() => decodeJwt('a.!!invalid!!.c')).toThrow(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts new file mode 100644 index 00000000..0241d03b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/decodeJwt.ts @@ -0,0 +1,29 @@ +/** + * Decodes a JWT without verifying its signature, and returns the payload as an object. + */ +const decodeJwt = (token: string): T => { + const parts = token.split('.'); + + if (parts.length !== 3) { + throw new Error('Invalid token format'); + } + + const base64Url = parts[1]; + + // Fix padding + const pad = '='.repeat((4 - (base64Url.length % 4)) % 4); + + // Convert Base64URL → Base64 + const base64 = (base64Url + pad).replace(/-/g, '+').replace(/_/g, '/'); + + // Decode safely + const binary = atob(base64); + const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0)); + const jsonString = new TextDecoder().decode(bytes); + + const payload = JSON.parse(jsonString) as T; + + return payload; +}; + +export default decodeJwt; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts new file mode 100644 index 00000000..16f17fa6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeJwt/index.ts @@ -0,0 +1 @@ +export { default } from './decodeJwt'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts new file mode 100644 index 00000000..205b9381 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/decodeSessionId.ts @@ -0,0 +1,33 @@ +import type { DecodedSessionId } from '../../types/DecodedSessionId'; + +const decodeSessionId = ({ sessionId }: { sessionId: string }): DecodedSessionId => { + const [, encoded] = sessionId.split('_'); + + if (!encoded) { + throw new Error('Invalid sessionId format'); + } + + const info = encoded.replace(/-/g, '+'); + + const binary = atob(info); + const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0)); + + const decodedSession = new TextDecoder().decode(bytes); + const sessionFields = decodedSession.split('~'); + + if (sessionFields.length < 4) { + throw new Error('Invalid sessionId format'); + } + + return { + p2p: sessionFields.includes('P'), + autoArchive: sessionFields.includes('A'), + version: sessionFields[0], + partnerId: sessionFields[1], + applicationId: sessionFields[1], // verify this + location: sessionFields[2], + date: sessionFields[3], + }; +}; + +export default decodeSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/index.ts similarity index 100% rename from tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/index.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionId/index.ts diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts new file mode 100644 index 00000000..23189e6a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/decodeSessionKey.ts @@ -0,0 +1,12 @@ +import { SessionKeyPayload, VideoSessionDetails } from '@common/types'; +import decodeJwt from '../decodeJwt'; +import decodeSessionId from '../decodeSessionId'; + +const decodeSessionKey = ({ sessionKey }: { sessionKey: string }): VideoSessionDetails => { + const tokenPayload = decodeJwt(sessionKey); + const session = decodeSessionId({ sessionId: tokenPayload.sessionId }); + + return { ...session, ...tokenPayload, sessionKey }; +}; + +export default decodeSessionKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts new file mode 100644 index 00000000..4f779362 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/decodeSessionKey/index.ts @@ -0,0 +1 @@ +export { default } from './decodeSessionKey'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts index 30a11ef7..9ec1db68 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/index.ts @@ -1,3 +1,8 @@ export { default as removeUndefinedProps } from './removeUndefinedProps'; export { default as toRemValue } from './toRemValue'; export { default as kebabToCamel } from './kebabToCamel'; +export { default as interceptObject } from './interceptObject'; +export { default as decodeSessionKey } from './decodeSessionKey'; +export { default as decodeSessionId } from './decodeSessionId'; +export { default as decodeJwt } from './decodeJwt'; +export { default as isZodError } from './isZodError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts new file mode 100644 index 00000000..66bb385c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/index.ts @@ -0,0 +1 @@ +export { default } from './interceptObject'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts new file mode 100644 index 00000000..98507eb9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.test.ts @@ -0,0 +1,120 @@ +import { describe, expect, it } from 'vitest'; +import interceptObject from './'; + +type CounterService = { + value: number; + label: string; + summary: string; + increment: (step: number) => number; + readValue: () => number; +}; + +describe('interceptObject', () => { + it('should replace the target with a proxy and preserve bound original methods', () => { + const container = makeContainer(1); + + const envelope = interceptObject(container, 'service'); + const increment = container.service.increment; + + expect(envelope.proxy).toBe(container.service); + expect(container.service.summary).toBe('counter:1'); + expect(increment).toBe(container.service.increment); + expect(increment(2)).toBe(3); + + const readValue = envelope.getOriginal('readValue'); + + expect(readValue).toBe(envelope.getOriginal('readValue')); + expect(readValue()).toBe(3); + }); + + it('should apply and remove overrides for destructured methods', () => { + const container = makeContainer(4); + const envelope = interceptObject(container, 'service'); + const increment = container.service.increment; + + envelope.override('increment', ({ target, handler }) => { + expect(target.value).toBe(4); + + return (step) => handler(step * 2); + }); + + expect(increment(3)).toBe(10); + + envelope.removeOverride('increment'); + + expect(increment(1)).toBe(11); + + const unsubscribe = envelope.override('increment', ({ handler }) => { + return (step) => handler(step) + 100; + }); + + expect(increment(1)).toBe(112); + + unsubscribe(); + + expect(increment(1)).toBe(13); + }); + + it('should refresh original bindings when rebound to a fresh container', () => { + const initialContainer = makeContainer(2); + const envelope = interceptObject(initialContainer, 'service'); + const proxiedIncrement = initialContainer.service.increment; + + expect(envelope.getOriginal('readValue')()).toBe(2); + + const freshContainer = makeContainer(20); + + envelope.rebind(freshContainer); + + expect(envelope.getOriginal('readValue')()).toBe(20); + + envelope.override('increment', ({ target, handler }) => { + expect(target).toBe(freshContainer.service); + + return (step) => handler(step) + 100; + }); + + expect(envelope.getOriginal('increment')(1)).toBe(21); + expect(freshContainer.service.value).toBe(21); + expect(proxiedIncrement(1)).toBe(122); + expect(freshContainer.service.value).toBe(22); + }); + + it('should return a null proxy when the target object is missing', () => { + const container = { + service: null as unknown as CounterService, + }; + + const envelope = interceptObject(container, 'service'); + + expect(envelope.proxy).toBeNull(); + expect(envelope.getOriginal('readValue')).toBeUndefined(); + + envelope.rebind({ service: makeService(8) }); + + expect(envelope.getOriginal('readValue')()).toBe(8); + }); +}); + +function makeContainer(value: number): { service: CounterService } { + return { + service: makeService(value), + }; +} + +function makeService(value: number): CounterService { + return { + value, + label: 'counter', + get summary() { + return `${this.label}:${this.value}`; + }, + increment(step) { + this.value += step; + return this.value; + }, + readValue() { + return this.value; + }, + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts new file mode 100644 index 00000000..4f0e4d82 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/interceptObject/interceptObject.ts @@ -0,0 +1,126 @@ +import { isFunction } from '@common/assertions'; +import type { AnyFunction, ObjectKeys } from '@common/types'; + +/** + * Methods accessed through the proxy are wrapped so their execution can be + * dynamically redirected to registered overrides, even when destructured. + * + * Overrides are defined via a builder that receives the original target and a + * pre-bound version of the method, and must return a replacement function. + * + * Original methods retain their native behavior and binding. + */ +const interceptObject = < + Envelop extends object, + Key extends ObjectKeys, + Target extends object = Envelop[Key] extends object ? Envelop[Key] : never, +>( + container: Envelop, + target: Key +) => { + let targetObj = container[target] as Target; + + const overrideRegistry = new Map(); + const originalRegistry = new Map(); + let functionCache = new WeakMap(); + + const proxy = targetObj + ? new Proxy(targetObj, { + get(proxyTarget, prop): unknown { + // Use the real target as `this` for property access to avoid + // "Illegal invocation" from native getters that perform brand checks + // (e.g. MediaDevices.ondevicechange in Firefox). + const value = Reflect.get(proxyTarget, prop, proxyTarget); + const methodName = String(prop); + + if (!isFunction(value)) return value; + + const typedValue = value as AnyFunction; + + if (functionCache.has(typedValue)) return functionCache.get(typedValue); + + if (!originalRegistry.has(methodName)) { + originalRegistry.set(methodName, typedValue.bind(proxyTarget)); + } + + const wrapped: AnyFunction = function (...args: unknown[]): unknown { + const registeredOverride = overrideRegistry.get(methodName); + if (registeredOverride) return registeredOverride(...args); + + return typedValue.apply(proxyTarget, args); + }; + + functionCache.set(typedValue, wrapped); + + return wrapped; + }, + }) + : null; + + if (targetObj) { + // Replace the original object with the proxy in the container + Object.defineProperty(container, target, { + value: proxy, + configurable: true, + writable: true, + }); + } + + return { + proxy, + override< + K extends keyof Target, + Handler extends AnyFunction = Target[K] extends AnyFunction ? Target[K] : never, + >( + method: K, + builder: (args: { + target: Target; + handler: Handler; + }) => (...args: Parameters) => ReturnType + ): Unsubscribe { + const original = this.getOriginal(method) as unknown as Handler; + const handler = builder({ target: targetObj, handler: original }); + + overrideRegistry.set(method as string, handler as AnyFunction); + + return () => { + overrideRegistry.delete(method as string); + }; + }, + removeOverride(method: K) { + overrideRegistry.delete(method as string); + }, + getOriginal< + K extends keyof Target, + Handler extends AnyFunction = Target[K] extends AnyFunction ? Target[K] : never, + >(method: K): Handler { + const cached = originalRegistry.get(method as string); + if (cached) return cached as Handler; + + const value = targetObj?.[method]; + if (!isFunction(value)) return value as Handler; + + const bound = value.bind(targetObj) as Handler; + originalRegistry.set(method as string, bound); + + return bound; + }, + /** + * Re-reads the target from the given container, clearing stale caches + * while preserving registered overrides. + * + * Useful when the container reference is replaced after initialization + * (e.g. `vi.stubGlobal` in tests replacing `navigator`). + */ + rebind(freshContainer?: Envelop) { + if (freshContainer) targetObj = freshContainer[target] as Target; + + originalRegistry.clear(); + functionCache = new WeakMap(); + }, + }; +}; + +type Unsubscribe = () => void; + +export default interceptObject; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts new file mode 100644 index 00000000..f0da82f6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/index.ts @@ -0,0 +1 @@ +export { default } from './isZodError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts new file mode 100644 index 00000000..a8f9e00e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { z } from 'zod'; +import isZodError from './isZodError'; + +const schema = z.object({ + name: z.string(), +}); + +describe('isZodError', () => { + it('returns true for a ZodError', () => { + const result = schema.safeParse({ name: 123 }); + expect(result.success).toBe(false); + expect(isZodError(!result.success && result.error)).toBe(true); + expect(isZodError(new Error('Not a Zod error'))).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts new file mode 100644 index 00000000..01632804 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/helpers/isZodError/isZodError.ts @@ -0,0 +1,11 @@ +import { isNotNil } from '@common/assertions'; +import { isApplicationErrorLike } from '@common/errors'; +import { ZodError } from 'zod'; + +function isZodError(error: unknown): error is ZodError { + if (error instanceof ZodError) return true; + + return isApplicationErrorLike(error) && error.name === 'ZodError' && isNotNil(error.issues); +} + +export default isZodError; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts index d8589f34..c0f45206 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.spec.ts @@ -253,6 +253,82 @@ describe('LoggerBase', () => { }); }); + describe('setContext / clearContext', () => { + it('merges context into log() calls automatically', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1', sessionId: 's1' }); + loggerBase.log('TestEvent'); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'TestEvent', + expect.objectContaining({ userId: 'u1', sessionId: 's1' }) + ); + }); + }); + + it('merges context into reportError() calls automatically', async () => { + const provider = { ...minimalProvider, reportError: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1', connectionId: 'c1' }); + loggerBase.reportError(new Error('oops')); + + await waitFor(() => { + expect(provider.reportError).toHaveBeenCalledWith( + expect.objectContaining({ message: 'oops' }), + expect.objectContaining({ userId: 'u1', connectionId: 'c1' }) + ); + }); + }); + + it('extra passed to log() takes precedence over context', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ sessionId: 'from-context' }); + loggerBase.log('TestEvent', { sessionId: 'from-extra' }); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'TestEvent', + expect.objectContaining({ sessionId: 'from-extra' }) + ); + }); + }); + + it('clearContext() removes context from subsequent log() calls', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1' }); + loggerBase.clearContext(); + loggerBase.log('TestEvent'); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith('TestEvent', {}); + }); + }); + + it('setContext() merges with previously set context fields', async () => { + const provider = { ...minimalProvider, log: vi.fn() }; + loggerBase.setup(() => provider); + + loggerBase.setContext({ userId: 'u1' }); + loggerBase.setContext({ sessionId: 's1' }); + loggerBase.log('TestEvent'); + + await waitFor(() => { + expect(provider.log).toHaveBeenCalledWith( + 'TestEvent', + expect.objectContaining({ userId: 'u1', sessionId: 's1' }) + ); + }); + }); + }); + describe('setup with synchronous callback returning invalid result', () => { it.each([ ['null', () => null], diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts index d81d04f2..d245af20 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/Logger.ts @@ -43,10 +43,21 @@ export type LoggerProviderConfig = { [LoggerFeature.Log](event: string, extra?: Record): void; }; +/** + * Persistent context that is automatically merged into every log and reportError call. + */ +export type LogContext = { + userId?: string; + sessionId?: string; + connectionId?: string; + partnerId?: string; +}; + /** * Logger base class for error reporting and event logging. */ export class LoggerBase implements LoggerProviderConfig { + private readonly context: LogContext = {}; /** * Indicates whether the lack of a logger provider or one of its features has been acknowledged. */ @@ -112,6 +123,16 @@ export class LoggerBase implements LoggerProviderConfig { }); } + /** + * Resets the logger state, clearing the provider, any stored error, acknowledged features, and context. + */ + public reset() { + this.provider = null; + this.error = null; + this.acknowledged = Object.create(null); + this.clearContext(); + } + protected logLoggerEvent( feature: T, ...args: Parameters<(typeof this)[T]> @@ -192,6 +213,22 @@ export class LoggerBase implements LoggerProviderConfig { }; } + /** + * Sets persistent context fields that are automatically merged into every log and reportError call. + */ + public setContext(context: Partial): void { + Object.assign(this.context, context); + } + + /** + * Clears all persistent context (e.g. on session disconnect or user logout). + */ + public clearContext(): void { + (Object.keys(this.context) as Array).forEach((key) => { + delete this.context[key]; + }); + } + public group>(groupName: string, context?: T) { const groupId = crypto.randomUUID(); @@ -228,7 +265,7 @@ export class LoggerBase implements LoggerProviderConfig { } : error; - const extraRecord = extra ?? {}; + const extraRecord = { ...this.context, ...(extra ?? {}) }; void this.tryExecuteFeature(LoggerFeature.ReportError).then((feature) => feature?.(normalizedError, extraRecord) @@ -241,7 +278,8 @@ export class LoggerBase implements LoggerProviderConfig { * @param extra Additional data associated with the event. */ public log(event: string, extra: Record = {}) { - void this.tryExecuteFeature(LoggerFeature.Log).then((feature) => feature?.(event, extra)); + const merged = { ...this.context, ...extra }; + void this.tryExecuteFeature(LoggerFeature.Log).then((feature) => feature?.(event, merged)); } } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts index b84bdc04..5460039e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/logger/index.ts @@ -1,3 +1,3 @@ export { LoggerBase } from './Logger'; -export type { LoggerProviderConfig } from './Logger'; +export type { LoggerProviderConfig, LogContext } from './Logger'; export { LoggerFeature, ColorsPerFeature, AnsiColors } from './Logger'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts index 6885eeca..9c1574c7 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/ClientLogEvent/ClientLogEvent.schema.ts @@ -19,6 +19,7 @@ export const ClientLogEventSchema = z.object({ sdkId: z.string().optional(), componentId: z.string().optional(), partnerId: z.string().optional(), + userId: z.string().optional(), logVersion: z.string().optional(), name: z.string().optional(), }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts new file mode 100644 index 00000000..54c0f4f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/FacingMode.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; +import { FacingMode } from '../types'; + +export const FacingModeSchema = z.enum([ + FacingMode.user, + FacingMode.environment, + FacingMode.unknown, +]); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts new file mode 100644 index 00000000..1ca8d537 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.spec.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import RoomNameSchema from './RoomName.schema'; + +describe('RoomNameSchema', () => { + it('should accept a valid room name', () => { + expect(RoomNameSchema.safeParse('my-room-123').success).toBe(true); + }); + + it('should reject an invalid room name', () => { + expect(RoomNameSchema.safeParse('').success).toBe(false); + expect(RoomNameSchema.safeParse('UPPERCASE').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts new file mode 100644 index 00000000..12143bf2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/RoomName.schema.ts @@ -0,0 +1,8 @@ +import z from 'zod'; +import { isValidRoomName } from '../../assertions'; + +export const RoomNameSchema = z + .string() + .refine((val) => isValidRoomName(val), { message: 'Not a valid room name' }); + +export default RoomNameSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts new file mode 100644 index 00000000..ca680f36 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/RoomName/index.ts @@ -0,0 +1 @@ +export * from './RoomName.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts index 3b78e507..e727e2a1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/schemas/index.ts @@ -1,3 +1,5 @@ +export * from './RoomName'; export * from './VonageAudioOutputDevice'; export * from './VonageDevice'; export * from './VonageDeviceKind'; +export * from './FacingMode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts index f4a98edf..f6e8bd7d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DecodedSessionId.ts @@ -8,9 +8,15 @@ export type DecodedSessionId = { /** The version of the session */ version: string; - /** The partner ID associated with the session */ + /** + * @deprecated Use applicationId instead. This value is the same as applicationId */ partnerId: string; + /* + * The application ID associated with the session. This is typically the same as the partner ID, but can be different in some cases. + */ + applicationId: string; + /** The location hint (IP address or region) used when the session was created for media routing */ location: string; diff --git a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DeepPartial.ts similarity index 80% rename from tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/index.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DeepPartial.ts index ac456c1e..01ddc778 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/frontend/src/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/DeepPartial.ts @@ -1,5 +1,3 @@ -export * from './room'; - export type DeepPartial = { [K in keyof T]?: T[K] extends object ? DeepPartial : T[K]; }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts new file mode 100644 index 00000000..26e59658 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/FacingMode.ts @@ -0,0 +1,7 @@ +export enum FacingMode { + user = 'user', + environment = 'environment', + unknown = 'unknown', +} + +export default FacingMode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts new file mode 100644 index 00000000..f91a4c8a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/IsOptionalKey.ts @@ -0,0 +1,10 @@ +export type IsOptionalKey = T extends unknown + ? K extends keyof T + ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type + {} extends Pick + ? true + : false + : false + : never; + +export default IsOptionalKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts new file mode 100644 index 00000000..2249c08c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/ObjectKeys.ts @@ -0,0 +1,8 @@ +/** + * Like keyof, but only returns keys whose values are objects + */ +export type ObjectKeys = { + [K in keyof T]: T[K] extends object ? K : never; +}[keyof T]; + +export default ObjectKeys; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts new file mode 100644 index 00000000..28251ffe --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SameKeys.ts @@ -0,0 +1,5 @@ +export type SameKeys = { + [K in keyof T]?: unknown; +}; + +export default SameKeys; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts new file mode 100644 index 00000000..560086b6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionId.ts @@ -0,0 +1,3 @@ +export type SessionId = `${string}_${string}` & { __brand: 'SessionId' }; + +export default SessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts new file mode 100644 index 00000000..8cd7e214 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKey.ts @@ -0,0 +1,5 @@ +export type SessionKey = `${string}.${string}.${string}` & { + __brand: 'SessionKey'; +}; + +export default SessionKey; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts new file mode 100644 index 00000000..456e23c1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/SessionKeyPayload.ts @@ -0,0 +1,6 @@ +export type SessionKeyPayload = { + sessionId: string; + roomName?: string | null | undefined; +}; + +export default SessionKeyPayload; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts new file mode 100644 index 00000000..95e681e8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetails.ts @@ -0,0 +1,12 @@ +import DecodedSessionId from './DecodedSessionId'; +import { Prettify } from './Prettify'; + +export type VideoSessionDetails = Prettify< + DecodedSessionId & { + sessionKey: string; + sessionId: string; + roomName?: string | null | undefined; + } +>; + +export default VideoSessionDetails; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts new file mode 100644 index 00000000..f867d3e5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/VideoSessionDetailsWithToken.ts @@ -0,0 +1,6 @@ +import { Prettify } from './Prettify'; +import VideoSessionDetails from './VideoSessionDetails'; + +export type VideoSessionDetailsWithToken = Prettify; + +export default VideoSessionDetailsWithToken; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts index a1f7d790..7b061db1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/src/types/index.ts @@ -5,7 +5,17 @@ export { type ClientLogEvent, type SerializedError, } from '../schemas/ClientLogEvent'; -export * from './DecodedSessionId'; -export * from './Any'; -export * from './AnyFunction'; -export * from './KebabToCamel'; +export type * from './DecodedSessionId'; +export type * from './Any'; +export type * from './AnyFunction'; +export type * from './KebabToCamel'; +export type * from './ObjectKeys'; +export type * from './SessionId'; +export type * from './SameKeys'; +export type * from './IsOptionalKey'; +export type * from './SessionKeyPayload'; +export type * from './VideoSessionDetails'; +export type * from './VideoSessionDetailsWithToken'; +export type * from './SessionKey'; +export type * from './DeepPartial'; +export * from './FacingMode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts index 2cd7cbc0..f5762b70 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/index.ts @@ -7,3 +7,5 @@ export { default as useMountEffect } from './useMountEffect'; export { default as useStableCallback } from './useStableCallback'; export { default as useStableRef } from './useStableRef'; export { default as useSuspenseMemo } from './useSuspenseMemo'; +export { default as useAnchorElement } from './useAnchorElement'; +export { default as useRenderCount } from './useRenderCount'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts new file mode 100644 index 00000000..4ed3cbd9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/index.ts @@ -0,0 +1 @@ +export { default } from './useAnchorElement'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts new file mode 100644 index 00000000..73c6197d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useAnchorElement/useAnchorElement.ts @@ -0,0 +1,66 @@ +import { isFunction } from '../../assertions'; +import useMountEffect from '../useMountEffect'; + +type UseAnchorElementProps = { + /** + * A ref to the element that will be used as an anchor for the iframe. The iframe will be positioned and sized to match this element. + */ + anchorRef: React.RefObject; + + /** + * A function that return the element to anchor to. + */ + target: HTMLElement | null | (() => HTMLElement | null); + + /** + * Optional callback that will be called when the anchor element is captured by the anchor. + */ + onAttach?: () => void; + + /** + * Optional callback that will be called when the anchor element is released by the anchor. On unmount. + */ + onDetach?: () => void; +}; + +/** + * Anchors an element to the position and size of another element. + */ +const useAnchorElement = ({ anchorRef, target, onAttach, onDetach }: UseAnchorElementProps) => { + useMountEffect(() => { + const selector = isFunction(target) ? target : () => target; + + const elementToAnchor = selector(); + const anchorTo = anchorRef.current; + + if (!elementToAnchor || !anchorTo) return; + + onAttach?.(); + + let frameId: number; + + const update = () => { + const rect = anchorTo.getBoundingClientRect(); + + Object.assign(elementToAnchor.style, { + position: 'fixed', + top: `${rect.top}px`, + left: `${rect.left}px`, + width: `${rect.width}px`, + height: `${rect.height}px`, + zIndex: '10', + }); + + frameId = requestAnimationFrame(update); + }; + + update(); + + return () => { + onDetach?.(); + cancelAnimationFrame(frameId); + }; + }); +}; + +export default useAnchorElement; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts new file mode 100644 index 00000000..f6cb361b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/index.ts @@ -0,0 +1 @@ +export { default } from './useRenderCount'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts new file mode 100644 index 00000000..eb2c78e1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { renderHook } from '@testing-library/react'; +import useRenderCount from './'; + +describe('useRenderCount', () => { + it('should increment on each re-render', () => { + const { result, rerender } = renderHook(() => useRenderCount()); + + rerender(); + expect(result.current).toBe(2); + + rerender(); + expect(result.current).toBe(3); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts new file mode 100644 index 00000000..b6fbb541 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useRenderCount/useRenderCount.ts @@ -0,0 +1,7 @@ +import useAccumulator from '../useAccumulator'; + +function useRenderCount() { + return useAccumulator((count) => (count ?? 0) + 1, [{}]).current; +} + +export default useRenderCount; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts index 91dfe7c7..a8f8114d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useDisposableStableRef.ts @@ -1,6 +1,25 @@ -import { useMemo, useEffectEvent, useEffect } from 'react'; +import { useState, useEffectEvent, useEffect } from 'react'; import type { RefCreator, CleanupFunction } from '../useStableRef.types'; -import { stable_ref_unique_symbol } from '../useStableRef.types'; + +export const STABLE_REF_UNSAFE_RENDER_WARNING = [ + 'useStableRef:', + '', + 'Avoid creating values that require cleanup during render.', + 'React may run the render function multiple times and discard the result.', + 'Discarded renders do NOT run cleanup.', + 'This can lead to duplicated resources, memory leaks, or inconsistent state.', + '', + 'Safe:', + '- Do not create values that require cleanup during render.', + '', + 'Advanced (unsafe, use at your own risk):', + '- If you are 100% sure the value is pure (can be created multiple times and discarded without problems) and you need it during render, you can create the ref with an empty dependency array:', + ' const ref = useStableRef(() => src, [])', + '- and dispose it manually in an effect:', + ' useEffect(() => () => ref.current.dispose(), [])', + '- WARNING:', + ' React does not guarantee cleanup will run for discarded renders, so you may end up with duplicated resources or memory leaks.', +].join('\n'); /** * Disposable stable ref, not available during render phase. @@ -14,8 +33,8 @@ function useDisposableStableRef({ cleanup: CleanupFunction; dependencies: React.DependencyList; }): React.RefObject { - const ref = useMemo(() => { - let current = stable_ref_unique_symbol as T | typeof stable_ref_unique_symbol; + const [ref] = useState(() => { + let current = undefined as T; const wrapper = { current, @@ -26,7 +45,7 @@ function useDisposableStableRef({ current: { get: () => { if (!wrapper.isInitialized) { - throw new Error('Stable ref is not available during render phase.'); + throw new Error(STABLE_REF_UNSAFE_RENDER_WARNING); } return current; @@ -38,22 +57,23 @@ function useDisposableStableRef({ }); return wrapper; - }, []); - - const stableBuilder = useEffectEvent(builder); - const stableCleanup = useEffectEvent(cleanup); + }); - useEffect(() => { - const current = stableBuilder(); + const stableBuilder = useEffectEvent(() => { + const current = builder(); ref.current = current; ref.isInitialized = true; return () => { - stableCleanup?.(current); + cleanup?.(current); }; + }); + + useEffect(() => { + return stableBuilder(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ref, ...dependencies]); + }, dependencies); return ref as React.RefObject; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts index 2b380f83..6a0c8a9f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useNonDisposableStableRef.ts @@ -1,4 +1,4 @@ -import { useMemo } from 'react'; +import { useState } from 'react'; import type { RefCreator } from '../useStableRef.types'; import { stable_ref_unique_symbol } from '../useStableRef.types'; import shallowCompare from 'react-global-state-hooks/shallowCompare'; @@ -12,13 +12,10 @@ function useNonDisposableStableRef( builder: RefCreator, dependencies: React.DependencyList ): React.RefObject { - const ref = useMemo( - () => ({ - current: undefined as T | undefined, - dependencies: undefined as React.DependencyList | undefined, - }), - [] - ); + const [ref] = useState(() => ({ + current: undefined as T | undefined, + dependencies: undefined as React.DependencyList | undefined, + })); const isFirstRun = ref.current === stable_ref_unique_symbol; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts index 057a7d86..34786055 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/hooks/useSimpleRef.ts @@ -1,10 +1,13 @@ -import { useRef } from 'react'; +import { useState } from 'react'; /** * Simple stable ref hook that always updates the ref's current value. */ function useSimpleRef(value: T): React.RefObject { - const ref = useRef(value); + const [ref] = useState(() => ({ + current: value, + })); + ref.current = value; return ref; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts index 94eb2327..99a53291 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/hooks/useStableRef/useStableRef.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect, vi } from 'vitest'; import { renderHook } from '@testing-library/react'; import useStableRef from './'; +import { STABLE_REF_UNSAFE_RENDER_WARNING } from './hooks/useDisposableStableRef'; describe('useStableRef', () => { describe('Simple ref (value only)', () => { @@ -108,7 +109,7 @@ describe('useStableRef', () => { // Trying to access during render return ref.current; }); - }).toThrow('Stable ref is not available during render phase.'); + }).toThrow(STABLE_REF_UNSAFE_RENDER_WARNING); }); it('should call cleanup when dependencies change', () => { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts index f19e65a9..b8b6e6fc 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcBrowser/schemas/MediaDeviceInfo/MediaDeviceInfo.schema.ts @@ -1,7 +1,14 @@ import z from 'zod'; import DeviceKindSchema from '../DeviceKind'; +import { FacingMode } from '@common/types'; +import { FacingModeSchema } from '@common/schemas'; -export type MediaDeviceInfoJSON = Omit; +export type MediaDeviceInfoJSON = Omit & { + /** + * FaceMode inferred from the device label. + */ + inferredFacingMode?: FacingMode | null; +}; /** * Native browser MediaDeviceInfo schema @@ -11,6 +18,7 @@ export const MediaDeviceInfoJSONSchema: z.ZodType = z.loose kind: DeviceKindSchema, label: z.string(), groupId: z.string(), + inferredFacingMode: FacingModeSchema.nullable().optional(), }); export function assertMediaDeviceInfo(data: unknown): asserts data is MediaDeviceInfoJSON { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts deleted file mode 100644 index 12e8b2f1..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { VALID_SESSION_ID, INVALID_SESSION_IDS } from '@common-test/fixtures'; -import assertVonageSessionId from '.'; - -describe('assertVonageSessionId', () => { - it('should not throw for a valid session ID', () => { - expect(() => assertVonageSessionId(VALID_SESSION_ID)).not.toThrow(); - }); - - it('should throw for an empty string', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.empty)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for a session ID without underscore separator', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.noUnderscore)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for a session ID with multiple underscores', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.multipleUnderscores)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for a session ID with too few decoded fields', () => { - expect(() => assertVonageSessionId(INVALID_SESSION_IDS.tooFewFields)).toThrow( - 'Invalid sessionId format' - ); - }); - - it('should throw for null', () => { - expect(() => assertVonageSessionId(null)).toThrow(); - }); - - it('should throw for undefined', () => { - expect(() => assertVonageSessionId(undefined)).toThrow(); - }); -}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts deleted file mode 100644 index dd0f4134..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/assertVonageSessionId.ts +++ /dev/null @@ -1,7 +0,0 @@ -import decodeSessionId from '../../helpers/decodeSessionId'; - -function assertVonageSessionId(value: unknown): asserts value is string { - decodeSessionId(value as string); -} - -export default assertVonageSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts deleted file mode 100644 index cd13b437..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/assertVonageSessionId/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './assertVonageSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts index 951a4950..2bce812f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/assertions/index.ts @@ -1,2 +1 @@ export * from '../../src/assertions'; -export { default as assertVonageSessionId } from './assertVonageSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts deleted file mode 100644 index 2b59af69..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/decodeSessionId/decodeSessionId.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { DecodedSessionId } from '../../../src/types/DecodedSessionId'; -import { StringDecoder } from 'node:string_decoder'; - -/** - * Decodes an OpenTok sessionId and returns an object with its values - * @param {String} sessionId - * @returns {Object} - * @throws {Error} If sessionId format is invalid - */ -const decodeSessionId = (sessionId: string): DecodedSessionId => { - const splittedSession = (sessionId || '').split('_'); - if (splittedSession.length !== 2) { - throw new Error('Invalid sessionId format'); - } - - const info = splittedSession[1]; - const buf = Buffer.from(info, 'base64'); - const decoder = new StringDecoder('utf8'); - const decodedSession = decoder.write(buf); - const sessionFields = decodedSession.split('~'); - - if (sessionFields.length < 4) { - throw new Error('Invalid sessionId format'); - } - - return { - p2p: sessionFields.includes('P'), - autoArchive: sessionFields.includes('A'), - version: sessionFields[0], - partnerId: sessionFields[1], - location: sessionFields[2], - date: sessionFields[3], - }; -}; - -export default decodeSessionId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts index df6f5eba..2fae8e1d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/helpers/index.ts @@ -1,2 +1 @@ export * from '../../src/helpers'; -export { default as decodeSessionId } from './decodeSessionId'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts new file mode 100644 index 00000000..ecbe576d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveLayout.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; +import type { ArchiveLayout } from '@vonage/video'; +import LayoutTypeSchema from './LayoutType.schema'; + +export const ArchiveLayoutSchema: z.ZodType = z.object({ + type: LayoutTypeSchema, + stylesheet: z.string().optional(), + screenshareType: z.string().optional(), +}); + +export default ArchiveLayoutSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts new file mode 100644 index 00000000..a49ecb52 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.spec.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import ArchiveModeSchema from './ArchiveMode.schema'; + +describe('ArchiveModeSchema', () => { + it('should accept valid archive modes', () => { + expect(ArchiveModeSchema.safeParse('manual').success).toBe(true); + expect(ArchiveModeSchema.safeParse('always').success).toBe(true); + }); + + it('should reject an invalid archive mode', () => { + expect(ArchiveModeSchema.safeParse('invalid').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts new file mode 100644 index 00000000..ec84baf2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/ArchiveMode.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { ArchiveMode } from '@vonage/video'; + +export const ArchiveModeSchema: z.ZodType = z.enum(ArchiveMode); + +export default ArchiveModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts new file mode 100644 index 00000000..d1e09572 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveMode/index.ts @@ -0,0 +1 @@ +export * from './ArchiveMode.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts new file mode 100644 index 00000000..5f86cd7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptions.schema.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; +import type { ArchiveOptions } from '@vonage/video'; +import ArchiveOptionsWithMaxBitrateSchema from './ArchiveOptionsWithMaxBitrate.schema'; +import ArchiveOptionsWithQuantizationParameterSchema from './ArchiveOptionsWithQuantizationParameter.schema'; +import ArchiveWithTranscriptionSchema from './ArchiveWithTranscription.schema'; +import ArchiveWithoutTranscriptionSchema from './ArchiveWithoutTranscription.schema'; + +export const ArchiveOptionsSchema: z.ZodType = z.union([ + ArchiveOptionsWithMaxBitrateSchema, + ArchiveOptionsWithMaxBitrateSchema.and(ArchiveWithTranscriptionSchema), + ArchiveOptionsWithMaxBitrateSchema.and(ArchiveWithoutTranscriptionSchema), + ArchiveOptionsWithQuantizationParameterSchema, + ArchiveOptionsWithQuantizationParameterSchema.and(ArchiveWithTranscriptionSchema), + ArchiveOptionsWithQuantizationParameterSchema.and(ArchiveWithoutTranscriptionSchema), + ArchiveWithTranscriptionSchema, + ArchiveWithoutTranscriptionSchema, +]); + +export default ArchiveOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts new file mode 100644 index 00000000..834d2595 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithMaxBitrate.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveOptionsWithMaxBitrateSchema = BaseArchiveOptionsSchema.extend({ + maxBitrate: z.number().optional(), +}); + +export type ArchiveOptionsWithMaxBitrate = z.infer; + +export default ArchiveOptionsWithMaxBitrateSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts new file mode 100644 index 00000000..d6d7e051 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOptionsWithQuantizationParameter.schema.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveOptionsWithQuantizationParameterSchema = BaseArchiveOptionsSchema.extend({ + quantizationParameter: z.number().optional(), +}); + +export type ArchiveOptionsWithQuantizationParameter = z.infer< + typeof ArchiveOptionsWithQuantizationParameterSchema +>; + +export default ArchiveOptionsWithQuantizationParameterSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts new file mode 100644 index 00000000..06a6c159 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveOutputMode.schema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; +import { ArchiveOutputMode } from '@vonage/video'; + +export const ArchiveOutputModeSchema: z.ZodType = + z.nativeEnum(ArchiveOutputMode); + +export default ArchiveOutputModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts new file mode 100644 index 00000000..c5a2a8de --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithTranscription.schema.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveWithTranscriptionSchema = BaseArchiveOptionsSchema.extend({ + hasTranscription: z.literal(true), + transcriptionProperties: z.object({ + primaryLanguageCode: z.string().optional(), + hasSummary: z.boolean().optional(), + }), +}); + +export type ArchiveWithTranscription = z.infer; + +export default ArchiveWithTranscriptionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts new file mode 100644 index 00000000..41c05c3c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/ArchiveWithoutTranscription.schema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import BaseArchiveOptionsSchema from './BaseArchiveOptions.schema'; + +export const ArchiveWithoutTranscriptionSchema = BaseArchiveOptionsSchema.extend({ + hasTranscription: z.literal(false).optional(), +}).omit({ transcriptionProperties: true }); + +export type ArchiveWithoutTranscription = z.infer; + +export default ArchiveWithoutTranscriptionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts new file mode 100644 index 00000000..ae2ad4b4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/BaseArchiveOptions.schema.ts @@ -0,0 +1,22 @@ +import { z } from 'zod'; +import ArchiveLayoutSchema from './ArchiveLayout.schema'; +import ArchiveOutputModeSchema from './ArchiveOutputMode.schema'; +import ResolutionSchema from './Resolution.schema'; +import StreamModeSchema from './StreamMode.schema'; +import TranscriptionPropertiesSchema from './TranscriptionProperties.schema'; + +export const BaseArchiveOptionsSchema = z.object({ + hasAudio: z.boolean().optional(), + hasVideo: z.boolean().optional(), + layout: ArchiveLayoutSchema.optional(), + name: z.string().optional(), + outputMode: ArchiveOutputModeSchema.optional(), + resolution: ResolutionSchema.optional(), + streamMode: StreamModeSchema.optional(), + hasTranscription: z.boolean().optional(), + transcriptionProperties: TranscriptionPropertiesSchema.optional(), +}); + +export type BaseArchiveOptions = z.infer; + +export default BaseArchiveOptionsSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts new file mode 100644 index 00000000..b283bef5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/LayoutType.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { LayoutType } from '@vonage/video'; + +export const LayoutTypeSchema: z.ZodType = z.nativeEnum(LayoutType); + +export default LayoutTypeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts new file mode 100644 index 00000000..1afe0429 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/MediaMode.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { MediaMode } from '@vonage/video'; + +export const MediaModeSchema: z.ZodType = z.nativeEnum(MediaMode); + +export default MediaModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts new file mode 100644 index 00000000..88dd065a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/Resolution.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { Resolution } from '@vonage/video'; + +export const ResolutionSchema: z.ZodType = z.nativeEnum(Resolution); + +export default ResolutionSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts new file mode 100644 index 00000000..56125470 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.spec.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import SessionIdSchema from './SessionId.schema'; + +describe('SessionIdSchema', () => { + it('should accept a valid session ID', () => { + expect( + SessionIdSchema.safeParse( + '1_MX4xMjM0NTY3OH4-VGh1IEZlYiAyNyAwODozMjozNCBQU1QgMjAyMH4wLjI0NDYxMjE' + ).success + ).toBe(true); + }); + + it('should reject an invalid session ID', () => { + expect(SessionIdSchema.safeParse('not-a-session-id').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts new file mode 100644 index 00000000..9fcb186c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/SessionId.schema.ts @@ -0,0 +1,9 @@ +import z from 'zod'; +import { isValidSessionId } from '../../../src/assertions'; + +export const SessionIdSchema = z + .string() + .refine((val) => isValidSessionId(val), { message: 'Not a valid SessionId' }) + .transform((val) => val as string); + +export default SessionIdSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts new file mode 100644 index 00000000..ca4df1d1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionId/index.ts @@ -0,0 +1 @@ +export * from './SessionId.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts new file mode 100644 index 00000000..fd8a12ed --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.spec.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import SessionKeySchema from './SessionKey.schema'; + +const validSessionKey = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZXNzaW9uSWQiOiIxX01YNWtNVEkxWWpGbU1DMWtZMkl5TFRRM05EY3RZamxrWVMxa09ESTVOMkk0WkdFME9UZC1makUzTnpVM09UWXhOVGd3TWpkLWFqaElOU3RYZEV4VU5sYzBZbE5vZGs5UVNYVllVRmRDZm41LSIsInJvb21OYW1lIjoiYXdlc29tZS1yb29tLW5hbWUiLCJpYXQiOjE3NzU5NjMzMjh9.QcNVXp6gatPTV82IJa8VgDG6rOLBkFjU3r7j_BcxM-c'; + +describe('SessionKeySchema', () => { + it('should accept a valid session key', () => { + expect(SessionKeySchema.safeParse(validSessionKey).success).toBe(true); + }); + + it('should reject an invalid session key', () => { + expect(SessionKeySchema.safeParse('not-a-session-key').success).toBe(false); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts new file mode 100644 index 00000000..eb9adad0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/SessionKey.schema.ts @@ -0,0 +1,9 @@ +import z from 'zod'; +import { isValidSessionKey } from '../../../src/assertions'; + +export const SessionKeySchema = z + .string() + .refine((val) => isValidSessionKey(val), { message: 'Not a valid SessionKey' }) + .transform((val) => val); + +export default SessionKeySchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts new file mode 100644 index 00000000..0d0a7fdb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/SessionKey/index.ts @@ -0,0 +1 @@ +export * from './SessionKey.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts new file mode 100644 index 00000000..af09cadf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/StreamMode.schema.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { StreamMode } from '@vonage/video'; + +export const StreamModeSchema: z.ZodType = z.nativeEnum(StreamMode); + +export default StreamModeSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts new file mode 100644 index 00000000..0a4dc9fb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/TranscriptionProperties.schema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +export const TranscriptionPropertiesSchema = z.object({ + primaryLanguageCode: z.string().optional(), + hasSummary: z.boolean().optional(), + hasTranscription: z.boolean().optional(), +}); + +export type TranscriptionProperties = z.infer; + +export default TranscriptionPropertiesSchema; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts index 9897c5d4..ff44f78e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/schemas/index.ts @@ -1 +1,17 @@ export * from '../../src/schemas'; +export * from './SessionId'; +export * from './SessionKey'; +export * from './LayoutType.schema'; +export * from './ArchiveOutputMode.schema'; +export * from './MediaMode.schema'; +export * from './ArchiveMode'; +export * from './Resolution.schema'; +export * from './StreamMode.schema'; +export * from './ArchiveLayout.schema'; +export * from './TranscriptionProperties.schema'; +export * from './BaseArchiveOptions.schema'; +export * from './ArchiveOptionsWithMaxBitrate.schema'; +export * from './ArchiveOptionsWithQuantizationParameter.schema'; +export * from './ArchiveWithTranscription.schema'; +export * from './ArchiveWithoutTranscription.schema'; +export * from './ArchiveOptions.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts index df511476..af19d1e8 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/srcNode/types/index.ts @@ -1 +1,8 @@ export * from '../../src/types'; + +export type { TranscriptionProperties } from '../schemas/TranscriptionProperties.schema'; +export type { BaseArchiveOptions } from '../schemas/BaseArchiveOptions.schema'; +export type { ArchiveOptionsWithMaxBitrate } from '../schemas/ArchiveOptionsWithMaxBitrate.schema'; +export type { ArchiveOptionsWithQuantizationParameter } from '../schemas/ArchiveOptionsWithQuantizationParameter.schema'; +export type { ArchiveWithTranscription } from '../schemas/ArchiveWithTranscription.schema'; +export type { ArchiveWithoutTranscription } from '../schemas/ArchiveWithoutTranscription.schema'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts index 3ce2a0cf..b529436a 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/index.ts @@ -1,2 +1,3 @@ export { default as makeGenericMock } from './makeGenericMock'; export { default as setupPartialMock } from './setupPartialMock'; +export { default as mockModule } from './mockModule'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts index c8fe04e3..ef49dd8c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/test/helpers/setupPartialMock.ts @@ -37,7 +37,16 @@ function setupPartialMock( entries.forEach((key) => { const value = source[key as keyof T]; const currentValue = target[key as keyof T]; - const desc = Object.getOwnPropertyDescriptor(target, key); + + const desc = (() => { + const desc = Object.getOwnPropertyDescriptor(target, key); + if (desc) return desc; + + const proto = Object.getPrototypeOf(target); + if (!proto) return undefined; + + return Object.getOwnPropertyDescriptor(proto, key); + })(); // trying to mock or override something that does not exist on the target if (!desc) { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts new file mode 100644 index 00000000..f3a8befc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/environment/helpers/setupMuiMaterialStylesMock.ts @@ -0,0 +1,30 @@ +import { isRecord } from '@common/assertions'; +import { vi } from 'vitest'; + +vi.mock('@mui/material/styles', async (importOriginal) => { + const actual = await importOriginal(); + + function createTheme(...args: Parameters) { + const [themeOptions, ...rest] = args; + + const sanitizedThemeOptions = (() => { + const { cssVariables } = themeOptions || {}; + + if (isRecord(cssVariables) && cssVariables.colorSchemeSelector === ':host(.%s)') { + return { + ...themeOptions, + cssVariables: true, + }; + } + + return themeOptions; + })(); + + return actual.createTheme(sanitizedThemeOptions, ...rest); + } + + return { + ...actual, + createTheme, + }; +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts index fbd69804..7c896a39 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/index.ts @@ -1,5 +1,9 @@ export * from '../../test/fixtures'; -export { default as makeMediaDeviceInfos } from './makeMediaDeviceInfos'; +export { + default as makeMediaDeviceInfos, + frontCameraId, + rearCameraId, +} from './makeMediaDeviceInfos'; export { default as mockPlatformModule } from './mockPlatformModule'; export { default as makeWindowNavigatorMock } from './makeWindowNavigatorMock'; export { default as makeMediaStreamMock } from './makeMediaStreamMock'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts index ed461c9d..b8258c44 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testBrowser/fixtures/makeMediaDeviceInfos.ts @@ -1,8 +1,11 @@ +export const frontCameraId = 'video-input-1'; +export const rearCameraId = 'video-input-2'; + /** * Some media device info fixtures for testing purposes. * Do not add logic here. */ -const makeMediaDeviceInfos = () => +const makeMediaDeviceInfos = (): MediaDeviceInfo[] => [ { deviceId: 'audio-input-1', @@ -41,26 +44,26 @@ const makeMediaDeviceInfos = () => }), }, { - deviceId: 'video-input-1', + deviceId: frontCameraId, kind: 'videoinput', - label: 'Default Camera', + label: 'Front Camera', groupId: 'group-2', toJSON: () => ({ - deviceId: 'video-input-1', + deviceId: frontCameraId, kind: 'videoinput' as MediaDeviceKind, - label: 'Default Camera', + label: 'Front Camera', groupId: 'group-2', }), }, { - deviceId: 'video-input-2', + deviceId: rearCameraId, kind: 'videoinput', - label: 'USB Webcam', + label: 'Back Camera', groupId: 'group-6', toJSON: () => ({ - deviceId: 'video-input-2', + deviceId: rearCameraId, kind: 'videoinput' as MediaDeviceKind, - label: 'USB Webcam', + label: 'Back Camera', groupId: 'group-6', }), }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts new file mode 100644 index 00000000..77bb8d87 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/index.ts @@ -0,0 +1,3 @@ +export { default as mockVideoModule } from './mockVideoModule'; +export { default as mockAuthModule } from './mockAuthModule'; +export { default as waitForEvent } from './waitForEvent'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts new file mode 100644 index 00000000..ccf62e77 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockAuthModule.ts @@ -0,0 +1,67 @@ +import { type Mockable, SPY_MARK } from '@common/types/Mockable'; +import type * as module from '@vonage/auth'; +import { vi } from 'vitest'; +import { isFunction } from '@common/assertions'; +import { mockModule, setupPartialMock } from '@common-test/helpers'; + +type Module = typeof module; + +type AuthInstance = InstanceType; + +export type AuthMock = Partial< + Omit, 'Auth'> & { + Auth?: + | Mockable + | ((args: { + instance: AuthInstance; + spyOn: (mocks: Mockable) => void; + }) => void); + } +>; + +/** + * @example + * ```ts + * vi.mock('@vonage/auth', async () => { + * const actual = await vi.importActual('@vonage/auth'); + * + * return mockAuthModule(actual, { + * Auth: { + * getQueryParams: { foo: 'bar' } + * }, + * }); + * }); + * ``` + */ +const mockAuthModule = >( + actual: Module, + mock: T | ((spy: typeof SPY_MARK) => T) +): Module => { + const mock$ = (isFunction(mock) ? mock(SPY_MARK) : mock) as AuthMock; + const { Auth, ...rest } = mock$; + + const Auth$ = (() => { + if (!mock$.Auth) return actual.Auth; + + const OriginalAuth = actual.Auth; + + return vi.fn((...args: ConstructorParameters) => { + const instance = new OriginalAuth(...args); + const spyOn = (mocks: Mockable) => { + setupPartialMock('Auth instance', instance, mocks); + }; + + if (!isFunction(mock$.Auth)) { + return spyOn(Auth as Mockable); + } + + mock$.Auth({ instance, spyOn }); + + return instance; + }); + })(); + + return mockModule({ ...actual, Auth: Auth$ } as Module, rest); +}; + +export default mockAuthModule; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts new file mode 100644 index 00000000..2a4ee984 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/mockVideoModule.ts @@ -0,0 +1,70 @@ +import { type Mockable, SPY_MARK } from '@common/types/Mockable'; +import type * as module from '@vonage/video'; +import { vi } from 'vitest'; +import { isFunction } from '@common/assertions'; +import { mockModule, setupPartialMock } from '@common-test/helpers'; +import type { Any } from '@common/types'; + +type Module = typeof module; + +type VideoInstance = InstanceType; + +export type VideoMock = Partial< + Omit, 'Video'> & { + Video?: + | Mockable + | ((args: { + instance: VideoInstance; + spyOn: (mocks: Mockable) => void; + }) => void); + } +>; + +/** + * @example + * ```ts + * vi.mock('@vonage/video', async () => { + * const actual = await vi.importActual('@vonage/video'); + * + * return mockVideoModule(actual, { + * Video: { + * createSession: { sessionId: 'mock-session-id' }, + * generateClientToken: 'mock-token', + * }, + * }); + * }); + * ``` + */ +const mockVideoModule = ( + actual: Any, + mock: T | ((spy: typeof SPY_MARK) => T) +): Module => { + const actual$ = actual as Module; + const mock$ = (isFunction(mock) ? mock(SPY_MARK) : mock) as VideoMock; + const { Video, ...rest } = mock$; + + const Video$ = (() => { + if (!mock$.Video) return actual$.Video; + + const OriginalVideo = actual$.Video; + + return vi.fn((...args: ConstructorParameters) => { + const instance = new OriginalVideo(...args); + const spyOn = (mocks: Mockable) => { + setupPartialMock('Video instance', instance, mocks); + }; + + if (!isFunction(mock$.Video)) { + return spyOn(Video as Mockable); + } + + mock$.Video({ instance, spyOn }); + + return instance; + }); + })(); + + return mockModule({ ...actual$, Video: Video$ } as Module, rest); +}; + +export default mockVideoModule; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts new file mode 100644 index 00000000..b329c199 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/helpers/waitForEvent.ts @@ -0,0 +1,30 @@ +import { EventEmitter } from 'node:events'; +import defer from '@common/execution/defer'; + +/** + * Waits for a specific event to be emitted from an event emitter. + * Optionally, provide a spy function to be called when the event occurs. + * @param {EventEmitter} eventEmitter - The event emitter to listen to. + * @param {string} event - The name of the event to wait for. + * @param {(...args: any[]) => void | undefined} eventSpy - An optional callback that will be invoked with the event arguments when the event is emitted. + * @returns {Promise} - A promise that resolves if the event is dispatched. + */ +const waitForEvent = async ( + eventEmitter: EventEmitter, + event: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + eventSpy?: (...args: any[]) => void +): Promise => { + const { promise, resolve } = defer(); + const handler = (...args: unknown[]) => { + if (eventSpy) { + eventSpy(...args); + } + eventEmitter.off(event, handler); + resolve(); + }; + eventEmitter.on(event, handler); + await promise; +}; + +export default waitForEvent; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts new file mode 100644 index 00000000..c5f595cf --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/testNode/index.ts @@ -0,0 +1 @@ +export * from './helpers'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json index 843ddea1..dcaaa885 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": ["eslint.config.mjs"], + "include": ["eslint.config.mjs", "./test/**/*", "./testBrowser/**/*", "./testNode/**/*"], "references": [{ "path": "./tsconfig.lib.json" }, { "path": "./tsconfig.spec.json" }], "compilerOptions": { "rootDir": "..", @@ -17,7 +17,9 @@ "@common-test": ["./test"], "@common-test/*": ["./test/*"], "@web-test": ["./testBrowser"], - "@web-test/*": ["./testBrowser/*"] + "@web-test/*": ["./testBrowser/*"], + "@node-test": ["./testNode"], + "@node-test/*": ["./testNode/*"] }, "composite": true, "lib": ["DOM", "DOM.Iterable", "ESNext"] diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json index 497e9207..45e2250f 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/tsconfig.lib.json @@ -11,13 +11,15 @@ "include": [ "testBrowser/**/*.tsx", "testBrowser/**/*.ts", + "testNode/**/*.ts", "test/**/*.tsx", "test/**/*.ts", "srcNode/**/*.ts", "srcBrowser/**/*.tsx", "srcBrowser/**/*.ts", "src/**/*.tsx", - "src/**/*.ts" + "src/**/*.ts", + "src/types/FacingMode.ts" ], "exclude": ["**/*.spec.*", "**/*.test.*"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts index f4603a77..44ee009d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/common/vite.config.ts @@ -16,6 +16,7 @@ export default defineConfig(() => ({ '@common': path.resolve(__dirname, './src'), '@common-test': path.resolve(__dirname, './test'), '@web-test': path.resolve(__dirname, './testBrowser'), + '@node-test': path.resolve(__dirname, './testNode'), '@web': path.resolve(__dirname, './srcBrowser'), '@node': path.resolve(__dirname, './srcNode'), }, @@ -58,7 +59,7 @@ export default defineConfig(() => ({ provider: 'v8' as const, reporter: ['text', 'lcov'], include: ['src/**/*.{ts,tsx}', 'srcBrowser/**/*.{ts,tsx}', 'srcNode/**/*.{ts,tsx}'], - exclude: ['test/**', 'testBrowser/**', '**/index.ts'], + exclude: ['test/**', 'testBrowser/**', 'testNode/**', '**/index.ts'], }, }, })); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts new file mode 100644 index 00000000..73008bbd --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.test.ts @@ -0,0 +1,29 @@ +import { describe, it, expect } from 'vitest'; +import ApplicationClientError from './ApplicationClientError'; +import { StatusCode } from 'status-code-enum'; + +describe('ApplicationClientError', () => { + it('should create an instance with the correct properties', () => { + const error = new ApplicationClientError({ + src: { + type: 'server_error', + message: 'Invalid credentials', + fallbackMessage: 'Please check your input', + statusCode: StatusCode.ClientErrorBadRequest, + }, + fallbackConfig: { + fallbackMessage: 'Fallback', + }, + }); + + expect(error.type).toBe('server_error'); + expect(error.message).toBe('Invalid credentials'); + expect(error.fallbackMessage).toBe('Invalid credentials'); + + const exported = error.exportSafely(); + + expect(exported.message).toBe('Invalid credentials'); + expect(exported.type).toBe('server_error'); + expect(exported.statusCode).toBe(StatusCode.ClientErrorBadRequest); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts new file mode 100644 index 00000000..2a4072dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/ApplicationClientError.ts @@ -0,0 +1,45 @@ +import ApplicationError from '@common/errors/ApplicationError'; +import type ClientErrorFallbackConfig from './types/ClientErrorFallbackConfig'; +import { isErrorLike } from '@common/assertions'; + +class ApplicationClientError extends ApplicationError { + public override type: string = 'error'; + + constructor({ + src, + fallbackConfig, + }: { + src: unknown; + fallbackConfig: ClientErrorFallbackConfig; + }) { + const clientDefaults = { + statusCode: -1, + message: 'Unexpected error occurred.', + }; + + super({ + src, + fallbackConfig: { + ...clientDefaults, + ...fallbackConfig, + }, + }); + + this.type = (() => { + if (!isErrorLike(src)) return this.fallbackConfig.type ?? this.type; + return (src as { type?: string }).type ?? this.fallbackConfig.type ?? this.type; + })(); + + if (this.type === 'server_error' && isErrorLike(src)) { + // prevents hiding the original message behind the fallback message + this.fallbackMessage = src.message; + } + + const shouldAddDetails = !this.issues.length && this.fallbackMessage !== this.message; + if (!shouldAddDetails) return; + + this.issues.push(this.message); + } +} + +export default ApplicationClientError; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts new file mode 100644 index 00000000..14d3330b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/index.ts @@ -0,0 +1,2 @@ +export { default } from './ApplicationClientError'; +export type { default as ClientErrorFallbackConfig } from './types/ClientErrorFallbackConfig'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts new file mode 100644 index 00000000..20d3733c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ApplicationClientError/types/ClientErrorFallbackConfig.ts @@ -0,0 +1,8 @@ +import { StatusCode } from 'status-code-enum'; +import type { ApplicationErrorFallbackConfig } from '@common/errors/types'; + +type ClientErrorFallbackConfig = Omit & { + statusCode?: StatusCode; +}; + +export default ClientErrorFallbackConfig; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts new file mode 100644 index 00000000..3fef48f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/ErrorCode.ts @@ -0,0 +1,7 @@ +const ErrorCode = { + DeviceAccess: 'device.access.error', + DevicesTrackUnavailable: 'devices.track.unavailable', + FacingModeNotSupported: 'facingMode.not.supported', +} as const; + +export default ErrorCode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts new file mode 100644 index 00000000..e8c0da7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/index.ts @@ -0,0 +1,9 @@ +export { + default as ApplicationClientError, + type ClientErrorFallbackConfig, +} from './ApplicationClientError'; +export { + default as makeApplicationErrorMapper, + type ApplicationErrorMapperConfig, +} from './mappers/makeApplicationErrorMapper'; +export { default as ErrorCode } from './ErrorCode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts new file mode 100644 index 00000000..226ef068 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/index.ts @@ -0,0 +1 @@ +export { default as makeApplicationErrorMapper } from './makeApplicationErrorMapper'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts new file mode 100644 index 00000000..c21c4c31 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/index.ts @@ -0,0 +1 @@ +export { default, type ApplicationErrorMapperConfig } from './makeApplicationErrorMapper'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts new file mode 100644 index 00000000..4360f248 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/errors/mappers/makeApplicationErrorMapper/makeApplicationErrorMapper.ts @@ -0,0 +1,42 @@ +import ApplicationClientError from '../../ApplicationClientError/ApplicationClientError'; +import { isNil, isString } from '@common/assertions'; +import { t } from 'i18next'; + +export type ApplicationErrorMapperConfig = { + fallbackMessage: string; + type: string; +}; + +function makeApplicationErrorMapper(): ApplicationErrorMapper; + +function makeApplicationErrorMapper(fallbackMessage: string): ApplicationErrorMapper; + +function makeApplicationErrorMapper(config: ApplicationErrorMapperConfig): ApplicationErrorMapper; + +function makeApplicationErrorMapper( + arg?: string | ApplicationErrorMapperConfig +): ApplicationErrorMapper { + const config = + isString(arg) || isNil(arg) + ? { + fallbackMessage: arg ?? t('errors.unknown'), + type: 'error', + } + : arg; + + return (source: unknown): ApplicationClientError => { + const { fallbackMessage, type } = config; + + return new ApplicationClientError({ + src: source, + fallbackConfig: { + fallbackMessage, + type, + }, + }); + }; +} + +type ApplicationErrorMapper = (source: unknown) => ApplicationClientError; + +export default makeApplicationErrorMapper; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts new file mode 100644 index 00000000..bad26856 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/index.ts @@ -0,0 +1,5 @@ +export { default as useVideoStats } from './useVideoStats'; +export { default as usePublisherStats } from './usePublisherStats'; +export { default as useSubscriberStats } from './useSubscriberStats'; +export { default as useArchives } from './useArchives'; +export type { UseArchivesProps } from './useArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts new file mode 100644 index 00000000..9d205504 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/index.ts @@ -0,0 +1,2 @@ +export { default } from './useArchives'; +export type { UseArchivesProps } from './useArchives'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts new file mode 100644 index 00000000..17b335e7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.test.ts @@ -0,0 +1,109 @@ +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import { makeTestProvider, providers, ProviderOptions } from '@core-test/providers'; +import useArchives from './useArchives'; +import { makeVideoClientMock } from '@core-test/fixtures'; +import { SingleArchiveResponse } from '@vonage/video'; + +const singleArchiveResponse = { + id: 'archive-1', + name: 'test', +} as SingleArchiveResponse; + +describe('useArchives', () => { + it('returns archives when the request succeeds', async () => { + expect.assertions(4); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.resolve({ + count: 1, + items: [singleArchiveResponse], + }), + }); + + const { result } = renderHook( + () => + useArchives({ + sessionKey: 'room-1', + queryOptions: { retry: false }, + }), + { + runtimeContext: { + videoClient, + }, + } + ); + + expect(result.current.isLoading).toBe(true); + + await waitFor(() => { + if (!result.current.data) { + throw new Error('No data'); + } + }); + + expect(result.current.data).toEqual({ + count: 1, + items: [{ id: 'archive-1', name: 'test' }], + }); + + expect(result.current.error).toBeNull(); + + expect(videoClient.searchArchives).toHaveBeenCalledWith({ + sessionKey: 'room-1', + count: undefined, + offset: undefined, + }); + }); + + it('returns error when the request fails', async () => { + expect.assertions(3); + + const error = new Error('Failed to fetch archives'); + + const videoClient = makeVideoClientMock({ + searchArchives: Promise.reject(error), + }); + + const { result } = renderHook( + () => + useArchives({ + sessionKey: 'room-1', + queryOptions: { retry: false }, + }), + { + runtimeContext: { + videoClient, + }, + } + ); + + expect(result.current.isLoading).toBe(true); + + await waitFor(() => { + if (!result.current.error) { + throw new Error('No error'); + } + }); + + expect(result.current.error).toEqual(error); + expect(result.current.data).toBeUndefined(); + }); +}); + +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook(render: () => Result, { runtimeContext }: RenderOptions = {}) { + const { wrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + return { + ...context, + ...renderHookBase(render, { + wrapper, + }), + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts new file mode 100644 index 00000000..4a05d31a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useArchives/useArchives.ts @@ -0,0 +1,50 @@ +import { runtime$ } from '@core/stores'; +import type { VideoClient } from '@core/services'; +import type { QueryOptions } from '@core/types'; + +type Result = Awaited>; + +type Input = Parameters[0]; + +export type UseArchivesProps = Input & { + queryOptions?: QueryOptions; +}; + +/** + * Hook to search for archives. + * + * @example + * const { data, error, isLoading } = useArchives({ + * sessionKey: 'room-1', + * count: 10, + * offset: 0 + * }); + * + * console.log(data); // { items: [...], count: 100 } + * console.log(error); // null or Error + * console.log(isLoading); // boolean + */ +const useArchives = ({ + queryOptions, + sessionKey, + count, + offset, +}: UseArchivesProps) => { + const videoClient = runtime$.useVideoClient(); + + return runtime$.useQuery({ + ...queryOptions, + + queryKey: ['archives', sessionKey, count, offset], + + queryFn: async () => { + return await videoClient.searchArchives({ + sessionKey, + count, + offset, + }); + }, + }); +}; + +export default useArchives; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts new file mode 100644 index 00000000..9df64e4d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/index.ts @@ -0,0 +1 @@ +export { default } from './usePublisherStats'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts new file mode 100644 index 00000000..7c1a21d6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.spec.ts @@ -0,0 +1,463 @@ +import { describe, expect, it, vi } from 'vitest'; +import { renderHook as renderHookBase, waitFor, act } from '@testing-library/react'; +import type { Publisher, PublisherStatsArr, VideoLayerStats } from '@vonage/client-sdk-video'; +import usePublisherStats, { PublisherInspectorStatistics } from './usePublisherStats'; +import { wait } from '@common/execution'; +import { ProviderOptions, makeTestProvider, providers } from '@core-test'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import { composeProviders } from '@web/helpers'; +import { StrictMode } from 'react'; +import { UseQueryResult } from '@tanstack/react-query'; +import { DeepPartial } from '@common/types'; + +describe('usePublisherStats', () => { + describe('resolution', () => { + it('maps valid publisher dimensions and video frame rate', async () => { + expect.assertions(2); + + const publisher = makePublisher( + [ + makeStatsContainer({ + video: { + frameRate: 30, + }, + }), + ], + { + videoWidth: 1280, + videoHeight: 720, + } + ); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + fixedFrameRate: 30, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + // optionalValue wraps the value; the fallback '-' should NOT be used + expect(stats.resolution.value).toEqual({ + width: 1280, + height: 720, + }); + + expect(stats.frameRate.value).toBe(30); + }); + }); + + describe('frameRate', () => { + it('does NOT treat 0 fps as missing because it is a valid value', async () => { + expect.assertions(1); + + const publisher = makePublisher([ + makeStatsContainer({ + video: { + frameRate: 0, + }, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + fixedFrameRate: 0, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + // 0 fps is a real value; the formatted output should not be the fallback '-' + expect(stats.frameRate.value).toBe(0); + }); + }); + + describe('bitrateBps', () => { + it('calculates bitrate correctly when a previous sample is available', async () => { + expect.assertions(3); + + const publisher = makePublisher([ + makeStatsContainer({ + video: { + bytesSent: 0, + }, + timestamp: 0, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + staleTime: 0, + }, + }) + ); + + let data = await waitForStatsToLoad(result); + + // first render there is no previous sample, so the bitrate should be the fallback '-' + expect(data.bitrateBps.toString()).toBe('-'); + + vi.spyOn(publisher, 'getStats').mockImplementationOnce((callback) => { + callback(undefined, [ + makeStatsContainer({ + video: { + bytesSent: 1000, + }, + timestamp: 1000, + }), + ]); + }); + + await act(async () => { + await result.current.refetch(); + }); + + data = await waitForStatsToLoad(result); + + expect(data.bitrateBps.toString()).toBe('8.0 kbps'); + + expect(data.bitrateBps.value).toBe(8000); + }); + }); + + describe('packetLossRatio', () => { + it('calculates packet loss ratio from aggregated video packet totals', async () => { + expect.assertions(3); + + // 4 lost out of 204 total means ~1.96 % + const container1 = makeStatsContainer({ + video: { + packetsSent: 100, + packetsLost: 2, + }, + }); + + const container2 = makeStatsContainer({ + video: { + packetsSent: 100, + packetsLost: 2, + }, + }); + + const publisher = makePublisher([container1, container2]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.video.packetsSent.value).toBe(200); + expect(stats.video.packetsLost.value).toBe(4); + expect(stats.packetLossRatio.value).toBeCloseTo(4 / 204); + }); + }); + + describe('connectionEstimatedBandwidthBps', () => { + it('picks the maximum valid bandwidth across multiple containers when publisherStatisticsEnabled is true', async () => { + expect.assertions(1); + + const container1 = makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: -1, + }, + }, + }); + + const container2 = makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: 500_000, + }, + }, + }); + + const container3 = makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: 2_000_000, + }, + }, + }); + + const publisher = makePublisher([container1, container2, container3]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.connectionEstimatedBandwidthBps.value).toBe(2_000_000); + }); + + it('returns fallback when publisherStatisticsEnabled is false', async () => { + expect.assertions(1); + + const publisher = makePublisher([ + makeStatsContainer({ + mediaLink: { + transport: { + connectionEstimatedBandwidth: 2_000_000, + }, + }, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: false, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.connectionEstimatedBandwidthBps.toString()).toBe('-'); + }); + }); + + describe('videoLayers', () => { + it('returns videoLayers from the first stats container', async () => { + expect.assertions(1); + + const layers = [ + { + spatialLayerId: 0, + }, + { + spatialLayerId: 1, + }, + ] as unknown as VideoLayerStats[]; + + const publisher = makePublisher([ + makeStatsContainer({ + video: { + layers, + }, + }), + ]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.videoLayers).toEqual(layers); + }); + + it('returns null when video layers are absent', async () => { + expect.assertions(1); + + const containerWithoutLayers = { + stats: { + timestamp: 0, + audio: { + packetsSent: 100, + packetsLost: 0, + bytesSent: 1000, + }, + video: { + packetsSent: 100, + packetsLost: 0, + bytesSent: 5000, + frameRate: 30, + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1_000_000, + }, + }, + }, + } as unknown as PublisherStatsArr[number]; + + const publisher = makePublisher([containerWithoutLayers]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.videoLayers).toBeNull(); + }); + }); + + describe('missing / partial track data', () => { + it('treats missing audio track fields as zero', async () => { + expect.assertions(3); + + const containerWithNoAudio = { + stats: { + timestamp: 0, + audio: {}, + video: { + packetsSent: 100, + packetsLost: 0, + bytesSent: 5000, + frameRate: 30, + layers: [], + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1_000_000, + }, + }, + }, + } as unknown as PublisherStatsArr[number]; + + const publisher = makePublisher([containerWithNoAudio]); + + const { result } = renderHook(() => + usePublisherStats({ + publisher, + publisherStatisticsEnabled: true, + queryOptions: { + refetchInterval: false, + }, + }) + ); + + const stats = await waitForStatsToLoad(result); + + expect(stats.audio.packetsSent.value).toBe(0); + expect(stats.audio.packetsLost.value).toBe(0); + expect(stats.audio.bytesSent.value).toBe(0); + }); + }); +}); + +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { runtimeContext }: RenderOptions = {} +) { + const { wrapper: MainWrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + const wrapper = composeProviders(StrictMode, SuspenseBoundary, MainWrapper); + const result = renderHookBase(render, { wrapper }); + + return { + ...context, + ...result, + }; +} + +async function waitForStatsToLoad(args: { + current: UseQueryResult; +}) { + await waitFor(() => { + if (args.current.isLoading || args.current.isFetching) { + throw new Error('Still loading'); + } + + if (args.current.data === undefined) { + throw new Error('Stats not loaded'); + } + }); + + return args.current.data!; +} + +/** + * Builds a minimal Publisher mock whose getStats callback resolves with the + * provided stats array or an error when `error` is truthy. + */ +function makePublisher( + statsArr: PublisherStatsArr | null = null, + options: { error?: Error; videoWidth?: number; videoHeight?: number } = {} +): Publisher { + return { + id: 'publisher-id-1', + videoWidth: vi.fn().mockReturnValue(options.videoWidth ?? 1280), + videoHeight: vi.fn().mockReturnValue(options.videoHeight ?? 720), + getStats: vi.fn( + async (callback: (error: Error | null, stats: PublisherStatsArr | null) => void) => { + await wait(1); + + callback(options.error ?? null, statsArr); + } + ), + } as unknown as Publisher; +} + +/** + * Builds a minimal PublisherStatsArr entry. + */ +function makeStatsContainer( + stats: DeepPartial = {} +): PublisherStatsArr[0] { + return { + stats: { + timestamp: stats.timestamp ?? 0, + audio: { + packetsSent: 100, + packetsLost: 2, + bytesSent: 5000, + ...stats.audio, + }, + video: { + packetsSent: 200, + packetsLost: 4, + bytesSent: 20000, + frameRate: 30, + layers: [], + ...stats.video, + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1_000_000, + ...stats.mediaLink?.transport, + }, + }, + }, + } as unknown as PublisherStatsArr[number]; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts new file mode 100644 index 00000000..1ae9e0ef --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/usePublisherStats/usePublisherStats.ts @@ -0,0 +1,202 @@ +import { runtime$ } from '@core/stores'; +import type { QueryOptions } from '@core/types'; +import { + BitrateValue, + bytesValue, + BytesValue, + FrameRateValue, + IntegerValue, + integerValue, + optionalValue, + OptionalValue, + PacketLossValue, + ResolutionValue, +} from '@core/metrics'; +import type { Publisher, PublisherStatsArr, VideoLayerStats } from '@vonage/client-sdk-video'; +import useStableRef from '@web/hooks/useStableRef/useStableRef'; +import { isNil } from '@common/assertions'; + +const POLL_INTERVAL_MS = 2000; + +export type OutgoingTrackTotals = { + packetsSent: IntegerValue; + packetsLost: IntegerValue; + bytesSent: BytesValue; +}; + +export type PublisherInspectorStatistics = { + resolution: OptionalValue; + frameRate: OptionalValue; + bitrateBps: OptionalValue; + packetLossRatio: OptionalValue; + audio: OutgoingTrackTotals; + video: OutgoingTrackTotals; + connectionEstimatedBandwidthBps: OptionalValue; + videoLayers: VideoLayerStats[] | null; +}; + +export type UsePublisherStatsProps = { + queryOptions?: QueryOptions; + publisher: Publisher | null | undefined; + publisherStatisticsEnabled: boolean; + fixedFrameRate?: number | null; +}; + +const usePublisherStats = ({ + queryOptions, + publisher, + publisherStatisticsEnabled, + fixedFrameRate, +}: UsePublisherStatsProps) => { + const previousPublisherVideoSampleRef = useStableRef( + () => null, + [] + ); + + return runtime$.useQuery({ + queryKey: ['publisherStats', publisher?.id, publisherStatisticsEnabled], + refetchInterval: POLL_INTERVAL_MS, + queryFn: async () => { + if (!publisher) return null; + + const publisherStatsContainers = await getPublisherStats(publisher); + if (!publisherStatsContainers?.length) return null; + + const audioTotals = aggregateOutgoingTrackTotals( + publisherStatsContainers, + (container) => container.stats.audio + ); + + const videoTotals = aggregateOutgoingTrackTotals( + publisherStatsContainers, + (container) => container.stats.video + ); + + const firstPublisherStatsContainer = publisherStatsContainers[0]; + const stats = firstPublisherStatsContainer?.stats; + + const frameRate = fixedFrameRate ?? null; + + const width = publisher.videoWidth(); + const height = publisher.videoHeight(); + const resolution = isNil(width) || isNil(height) ? null : { width, height }; + + const connectionEstimatedBandwidthValues = publisherStatsContainers + .map((container) => container.stats.mediaLink?.transport?.connectionEstimatedBandwidth) + .filter((value): value is number => typeof value === 'number' && value >= 0); + + const connectionEstimatedBandwidthBps = connectionEstimatedBandwidthValues?.length + ? Math.max(...connectionEstimatedBandwidthValues) + : null; + + const packetLossRatio = calculatePacketLossRatio({ + packetsLost: videoTotals.packetsLost, + packetsSuccessful: videoTotals.packetsSent, + }); + + // Bitrate is intentionally null on the first poll because we need two samples + // to compute a delta. It will resolve on the second tick. + const bitrateBps = calculateBitrateFromDelta({ + currentBytesSent: videoTotals.bytesSent.value, + currentTimestamp: stats.timestamp, + previousSample: previousPublisherVideoSampleRef.current, + }); + + previousPublisherVideoSampleRef.current = { + bytesSent: videoTotals.bytesSent, + timestamp: stats.timestamp, + }; + + return { + resolution: optionalValue(ResolutionValue, resolution, { fallback: '-' }), + frameRate: optionalValue(FrameRateValue, frameRate, { fallback: '-' }), + bitrateBps: optionalValue(BitrateValue, bitrateBps, { fallback: '-' }), + packetLossRatio: optionalValue(PacketLossValue, packetLossRatio, { fallback: '-' }), + audio: audioTotals, + video: videoTotals, + connectionEstimatedBandwidthBps: optionalValue( + BitrateValue, + publisherStatisticsEnabled ? connectionEstimatedBandwidthBps : null, + { fallback: '-' } + ), + videoLayers: stats?.video?.layers ?? null, + }; + }, + ...queryOptions, + }); +}; + +type PreviousPublisherVideoSample = { + bytesSent: BytesValue; + timestamp: number; +}; + +function getPublisherStats(publisher: Publisher): Promise { + return new Promise((resolve) => { + publisher.getStats((error, stats) => { + if (error) return resolve(null); + resolve(stats ?? null); + }); + }); +} + +function aggregateOutgoingTrackTotals( + publisherStatsContainers: PublisherStatsArr, + getTrack: (container: PublisherStatsArr[number]) => { + packetsSent: number; + packetsLost: number; + bytesSent: number; + } +): OutgoingTrackTotals { + return publisherStatsContainers.reduce( + (accumulator, container) => { + const track = getTrack(container); + + return { + packetsSent: integerValue(accumulator.packetsSent.value + (track?.packetsSent ?? 0)), + packetsLost: integerValue(accumulator.packetsLost.value + (track?.packetsLost ?? 0)), + bytesSent: bytesValue(accumulator.bytesSent.value + (track?.bytesSent ?? 0)), + }; + }, + { + packetsSent: integerValue(0), + packetsLost: integerValue(0), + bytesSent: bytesValue(0), + } + ); +} + +function calculateBitrateFromDelta({ + currentBytesSent, + currentTimestamp, + previousSample, +}: { + currentBytesSent: number; + currentTimestamp: number; + previousSample: PreviousPublisherVideoSample | null; +}): number | null { + if (!previousSample) return null; + + const elapsedMilliseconds = currentTimestamp - previousSample.timestamp; + const deltaBytes = currentBytesSent - previousSample.bytesSent.value; + + const canCalculateBitrate = elapsedMilliseconds > 0 && deltaBytes >= 0; + if (!canCalculateBitrate) return null; + + return Math.round((deltaBytes * 8 * 1000) / elapsedMilliseconds); +} + +function calculatePacketLossRatio({ + packetsLost, + packetsSuccessful, +}: { + packetsLost: IntegerValue; + packetsSuccessful: IntegerValue; +}): number | null { + const totalPackets = packetsLost.value + packetsSuccessful.value; + if (totalPackets <= 0) return null; + + return packetsLost.value / totalPackets; +} + +export default usePublisherStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts new file mode 100644 index 00000000..c42550d4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/index.ts @@ -0,0 +1 @@ +export { default } from './useSubscriberStats'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts new file mode 100644 index 00000000..b8befc53 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.spec.ts @@ -0,0 +1,145 @@ +import { describe, expect, it, vi } from 'vitest'; +import { renderHook as renderHookBase, waitFor } from '@testing-library/react'; +import type { Subscriber, SubscriberStats } from '@vonage/client-sdk-video'; +import useSubscriberStats, { SubscriberInspectorStatistics } from './useSubscriberStats'; +import { ProviderOptions, makeTestProvider, providers } from '@core-test'; +import SuspenseBoundary from '@web/components/SuspenseBoundary'; +import { composeProviders } from '@web/helpers'; +import { StrictMode } from 'react'; +import { type UseQueryResult } from '@tanstack/react-query'; +import { wait } from '@common/execution'; + +describe('useSubscriberStats', () => { + it('returns null when subscriber is null or getStats returns error', async () => { + expect.assertions(2); + + let subscriber = makeSubscriber(null, undefined); + + let { result } = renderHook(() => useSubscriberStats({ subscriber })); + + let data = await waitForStatsToLoad(result); + + expect(data).toBeNull(); + + subscriber = makeSubscriber(null, new Error('stats error')); + + ({ result } = renderHook(() => useSubscriberStats({ subscriber }))); + + data = await waitForStatsToLoad(result); + + expect(data).toBeNull(); + }); + + it('returns subscriber statistics', async () => { + expect.assertions(8); + + const subscriber = makeSubscriber({ + audio: { + packetsReceived: 100, + packetsLost: 2, + bytesReceived: 1000, + }, + video: { + packetsReceived: 200, + packetsLost: 4, + bytesReceived: 2000, + codec: 'H264', + frameRate: 30, + decodedFrameRate: 30, + bitrate: 500000, + }, + mediaLink: { + transport: { + connectionEstimatedBandwidth: 1000000, + }, + }, + } as SubscriberStats); + + const { result } = renderHook(() => useSubscriberStats({ subscriber })); + + const data = await waitForStatsToLoad(result); + + expect(data).toMatchObject({ + id: 'subscriber-1', + title: 'Test Subscriber', + }); + + expect(data.audio.bytesReceived.toString()).toBe('1,000'); + expect(data.video.codec).toBe('H264'); + expect(data.video.frameRate.toString()).toBe('30 fps'); + expect(data.video.decodedFrameRate.toString()).toBe('30 fps'); + expect(data.video.bitrateBps.toString()).toBe('500.0 kbps'); + expect(data.packetLossRatio.toString()).toBe('1.96%'); + expect(data.connectionEstimatedBandwidthBps.toString()).toBe('1.00 Mbps'); + }); + + it('returns fallback bandwidth when value is negative', async () => { + expect.assertions(1); + + const subscriber = makeSubscriber({ + audio: {}, + video: {}, + mediaLink: { + transport: { + connectionEstimatedBandwidth: -1, + }, + }, + } as SubscriberStats); + + const { result } = renderHook(() => useSubscriberStats({ subscriber })); + + const data = await waitForStatsToLoad(result); + + expect(data.packetLossRatio.toString()).toBe('-'); + }); +}); + +function makeSubscriber(stats: SubscriberStats | null, error?: Error): Subscriber { + return { + id: 'subscriber-1', + stream: { + name: 'Test Subscriber', + }, + getStats: vi.fn(async (callback) => { + await wait(1); + + callback(error ?? null, stats); + }), + } as unknown as Subscriber; +} + +async function waitForStatsToLoad(args: { + current: UseQueryResult; +}) { + await waitFor(() => { + if (args.current.isLoading || args.current.isFetching) { + throw new Error('Still loading'); + } + + if (args.current.data === undefined) { + throw new Error('Stats not loaded'); + } + }); + + return args.current.data!; +} +type RenderOptions = { + runtimeContext?: ProviderOptions['RuntimeContext']; +}; + +function renderHook( + render: (initialProps: Props) => Result, + { runtimeContext }: RenderOptions = {} +) { + const { wrapper: MainWrapper, ...context } = makeTestProvider([providers.runtime], { + runtimeContext, + }); + + const wrapper = composeProviders(StrictMode, SuspenseBoundary, MainWrapper); + const result = renderHookBase(render, { wrapper }); + + return { + ...context, + ...result, + }; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts new file mode 100644 index 00000000..9769c1be --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useSubscriberStats/useSubscriberStats.ts @@ -0,0 +1,161 @@ +import { runtime$ } from '@core/stores'; +import type { QueryOptions } from '@core/types'; +import { + BitrateValue, + ResolutionValue, + FrameRateValue, + IntegerValue, + integerValue, + OptionalValue, + optionalValue, + PacketLossValue, +} from '@core/metrics'; +import type { Subscriber, SubscriberStats } from '@vonage/client-sdk-video'; + +const POLL_INTERVAL_MS = 2000; + +export type IncomingTrackTotals = { + packetsReceived: IntegerValue; + packetsLost: IntegerValue; + bytesReceived: IntegerValue; +}; + +export type SubscriberInspectorStatistics = { + id?: string; + title?: string; + audio: IncomingTrackTotals; + video: IncomingTrackTotals & { + resolution: OptionalValue; + codec: string | null; + frameRate: OptionalValue; + decodedFrameRate: OptionalValue; + bitrateBps: OptionalValue; + freezeCount: OptionalValue; + totalFreezesDuration: OptionalValue; + }; + packetLossRatio: OptionalValue; + connectionEstimatedBandwidthBps: OptionalValue; + remotePublisherConnectionEstimatedBandwidthBps: OptionalValue; +}; + +export type useSubscriberStatsProps = { + queryOptions?: QueryOptions; + subscriber: Subscriber | null | undefined; +}; + +const useSubscriberStats = ({ + queryOptions, + subscriber, +}: useSubscriberStatsProps) => { + return runtime$.useQuery({ + queryKey: ['archives', subscriber], + refetchInterval: POLL_INTERVAL_MS, + queryFn: async () => { + if (!subscriber) { + return null; + } + + const stats = await getSubscriberStats(subscriber); + + if (!stats) { + return null; + } + + const audio: IncomingTrackTotals = { + packetsReceived: integerValue(stats.audio?.packetsReceived ?? 0), + packetsLost: integerValue(stats.audio?.packetsLost ?? 0), + bytesReceived: integerValue(stats.audio?.bytesReceived ?? 0), + }; + + const video: IncomingTrackTotals = { + packetsReceived: integerValue(stats.video?.packetsReceived ?? 0), + packetsLost: integerValue(stats.video?.packetsLost ?? 0), + bytesReceived: integerValue(stats.video?.bytesReceived ?? 0), + }; + + const packetLossRatio = calculatePacketLossRatio({ + packetsLost: video.packetsLost, + packetsSuccessful: video.packetsReceived, + }); + + const connectionEstimatedBandwidth = stats.mediaLink?.transport?.connectionEstimatedBandwidth; + + const remotePublisherConnectionEstimatedBandwidth = + stats.mediaLink?.remotePublisherTransport?.connectionEstimatedBandwidth; + + return { + id: subscriber.id, + title: subscriber.stream?.name ?? subscriber.id, + audio, + video: { + ...video, + resolution: optionalValue(ResolutionValue, stats.video), + codec: stats.video?.codec ?? null, + frameRate: optionalValue(FrameRateValue, stats.video?.frameRate, { fallback: '-' }), + decodedFrameRate: optionalValue(FrameRateValue, stats.video?.decodedFrameRate, { + fallback: '-', + }), + bitrateBps: optionalValue(BitrateValue, stats.video?.bitrate, { fallback: '-' }), + freezeCount: optionalValue(IntegerValue, stats.video?.freezeCount ?? null, { + fallback: '-', + }), + totalFreezesDuration: optionalValue( + IntegerValue, + stats.video?.totalFreezesDuration ?? null, + { + fallback: '-', + } + ), + }, + packetLossRatio: optionalValue(PacketLossValue, packetLossRatio, { fallback: '-' }), + connectionEstimatedBandwidthBps: optionalValue( + BitrateValue, + connectionEstimatedBandwidth === undefined || connectionEstimatedBandwidth < 0 + ? null + : connectionEstimatedBandwidth, + { + fallback: '-', + } + ), + remotePublisherConnectionEstimatedBandwidthBps: optionalValue( + BitrateValue, + remotePublisherConnectionEstimatedBandwidth === undefined || + remotePublisherConnectionEstimatedBandwidth < 0 + ? null + : remotePublisherConnectionEstimatedBandwidth, + { + fallback: '-', + } + ), + }; + }, + ...queryOptions, + }); +}; + +function getSubscriberStats(subscriber: Subscriber): Promise { + return new Promise((resolve) => { + subscriber.getStats((error, stats) => { + if (error) return resolve(null); + resolve(stats ?? null); + }); + }); +} + +function calculatePacketLossRatio({ + packetsLost, + packetsSuccessful, +}: { + packetsLost: IntegerValue; + packetsSuccessful: IntegerValue; +}): number | null { + const totalPackets = packetsLost.value + packetsSuccessful.value; + + if (totalPackets <= 0) { + return null; + } + + return packetsLost.value / totalPackets; +} + +export default useSubscriberStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts new file mode 100644 index 00000000..54377e85 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.spec.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from 'vitest'; +import formatFrameRate from './formatFrameRate'; + +describe('formatFrameRate', () => { + it('returns null when frame rate is not available', () => { + expect(formatFrameRate(null)).toBeNull(); + }); + + it('formats integer frame rates', () => { + expect(formatFrameRate(60)).toBe('60fps'); + expect(formatFrameRate(0)).toBe('0fps'); + }); + + it('rounds fractional frame rates to the nearest integer', () => { + expect(formatFrameRate(29.4)).toBe('29fps'); + expect(formatFrameRate(29.5)).toBe('30fps'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts new file mode 100644 index 00000000..0d5390ec --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatFrameRate.ts @@ -0,0 +1,11 @@ +/** + * Formats a frame rate value into a display string. + * @param {number | null} frameRate - The frame rate in frames per second. + * @returns {string | null} The formatted frame rate (e.g. "30fps"), or null if frameRate is not available. + */ +const formatFrameRate = (frameRate: number | null): string | null => { + if (frameRate === null) return null; + return `${Math.round(frameRate)}fps`; +}; + +export default formatFrameRate; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts new file mode 100644 index 00000000..3012bf10 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from 'vitest'; +import formatResolution from './formatResolution'; + +describe('formatResolution', () => { + it('returns null when height is not available', () => { + expect(formatResolution(null)).toBeNull(); + }); + + it('formats common resolutions', () => { + expect(formatResolution(1080)).toBe('1080p'); + expect(formatResolution(720)).toBe('720p'); + expect(formatResolution(480)).toBe('480p'); + }); + + it('handles atypical heights', () => { + expect(formatResolution(0)).toBe('0p'); + expect(formatResolution(1234)).toBe('1234p'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts new file mode 100644 index 00000000..07a9e46e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/formatResolution.ts @@ -0,0 +1,11 @@ +/** + * Formats a video height into a standard resolution label. + * @param {number | null} height - The video height in pixels. + * @returns {string | null} The formatted resolution label (e.g. "720p"), or null if height is not available. + */ +const formatResolution = (height: number | null): string | null => { + if (height === null) return null; + return `${height}p`; +}; + +export default formatResolution; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts new file mode 100644 index 00000000..73023e73 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/index.ts @@ -0,0 +1,2 @@ +export { default as formatResolution } from './formatResolution'; +export { default as formatFrameRate } from './formatFrameRate'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts new file mode 100644 index 00000000..1ea7e42b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/helpers/readPublisherStats.ts @@ -0,0 +1,42 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import type { VideoStats } from '../types'; + +/** + * Reads the current video stats from a Vonage publisher instance. + * + * Resolution is read directly from the SDK's `videoWidth()` / `videoHeight()` methods, + * which reflect the actual captured dimensions of the camera stream. + * + * Frame rate cannot be obtained via the session stats API (`session.getPublisherStats()`) + * because the preview publisher is not connected to a session. Instead, we reach the + * underlying `MediaStreamTrack` via `publisher.getVideoSource().track` and call the + * standard Web API `track.getSettings().frameRate`. + * + * @param {Publisher} publisher - An initialized Vonage publisher instance. + * @returns {VideoStats} The current width, height, and frame rate (each `null` if unavailable). + */ +function readPublisherStats(publisher: Publisher): VideoStats { + // videoWidth() / videoHeight() return `undefined` before the camera stream is ready; + // we normalize to `null` to keep VideoStats consistently typed. + const width = publisher.videoWidth() ?? null; + const height = publisher.videoHeight() ?? null; + + let frameRate: number | null = null; + try { + // getVideoSource() returns a Vonage VideoSource whose `.track` is the raw + // MediaStreamTrack. We read frameRate from the track's settings because + // the preview publisher is not published to a session, making the + // session.getPublisherStats() API unavailable here. + const source = publisher.getVideoSource(); + const track = source?.track; + if (track) { + frameRate = track.getSettings().frameRate ?? null; + } + } catch { + // getVideoSource may throw if publisher is not fully initialized + } + + return { width, height, frameRate }; +} + +export default readPublisherStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts new file mode 100644 index 00000000..bdf61ebb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/index.ts @@ -0,0 +1,3 @@ +export { default } from './useVideoStats'; +export { formatResolution, formatFrameRate } from './helpers'; +export type { VideoStats } from './types'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts new file mode 100644 index 00000000..128f2196 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/types.ts @@ -0,0 +1,5 @@ +export type VideoStats = { + width: number | null; + height: number | null; + frameRate: number | null; +}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts new file mode 100644 index 00000000..e0fab0b8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.spec.ts @@ -0,0 +1,179 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import type { Publisher } from '@vonage/client-sdk-video'; +import useVideoStats, { formatResolution, formatFrameRate } from './index'; + +describe('useVideoStats', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + const createMockPublisher = ( + width: number | undefined, + height: number | undefined, + frameRate: number | undefined + ) => + ({ + videoWidth: vi.fn().mockReturnValue(width), + videoHeight: vi.fn().mockReturnValue(height), + getVideoSource: vi.fn().mockReturnValue({ + track: { + getSettings: vi.fn().mockReturnValue({ frameRate }), + }, + }), + }) as unknown as Publisher; + + it('should return null values when publisher is null', () => { + const { result } = renderHook(() => useVideoStats(null)); + + expect(result.current).toEqual({ + width: null, + height: null, + frameRate: null, + }); + }); + + it('should return video stats from publisher', () => { + const publisher = createMockPublisher(1280, 720, 30); + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current).toEqual({ + width: 1280, + height: 720, + frameRate: 30, + }); + }); + + it('should update stats on interval', () => { + const publisher = createMockPublisher(1280, 720, 30); + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current.height).toBe(720); + + (publisher.videoWidth as ReturnType).mockReturnValue(1920); + (publisher.videoHeight as ReturnType).mockReturnValue(1080); + + act(() => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current).toEqual({ + width: 1920, + height: 1080, + frameRate: 30, + }); + }); + + it('should handle publisher with no video source track', () => { + const publisher = { + videoWidth: vi.fn().mockReturnValue(640), + videoHeight: vi.fn().mockReturnValue(480), + getVideoSource: vi.fn().mockReturnValue({ track: null }), + } as unknown as Publisher; + + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current).toEqual({ + width: 640, + height: 480, + frameRate: null, + }); + }); + + it('should handle getVideoSource throwing an error', () => { + const publisher = { + videoWidth: vi.fn().mockReturnValue(640), + videoHeight: vi.fn().mockReturnValue(480), + getVideoSource: vi.fn().mockImplementation(() => { + throw new Error('Not initialized'); + }), + } as unknown as Publisher; + + const { result } = renderHook(() => useVideoStats(publisher)); + + expect(result.current).toEqual({ + width: 640, + height: 480, + frameRate: null, + }); + }); + + it('should reset stats when publisher becomes null', () => { + const publisher = createMockPublisher(1280, 720, 30); + const { result, rerender } = renderHook(({ pub }) => useVideoStats(pub), { + initialProps: { pub: publisher as Publisher | null }, + }); + + expect(result.current.height).toBe(720); + + rerender({ pub: null }); + + expect(result.current).toEqual({ + width: null, + height: null, + frameRate: null, + }); + }); + + it('should update stats when publisher instance changes', () => { + const firstPublisher = createMockPublisher(640, 480, 30); + const secondPublisher = createMockPublisher(1280, 720, 60); + + const { result, rerender } = renderHook(({ pub }) => useVideoStats(pub), { + initialProps: { pub: firstPublisher as Publisher | null }, + }); + + expect(result.current).toEqual({ + width: 640, + height: 480, + frameRate: 30, + }); + + rerender({ pub: secondPublisher as Publisher | null }); + + expect(result.current).toEqual({ + width: 1280, + height: 720, + frameRate: 60, + }); + }); + + it('should clean up interval on unmount', () => { + const clearIntervalSpy = vi.spyOn(global, 'clearInterval'); + const publisher = createMockPublisher(1280, 720, 30); + const { unmount } = renderHook(() => useVideoStats(publisher)); + + unmount(); + + expect(clearIntervalSpy).toHaveBeenCalled(); + clearIntervalSpy.mockRestore(); + }); +}); + +describe('formatResolution', () => { + it('should format height to resolution label', () => { + expect(formatResolution(1080)).toBe('1080p'); + expect(formatResolution(720)).toBe('720p'); + expect(formatResolution(480)).toBe('480p'); + }); + + it('should return null for null height', () => { + expect(formatResolution(null)).toBeNull(); + }); +}); + +describe('formatFrameRate', () => { + it('should format fps to display string', () => { + expect(formatFrameRate(30)).toBe('30fps'); + expect(formatFrameRate(29.97)).toBe('30fps'); + expect(formatFrameRate(60)).toBe('60fps'); + }); + + it('should return null for null fps', () => { + expect(formatFrameRate(null)).toBeNull(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts new file mode 100644 index 00000000..d83a4939 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/hooks/useVideoStats/useVideoStats.ts @@ -0,0 +1,46 @@ +import { useEffect, useRef, useState } from 'react'; +import type { Publisher } from '@vonage/client-sdk-video'; +import readPublisherStats from './helpers/readPublisherStats'; +import type { VideoStats } from './types'; + +const POLL_INTERVAL_MS = 1000; + +const NULL_STATS: VideoStats = { width: null, height: null, frameRate: null }; + +const useVideoStats = (publisher: Publisher | null): VideoStats => { + const [stats, setStats] = useState(NULL_STATS); + const lastPublisherRef = useRef(null); + + useEffect(() => { + if (!publisher) return; + + const pollStats = () => { + const next = readPublisherStats(publisher); + setStats((prev) => { + const unchanged = + prev.width === next.width && + prev.height === next.height && + prev.frameRate === next.frameRate; + return unchanged ? prev : next; + }); + }; + + pollStats(); + const intervalId = setInterval(pollStats, POLL_INTERVAL_MS); + return () => clearInterval(intervalId); + }, [publisher]); + + if (!publisher) { + lastPublisherRef.current = null; + return NULL_STATS; + } + + if (lastPublisherRef.current !== publisher) { + lastPublisherRef.current = publisher; + return readPublisherStats(publisher); + } + + return stats; +}; + +export default useVideoStats; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts new file mode 100644 index 00000000..9609962b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/index.ts @@ -0,0 +1,8 @@ +/** + * The patch should be applied before importing any file, + * Fixes compatibility issues of web-rtc-adapter browsers/environments. + */ +import './webrtc-adapter.patch'; + +export { default as xmlHttpRequestEnvelop } from './xmlHttpRequestEnvelop'; +export { default as mediaDevicesEnvelop } from './mediaDevicesEnvelop'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts new file mode 100644 index 00000000..396b9742 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/mediaDevicesEnvelop.ts @@ -0,0 +1,11 @@ +import { interceptObject } from '@common/helpers'; + +/** + * Early interceptor for media devices, allows to override after they have been destructured by the Vonage SDK. + * + * The proxy replaces `navigator.mediaDevices` so that any code (including the + * Vonage SDK) that reads methods from it will go through the intercept layer. + */ +const mediaDevicesEnvelop = interceptObject(navigator, 'mediaDevices'); + +export default mediaDevicesEnvelop; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts new file mode 100644 index 00000000..430a2ad2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it, beforeEach } from 'vitest'; + +describe('correctWebRTCAdapterErrors', () => { + beforeEach(() => { + localStorage.clear(); + + class MockRTCPeerConnection { + addEventListener() {} + removeEventListener() {} + } + + Object.defineProperty(globalThis, 'RTCPeerConnection', { + value: MockRTCPeerConnection, + writable: true, + configurable: true, + }); + }); + + it('makes addEventListener and removeEventListener writable and configurable', async () => { + await import('./webrtc-adapter.patch'); + + const addEventListenerDescriptor = Object.getOwnPropertyDescriptor( + RTCPeerConnection.prototype, + 'addEventListener' + ); + + const removeEventListenerDescriptor = Object.getOwnPropertyDescriptor( + RTCPeerConnection.prototype, + 'removeEventListener' + ); + + expect(addEventListenerDescriptor?.writable).toBe(true); + expect(addEventListenerDescriptor?.configurable).toBe(true); + + expect(removeEventListenerDescriptor?.writable).toBe(true); + expect(removeEventListenerDescriptor?.configurable).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts new file mode 100644 index 00000000..ede99b4f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/webrtc-adapter.patch/webrtc-adapter.patch.ts @@ -0,0 +1,21 @@ +(function correctWebRTCAdapterErrors() { + const shouldOverride = localStorage.getItem('error-test'); + if (shouldOverride) return; + + const NativeRTCPeerConnection = globalThis.RTCPeerConnection; + if (!NativeRTCPeerConnection) return; + + Object.defineProperty(NativeRTCPeerConnection.prototype, 'addEventListener', { + value: NativeRTCPeerConnection.prototype.addEventListener, + writable: true, + configurable: true, + }); + + Object.defineProperty(NativeRTCPeerConnection.prototype, 'removeEventListener', { + value: NativeRTCPeerConnection.prototype.removeEventListener, + writable: true, + configurable: true, + }); +})(); + +export {}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts new file mode 100644 index 00000000..f7c6316b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/interceptors/xmlHttpRequestEnvelop.ts @@ -0,0 +1,67 @@ +import { isFunction } from '@common/assertions'; +import type { AnyFunction } from '@common/types'; + +/** + * Utility to override XMLHttpRequest methods with custom handlers. + * + * In principle, we need to override sometimes the `open` of the XMLHttpRequest, + * but could be extended to other methods if needed and we already have the same pattern for patching other APIs + */ +const xmlHttpRequestEnvelop = (() => { + const originalRegistry = new Map(); + + const api = { + override< + K extends FunctionKeys, + Handler extends AnyFunction = XMLHttpRequest[K], + >( + method: K, + builder: (args: { + handler: Handler; + }) => (this: XMLHttpRequest, ...args: Parameters) => ReturnType + ): Unsubscribe { + const original = api.getOriginal(method); + + XMLHttpRequest.prototype[method] = builder({ handler: original }); + + return () => { + api.removeOverride(method); + }; + }, + + removeOverride>(method: K) { + const original = originalRegistry.get(method); + if (!original) return; + + XMLHttpRequest.prototype[method] = original; + originalRegistry.delete(method); + }, + + getOriginal< + K extends FunctionKeys, + Handler extends AnyFunction = XMLHttpRequest[K], + >(method: K): Handler { + const key = method as string; + + const cached = originalRegistry.get(key); + if (cached) return cached as Handler; + + const value = XMLHttpRequest.prototype[method]; + if (!isFunction(value)) return value as Handler; + + originalRegistry.set(key, value); + + return value as Handler; + }, + }; + + return api; +})(); + +type Unsubscribe = () => void; + +type FunctionKeys = { + [K in keyof T]: T[K] extends AnyFunction ? K : never; +}[keyof T]; + +export default xmlHttpRequestEnvelop; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts new file mode 100644 index 00000000..90495069 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/index.ts @@ -0,0 +1,2 @@ +export { default } from './logger'; +export type { LoggerProviderConfig } from '@common/logger'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts new file mode 100644 index 00000000..dc14704a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/logger/logger.ts @@ -0,0 +1,3 @@ +import { LoggerBase } from '@common/logger'; + +export default new LoggerBase(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts new file mode 100644 index 00000000..13306704 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.test.ts @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import { bitrateValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('BitrateValue', () => { + it('returns em-dash for zero or negative bitrate', () => { + expect(bitrateValue(0, locale).toString()).toBe('–'); + expect(bitrateValue(-1, locale).toString()).toBe('–'); + }); + + it('formats bitrate thresholds', () => { + expect(bitrateValue(999, locale).toString()).toBe('999 bps'); + expect(bitrateValue(1000, locale).toString()).toBe('1.0 kbps'); + expect(bitrateValue(1_000_000, locale).toString()).toBe('1.00 Mbps'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts new file mode 100644 index 00000000..60cc8c58 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/BitrateValue.ts @@ -0,0 +1,37 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +const emptyValue = '–'; + +export class BitrateValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'BitrateValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value <= 0) { + return emptyValue; + } + + if (this.value < 1000) { + return `${this.formatInteger(Math.round(this.value))} bps`; + } + + if (this.value < 1000 * 1000) { + return `${this.formatNumber(this.value / 1000, { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} kbps`; + } + + return `${this.formatNumber(this.value / (1000 * 1000), { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} Mbps`; + } +} + +export function bitrateValue(value: number | string, args?: MetricFormatArgs): BitrateValue { + return new BitrateValue(value, args); +} + +export default BitrateValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts new file mode 100644 index 00000000..a4db9bb9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BitrateValue/index.ts @@ -0,0 +1 @@ +export { default, bitrateValue } from './BitrateValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts new file mode 100644 index 00000000..aacbe5f2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.test.ts @@ -0,0 +1,13 @@ +import { describe, it, expect } from 'vitest'; +import { bytesValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('BytesValue', () => { + it('formats bytes and unit thresholds', () => { + expect(bytesValue(1023, locale).toString()).toBe('1,023 B'); + expect(bytesValue(1024, locale).toString()).toBe('1.0 KB'); + expect(bytesValue(1024 * 1024, locale).toString()).toBe('1.0 MB'); + expect(bytesValue(1024 * 1024 * 1024, locale).toString()).toBe('1.0 GB'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts new file mode 100644 index 00000000..b12714b9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/BytesValue.ts @@ -0,0 +1,38 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +export class BytesValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'BytesValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value < 1024) { + return `${this.formatInteger()} B`; + } + + if (this.value < 1024 * 1024) { + return `${this.formatNumber(this.value / 1024, { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} KB`; + } + + if (this.value < 1024 * 1024 * 1024) { + return `${this.formatNumber(this.value / (1024 * 1024), { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} MB`; + } + + return `${this.formatNumber(this.value / (1024 * 1024 * 1024), { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} GB`; + } +} + +export function bytesValue(value: number | string, args?: MetricFormatArgs): BytesValue { + return new BytesValue(value, args); +} + +export default BytesValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts new file mode 100644 index 00000000..e2ab0e45 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/BytesValue/index.ts @@ -0,0 +1 @@ +export { default, bytesValue } from './BytesValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts new file mode 100644 index 00000000..50419183 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import { durationValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('DurationValue', () => { + it('formats millisecond and second thresholds', () => { + expect(durationValue(999, locale).toString()).toBe('999 ms'); + expect(durationValue(1000, locale).toString()).toBe('1.0 s'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts new file mode 100644 index 00000000..3eccae5b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/DurationValue.ts @@ -0,0 +1,24 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +export class DurationValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'DurationValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value < 1000) { + return `${this.formatInteger()} ms`; + } + + return `${this.formatNumber(this.value / 1000, { + minimumFractionDigits: 1, + maximumFractionDigits: 1, + })} s`; + } +} + +export function durationValue(value: number | string, args?: MetricFormatArgs): DurationValue { + return new DurationValue(value, args); +} + +export default DurationValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts new file mode 100644 index 00000000..d0d453bb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/DurationValue/index.ts @@ -0,0 +1 @@ +export { default, durationValue } from './DurationValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts new file mode 100644 index 00000000..7150ccf7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { frameRateValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('FrameRateValue', () => { + it('returns em-dash for zero or negative frame rate', () => { + expect(frameRateValue(0, locale).toString()).toBe('–'); + expect(frameRateValue(-1, locale).toString()).toBe('–'); + }); + + it('rounds and appends fps', () => { + expect(frameRateValue(24.4, locale).toString()).toBe('24 fps'); + expect(frameRateValue(29.9, locale).toString()).toBe('30 fps'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts new file mode 100644 index 00000000..dd9c3e00 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/FrameRateValue.ts @@ -0,0 +1,23 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue'; + +const emptyValue = '–'; + +export class FrameRateValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'FrameRateValue', value, ...args }); + } + + protected override formatMetricValue(): string { + if (this.value <= 0) { + return emptyValue; + } + + return `${this.formatInteger(Math.round(this.value))} fps`; + } +} + +export function frameRateValue(value: number | string, args?: MetricFormatArgs): FrameRateValue { + return new FrameRateValue(value, args); +} + +export default FrameRateValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts new file mode 100644 index 00000000..f22d81c5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/FrameRateValue/index.ts @@ -0,0 +1 @@ +export { default, frameRateValue } from './FrameRateValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts new file mode 100644 index 00000000..22da66ef --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.test.ts @@ -0,0 +1,12 @@ +import { describe, it, expect } from 'vitest'; +import { integerValue } from './'; + +describe('IntegerValue', () => { + it('formats a whole number', () => { + expect(integerValue(1280, { locales: 'en-US' }).toString()).toBe('1,280'); + }); + + it('truncates fractional digits', () => { + expect(integerValue(99.9, { locales: 'en-US' }).toString()).toBe('100'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts new file mode 100644 index 00000000..4a8dc5d2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/IntegerValue.ts @@ -0,0 +1,17 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue/MetricValue'; + +export class IntegerValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'IntegerValue', value, ...args }); + } + + protected override formatMetricValue(): string { + return this.formatInteger(); + } +} + +export function integerValue(value: number | string, args?: MetricFormatArgs): IntegerValue { + return new IntegerValue(value, args); +} + +export default IntegerValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts new file mode 100644 index 00000000..41628b7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/IntegerValue/index.ts @@ -0,0 +1 @@ +export { default, integerValue } from './IntegerValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts new file mode 100644 index 00000000..8547e257 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/MetricValue.ts @@ -0,0 +1,102 @@ +import assertResult from '@common/execution/assertResult'; +import { assertNotNil, assertNumericString, isNumber } from '@common/assertions'; +import { ApplicationClientError } from '@core/errors'; + +export type MetricFormatArgs = { + locales?: Intl.LocalesArgument; + options?: Intl.NumberFormatOptions; +}; + +export interface IMetricValue { + /** + * The name of the metric value, used for identification and error reporting. + */ + readonly name: string; + + /** + * The value of the metric. + */ + readonly value: TValue; + + /** + * Returns a string representation of the metric value, formatted according to the specified locales and options. + */ + toString(): string; +} + +export abstract class MetricValue implements IMetricValue { + public readonly name: string; + + public readonly value: number; + + protected readonly locales?: Intl.LocalesArgument; + protected readonly options?: Intl.NumberFormatOptions; + + private _stringValue: string | null = null; + + constructor(args: { + name: string; + value: number | string; + locales?: Intl.LocalesArgument; + options?: Intl.NumberFormatOptions; + }) { + this.name = args.name; + this.value = this.readInitialValue(args.value); + + this.locales = args.locales; + this.options = { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + ...args.options, + }; + } + + public get stringValue(): string { + return this.toString(); + } + + public toString(): string { + if (this._stringValue === null) { + this._stringValue = this.formatMetricValue(); + } + + return this._stringValue; + } + + protected abstract formatMetricValue(): string; + + protected readInitialValue(value: number | string): number { + return assertResult( + () => { + assertNotNil(value, `${this.name}: value cannot be null or undefined`); + + if (isNumber(value)) { + return value; + } + + assertNumericString(value, `${this.name}: ${value} is not a valid number string`); + + return Number(value.trim()); + }, + (error) => + new ApplicationClientError({ + src: error, + fallbackConfig: { + fallbackMessage: `${this.name}: Invalid value`, + }, + }) + ); + } + + protected formatNumber(value = this.value, options = this.options): string { + return new Intl.NumberFormat(this.locales, options).format(value); + } + + protected formatInteger(value = this.value): string { + return this.formatNumber(value, { + maximumFractionDigits: 0, + }); + } +} + +export default MetricValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts new file mode 100644 index 00000000..41d132af --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/MetricValue/index.ts @@ -0,0 +1 @@ +export { default, type MetricFormatArgs, type IMetricValue } from './MetricValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts new file mode 100644 index 00000000..6b4bad27 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { optionalValue } from './'; +import { BytesValue } from '../BytesValue/BytesValue'; + +const args = { locales: 'en-US' }; + +describe('optionalValue', () => { + it('returns the metric instance when value is non-null', () => { + const result = optionalValue(BytesValue, 1024, args); + + expect(result.toString()).toBe('1.0 KB'); + expect(result.metric).toBeInstanceOf(BytesValue); + }); + + it('returns an empty string by default when value is null', () => { + expect(optionalValue(BytesValue, null, args).toString()).toBe(''); + }); + + it('returns the custom fallback when value is null', () => { + expect(optionalValue(BytesValue, null, { fallback: '–' }).toString()).toBe('–'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts new file mode 100644 index 00000000..5d3ffaea --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/OptionalValue.ts @@ -0,0 +1,91 @@ +import { isNil, isRecord } from '@common/assertions'; +import { + type IMetricValue, + type MetricFormatArgs as MetricFormatArgsBase, +} from '../MetricValue/MetricValue'; +import { Any } from '@common/types'; + +type MetricFormatArgs = MetricFormatArgsBase & { + fallback?: string; +}; + +type IMetricClass> = new ( + value: Metric['value'], + args?: MetricFormatArgs +) => Metric; + +class OptionalValue> implements IMetricValue { + public readonly name = 'OptionalValue'; + + public readonly fallback: string = ''; + + public readonly metric: Metric | null; + + public get value(): Metric['value'] | null { + if (isNil(this.metric)) return null; + return this.metric.value as Metric['value']; + } + + constructor(metric: IMetricClass, args?: MetricFormatArgs); + + constructor( + MetricClass: IMetricClass, + value: Metric['value'] | null | undefined, + args?: MetricFormatArgs + ); + + constructor( + arg1: IMetricClass | Metric['value'] | null | undefined, + arg2?: Metric['value'] | MetricFormatArgs | null, + arg3?: MetricFormatArgs + ) { + const isMetricValue = + isRecord(arg1) && Object.hasOwn(arg1, 'value') && Object.hasOwn(arg1, 'toString'); + + const args = (isMetricValue ? arg2 : arg3) as MetricFormatArgs | undefined; + + const metric = (() => { + if (isMetricValue) return arg1 as Metric; + + const MetricClass = arg1 as IMetricClass; + const value = arg2 as Metric['value'] | null | undefined; + + if (isNil(value)) return null; + + return new MetricClass(value, args); + })(); + + this.metric = metric; + this.fallback = args?.fallback ?? ''; + } + + toString(): string { + if (isNil(this.metric)) return this.fallback; + return this.metric.toString(); + } +} + +/** + * Creates an instance of `OptionalValue` for the specified metric class and value. + */ +export function optionalValue>( + metric: IMetricClass, + args?: MetricFormatArgs +): OptionalValue; + +/** + * Creates an instance of `OptionalValue` for the specified metric. + */ +export function optionalValue>( + MetricClass: IMetricClass, + value: Metric['value'] | null | undefined, + args?: MetricFormatArgs +): OptionalValue; + +export function optionalValue>( + ...args: ConstructorParameters> +) { + return new OptionalValue(...args); +} + +export default OptionalValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts new file mode 100644 index 00000000..7cfa6883 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/OptionalValue/index.ts @@ -0,0 +1 @@ +export { default, optionalValue } from './OptionalValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts new file mode 100644 index 00000000..e2a48cd1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.test.ts @@ -0,0 +1,11 @@ +import { describe, it, expect } from 'vitest'; +import { packetLossValue } from './'; + +const locale = { locales: 'en-US' }; + +describe('PacketLossValue', () => { + it('formats ratio as percentage with 2 decimal places', () => { + expect(packetLossValue(0.1234, locale).toString()).toBe('12.34%'); + expect(packetLossValue(0, locale).toString()).toBe('0.00%'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts new file mode 100644 index 00000000..571a69ae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/PacketLossValue.ts @@ -0,0 +1,20 @@ +import MetricValue, { type MetricFormatArgs, type IMetricValue } from '../MetricValue/MetricValue'; + +export class PacketLossValue extends MetricValue implements IMetricValue { + constructor(value: number | string, args?: MetricFormatArgs) { + super({ name: 'PacketLossValue', value, ...args }); + } + + protected override formatMetricValue(): string { + return `${this.formatNumber(this.value * 100, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })}%`; + } +} + +export function packetLossValue(value: number | string, args?: MetricFormatArgs): PacketLossValue { + return new PacketLossValue(value, args); +} + +export default PacketLossValue; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts new file mode 100644 index 00000000..7e036d0b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/PacketLossValue/index.ts @@ -0,0 +1 @@ +export { default, packetLossValue } from './PacketLossValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts new file mode 100644 index 00000000..7afb106b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from 'vitest'; +import { resolutionValue } from './'; + +describe('ResolutionValue', () => { + it('returns em-dash for null or incomplete resolution', () => { + expect(resolutionValue(null).toString()).toBe('–'); + expect(resolutionValue({ width: null, height: 720 }).toString()).toBe('–'); + expect(resolutionValue({ width: 1280, height: null }).toString()).toBe('–'); + }); + + it('returns em-dash for zero dimensions', () => { + expect(resolutionValue({ width: 0, height: 720 }).toString()).toBe('–'); + }); + + it('formats valid resolution without thousands separators', () => { + expect(resolutionValue({ width: 1280, height: 720 }).toString()).toBe('1280x720'); + }); + + it('accepts string dimensions', () => { + expect(resolutionValue({ width: 1920, height: 1080 }).toString()).toBe('1920x1080'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts new file mode 100644 index 00000000..3b8d1f94 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/ResolutionValue.ts @@ -0,0 +1,64 @@ +import type { IMetricValue, MetricFormatArgs } from '../MetricValue/MetricValue'; + +export type Resolution = { + width: number | null; + height: number | null; +}; + +export class ResolutionValue implements IMetricValue { + public readonly name = 'ResolutionValue'; + + public readonly value: Resolution; + + constructor(resolution: Resolution | null, _args?: MetricFormatArgs) { + this.value = { + width: parseDimension(resolution?.width ?? null), + height: parseDimension(resolution?.height ?? null), + }; + } + + public get stringValue(): string { + return this.toString(); + } + + public toString(): string { + if (this.value.width === null || this.value.height === null) { + return '–'; + } + + if (this.value.width <= 0 || this.value.height <= 0) { + return '–'; + } + + return `${this.value.width}x${this.value.height}`; + } +} + +export function resolutionValue( + resolution: Resolution | null, + args?: MetricFormatArgs +): ResolutionValue { + return new ResolutionValue(resolution, args); +} + +export default ResolutionValue; + +function parseDimension(value: number | string | null | undefined): number | null { + if (value === null || value === undefined) { + return null; + } + + if (typeof value === 'number') { + return Number.isFinite(value) ? value : null; + } + + const trimmed = value.trim(); + + if (!trimmed) { + return null; + } + + const parsed = Number(trimmed); + + return Number.isFinite(parsed) ? parsed : null; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts new file mode 100644 index 00000000..6ce31aee --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/ResolutionValue/index.ts @@ -0,0 +1 @@ +export { default, resolutionValue, type Resolution } from './ResolutionValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts new file mode 100644 index 00000000..b38162ae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/metrics/index.ts @@ -0,0 +1,9 @@ +export { default as MetricValue, type IMetricValue, type MetricFormatArgs } from './MetricValue'; +export { default as IntegerValue, integerValue } from './IntegerValue'; +export { default as BytesValue, bytesValue } from './BytesValue'; +export { default as FrameRateValue, frameRateValue } from './FrameRateValue'; +export { default as BitrateValue, bitrateValue } from './BitrateValue'; +export { default as PacketLossValue, packetLossValue } from './PacketLossValue'; +export { default as DurationValue, durationValue } from './DurationValue'; +export { default as OptionalValue, optionalValue } from './OptionalValue'; +export { default as ResolutionValue, resolutionValue, type Resolution } from './ResolutionValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts new file mode 100644 index 00000000..5b8a08e4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/index.ts @@ -0,0 +1 @@ +export { default as createVideoClient, type VideoClient } from './videoClient'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts new file mode 100644 index 00000000..1e653c6f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.test.ts @@ -0,0 +1,69 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; +import { createTRPCClient, httpBatchLink } from '@trpc/client'; +import createVideoClient from './createVideoClient'; + +vi.mock('@trpc/client', () => { + const httpBatchLink = vi.fn(() => 'mock-link'); + + const mutate = vi.fn(); + + const createTRPCClient = vi.fn(() => ({ + createSession: { mutate }, + joinSession: { mutate }, + createSessionAndJoin: { mutate }, + startArchive: { mutate }, + stopArchive: { mutate }, + searchArchives: { mutate }, + enableCaptions: { mutate }, + disableCaptions: { mutate }, + ensureCaptionsEnabled: { mutate }, + })); + + return { createTRPCClient, httpBatchLink }; +}); + +describe('createVideoClient', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should create a client with httpBatchLink when given link options', () => { + const linkOptions = { url: 'http://localhost:4000/trpc' }; + + createVideoClient(linkOptions); + + expect(httpBatchLink).toHaveBeenCalledWith(linkOptions); + expect(createTRPCClient).toHaveBeenCalledWith({ + links: ['mock-link'], + }); + }); + + it('should create a client with provided links array', () => { + const links = ['custom-link'] as never[]; + + createVideoClient(links); + + expect(httpBatchLink).not.toHaveBeenCalled(); + expect(createTRPCClient).toHaveBeenCalledWith({ + links, + }); + }); + + it('should flatten the proxy so procedures are called directly instead of via .mutate', async () => { + const client = createVideoClient({ url: 'http://localhost:4000/trpc' }); + + const payload = { roomName: 'test-room' }; + await client.createSession(payload); + + const mockTrpcClient = vi.mocked(createTRPCClient).mock.results[0].value; + expect(mockTrpcClient.createSession.mutate).toHaveBeenCalledWith(payload); + }); + + it('should throw when accessing a procedure that does not exist', () => { + const client = createVideoClient({ url: 'http://localhost:4000/trpc' }); + + expect(() => { + void (client as Record).nonExistent; + }).toThrow('Procedure nonExistent does not exist on the video client'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts new file mode 100644 index 00000000..98f7f75b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/createVideoClient.ts @@ -0,0 +1,96 @@ +// eslint-disable-next-line @nx/enforce-module-boundaries +import type { IVideoRouter } from '../../../../api/src/types/IVideoRouter'; +import { createTRPCClient, httpBatchLink } from '@trpc/client'; +import type { Prettify, AnyFunction } from '@common/types'; + +/** + * Creates a video client for interacting with the video API. + * + * @example + * ```ts + * const videoClient = createVideoClient({ + * url: 'http://localhost:4000/trpc', + * }); + * + * videoClient.createSession(); // creates a new session + * videoClient.createSession({ sessionId: 'existing-session-id' }); // uses an existing session + * ``` + */ +function createVideoClient(linkOptions: LinkOptions): VideoClient; + +/** + * Creates a video client for interacting with the video API. + * + * @example + * ```ts + * const videoClient = createVideoClient({ + * links: [ + * httpBatchLink({ + * url: 'http://localhost:4000/trpc', + * }), + * ], + * }); + * + * videoClient.createSession(); // creates a new session + * videoClient.createSession({ sessionId: 'existing-session-id' }); // uses an existing session + * ``` + */ +function createVideoClient(links: Links): VideoClient; + +function createVideoClient(args: Links | LinkOptions): VideoClient { + const options: Options = (() => { + if (Array.isArray(args)) { + return { links: args }; + } + + return { + links: [httpBatchLink(args)], + }; + })(); + + const trpcClient = createTRPCClient(options); + + // make the proxy flatter for a better developer experience, so instead of videoClient.createSession.mutate() it's just videoClient.createSession() + const proxy = new Proxy(trpcClient, { + get(target, property: string) { + const procedure = target[property as keyof typeof target]; + + if (!procedure) { + throw new Error(`Procedure ${property} does not exist on the video client`); + } + + return (procedure as MutateProcedure).mutate; + }, + }) as unknown as VideoClient; + + return proxy; +} + +type VideoClientBase = ReturnType>; + +type MutateProcedure = { + mutate: AnyFunction; +}; + +type Normalize = { + [K in keyof T]: T[K] extends MutateProcedure ? T[K]['mutate'] : T[K]; +}; + +type OnlyFunctions = { + [K in keyof T as T[K] extends AnyFunction ? K : never]: T[K]; +}; + +type SanitizedVideoClient = OnlyFunctions>; + +/** + * Video client to communicate with a vonage video handler. + */ +export type VideoClient = Prettify; + +type Options = Prettify>[0]>; + +type Links = Options['links']; + +type LinkOptions = Parameters>[0]; + +export default createVideoClient; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts new file mode 100644 index 00000000..88bc731d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/services/videoClient/index.ts @@ -0,0 +1 @@ +export { default, type VideoClient } from './createVideoClient'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts index fb34dc76..da06dbfd 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.spec.ts @@ -2,6 +2,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import getUserMedia from '.'; import mediaDevices$ from '../../devices$'; import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; const devices = makeMediaDeviceInfos(); @@ -21,6 +22,8 @@ describe('getUserMedia', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + mediaDevices$.reset(); }); @@ -47,4 +50,57 @@ describe('getUserMedia', () => { expect(result).toBe(mockStream); }); + + it('should sync media devices info after successfully getting user media', async () => { + const constraints = { audio: true }; + const boundGetUserMedia = getUserMedia.bind(mediaDevices$.actions); + const action = boundGetUserMedia(constraints); + const syncMediaDevicesInfoSpy = vi.spyOn(mediaDevices$.actions, 'syncMediaDevicesInfo'); + + await action(mediaDevices$); + + expect(syncMediaDevicesInfoSpy).toHaveBeenCalledTimes(1); + }); + + it('should normalize Firefox permission denial errors for the sdk', async () => { + const reason = new Error('The object can not be found here'); + reason.name = 'NotFoundError'; + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(devices), + getUserMedia: Promise.reject(reason), + }, + }); + + mediaDevicesEnvelop.rebind(navigator); + + const boundGetUserMedia = getUserMedia.bind(mediaDevices$.actions); + const action = boundGetUserMedia({ audio: true, video: true }); + + await expect(action(mediaDevices$)).rejects.toEqual( + new DOMException('Permission denied by system', 'NotAllowedError') + ); + }); + + it('should rethrow non Firefox permission errors', async () => { + const reason = new Error('Camera is busy'); + reason.name = 'NotReadableError'; + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve(devices), + getUserMedia: Promise.reject(reason), + }, + }); + + mediaDevicesEnvelop.rebind(navigator); + + const boundGetUserMedia = getUserMedia.bind(mediaDevices$.actions); + const action = boundGetUserMedia({ audio: true }); + + await expect(action(mediaDevices$)).rejects.toBe(reason); + }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts index edf635b3..823f04b8 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/getUserMedia/getUserMedia.ts @@ -1,16 +1,34 @@ import type { DevicesAPI } from '../../types'; +import { mediaDevicesEnvelop } from '@core/interceptors'; /** * Wrapper around navigator.mediaDevices.getUserMedia that also syncs the media devices info in the store after successfully getting user media. * This ensures that the store is always up to date with the latest media permissions and devices info, even if getUserMedia is called outside of the store's actions. */ -function getUserMedia(this: DevicesAPI['actions'], constraints: MediaStreamConstraints) { - return ({ getMetadata }: DevicesAPI): Promise => { - return getMetadata().__getUserMedia!(constraints).then((stream) => { - // After successfully getting user media, sync the media devices info - void this.syncMediaDevicesInfo(); - return stream; - }); +function getUserMedia(this: DevicesAPI['actions'], constraints?: MediaStreamConstraints) { + return (_api: DevicesAPI): Promise => { + // vanilla getUserMedia + const _getUserMedia = mediaDevicesEnvelop.getOriginal('getUserMedia'); + + return _getUserMedia(constraints) + .then((stream) => { + // After successfully getting user media, sync the media devices info + void this.syncMediaDevicesInfo(); + return stream; + }) + .catch((reason) => { + // The sdk is expecting the non access error to have an specific type of format + // firefox is not following the standard error format for permission denial, so we need to detect this case and throw a standardized error for the sdk to handle it properly. + const isFirefoxPermissionDenial = + reason.name === 'NotFoundError' && + reason.message.includes('The object can not be found here'); + + if (isFirefoxPermissionDenial) { + throw new DOMException('Permission denied by system', 'NotAllowedError'); + } + + throw reason; + }); }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts index 68b55ee8..7050b7d9 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/actions/selectDevice/selectDevice.ts @@ -47,7 +47,7 @@ function selectDevice( assertMediaDeviceInfo(devicesInfo); - if (kind !== 'audiooutput') await assertMediaStreamAccess({ kind, deviceId }); + if (kind !== 'audiooutput') await assertMediaStreamAccess(devicesInfo); // reconcile audio output device with Vonage SDK if it changed if (kind === 'audiooutput' && isSinkIdSupported()) { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts new file mode 100644 index 00000000..363b120b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/frontFacingKeywords.ts @@ -0,0 +1,3 @@ +const frontFacingKeywords = ['front', 'user', 'facetime', 'selfie', 'face'] as const; + +export default frontFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts index 12303326..21ca97b6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/index.ts @@ -1,2 +1,4 @@ export { default as metadata } from './metadata'; export { default as initialValue } from './initialValue'; +export { default as frontFacingKeywords } from './frontFacingKeywords'; +export { default as rearFacingKeywords } from './rearFacingKeywords'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts index a71d6542..b554dcdd 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/metadata.ts @@ -27,9 +27,9 @@ const metadata = () => { isStoreReady: CancelablePromise.resolve(), /** - * bound vanilla getUserMedia function + * Tracks whether the next media devices query is the bootstrap query executed while the store readiness promise is still being created. */ - __getUserMedia: undefined as typeof globalThis.navigator.mediaDevices.getUserMedia | undefined, + isFirstMediaDevicesInfoQuery: true, }; markDevicesApiMetadata(meta); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts new file mode 100644 index 00000000..a36597b0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/constants/rearFacingKeywords.ts @@ -0,0 +1,3 @@ +const rearFacingKeywords = ['rear', 'back', 'environment', 'world', 'main'] as const; + +export default rearFacingKeywords; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts index ae5f9dde..8d1f6e86 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/devices$.test.ts @@ -2,6 +2,7 @@ import { renderHook, waitFor } from '@testing-library/react'; import mediaDevices$ from './devices$'; import { vi, it, expect, describe, beforeEach } from 'vitest'; import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; describe('mediaDevices$ namespace', () => { beforeEach(() => { @@ -15,6 +16,8 @@ describe('mediaDevices$ namespace', () => { } as unknown as MediaStream), }, }); + + mediaDevicesEnvelop.rebind(navigator); }); it('should update devices when devicechange event triggers', async () => { diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts index 6c1ce9fd..d0e94663 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/assertMediaStreamAccess.ts @@ -1,19 +1,32 @@ -type Args = { - kind: MediaDeviceKind; - deviceId: string; -}; +import { assertResult } from '@common/execution'; +import { makeApplicationErrorMapper, ErrorCode } from '@core/errors'; +import { MediaDeviceInfoJSON } from '@web/types'; -const assertMediaStreamAccess = async ({ kind, deviceId }: Args): Promise => { +const assertMediaStreamAccess = async ({ + kind, + deviceId, + label, +}: MediaDeviceInfoJSON): Promise => { const constraints: MediaStreamConstraints = { audio: kind === 'audioinput' ? { deviceId: { exact: deviceId } } : false, video: kind === 'videoinput' ? { deviceId: { exact: deviceId } } : false, }; - const stream = await navigator.mediaDevices.getUserMedia(constraints).catch((error: Error) => { - throw new Error(`Failed to access ${kind} device: ${deviceId}`, { cause: error }); - }); + const stream = await assertResult( + () => navigator.mediaDevices.getUserMedia(constraints), + makeApplicationErrorMapper({ + fallbackMessage: `Failed to access ${kind} device: ${label}`, + type: ErrorCode.DeviceAccess, + }) + ); - stream.getTracks().forEach((track) => track.stop()); + assertResult( + () => stream.getTracks().forEach((track) => track.stop()), + makeApplicationErrorMapper({ + fallbackMessage: `Failed to access ${kind} track for device: ${label}`, + type: ErrorCode.DevicesTrackUnavailable, + }) + ); }; export default assertMediaStreamAccess; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts new file mode 100644 index 00000000..7bbde4c6 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.spec.ts @@ -0,0 +1,70 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { FacingMode } from '@common/types'; +import { isMobile } from '@web/platform'; +import { + makeMediaDeviceInfos, + frontCameraId, + rearCameraId, + setupWindowNavigatorMock, +} from '@web-test/fixtures'; +import mediaDevices$ from '../../devices$'; +import getMediaDevicesInfo$ from '.'; + +vi.mock('@web/platform', async (importOriginal) => { + const actual = await importOriginal(); + + return { + ...actual, + isMobile: vi.fn(() => false), + }; +}); + +const deviceWithoutId = { + deviceId: '', + label: 'device without id', +} as unknown as MediaDeviceInfo; + +const { getMediaDevicesInfo } = getMediaDevicesInfo$(mediaDevices$); + +describe('getMediaDevicesInfo', () => { + beforeEach(() => { + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: Promise.resolve([...makeMediaDeviceInfos(), deviceWithoutId]), + }, + }); + + mediaDevices$.reset(); + }); + + it('filters devices without deviceId and infers facing mode on mobile videoinput labels', async () => { + expect.assertions(5); + + vi.mocked(isMobile).mockReturnValue(true); + + const result = await getMediaDevicesInfo(); + + expect(result.some((device) => !device.deviceId)).toBe(false); + + const frontCamera = result.find((device) => device.deviceId === frontCameraId); + const rearCamera = result.find((device) => device.deviceId === rearCameraId); + const externalCamera = result.find((device) => device.deviceId === 'video-input-3'); + + expect(frontCamera?.inferredFacingMode).toBe(FacingMode.user); + expect(rearCamera?.inferredFacingMode).toBe(FacingMode.environment); + expect(externalCamera?.inferredFacingMode).toBe(FacingMode.unknown); + expect(result.find((device) => device.deviceId === deviceWithoutId.deviceId)).toBeUndefined(); + }); + + it('returns null inferred facing mode when platform is not mobile', async () => { + expect.assertions(1); + + vi.mocked(isMobile).mockReturnValue(false); + + const result = await getMediaDevicesInfo(); + const videoInputDevices = result.filter((device) => device.kind === 'videoinput'); + + expect(videoInputDevices.every((device) => device.inferredFacingMode === null)).toBe(true); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts similarity index 51% rename from tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts index 5d851a08..0038e2bc 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/getMediaDevicesInfo.ts @@ -1,14 +1,21 @@ import { idempotentCallbackWithRetry } from '@common/execution'; import type { MediaDeviceInfoJSON } from '@web/types'; -import { DevicesAPI } from '../types'; +import { DevicesAPI } from '../../types'; import { actions } from 'react-global-state-hooks'; +import { FacingMode } from '@common/types'; +import { frontFacingKeywords, rearFacingKeywords } from '../../constants'; +import { isMobile } from '@web/platform'; + /** * Retrieves the list of media devices from the browser. */ const getMediaDevicesInfo$ = actions()({ getMediaDevicesInfo() { return ({ getMetadata }): Promise => { - const { isStoreReady } = getMetadata(); + const metadata = getMetadata(); + const shouldSkipStoreReady = metadata.isFirstMediaDevicesInfoQuery; + + metadata.isFirstMediaDevicesInfoQuery = false; /** * Some browsers may intermittently fail to return the device list. @@ -17,21 +24,26 @@ const getMediaDevicesInfo$ = actions()({ return idempotentCallbackWithRetry( async () => { // Wait for permissions to be resolved before querying devices, as some browsers (e.g., Firefox) require permissions to be granted before providing device labels and IDs. - await isStoreReady; + if (!shouldSkipStoreReady) { + await metadata.isStoreReady; + } // Convert MediaDeviceInfo objects to plain JSON-serializable objects // native MediaDeviceInfo objects have methods and properties that may not be serializable, or work well when destructured, // so we create plain objects with the same properties. return navigator.mediaDevices.enumerateDevices().then((devices) => devices - .map((device) => ({ - deviceId: device.deviceId, - kind: device.kind, - label: device.label, - groupId: device.groupId, - })) // In case there are remaining devices without deviceId .filter((device) => device.deviceId) + .map( + (device): MediaDeviceInfoJSON => ({ + deviceId: device.deviceId, + kind: device.kind, + label: device.label, + groupId: device.groupId, + inferredFacingMode: inferFacingModeFromLabel({ device }), + }) + ) ); }, { @@ -42,4 +54,21 @@ const getMediaDevicesInfo$ = actions()({ }, }); +function inferFacingModeFromLabel({ device }: { device: MediaDeviceInfo }): FacingMode | null { + const shouldInferFacingMode = isMobile() && device.kind === 'videoinput' && device.label; + if (!shouldInferFacingMode) return null; + + const label = device.label.toLowerCase(); + + if (frontFacingKeywords.some((keyword) => label.includes(keyword))) { + return FacingMode.user; + } + + if (rearFacingKeywords.some((keyword) => label.includes(keyword))) { + return FacingMode.environment; + } + + return FacingMode.unknown; +} + export default getMediaDevicesInfo$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts new file mode 100644 index 00000000..62894220 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/getMediaDevicesInfo/index.ts @@ -0,0 +1 @@ +export { default } from './getMediaDevicesInfo'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts index 060fe707..c6a0ed61 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.test.ts @@ -4,10 +4,10 @@ import { waitFor } from '@testing-library/dom'; import mediaDevices$ from '../../devices$'; import { setupPartialMock } from '@common-test/helpers'; import { SPY_MARK } from '@common/types'; -import { setupWindowNavigatorMock } from '@web-test/fixtures'; +import { setupWindowNavigatorMock, makeMediaDeviceInfos } from '@web-test/fixtures'; import * as vonageClientSdk from '@vonage/client-sdk-video'; import * as isFirefoxModule from '@web/platform/isFirefox'; -import { makeMediaDeviceInfos } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; const someDevices = makeMediaDeviceInfos(); @@ -22,6 +22,8 @@ describe('setupDeviceStore', () => { enumerateDevices: Promise.resolve(someDevices), }, }); + + mediaDevicesEnvelop.rebind(navigator); }); it('should initialize device sync and register event listener', async () => { @@ -190,6 +192,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -235,6 +239,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -250,6 +256,35 @@ describe('setupDeviceStore', () => { }); describe('Firefox permission handling', () => { + it('should resolve store readiness and sync devices when Firefox labels are already present', async () => { + vi.spyOn(isFirefoxModule, 'default').mockReturnValue(true); + + const api$ = makeApiClone(); + + setupWindowNavigatorMock({ + mediaDevices: { + addEventListener: vi.fn(), + enumerateDevices: vi.fn().mockResolvedValue([ + { deviceId: 'device1', kind: 'audioinput', label: 'Microphone' }, + { deviceId: 'device2', kind: 'videoinput', label: 'Camera' }, + ]), + getUserMedia: vi.fn(), + }, + }); + + mediaDevicesEnvelop.rebind(navigator); + + setupDeviceStore(api$); + + await waitFor( + async () => { + await expect(api$.getMetadata().isStoreReady).resolves.toBeUndefined(); + expect(mediaDevices$.actions.syncMediaDevicesInfo).toHaveBeenCalledWith(); + }, + { timeout: 200 } + ); + }); + it('should request permissions when on Firefox and device labels are empty', async () => { vi.spyOn(isFirefoxModule, 'default').mockReturnValue(true); @@ -272,6 +307,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -304,6 +341,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -327,6 +366,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); @@ -350,8 +391,8 @@ describe('setupDeviceStore', () => { // in the test environment. The monkey patching behavior is verified via // integration tests in a real browser environment. - describe('metadata setup', () => { - it('should set __getUserMedia on metadata', () => { + describe('envelope original method access', () => { + it('should make getUserMedia available via the mediaDevices envelope', () => { const originalGetUserMedia = vi.fn(); setupWindowNavigatorMock({ @@ -361,12 +402,16 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); setupDeviceStore(api$); - const metadata = api$.getMetadata(); - expect(metadata.__getUserMedia).toBeDefined(); + const envelopGetUserMedia = mediaDevicesEnvelop.getOriginal('getUserMedia'); + + expect(envelopGetUserMedia).toBeDefined(); + expect(typeof envelopGetUserMedia).toBe('function'); }); }); @@ -382,6 +427,8 @@ describe('setupDeviceStore', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + const api$ = makeApiClone(); const cleanup = setupDeviceStore(api$); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts index a42f3bf2..8409728c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/helpers/setupDeviceStore/setupDeviceStore.ts @@ -4,6 +4,7 @@ import { assertDevicesAPI } from '../../assertions'; import { attempt } from '@common/execution'; import isFirefox from '@web/platform/isFirefox'; import CancelablePromise from 'easy-cancelable-promise'; +import { mediaDevicesEnvelop } from '@core/interceptors'; /** * Avoid monkey patching getUserMedia in non browser environment, like test or server side rendering @@ -16,21 +17,21 @@ const isBrowserEnvironment = Boolean(globalThis.navigator.mediaDevices?.addEvent function setupDeviceStore(api: unknown) { assertDevicesAPI(api); + const getUserMedia = mediaDevicesEnvelop.getOriginal('getUserMedia'); + // no support for media devices - if (!globalThis.navigator.mediaDevices?.addEventListener) { + if (!globalThis.navigator.mediaDevices?.addEventListener || !getUserMedia) { return; } const meta = api.getMetadata(); - const __getUserMedia = globalThis.navigator.mediaDevices.getUserMedia; - const shouldMonkeyPatchGetUserMedia = isBrowserEnvironment && __getUserMedia; + const shouldMonkeyPatchGetUserMedia = isBrowserEnvironment && getUserMedia; const abortController = new AbortController(); - // make accessible to the actions the vanilla getUserMedia function - meta.__getUserMedia = __getUserMedia.bind(navigator.mediaDevices); + meta.isFirstMediaDevicesInfoQuery = true; - attempt(() => { + void attempt(() => { void setVonageAudioOutputDevice(api.getState().audiooutput!); }); @@ -44,7 +45,9 @@ function setupDeviceStore(api: unknown) { const syncDevicesAndResolve = () => { void api.actions .syncMediaDevicesInfo() - .then(() => resolve()) + .then(() => { + resolve(); + }) .catch(reject); }; @@ -62,7 +65,7 @@ function setupDeviceStore(api: unknown) { if (hasLabels) return; //we should request permissions to be able to see the devices labels. - return meta.__getUserMedia!({ audio: true, video: true }).then((stream) => { + return getUserMedia({ audio: true, video: true }).then((stream) => { stream.getTracks().forEach((track) => track.stop()); }); }) @@ -114,23 +117,15 @@ function setupDeviceStore(api: unknown) { /** * Restore the original getUserMedia function. */ - const __restoreMonkeyPatch = () => { - if (!isBrowserEnvironment) return; - globalThis.navigator.mediaDevices.getUserMedia = __getUserMedia; - }; + const restoreMonkeyPatch = (() => { + if (!shouldMonkeyPatchGetUserMedia) return () => {}; - /** - * Monkey patch navigator.mediaDevices.getUserMedia to keep the store in sync when it's called outside of the store's getUserMedia action. - */ - if (shouldMonkeyPatchGetUserMedia) { - globalThis.navigator.mediaDevices.getUserMedia = Object.assign(api.actions.getUserMedia, { - __restoreMonkeyPatch, - }); - } + return mediaDevicesEnvelop.override('getUserMedia', () => api.actions.getUserMedia); + })(); return () => { abortController.abort(); - __restoreMonkeyPatch(); + restoreMonkeyPatch(); }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts index efbc5f68..99d915c3 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/devices/hooks/useMediaDevices.ts @@ -35,7 +35,7 @@ function useMediaDevices( */ function useMediaDevices( kind: MediaDeviceKind, - selector: (state: Record) => Selection, + selector: (state: Record) => Selection, options?: Options ): Selection; @@ -44,7 +44,7 @@ function useMediaDevices( */ function useMediaDevices( kind: MediaDeviceKind, - selector: (state: Record) => Selection, + selector: (state: Record) => Selection, dependencies?: Dependencies ): Selection; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts index 8466f9da..f54d15a5 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/index.ts @@ -1 +1,4 @@ export { default as mediaDevices$ } from './devices'; +export { default as notifications$ } from './notifications'; +export { default as runtime$ } from './runtime'; +export { default as publisher$ } from './publisher'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts new file mode 100644 index 00000000..0edf5c61 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/clearAllNotifications.ts @@ -0,0 +1,9 @@ +import type { NotificationsAPI } from '../types'; + +function clearAllNotifications() { + return ({ setState }: NotificationsAPI) => { + setState((state) => ({ ...state, notifications: new Map() })); + }; +} + +export default clearAllNotifications; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts new file mode 100644 index 00000000..77061fdc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/dismissNotification.ts @@ -0,0 +1,14 @@ +import type { NotificationsAPI } from '../types'; +import type NotificationId from '../types/NotificationId'; + +function dismissNotification(this: NotificationsAPI['actions'], id: NotificationId) { + return ({ setState }: NotificationsAPI) => { + setState((state) => { + const notifications = new Map(state.notifications); + notifications.delete(id); + return { ...state, notifications }; + }); + }; +} + +export default dismissNotification; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts new file mode 100644 index 00000000..386266ad --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/index.ts @@ -0,0 +1,3 @@ +export { default as pushNotification } from './pushNotification'; +export { default as dismissNotification } from './dismissNotification'; +export { default as clearAllNotifications } from './clearAllNotifications'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts new file mode 100644 index 00000000..d9f17733 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/actions/pushNotification.ts @@ -0,0 +1,28 @@ +import { notificationId, type NotificationEntry, type NotificationsAPI } from '../types'; + +function pushNotification( + this: NotificationsAPI['actions'], + payload: Omit +) { + return ({ setState }: NotificationsAPI) => { + const entry: NotificationEntry = { ...payload, id: notificationId() }; + + if (!this.hasSubscribers()) { + console.warn( + [ + 'A notification was pushed, but the notifications store has no active React consumer.', + 'This notification will not be visible to users.', + 'Render NotificationsContainer or provide a custom notification handler.', + ].join('\n') + ); + } + + setState((state) => { + const notifications = new Map(state.notifications); + notifications.set(entry.id, entry); + return { ...state, notifications }; + }); + }; +} + +export default pushNotification; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts new file mode 100644 index 00000000..1b23d477 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/index.ts @@ -0,0 +1 @@ +export { default as initialValue } from './initialValue'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts new file mode 100644 index 00000000..4c851d29 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/constants/initialValue.ts @@ -0,0 +1,5 @@ +import type { NotificationEntry, NotificationId } from '../types'; + +const initialState = { notifications: new Map() }; + +export default initialState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts new file mode 100644 index 00000000..b467b458 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/index.ts @@ -0,0 +1,2 @@ +export type * from './types'; +export { default } from './notifications$'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts new file mode 100644 index 00000000..07c2f0e5 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.test.ts @@ -0,0 +1,23 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import notifications$ from './notifications$'; + +describe('notifications$', () => { + it('push, dismiss, and clearAll manage the notifications map correctly', () => { + const { result } = renderHook(() => notifications$.use()); + + act(() => { + notifications$.actions.push({ type: 'info', message: 'A', expirationMs: null }); + notifications$.actions.push({ type: 'warning', message: 'B', expirationMs: null }); + }); + + expect(result.current[0].notifications.size).toBe(2); + + const [first] = result.current[0].notifications.values(); + act(() => notifications$.actions.dismiss(first.id)); + expect(result.current[0].notifications.size).toBe(1); + + act(() => notifications$.actions.clearAll()); + expect(result.current[0].notifications.size).toBe(0); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts new file mode 100644 index 00000000..829edfde --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notifications$.ts @@ -0,0 +1,9 @@ +import type { Prettify } from '@common/types'; +import notificationsStore from './notificationsStore'; + +// Notifications public namespace +const notifications$ = { ...notificationsStore } as Prettify< + Omit +>; + +export default notifications$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts new file mode 100644 index 00000000..f3d026d8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/notificationsStore.ts @@ -0,0 +1,28 @@ +import createGlobalState from 'react-global-state-hooks/createGlobalState'; +import { pushNotification, dismissNotification, clearAllNotifications } from './actions'; +import { InferAPI } from 'react-hooks-global-states'; +import { initialValue } from './constants'; + +export type NotificationsAPI = InferAPI; + +const notifications$ = createGlobalState(initialValue, { + name: 'notifications', + actions: { + push: pushNotification, + + dismiss: dismissNotification, + + clearAll: clearAllNotifications, + + /** + * Returns whether there are any subscribers to the notifications store. + */ + hasSubscribers: () => { + return () => { + return Boolean(notifications$.subscribers.size); + }; + }, + }, +}); + +export default notifications$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts new file mode 100644 index 00000000..c0a90d55 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationEntry.ts @@ -0,0 +1,12 @@ +import type NotificationId from './NotificationId'; +import type NotificationType from './NotificationType'; + +export type NotificationEntry = { + id: NotificationId; + type: NotificationType; + message: string; + expirationMs: number | null; + children?: React.ReactNode; +}; + +export default NotificationEntry; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts new file mode 100644 index 00000000..074f126c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationId.ts @@ -0,0 +1,11 @@ +import uniqueId from 'react-global-state-hooks/uniqueId'; + +export type NotificationId = `notification:${string}`; + +export const notificationId = uniqueId.for('notification:') as { + (): NotificationId; + is(value: unknown): value is NotificationId; + assert(value: unknown): asserts value is NotificationId; +}; + +export default NotificationId; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts new file mode 100644 index 00000000..7c8fd12c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationType.ts @@ -0,0 +1,3 @@ +export type NotificationType = 'info' | 'warning' | 'success'; + +export default NotificationType; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts new file mode 100644 index 00000000..7ef08d9a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsAPI.ts @@ -0,0 +1,3 @@ +export type NotificationsAPI = import('../notificationsStore').NotificationsAPI; + +export default NotificationsAPI; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts new file mode 100644 index 00000000..848a6f4d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/NotificationsState.ts @@ -0,0 +1,5 @@ +import type { initialValue } from '../constants'; + +export type NotificationsState = typeof initialValue; + +export default NotificationsState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts new file mode 100644 index 00000000..f17ca247 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/notifications/types/index.ts @@ -0,0 +1,5 @@ +export type { NotificationType } from './NotificationType'; +export { type NotificationId, notificationId } from './NotificationId'; +export type { NotificationEntry } from './NotificationEntry'; +export type { NotificationsState } from './NotificationsState'; +export type { NotificationsAPI } from './NotificationsAPI'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts new file mode 100644 index 00000000..3afc5de3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/getFacingMode.ts @@ -0,0 +1,54 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import mediaDevices$ from '@core/stores/devices'; +import { isMobile } from '@web/platform'; +import { ErrorCode, makeApplicationErrorMapper } from '@core/errors'; +import { frontFacingKeywords, rearFacingKeywords } from '@core/stores/devices/constants'; +import { FacingMode } from '@common/types'; + +/** + * Gets the facing mode of the publisher's video track. + * + * [TODO]: After migrating publisher context, this should became an action of publisher$ + */ +const getFacingMode = ({ publisher }: { publisher: Publisher }): FacingMode => { + if (!isMobile()) { + throw makeApplicationErrorMapper({ + fallbackMessage: 'Camera facing mode is only supported on mobile devices.', + type: ErrorCode.FacingModeNotSupported, + })(null); + } + + const { track, deviceId } = publisher.getVideoSource?.() ?? {}; + + if (!track || !deviceId) { + return FacingMode.unknown; + } + + const { facingMode } = track.getSettings(); + + if (facingMode === FacingMode.user || facingMode === FacingMode.environment) { + return FacingMode[facingMode]; + } + + /** + * If facingMode is not available from the track settings, we try to infer it from the device label. + */ + const { videoinput } = mediaDevices$.mediaDevicesMap$.getState(); + const videoInputLabel = videoinput?.[deviceId]?.label?.toLowerCase(); + + if (!videoInputLabel) { + return FacingMode.unknown; + } + + if (rearFacingKeywords.some((keyword) => videoInputLabel.includes(keyword))) { + return FacingMode.environment; + } + + if (frontFacingKeywords.some((keyword) => videoInputLabel.includes(keyword))) { + return FacingMode.user; + } + + return FacingMode.unknown; +}; + +export default getFacingMode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts new file mode 100644 index 00000000..c41e6626 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/actions/index.ts @@ -0,0 +1 @@ +export { default as getFacingMode } from './getFacingMode'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts new file mode 100644 index 00000000..3780f02c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/index.ts @@ -0,0 +1 @@ +export { default } from './publisher$'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts new file mode 100644 index 00000000..87eacffb --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.test.ts @@ -0,0 +1,173 @@ +import type { Publisher } from '@vonage/client-sdk-video'; +import { FacingMode } from '@common/types'; +import mediaDevices$ from '@core/stores/devices'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import publisher$ from './publisher$'; +import { isMobile } from '@web/platform'; +import { ErrorCode } from '@core/errors'; + +vi.mock('@web/platform', async (importOriginal) => { + const actual = await importOriginal(); + + return { + ...actual, + isMobile: vi.fn(() => true), + }; +}); + +describe('publisher$.actions.getFacingMode', () => { + beforeEach(() => { + mediaDevices$.reset(); + }); + + it('throws when facing mode is requested on non-mobile devices', () => { + expect.assertions(1); + vi.mocked(isMobile).mockReturnValue(false); + + const publisher = { + getVideoSource: vi.fn(), + } as unknown as Publisher; + + try { + publisher$.actions.getFacingMode({ publisher }); + } catch (error) { + expect(error).toMatchObject({ + type: ErrorCode.FacingModeNotSupported, + fallbackMessage: 'Camera facing mode is only supported on mobile devices.', + }); + } + }); + + it('resolves facing mode through all runtime branches', () => { + runCase({ + label: 'returns unknown when track or deviceId is missing', + publisher: makePublisher({ videoSource: {} }), + expected: FacingMode.unknown, + }); + + runCase({ + label: 'returns direct user facingMode from track settings', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-user', + track: makeTrack({ facingMode: FacingMode.user }), + }, + }), + expected: FacingMode.user, + }); + + runCase({ + label: 'returns direct environment facingMode from track settings', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-environment', + track: makeTrack({ facingMode: FacingMode.environment }), + }, + }), + expected: FacingMode.environment, + }); + + runCase({ + label: 'returns unknown when track facingMode is missing and no label exists', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-missing-label', + track: makeTrack({}), + }, + }), + expected: FacingMode.unknown, + }); + + runCase({ + label: 'infers environment from rear-facing keywords', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-rear', + track: makeTrack({}), + }, + }), + devices: [ + { + deviceId: 'camera-rear', + kind: 'videoinput', + label: 'Back Camera', + groupId: 'group-rear', + } as MediaDeviceInfo, + ], + expected: FacingMode.environment, + }); + + runCase({ + label: 'infers user from front-facing keywords', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-front', + track: makeTrack({}), + }, + }), + devices: [ + { + deviceId: 'camera-front', + kind: 'videoinput', + label: 'FaceTime HD Camera', + groupId: 'group-front', + } as MediaDeviceInfo, + ], + expected: FacingMode.user, + }); + + runCase({ + label: 'returns unknown when label has no front/rear keywords', + publisher: makePublisher({ + videoSource: { + deviceId: 'camera-unknown', + track: makeTrack({}), + }, + }), + devices: [ + { + deviceId: 'camera-unknown', + kind: 'videoinput', + label: 'External USB Camera', + groupId: 'group-unknown', + } as MediaDeviceInfo, + ], + expected: FacingMode.unknown, + }); + }); +}); + +function makePublisher({ + videoSource, +}: { + videoSource?: { track?: MediaStreamTrack; deviceId?: string }; +}): Publisher { + return { + getVideoSource: vi.fn().mockReturnValue(videoSource), + } as unknown as Publisher; +} + +function runCase({ + label, + publisher, + expected, + devices, +}: { + label: string; + publisher: Publisher; + expected: FacingMode; + devices?: MediaDeviceInfo[]; +}) { + mediaDevices$.setState((state) => ({ + ...state, + mediaDeviceInfo: devices ?? [], + })); + + expect(publisher$.actions.getFacingMode({ publisher }), label).toBe(expected); +} + +function makeTrack({ facingMode }: { facingMode?: FacingMode | string }): MediaStreamTrack { + return { + getSettings: () => ({ facingMode }), + } as unknown as MediaStreamTrack; +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts new file mode 100644 index 00000000..9ca2d374 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/publisher/publisher$.ts @@ -0,0 +1,9 @@ +import { getFacingMode } from './actions'; + +const publisher$ = { + actions: { + getFacingMode, + }, +}; + +export default publisher$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts new file mode 100644 index 00000000..94a478d7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/RuntimeProvider.ts @@ -0,0 +1,89 @@ +import { createElement, useEffect, useMemo, type PropsWithChildren } from 'react'; +import runtimeStore from './runtimeStore'; +import { Prettify } from '@common/types'; +import { useStableRef } from '@web/hooks'; +import { QueryClient } from '@tanstack/react-query'; +import { type VideoClient, createVideoClient } from '@core/services'; +import { isFunction, isString } from '@common/assertions'; +import logger, { LoggerProviderConfig } from '@core/logger'; + +type LoggerProviderArg = + | LoggerProviderConfig + | (() => Promise | LoggerProviderConfig); + +type RuntimeState = { + language?: string; + queryClient?: QueryClient; + videoClient: VideoClient | string; + loggerProvider?: LoggerProviderArg; +}; + +type RuntimeProviderProps = Prettify>; + +/** + * Provides vonage video general configuration and an isolated QueryClient for all runtime hooks. + * The QueryClient is stored in the runtime store so hooks can access it without React context. + */ +const RuntimeProvider = ({ + children, + language = 'en', + videoClient: videoClientParam, + queryClient: queryClientParam, + loggerProvider, +}: RuntimeProviderProps) => { + const clientUrl = isString(videoClientParam) ? videoClientParam : undefined; + + const videoClient = useStableRef((): VideoClient => { + if (isString(videoClientParam)) { + return createVideoClient({ + url: clientUrl!, + }); + } + + return videoClientParam; + }, [clientUrl]).current; + + const queryClient = useStableRef(() => queryClientParam ?? new QueryClient(), []).current; + + const isExternalClient = !!queryClientParam; + + const value = useMemo(() => { + return { + videoClient, + language, + queryClient, + }; + }, [videoClient, language, queryClient]); + + useEffect( + function cleanupQueryClient() { + // avoid cleaning external QueryClients that may be shared with other parts of the app + if (isExternalClient) return; + + return () => { + queryClient.clear(); + }; + }, + [isExternalClient, queryClient] + ); + + useEffect( + function syncLogsProvider() { + if (!loggerProvider) return; + + logger.setup(() => { + if (isFunction(loggerProvider)) return loggerProvider(); + return loggerProvider; + }); + + return () => { + logger.reset(); + }; + }, + [loggerProvider] + ); + + return createElement(runtimeStore.Provider, { value }, children); +}; + +export default RuntimeProvider; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts new file mode 100644 index 00000000..a93f4749 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/index.ts @@ -0,0 +1,3 @@ +export { default as useLanguage } from './useLanguage'; +export { default as useVideoClient } from './useVideoClient'; +export { default as useQuery } from './useQuery'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts new file mode 100644 index 00000000..938100da --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useLanguage.ts @@ -0,0 +1,5 @@ +import runtimeStore from '../runtimeStore'; + +const useLanguage = runtimeStore.use.createSelectorHook(({ language }) => language); + +export default useLanguage; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts new file mode 100644 index 00000000..94b9e996 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useQuery.ts @@ -0,0 +1,35 @@ +import type { QueryKey } from '@tanstack/query-core'; +import type { QueryClient, UseQueryOptions, UseQueryResult } from '@tanstack/react-query'; +import { useQuery as useBaseQuery } from '@tanstack/react-query'; +import assertNotNil from '@common/assertions/assertNotNil'; +import runtimeStore from '../runtimeStore'; + +/** + * By default uses vonage sdk isolated QueryClient from runtime store. + */ +const useQuery = < + TQueryFnData = unknown, + TError = Error, + TData = TQueryFnData, + TQueryKey extends QueryKey = QueryKey, +>( + options: UseQueryOptions, + queryClientParam?: QueryClient +): UseQueryResult => { + const queryClient = runtimeStore.use.select(({ queryClient }) => queryClientParam ?? queryClient); + + assertNotNil( + queryClient, + 'runtime$.useQuery: QueryClient is missing. Wrap your app with from the Vonage SDK or pass queryClient manually.' + ); + + return useBaseQuery( + { + staleTime: 300, // prevents double fetch on a short period of time + ...options, + }, + queryClient + ); +}; + +export default useQuery; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts new file mode 100644 index 00000000..8ca1af4f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/hooks/useVideoClient.ts @@ -0,0 +1,9 @@ +import runtimeStore from '../runtimeStore'; + +const useVideoClient = () => { + return runtimeStore.use.select(({ videoClient }) => { + return videoClient; + }); +}; + +export default useVideoClient; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts new file mode 100644 index 00000000..9de0cfa3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/index.ts @@ -0,0 +1,2 @@ +export type * from './types'; +export { default } from './runtime$'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts new file mode 100644 index 00000000..1328a81d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.test.ts @@ -0,0 +1,17 @@ +import { renderHook } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; +import type { PropsWithChildren } from 'react'; + +import runtime$ from './runtime$'; +import type { Any } from '@common/types'; + +describe('runtime$ smoke test', () => { + it('provides default state', () => { + const wrapper = ({ children }: PropsWithChildren) => { + return runtime$.Provider({ children, videoClient: {} as Any }); + }; + + const { result } = renderHook(() => runtime$.useLanguage(), { wrapper }); + expect(result.current).toBe('en'); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts new file mode 100644 index 00000000..4032f5d7 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtime$.ts @@ -0,0 +1,37 @@ +import type { Prettify } from '@common/types'; + +import runtimeStore from './runtimeStore'; +import RuntimeProvider from './RuntimeProvider'; +import { useLanguage, useVideoClient, useQuery } from './hooks'; + +const extensions = { + /** + * Custom Provider that wraps the runtime store provider and an isolated QueryClientProvider. + * The QueryClient is created on mount and cleared on unmount. + */ + Provider: RuntimeProvider, + + /** + * Hook to get the current language from the runtime context. + */ + useLanguage, + + /** + * Hook to get the video client from the runtime context. + */ + useVideoClient, + + /** + * useQuery bound to the runtime$ isolated QueryClient. + * Consumers inside runtime$.Provider automatically use the correct QueryClient. + */ + useQuery, +}; + +// Spread instead of Object.assign to avoid mutating the runtimeStore object. +// Mutating would replace the store's original Provider, breaking its internal references. +const runtime$ = { ...runtimeStore, ...extensions } as Prettify< + Omit & typeof extensions +>; + +export default runtime$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts new file mode 100644 index 00000000..a122791f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/runtimeStore.ts @@ -0,0 +1,17 @@ +import { createContext, type InferAPI } from 'react-global-state-hooks'; +import { RuntimeState } from './types'; + +export type RuntimeAPI = InferAPI; + +const runtimeStore = createContext(null! as RuntimeState, { + name: 'runtime', + actions: { + setLanguage(language: string) { + return ({ setState }) => { + setState((state) => ({ ...state, language })); + }; + }, + }, +}); + +export default runtimeStore; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts new file mode 100644 index 00000000..eadcef4c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/RuntimeState.ts @@ -0,0 +1,10 @@ +import type { QueryClient } from '@tanstack/react-query'; +import type { VideoClient } from '@core/services'; + +export type RuntimeState = { + videoClient: VideoClient; + language: string; + queryClient: QueryClient; +}; + +export default RuntimeState; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts new file mode 100644 index 00000000..3fbcf159 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/stores/runtime/types/index.ts @@ -0,0 +1,2 @@ +export type * from './RuntimeState'; +export type RuntimeAPI = import('../runtimeStore').RuntimeAPI; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts new file mode 100644 index 00000000..b6743793 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/QueryOptions.ts @@ -0,0 +1,8 @@ +import { UseQueryOptions } from '@tanstack/react-query'; + +export type QueryOptions = Omit< + UseQueryOptions, + 'queryFn' | 'queryKey' +>; + +export default QueryOptions; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts new file mode 100644 index 00000000..4437bdae --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/src/types/index.ts @@ -0,0 +1 @@ +export type * from './QueryOptions'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts new file mode 100644 index 00000000..3f481fea --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/index.ts @@ -0,0 +1 @@ +export { default as makeVideoClientMock } from './makeVideoClientMock'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts new file mode 100644 index 00000000..3d54a249 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/fixtures/makeVideoClientMock.ts @@ -0,0 +1,46 @@ +import type { Mocked } from 'vitest'; +import type { VideoClient } from '@core/services'; +import { AnyFunction } from '@common/types'; +import { isFunction, isNil } from '@common/assertions'; + +type VideoClientFnMock>> = + | Promise + | VideoClient[K]; + +type VideoClientMock = Partial<{ + [K in keyof VideoClient]: VideoClientFnMock; +}>; + +const makeVideoClientMock = (mock: VideoClientMock): Mocked => { + const target: Record = {}; + + Object.keys(mock).forEach((key) => { + const value = mock[key as keyof VideoClientMock]; + + if (!isFunction(value)) { + target[key] = vi.fn(() => value); + return; + } + + if (vi.isMockFunction(value)) { + target[key] = value as AnyFunction; + return; + } + + target[key] = vi.fn(value); + }); + + return new Proxy(target, { + get(target, prop: string) { + const value = target[prop as keyof VideoClientMock]; + + if (isNil(value)) { + throw new Error(`Method ${prop} has not been implemented in the mock`); + } + + return value; + }, + }) as Mocked; +}; + +export default makeVideoClientMock; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts new file mode 100644 index 00000000..254ec8d9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/index.ts @@ -0,0 +1 @@ +export * from './providers'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts new file mode 100644 index 00000000..c9a3e0e0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/index.ts @@ -0,0 +1,6 @@ +export { + default as makeRuntimeProviderWrapper, + type RuntimeProviderWrapperOptions, +} from './makeRuntimeProviderWrapper'; + +export { default as makeTestProvider, providers, type ProviderOptions } from './makeTestProvider'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts new file mode 100644 index 00000000..69bbbe75 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeRuntimeProviderWrapper.ts @@ -0,0 +1,23 @@ +import runtime$ from '@core/stores/runtime'; +import RuntimeProvider from '@core/stores/runtime/RuntimeProvider'; +import { makeGenericProviderWrapper } from '@web-test'; +import type { GenericWrapperOptions } from '@web-test/makeGenericProviderWrapper'; +import type { VideoClient } from '@core/services'; + +export type RuntimeProviderWrapperOptions = Omit< + GenericWrapperOptions, + 'videoClient' +> & { + videoClient?: VideoClient | null; +}; + +function makeRuntimeProviderWrapper(options: RuntimeProviderWrapperOptions = {}) { + const [wrapper, context] = makeGenericProviderWrapper(RuntimeProvider, runtime$.Context, { + videoClient: null!, + ...options, + } as Parameters[0]); + + return { wrapper, context }; +} + +export default makeRuntimeProviderWrapper; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts new file mode 100644 index 00000000..93f61f6a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makeTestProvider.ts @@ -0,0 +1,138 @@ +import composeProviders, { type ProviderComponent } from '@web/helpers/composeProviders'; +import { makeRuntimeProviderWrapper, type RuntimeProviderWrapperOptions } from './makersIndex'; + +/** + * Keep updated accordingly to the providers you have and their dependencies. + */ +export enum providers { + runtime = 'runtime', +} + +type ProviderOptionsByKey = { + [providers.runtime]: RuntimeProviderWrapperOptions; +}; + +type ProviderContextsByKey = { + [providers.runtime]: NonNullable['context']>; +}; + +/** + * Keep updated accordingly to the providers you have and their dependencies. + */ +const PROVIDER_DEPENDENCIES = { + [providers.runtime]: [], +} as const; + +/** + * Infer the possible parameters for the provided keys + */ +type ProviderOptionsFor = { + [K in Keys[number] as `${K}Context`]: ProviderOptionsByKey[K] | undefined; +}; + +/** + * Infer the context britches for the provided keys + */ +type ProviderContextsFor = { + [K in Keys[number] as `${K}Context`]: ProviderContextsByKey[K]; +}; + +function makeTestProvider< + Keys extends readonly providers[], + Options extends ProviderOptionsFor, +>( + keys: Keys, + options?: Options +): { + wrapper: ProviderComponent; +} & ProviderContextsFor { + /** + * Check all the dependencies are included in the keys + * Even if the maker knows it's dependencies, we need the keys to infer the correct type and to avoid duplicate providers + */ + (() => { + const necessaryKeys = new Set( + keys.reduce((acc, key) => { + return [...acc, ...PROVIDER_DEPENDENCIES[key], key]; + }, [] as providers[]) + ); + + const isMissingDependency = + necessaryKeys.size < keys.length || ![...necessaryKeys].every((key) => keys.includes(key)); + + if (isMissingDependency) { + throw new Error( + `Some dependencies are missing for the provided keys. Provided keys: ${keys.join( + ', ' + )}. Necessary keys: ${[...necessaryKeys].join(', ')}.` + ); + } + })(); + + /** + * Sort providers in topological dependency order so that parents are always + * rendered as ancestors of the components that depend on them. + * composeProviders(reduceRight) makes the first element the outermost wrapper. + */ + const sortedKeys = (() => { + const visited = new Set(); + const result: providers[] = []; + + const visit = (key: providers) => { + if (visited.has(key)) return; + + visited.add(key); + + for (const dependency of PROVIDER_DEPENDENCIES[key]) { + if ((keys as readonly providers[]).includes(dependency)) { + visit(dependency); + } + } + + result.push(key); + }; + + for (const key of keys) { + visit(key); + } + + return result; + })(); + + /** + * Create the providers wrappers and contexts for the provided keys + */ + const providerWrappers = sortedKeys.map((key) => { + switch (key) { + case providers.runtime: + return makeRuntimeProviderWrapper( + (options as ProviderOptionsFor<[providers.runtime]> | undefined)?.runtimeContext + ); + default: + throw new Error(`Unknown provider: ${key}`); + } + }); + + const wrapper = composeProviders(...providerWrappers.map(({ wrapper }) => wrapper)); + + return { + wrapper, + ...providerWrappers.reduce((acc, { context }, index) => { + const key = sortedKeys[index]; + + return { + ...acc, + [`${key}Context` as keyof ProviderContextsFor]: context, + }; + }, {} as ProviderContextsFor), + }; +} + +/** + * All parameters + */ +export type ProviderOptions = { + [K in providers as `${Capitalize}Context`]?: ProviderOptionsByKey[K]; +}; + +export default makeTestProvider; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts new file mode 100644 index 00000000..c4b896d8 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/test/providers/makersIndex.ts @@ -0,0 +1,4 @@ +export { + default as makeRuntimeProviderWrapper, + type RuntimeProviderWrapperOptions, +} from './makeRuntimeProviderWrapper'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json index 1e6c8473..4764b309 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "files": [], - "include": ["eslint.config.mjs", "./test/setup.ts"], + "include": ["eslint.config.mjs", "./test/setup.ts", "./test/**/*.ts", "./test/**/*.tsx"], "references": [ { "path": "./tsconfig.lib.json" @@ -13,6 +13,7 @@ "compilerOptions": { "rootDir": "..", "baseUrl": "./", + "jsx": "react-jsx", "moduleResolution": "bundler", "composite": true, "paths": { @@ -20,12 +21,18 @@ "@common/*": ["../common/src/*"], "@core": ["./src"], "@core/*": ["./src/*"], + "@core-test": ["./test"], + "@core-test/*": ["./test/*"], "@web": ["../common/srcBrowser"], "@web/*": ["../common/srcBrowser/*"], "@common-test": ["../common/test"], "@common-test/*": ["../common/test/*"], "@web-test": ["../common/testBrowser"], - "@web-test/*": ["../common/testBrowser/*"] + "@web-test/*": ["../common/testBrowser/*"], + + // video-router + "@api-lib/*": ["../api/src/*"], + "@node/*": ["../common/srcNode/*"] }, "lib": ["DOM", "DOM.Iterable", "ESNext"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json index 1a8346c0..197e66c3 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.lib.json @@ -20,7 +20,19 @@ "../common/test/**/*.ts", "../common/test/**/*.tsx", "../common/testBrowser/**/*.ts", - "../common/testBrowser/**/*.tsx" + "../common/testBrowser/**/*.tsx", + + // video-router(this is just for linter and types) + "../api/src/**/*.ts", + "../common/srcNode/**/*.ts", + "../common/src/types/FacingMode.ts" ], - "exclude": ["**/*.spec.*", "**/*.test.*"] + "exclude": [ + "**/*.spec.*", + "**/*.test.*", + "../api/**/*.test.*", + "../api/**/*.spec.*", + "../common/**/*.test.*", + "../common/**/*.spec.*" + ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json index abebbb30..aae34595 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/tsconfig.spec.json @@ -7,6 +7,7 @@ "include": [ "vite.config.ts", "test/**/*.ts", + "test/**/*.tsx", "src/**/*.ts", "src/**/*.tsx", "../common/src/**/*.ts", @@ -16,7 +17,8 @@ "../common/test/**/*.ts", "../common/test/**/*.tsx", "../common/testBrowser/**/*.ts", - "../common/testBrowser/**/*.tsx" + "../common/testBrowser/**/*.tsx", + "../common/src/types/FacingMode.ts" ], "tsBuildInfoFile": "dist/tsconfig.spec.tsbuildinfo" } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts index 652bb152..6c0f113e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/core/vite.config.ts @@ -14,6 +14,7 @@ export default defineConfig(() => ({ resolve: { alias: { '@core': path.resolve(__dirname, './src'), + '@core-test': path.resolve(__dirname, './test'), '@common': path.resolve(__dirname, '../common/src'), '@web': path.resolve(__dirname, '../common/srcBrowser'), '@common-test': path.resolve(__dirname, '../common/test'), @@ -57,6 +58,12 @@ export default defineConfig(() => ({ reportsDirectory: './coverage', provider: 'v8' as const, reporter: ['text', 'lcov'], + allowExternal: true, + include: [ + `${path.resolve(__dirname, 'src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/srcBrowser')}/**/*.{ts,tsx}`, + ], exclude: ['test/**', '**/index.ts'], }, }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx index 79eb8252..c6e7515d 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/.storybook/preview.tsx @@ -1,7 +1,10 @@ import type { Preview } from '@storybook/react'; +import { registerIcon } from '@vonage/vivid'; import { ThemeProvider } from '../src/theme'; import '../src/styles.css'; +registerIcon(); + const preview: Preview = { decorators: [ (Story) => ( diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx new file mode 100644 index 00000000..384d6c3c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/Field.tsx @@ -0,0 +1,26 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; +import FieldDescription from './FieldDescription'; +import FieldInput from './FieldInput'; +import FieldLabel from './FieldLabel'; +import FieldRow from './FieldRow'; + +const FieldRoot = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( +
+ {children} +
+ ); +}; + +const Field = Object.assign(FieldRoot, { + Label: FieldLabel, + Input: FieldInput, + Description: FieldDescription, + Row: FieldRow, +}); + +export default Field; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx new file mode 100644 index 00000000..d9d86582 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldDescription.tsx @@ -0,0 +1,20 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; + +const FieldDescription = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( +

+ {children} +

+ ); +}; + +export default FieldDescription; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx new file mode 100644 index 00000000..c65fac3c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.test.tsx @@ -0,0 +1,74 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, fireEvent } from '@testing-library/react'; +import FieldInput from './FieldInput'; + +describe('FieldInput', () => { + describe('switch variant', () => { + it('calls onChange with true when toggled from unchecked', () => { + const onChange = vi.fn(); + + const { getByRole } = render( + + ); + + fireEvent.click(getByRole('checkbox')); + + expect(onChange).toHaveBeenCalledWith(true); + }); + + it('calls onChange with false when toggled from checked', () => { + const onChange = vi.fn(); + + const { getByRole } = render( + + ); + + fireEvent.click(getByRole('checkbox')); + + expect(onChange).toHaveBeenCalledWith(false); + }); + + it('renders as disabled when disabled prop is set', () => { + const { getByRole } = render( + + ); + + expect((getByRole('checkbox') as HTMLInputElement).disabled).toBe(true); + }); + + it('renders the small switch size classes when requested', () => { + const { container } = render( + + ); + + expect(container.querySelector('span')).toHaveClass('h-5', 'w-9', 'after:h-4', 'after:w-4'); + }); + + it('toggles when the visible switch track is clicked', () => { + const onChange = vi.fn(); + const { container } = render( + + ); + + fireEvent.click(container.querySelector('span')!); + + expect(onChange).toHaveBeenCalledWith(true); + }); + }); + + describe('native input variant', () => { + it('renders a native input with passed props', () => { + const { getByRole } = render(); + + const input = getByRole('textbox') as HTMLInputElement; + + expect(input.placeholder).toBe('Enter value'); + }); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx new file mode 100644 index 00000000..36aaf51f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldInput.tsx @@ -0,0 +1,49 @@ +import type { ComponentProps, ReactElement } from 'react'; + +type SwitchInputProps = { + variant: 'switch'; + id: string; + checked: boolean; + onChange: (checked: boolean) => void; + disabled?: boolean; + size?: 'default' | 'small'; +}; + +type NativeInputProps = ComponentProps<'input'> & { variant?: never }; + +export type FieldInputProps = SwitchInputProps | NativeInputProps; + +const FieldInput = (props: FieldInputProps): ReactElement => { + if (props.variant === 'switch') { + const { id, checked, onChange, disabled, size = 'default' } = props; + const switchSizeClassName = + size === 'small' + ? 'h-5 w-9 after:left-0.5 after:top-0.5 after:h-4 after:w-4 peer-checked:after:translate-x-4' + : 'h-6 w-11 after:left-0.5 after:top-0.5 after:h-5 after:w-5 peer-checked:after:translate-x-5'; + + return ( + + ); + } + + const { variant: _variant, ...inputProps } = props; + + return ; +}; + +export default FieldInput; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx new file mode 100644 index 00000000..6ca3753f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldLabel.tsx @@ -0,0 +1,20 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; + +const FieldLabel = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( + + ); +}; + +export default FieldLabel; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx new file mode 100644 index 00000000..928c1e51 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/FieldRow.tsx @@ -0,0 +1,18 @@ +import type { ComponentProps, PropsWithChildren, ReactElement } from 'react'; + +const FieldRow = ({ + children, + className, + ...props +}: PropsWithChildren>): ReactElement => { + return ( +
+ {children} +
+ ); +}; + +export default FieldRow; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx new file mode 100644 index 00000000..f90ee8f0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/Field/index.tsx @@ -0,0 +1,4 @@ +import Field from './Field'; + +export type { FieldInputProps } from './FieldInput'; +export default Field; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx new file mode 100644 index 00000000..49ba46fa --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/LabeledValueList.tsx @@ -0,0 +1,39 @@ +import type { ReactElement } from 'react'; + +export type LabeledValueItem = { + label: string; + value: string; +}; + +export type LabeledValueListProps = { + title: string; + items: LabeledValueItem[]; +}; + +const LabeledValueList = ({ title, items }: LabeledValueListProps): ReactElement => { + return ( +
+

+ {title} +

+ +
    + {items.map((item) => ( +
  • + + {item.label} + + + {item.value} + +
  • + ))} +
+
+ ); +}; + +export default LabeledValueList; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx new file mode 100644 index 00000000..f84a9a0a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/LabeledValueList/index.tsx @@ -0,0 +1,4 @@ +import LabeledValueList from './LabeledValueList'; + +export type { LabeledValueItem, LabeledValueListProps } from './LabeledValueList'; +export default LabeledValueList; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx index 9d82ead5..81d9d637 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayout/PageLayout.tsx @@ -1,89 +1,61 @@ import React from 'react'; -import Box from '@mui/material/Box'; -import Stack from '@mui/material/Stack'; -import type { BoxProps } from '@mui/material/Box'; -import useTheme from '../theme'; -import { isFunction } from '@common/assertions'; +import { findSlotByDisplayName } from '../helpers'; +import { twMerge } from 'tailwind-merge'; type WithChildren = { children: React.ReactNode }; -export type PageLayoutProps = BoxProps; +export type PageLayoutProps = React.ComponentProps<'section'>; -export enum PageLayoutRegions { - Banner = 'Banner', - Left = 'Left', - Right = 'Right', - Footer = 'Footer', +export enum PageLayoutSlots { + Banner = 'PageLayout.Banner', + Left = 'PageLayout.Left', + Right = 'PageLayout.Right', + Footer = 'PageLayout.Footer', } -const PageLayout = ({ children, sx, ...props }: PageLayoutProps): React.ReactNode => { - const theme = useTheme(); - +const PageLayout = ({ children, className, ...props }: PageLayoutProps): React.ReactNode => { const childrenArray = React.Children.toArray(children); - const banner = pickChild(childrenArray, PageLayoutRegions.Banner); - const left = pickChild(childrenArray, PageLayoutRegions.Left); - const right = pickChild(childrenArray, PageLayoutRegions.Right); - const footer = pickChild(childrenArray, PageLayoutRegions.Footer); + const banner = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Banner, + }); + + const left = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Left, + }); + + const right = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Right, + }); + + const footer = findSlotByDisplayName({ + children: childrenArray, + displayName: PageLayoutSlots.Footer, + }); return ( - +
{banner} - +
{left && ( - +
{left} - +
)} {right && ( - +
{right} - +
)} - +
{footer} - +
); }; @@ -103,10 +75,10 @@ const PageLayoutFooter: React.FC = ({ children }) => { return children; }; -PageLayoutBanner.displayName = PageLayoutRegions.Banner; -PageLayoutLeft.displayName = PageLayoutRegions.Left; -PageLayoutRight.displayName = PageLayoutRegions.Right; -PageLayoutFooter.displayName = PageLayoutRegions.Footer; +PageLayoutBanner.displayName = PageLayoutSlots.Banner; +PageLayoutLeft.displayName = PageLayoutSlots.Left; +PageLayoutRight.displayName = PageLayoutSlots.Right; +PageLayoutFooter.displayName = PageLayoutSlots.Footer; /** * Banner that will be displayed at the top of the layout @@ -124,19 +96,8 @@ PageLayout.Left = PageLayoutLeft; PageLayout.Right = PageLayoutRight; /** - * Content for the left column + * Content for the footer */ PageLayout.Footer = PageLayoutFooter; -function pickChild(children: React.ReactNode[], identifier: PageLayoutRegions): React.ReactNode { - return ( - children.find((child: unknown) => { - const isValidElement = React.isValidElement(child) && isFunction(child.type); - if (!isValidElement) return false; - - return (child.type as React.ComponentType).displayName === identifier; - }) ?? null - ); -} - export default PageLayout; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx index 4a71bd24..dabd805e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/PageLayoutEmbed/PageLayoutEmbed.tsx @@ -2,7 +2,6 @@ import React from 'react'; import Box from '@mui/material/Box'; import Stack from '@mui/material/Stack'; import type { BoxProps } from '@mui/material/Box'; -import useTheme from '../theme'; import { isFunction } from '@common/assertions'; type WithChildren = { children: React.ReactNode }; @@ -17,8 +16,6 @@ export enum PageLayoutEmbedRegions { } const PageLayoutEmbed = ({ children, sx, ...props }: PageLayoutEmbedProps): React.ReactNode => { - const theme = useTheme(); - const childrenArray = React.Children.toArray(children); const left = pickChild(childrenArray, PageLayoutEmbedRegions.Left); @@ -49,12 +46,12 @@ const PageLayoutEmbed = ({ children, sx, ...props }: PageLayoutEmbedProps): Reac > {left && ( = { + value: TValue; + label: string; +}; + +export type SelectFieldProps = Omit< + ComponentProps<'select'>, + 'value' | 'onChange' | 'children' +> & { + id: string; + label: string; + value: TValue; + options: SelectFieldOption[]; + onChange: (value: TValue) => void; + description?: string; +}; + +const SelectField = ({ + id, + label, + value, + options, + onChange, + description, + ...selectProps +}: SelectFieldProps): ReactElement => { + const handleChange = (event: ChangeEvent) => { + const selectedOption = options.find((option) => String(option.value) === event.target.value); + + if (!selectedOption) return; + + onChange(selectedOption.value); + }; + + return ( +
+ +
+ + +
+ {description ? ( +

{description}

+ ) : null} +
+ ); +}; + +export default SelectField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx new file mode 100644 index 00000000..e980c09a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SelectField/index.tsx @@ -0,0 +1,4 @@ +import SelectField from './SelectField'; + +export type { SelectFieldOption, SelectFieldProps } from './SelectField'; +export default SelectField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx new file mode 100644 index 00000000..954e3aa4 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/SwitchField.tsx @@ -0,0 +1,38 @@ +import type { CSSProperties, ReactElement } from 'react'; +import Field from '../Field'; + +export type SwitchFieldProps = { + id: string; + label: string; + checked: boolean; + onChange: (checked: boolean) => void; + description?: string; + size?: 'default' | 'small'; + labelClassName?: string; + labelStyle?: CSSProperties; +}; + +const SwitchField = ({ + id, + label, + checked, + onChange, + description, + size, + labelClassName, + labelStyle, +}: SwitchFieldProps): ReactElement => { + return ( + + + + {label} + + + + {description ? {description} : null} + + ); +}; + +export default SwitchField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx new file mode 100644 index 00000000..7c8f82be --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/SwitchField/index.tsx @@ -0,0 +1,4 @@ +import SwitchField from './SwitchField'; + +export type { SwitchFieldProps } from './SwitchField'; +export default SwitchField; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx new file mode 100644 index 00000000..21647633 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/VividIcon.tsx @@ -0,0 +1,49 @@ +import { hasMediaProcessorSupport } from '@vonage/client-sdk-video'; +import { createElement, type CSSProperties } from 'react'; + +export type VividIconProps = { + name: string; + customSize?: -6 | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5; + /** + * Use `style` instead. Tailwind classes cannot reach Vivid's internal shadow DOM, + * so color set via `className` will be silently overridden by MUI and never applied. + * @deprecated + */ + className?: never; + /** + * Use `style` instead. MUI `sx` is being removed from this codebase. + * VividIcon accepts `style` directly — pass CSS vars there. + * @deprecated + */ + sx?: never; + style?: CSSProperties; +} & Record; + +const VividIcon = ({ name, customSize, style, ...props }: VividIconProps) => { + return createElement('vwc-icon', { + ref: captureRefComponent, + size: customSize, + name, + 'data-testid': `vivid-icon-${name}`, + style: { + color: 'var(--vera-text-secondary)', + ...style, + }, + ...props, + }); +}; + +function captureRefComponent(element: HTMLElement | null) { + if (!element || hasMediaProcessorSupport('both')) return; + + void customElements.whenDefined('vwc-icon').then(() => { + const elementWithShadow = element as HTMLElement & { shadowRoot: ShadowRoot | null }; + const figure = elementWithShadow.shadowRoot?.querySelector('figure'); + if (figure) { + figure.style.paddingLeft = '1px'; + figure.style.paddingRight = '1px'; + } + }); +} + +export default VividIcon; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts new file mode 100644 index 00000000..45ed4b7d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/VividIcon/index.ts @@ -0,0 +1,2 @@ +export { default } from './VividIcon'; +export type { VividIconProps } from './VividIcon'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx new file mode 100644 index 00000000..9194468b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.spec.tsx @@ -0,0 +1,55 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { describe, expect, it } from 'vitest'; +import Collapsible from './Collapsible'; + +describe('CollapsibleSection', () => { + it('renders collapsed by default and keeps the content mounted', () => { + render( + + Publisher statistics + +
Packets sent
+
+
+ ); + + const details = screen.getByText(/publisher statistics/i).closest('details'); + const content = screen.getByText(/packets sent/i); + + expect(details).not.toHaveAttribute('open'); + expect(content).toBeInTheDocument(); + expect(content).not.toBeVisible(); + }); + + it('shows and hides the content without unmounting it', async () => { + const user = userEvent.setup(); + + render( + + Publisher statistics + +
Packets sent
+
+
+ ); + + const summary = screen.getByText(/publisher statistics/i); + const details = summary.closest('details'); + const content = screen.getByText(/packets sent/i); + + expect(details).toHaveAttribute('open'); + expect(content).toBeVisible(); + + await user.click(summary); + + expect(details).not.toHaveAttribute('open'); + expect(content).toBeInTheDocument(); + expect(content).not.toBeVisible(); + + await user.click(summary); + + expect(details).toHaveAttribute('open'); + expect(content).toBeVisible(); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx new file mode 100644 index 00000000..4448120a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/Collapsible.tsx @@ -0,0 +1,105 @@ +import { useEffect, type ComponentProps, type PropsWithChildren } from 'react'; +import findSlotByDisplayName from '@ui/helpers/findSlotByDisplayName'; +import { twMerge } from 'tailwind-merge'; +import collapsible$, { CollapsibleState } from './collapsible$'; +import { CollapsibleSlots } from './constants'; +import { Summary, Details } from './components'; +import { useStableCallback } from '@web/hooks'; +import Icon from './components/Icon'; + +export type CollapsibleProps = { + children: React.ReactNode[]; +} & PropsWithChildren, 'children'>>; + +const InnerCollapsible = ({ children, className, onToggle, ...props }: CollapsibleProps) => { + const summary = findSlotByDisplayName({ + children, + displayName: CollapsibleSlots.Summary, + }); + + const details = findSlotByDisplayName({ + children, + displayName: CollapsibleSlots.Details, + }); + + const remainingChildren = children.filter?.((child) => ![summary, details].includes(child)); + + const { + setState, + actions: { toggle }, + } = collapsible$.use.api(); + + const open = collapsible$.use.select((state) => state.open); + + useEffect( + function syncOpenState() { + setState((state) => ({ + ...state, + open: props.open ?? state.open, + })); + }, + [setState, props.open] + ); + + return ( +
{ + toggle({ open: event.currentTarget.open }); + onToggle?.(event); + }} + className={twMerge('Collapsible flex flex-col open:gap-3', className)} + > + {summary} + {details} + {remainingChildren} +
+ ); +}; + +/** + * Collapsible component that can be used to show/hide content. + * + * @example + * + * + * Click to expand + * + * + * + * This is the content that can be collapsed. + * + * + */ +const Collapsible = (props: CollapsibleProps) => { + const initialize = useStableCallback((state: CollapsibleState) => { + return { + ...state, + open: props.open ?? state.open, + }; + }); + + return ( + + + + ); +}; + +/** + * Summary slot for the Collapsible component. + */ +Collapsible.Summary = Summary; + +/** + * Details slot for the Collapsible component. + */ +Collapsible.Details = Details; + +/** + * Icon component for the Collapsible summary + */ +Collapsible.Icon = Icon; + +export default Collapsible; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts new file mode 100644 index 00000000..da481879 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/collapsible$.ts @@ -0,0 +1,25 @@ +import { createContext, type InferAPI } from 'react-global-state-hooks'; + +export type CollapsibleState = typeof initialState; + +export type CollapsibleAPI = InferAPI; + +const initialState = { + open: false, +}; + +const collapsible$ = createContext(initialState, { + actions: { + /** + * Toggles the open state of the collapsible. If `args.open` is provided, it will set the open state to that value instead of toggling. + */ + toggle(args?: { open: boolean }) { + return ({ setState, getState }) => { + const { open } = getState(); + setState((state) => ({ ...state, open: args?.open ?? !open })); + }; + }, + }, +}); + +export default collapsible$; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx new file mode 100644 index 00000000..0dc96f5b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Details.tsx @@ -0,0 +1,26 @@ +import type { ComponentProps } from 'react'; +import { CollapsibleSlots } from '../constants'; +import classNames from 'classnames'; + +/** + * Details slot for the Collapsible component. + * + * @example + * + * ... + * + * Details content here + * + * + */ +function Details({ className, children, ...restProps }: ComponentProps<'div'>) { + return ( +
+ {children} +
+ ); +} + +Details.displayName = CollapsibleSlots.Details; + +export default Details; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx new file mode 100644 index 00000000..ae291c12 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Icon.tsx @@ -0,0 +1,32 @@ +import VividIcon, { VividIconProps } from '@ui/VividIcon'; +import collapsible$ from '../collapsible$'; + +type IconProps = Omit; + +/** + * Default icon for the Collapsible component that indicates whether the content is expanded or collapsed. + * + * @example + * + * ... + * + * Summary content here + * + * + * + */ +const Icon = (props: IconProps) => { + const open = collapsible$.use.select(({ open }) => open); + return ( + + ); +}; + +Icon.displayName = `Collapsible.Icon`; + +export default Icon; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx new file mode 100644 index 00000000..9b8805a1 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/Summary.tsx @@ -0,0 +1,57 @@ +import type { ComponentProps, ReactNode } from 'react'; +import collapsible$, { CollapsibleAPI, CollapsibleState } from '../collapsible$'; +import { CollapsibleSlots } from '../constants'; +import { twMerge } from 'tailwind-merge'; +import { isFunction } from '@common/assertions'; +import { Prettify } from '@common/types'; + +type Callback = (state: Prettify) => ReactNode; + +type SummaryProps = Omit, 'children'> & { + children: ReactNode | Callback; +}; + +/** + * Summary slot for the Collapsible component. + * + * @example + * + * + * Summary content here + * + * ... + * + * @example + * + * + * {({ open }) => open ? 'Collapse' : 'Expand'} + * + * ... + */ +function Summary({ className, children, ...props }: SummaryProps) { + return ( + + {isFunction(children) ? ( + + ) : ( + (children as ReactNode) + )} + + ); +} + +function StateRenderer({ builder }: { builder: Callback }) { + const [state, actions] = collapsible$.use(); + return builder({ ...state, ...actions }); +} + +Summary.displayName = CollapsibleSlots.Summary; + +export default Summary; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts new file mode 100644 index 00000000..3c5ff98b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/components/index.ts @@ -0,0 +1,2 @@ +export { default as Summary } from './Summary'; +export { default as Details } from './Details'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts new file mode 100644 index 00000000..d579beb2 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/CollapsibleSlots.ts @@ -0,0 +1,6 @@ +enum CollapsibleSlots { + Summary = 'Collapsible.Summary', + Details = 'Collapsible.Details', +} + +export default CollapsibleSlots; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts new file mode 100644 index 00000000..5e060122 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/constants/index.ts @@ -0,0 +1 @@ +export { default as CollapsibleSlots } from './CollapsibleSlots'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx new file mode 100644 index 00000000..92c0879e --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/Collapsible/index.tsx @@ -0,0 +1 @@ +export { default } from './Collapsible'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx new file mode 100644 index 00000000..c663c460 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.spec.tsx @@ -0,0 +1,72 @@ +import { render as renderBase } from '@testing-library/react'; +import { createInstance } from 'i18next'; +import { type ReactNode } from 'react'; +import { I18nextProvider, initReactI18next } from 'react-i18next'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import NotificationItem from './NotificationItem'; + +describe('NotificationItem', () => { + afterEach(() => { + vi.useRealTimers(); + }); + + it('calls onDismiss after expirationMs passes', () => { + vi.useFakeTimers(); + + const onDismiss = vi.fn(); + + render( + + ); + + vi.advanceTimersByTime(0); + expect(onDismiss).not.toHaveBeenCalled(); + + vi.advanceTimersByTime(1); + expect(onDismiss).toHaveBeenCalledWith('notification:item-1'); + }); + + it('clears the pending timeout when unmounted', () => { + vi.useFakeTimers(); + + const onDismiss = vi.fn(); + const setTimeoutSpy = vi.spyOn(globalThis, 'setTimeout'); + const clearTimeoutSpy = vi.spyOn(globalThis, 'clearTimeout'); + + const { unmount } = render( + + ); + + const timeoutHandle = setTimeoutSpy.mock.results.at(-1)?.value; + + unmount(); + + expect(clearTimeoutSpy).toHaveBeenCalledWith(timeoutHandle); + }); +}); + +const i18n = createInstance(); + +void i18n.use(initReactI18next).init({ + lng: 'en', + fallbackLng: 'en', + resources: { en: { translation: {} } }, + interpolation: { escapeValue: false }, + initImmediate: false, +}); + +function render(ui: ReactNode) { + return renderBase({ui}); +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx new file mode 100644 index 00000000..6d3a6411 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.stories.tsx @@ -0,0 +1,144 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import i18next from 'i18next'; +import { initReactI18next, I18nextProvider } from 'react-i18next'; +import type { NotificationId } from '@core/stores/notifications'; +import NotificationItem from './NotificationItem'; +import { notifications$ } from '@core/stores'; + +const i18n = i18next.createInstance(); +void i18n.use(initReactI18next).init({ + lng: 'en', + resources: { en: { translation: { 'notification.dismiss': 'Dismiss notification' } } }, +}); + +const meta = { + title: 'UI/Notifications/NotificationItem', + component: NotificationItem, + decorators: [ + (Story) => ( + + + + ), + ], + argTypes: { + type: { + control: { type: 'select' }, + options: ['info', 'warning', 'success'], + }, + }, + args: { + id: 'notification:preview' as const, + message: 'This is a notification message.', + expirationMs: null, + }, +} satisfies Meta; + +type Story = StoryObj; + +export const AllTypes: Story = { + args: { type: 'info', onDismiss: () => {} }, + parameters: { controls: { disable: true } }, + render: () => { + const infoId = 'notification:info' as NotificationId; + const warningId = 'notification:warning' as NotificationId; + const successId = 'notification:success' as NotificationId; + const childrenId = 'notification:children' as NotificationId; + + return ( + +
+ + + + +
+ View error details +
+                {`MediaProcessorError: GPU acceleration unavailable\n  at BackgroundProcessor.apply (processor.js:42)`}
+              
+
+
+
+
+ ); + }, +}; + +export const Info: Story = { + args: { type: 'info', onDismiss: notifications$.actions.dismiss }, +}; + +export const Warning: Story = { + args: { type: 'warning', onDismiss: notifications$.actions.dismiss }, +}; + +export const Success: Story = { + args: { type: 'success', onDismiss: notifications$.actions.dismiss }, +}; + +export const WithAutoDismiss: Story = { + args: { + type: 'info', + message: 'This notification will dismiss after 3 seconds.', + expirationMs: 3000, + onDismiss: notifications$.actions.dismiss, + }, +}; + +export const LongMessage: Story = { + args: { + type: 'warning', + message: + 'This is a longer notification message to show how text wraps inside the notification item component when the content exceeds one line.', + onDismiss: notifications$.actions.dismiss, + }, +}; + +export const WithChildren: Story = { + args: { + type: 'warning', + message: 'Failed to apply background effect.', + onDismiss: notifications$.actions.dismiss, + }, + render: (args) => ( + + +
+ + View error details + +
+            {`MediaProcessorError: GPU acceleration unavailable\n  at BackgroundProcessor.apply (processor.js:42)\n  at VideoSession.applyEffect (session.js:118)`}
+          
+
+
+
+ ), +}; + +export default meta; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx new file mode 100644 index 00000000..3069d949 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/NotificationItem.tsx @@ -0,0 +1,105 @@ +import { + useEffect, + type ReactElement, + PropsWithChildren, + ComponentProps, + CSSProperties, +} from 'react'; +import { useTranslation } from 'react-i18next'; +import type { NotificationEntry, NotificationId } from '@core/stores/notifications'; +import VividIcon from '@ui/VividIcon'; +import classNames from 'classnames'; +import { twMerge } from 'tailwind-merge'; +import { Prettify } from '@common/types'; +import { isString } from '@common/assertions'; + +const typeIconName: Record = { + info: 'info-line', + warning: 'warning-line', + success: 'check-circle-line', +}; + +const typeIconColorVar: Record = { + info: 'var(--vera-information)', + warning: 'var(--vera-warning)', + success: 'var(--vera-success)', +}; + +type NotificationItemProps = PropsWithChildren< + Prettify< + ComponentProps<'div'> & + NotificationEntry & { + onDismiss: (id: NotificationId) => void; + iconStyle?: CSSProperties; + } + > +>; + +function NotificationItem({ + id, + type, + message, + expirationMs, + onDismiss, + children, + className, + iconStyle, + ...rest +}: NotificationItemProps): ReactElement { + const { t } = useTranslation(); + + useEffect(() => { + if (expirationMs === null) return; + + const timer = setTimeout(() => onDismiss(id), expirationMs); + + return () => clearTimeout(timer); + }, [id, expirationMs, onDismiss]); + + const iconColorStyle: CSSProperties = { + color: typeIconColorVar[type], + pointerEvents: 'none', + ...iconStyle, + }; + + return ( +
+
+ +
+ +
+ {isString(message) ? ( +

+ ) : ( + message + )} + + {children} +

+ + +
+ ); +} + +export default NotificationItem; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts new file mode 100644 index 00000000..9a5a4dc9 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationItem/index.ts @@ -0,0 +1 @@ +export { default } from './NotificationItem'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx new file mode 100644 index 00000000..6473a321 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.stories.tsx @@ -0,0 +1,166 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import i18next from 'i18next'; +import { initReactI18next, I18nextProvider } from 'react-i18next'; +import notifications$ from '@core/stores/notifications'; +import NotificationsContainer from './NotificationsContainer'; +import { ZodIssue } from '@common/errors'; +import { handleClientApplicationError } from '@ui/helpers'; +import { ApplicationClientError } from '@core/errors'; + +const i18n = i18next.createInstance(); +void i18n.use(initReactI18next).init({ + lng: 'en', + resources: { en: { translation: { 'notification.dismiss': 'Dismiss notification' } } }, +}); + +const meta = { + title: 'UI/Notifications/NotificationsContainer', + component: NotificationsContainer, + argTypes: { + position: { + control: { type: 'select' }, + options: ['top-right', 'bottom-center'], + }, + }, + args: { + position: 'top-right', + }, + parameters: { + layout: 'fullscreen', + }, + decorators: [ + (Story) => ( + +
+ +
+
+ ), + ], +} satisfies Meta; + +type Story = StoryObj; + +const mocks: ZodIssue[] = [ + { + code: 'invalid_type', + path: ['username'], + message: 'Invalid input: expected string, received number', + expected: 'string', + received: 'number', + }, + { + code: 'too_small', + path: ['password'], + message: 'String must contain at least 8 character(s)', + expected: 'string', + received: 'string', + }, + { + code: 'invalid_enum_value', + path: ['role'], + message: "Invalid enum value. Expected 'admin' | 'user', received 'superuser'", + expected: "'admin' | 'user'", + received: "'superuser'", + }, +]; + +export const Interactive: Story = { + render: ({ position }) => { + return ( + <> +
+ + + + + + + + +
+ + + + ); + }, +}; + +export default meta; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx new file mode 100644 index 00000000..8f64e13d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/NotificationsContainer.tsx @@ -0,0 +1,48 @@ +import { type ReactElement } from 'react'; +import { tv } from 'tailwind-variants'; +import notifications$ from '@core/stores/notifications'; +import type { NotificationId } from '@core/stores/notifications'; +import NotificationItem from '../NotificationItem'; + +type NotificationPosition = 'top-right' | 'bottom-center'; + +const NotificationsContainer = ({ + position = 'top-right', +}: NotificationsContainerProps): ReactElement => { + const notifications = notifications$.use.select(({ notifications }) => notifications); + + const handleDismiss = (id: NotificationId) => { + notifications$.actions.dismiss(id); + }; + + return ( +
+ {[...notifications.values()].map((notification) => ( + + ))} +
+ ); +}; + +const variants = tv({ + base: 'fixed z-1400 flex flex-col gap-3 pointer-events-none max-sm:w-[calc(100%-12px)] pl-3', + variants: { + position: { + 'top-right': 'top-4 right-3', + 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 items-center', + }, + }, + defaultVariants: { + position: 'top-right', + }, +}); + +function styles({ position }: { position: NotificationPosition }) { + return variants({ position }); +} + +type NotificationsContainerProps = { + position?: 'top-right' | 'bottom-center'; +}; + +export default NotificationsContainer; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts new file mode 100644 index 00000000..3deb6f7a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/NotificationsContainer/index.ts @@ -0,0 +1 @@ +export { default } from './NotificationsContainer'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts new file mode 100644 index 00000000..7d7839dc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/components/index.ts @@ -0,0 +1,3 @@ +export { default as Collapsible } from './Collapsible'; +export { default as NotificationsContainer } from './NotificationsContainer'; +export { default as NotificationItem } from './NotificationItem'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts new file mode 100644 index 00000000..40743104 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/findSlotByDisplayName.ts @@ -0,0 +1,24 @@ +import { isFunction } from '@common/assertions'; +import React from 'react'; + +/** + * In a collection of React nodes, finds the first node that matches the provided display name. + */ +function findSlotByDisplayName({ + children, + displayName, +}: { + children: React.ReactNode[]; + displayName: string; +}): React.ReactNode { + return ( + children.find?.((child: unknown) => { + const isValidElement = React.isValidElement(child) && isFunction(child.type); + if (!isValidElement) return false; + + return (child.type as React.ComponentType).displayName === displayName; + }) ?? null + ); +} + +export default findSlotByDisplayName; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts new file mode 100644 index 00000000..dba9e3ba --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/findSlotByDisplayName/index.ts @@ -0,0 +1 @@ +export { default } from './findSlotByDisplayName'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx new file mode 100644 index 00000000..38edddd0 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.test.tsx @@ -0,0 +1,44 @@ +import { renderHook, act } from '@testing-library/react'; +import { describe, it, expect } from 'vitest'; +import handleClientApplicationError from './handleClientApplicationError'; +import ApplicationClientError from '@core/errors/ApplicationClientError/ApplicationClientError'; +import notifications$ from '@core/stores/notifications/notifications$'; + +describe('handleClientApplicationError', () => { + it('pushes warning notifications with children for string and ZodIssue issues', () => { + const { result } = renderHook(() => notifications$.use()); + + const stringIssueError = new ApplicationClientError({ + src: { message: 'Validation failed', issues: ['Field is required'] }, + fallbackConfig: { fallbackMessage: 'Fallback' }, + }); + + const zodIssueError = new ApplicationClientError({ + src: { + message: 'Invalid input', + issues: [ + { + code: 'invalid_type', + path: ['email'], + message: 'Expected string', + expected: 'string', + received: 'number', + }, + ], + }, + fallbackConfig: { fallbackMessage: 'Fallback' }, + }); + + act(() => { + handleClientApplicationError(stringIssueError); + handleClientApplicationError(zodIssueError); + }); + + const entries = [...result.current[0].notifications.values()]; + expect(entries).toHaveLength(2); + entries.forEach((entry) => { + expect(entry.type).toBe('warning'); + expect(entry.children).not.toBeUndefined(); + }); + }); +}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx new file mode 100644 index 00000000..7319df0f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/handleClientApplicationError.tsx @@ -0,0 +1,101 @@ +import notifications$ from '@core/stores/notifications'; +import { makeApplicationErrorMapper, type ApplicationClientError } from '@core/errors'; +import { Collapsible } from '../../components'; +import classNames from 'classnames'; +import type { ZodIssue } from '@common/errors'; +import logger from '@core/logger'; +import { isString } from '@common/assertions'; + +/** + * Handles application errors on the client by showing a notification with the error message and details + */ +function handleClientApplicationError(error: ApplicationClientError): void; + +/** + * Handles application errors on the client by showing a notification with the error message and details. + * The fallbackMessage only will be shown to the user if the exception is not an ApplicationClientError. + */ +function handleClientApplicationError(fallbackMessage: string, error: unknown): void; + +function handleClientApplicationError(arg0: ApplicationClientError | string, arg1?: unknown): void { + const fallbackMessage = isString(arg0) ? arg0 : arg0.fallbackConfig.fallbackMessage; + const error = isString(arg0) ? makeApplicationErrorMapper(fallbackMessage)(arg1) : arg0; + + notifications$.actions.push({ + type: 'warning', + message: error.fallbackMessage, + expirationMs: null, + children: error.issues.length ? makeErrorDetails(error) : undefined, + }); + + logger.reportError(error); +} + +function makeErrorDetails(error: ApplicationClientError) { + if (!error.issues?.length) return null; + + return ( + + + {({ open }) => ( + + {open ? 'See less' : 'See details'} + + )} + + + + {error.issues.map((issue: unknown, index) => { + const isZodIssue = isZodIssueObject(issue); + + return ( +
+ + ✖ {isZodIssue ? issueLabel(issue) : (issue as string)} + + + {isZodIssue && issue.expected && issue.received && ( +

+ expected {issue.expected}, received {issue.received} +

+ )} + + {isZodIssue && issue.path.length > 0 && ( +

→ at {issue.path.join('.')}

+ )} +
+ ); + })} +
+
+ ); +} + +function issueLabel(issue: ZodIssue): string { + if (issue.expected && issue.received) { + return issue.message.split(':')[0] + ':'; + } + + return issue.message; +} + +function isZodIssueObject(issue: unknown): issue is ZodIssue { + return ( + typeof issue === 'object' && + issue !== null && + typeof (issue as ZodIssue).message === 'string' && + Array.isArray((issue as ZodIssue).path) + ); +} + +export default handleClientApplicationError; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts new file mode 100644 index 00000000..52792bec --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/handleClientApplicationError/index.ts @@ -0,0 +1 @@ +export { default } from './handleClientApplicationError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts new file mode 100644 index 00000000..fd952f4c --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/index.ts @@ -0,0 +1,2 @@ +export { default as findSlotByDisplayName } from './findSlotByDisplayName'; +export { default as handleClientApplicationError } from './handleClientApplicationError'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/pick b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/helpers/pick new file mode 100644 index 00000000..e69de29b diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts index 41f686b0..c577b612 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/hooks/useDistinctLabelMediaDevices/useDistinctLabelMediaDevices.spec.ts @@ -4,6 +4,7 @@ import type { MediaDeviceInfoJSON } from '@web/types'; import useDistinctLabelMediaDevices from '.'; import mediaDevices$ from '@core/stores/devices'; import { makeMediaDeviceInfos, setupWindowNavigatorMock } from '@web-test/fixtures'; +import { mediaDevicesEnvelop } from '@core/interceptors'; const devices = makeMediaDeviceInfos(); @@ -20,6 +21,8 @@ describe('useDistinctLabelMediaDevices', () => { }, }); + mediaDevicesEnvelop.rebind(navigator); + mediaDevices$.reset(); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts index d9b08b76..517c03ec 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/index.ts @@ -1,6 +1,18 @@ export { default as Card, type CardProps } from './Card'; +export { default as Collapsible } from './components/Collapsible'; +export { default as Field, type FieldInputProps } from './Field'; export { default as Header, type HeaderProps } from './Header'; +export { + default as LabeledValueList, + type LabeledValueItem, + type LabeledValueListProps, +} from './LabeledValueList'; export { default as PageLayout, type PageLayoutProps } from './PageLayout'; export { default as PageLayoutEmbed, type PageLayoutEmbedProps } from './PageLayoutEmbed'; - -export { default as theme } from './theme'; +export { + default as SelectField, + type SelectFieldOption, + type SelectFieldProps, +} from './SelectField'; +export { default as SwitchField, type SwitchFieldProps } from './SwitchField'; +export { default as VividIcon, type VividIconProps } from './VividIcon'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx new file mode 100644 index 00000000..09ec8261 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.tsx @@ -0,0 +1,16 @@ +import { ThemeProvider as ThemeProviderBase } from '@mui/material'; +import React, { PropsWithChildren, useMemo } from 'react'; +import useSynchronizeThemeAndMedia from './hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia'; +import getMuiCustomTheme, { GetMuiCustomThemeProps } from './helpers/getMuiCustomTheme'; + +export type ThemeProviderProps = PropsWithChildren; + +export const ThemeProvider: React.FC = ({ children, container }) => { + const theme = useMemo(() => getMuiCustomTheme({ container }), [container]); + + useSynchronizeThemeAndMedia(); + + return {children}; +}; + +export default ThemeProvider; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.types.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.types.ts similarity index 92% rename from tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.types.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.types.ts index 8f78bfd4..fbe391ea 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.types.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/ThemeProvider.types.ts @@ -119,25 +119,25 @@ export type ColorsTokens = { 'skeleton-like': ColorTokenItem; }; -export type ShapeTokenItem = { +export type BorderTokenItem = { value: string; type: 'radius'; description: string; }; -export type ShapesTokens = { - none: ShapeTokenItem; - 'extra-small': ShapeTokenItem; - small: ShapeTokenItem; - medium: ShapeTokenItem; - large: ShapeTokenItem; - 'extra-large': ShapeTokenItem; +export type BorderTokens = { + none: BorderTokenItem; + 'extra-small': BorderTokenItem; + small: BorderTokenItem; + medium: BorderTokenItem; + large: BorderTokenItem; + 'extra-large': BorderTokenItem; }; export type ThemeTokens = { typography: TypographyTokens; colors: ColorsTokens; - shapes: ShapesTokens; + border: BorderTokens; }; export type Camelize = S extends `${infer Head}-${infer Tail}` @@ -146,7 +146,7 @@ export type Camelize = S extends `${infer Head}-${infer Tail}` export type ThemeColors = Record, string>; -export type ThemeShapes = { +export type ThemeBorder = { borderRadiusNone: string; borderRadiusExtraSmall: string; borderRadiusSmall: string; @@ -165,13 +165,13 @@ export type ThemeWeight = keyof ThemeTypography['weight']; export type Theme = { colors: ThemeColors; - shapes: ThemeShapes; + border: ThemeBorder; typography: ThemeTypography; }; export type PartialTheme = { colors?: Partial; - shapes?: Partial; + border?: Partial; typography?: { typeface?: Partial>; typeScale?: Partial>>; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json index 455306f7..c048a067 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.json @@ -1,245 +1,195 @@ { - "colors": { - "light": { - "primary": "#9941FF", - "text-primary": "#9941FF", - "on-primary": "#FFFFFF", - "primary-hover": "#871EFF", - "secondary": "#000000", - "text-secondary": "#000000", - "on-secondary": "#FFFFFF", - "secondary-hover": "#666666", - "tertiary": "#757575", - "text-tertiary": "#757575", - "on-tertiary": "#FFFFFF", - "tertiary-hover": "#929292", - "accent": "#FFFFFF", - "on-accent": "#000000", - "background": "#F5F0FD", - "on-background": "#757575", - "surface": "#FFFFFF", - "on-surface": "#929292", - "alert-background": "#FFEEF2", - "alert-background-hover": "#FEDFDF", - "alert-text": "#CD0000", - "error": "#E61D1D", - "on-error": "#FFFFFF", - "error-hover": "#CD0000", - "warning": "#BE5702", - "on-warning": "#FFFFFF", - "warning-hover": "#A64C03", - "success": "#1C8731", - "on-success": "#FFFFFF", - "success-hover": "#1F7629", - "information": "#0276D5", - "on-information": "#FFFFFF", - "information-hover": "#2997F0", - "information-background": "#E8F4FB", - "border": "#E6E6E6", - "dark-background": "#202124", - "dark-grey": "#333333", - "dark-grey-hover": "#292828", - "on-dark-grey": "#FFFFFF", - "dark-grey-opacity": "#333333CD", - "disabled": "#E6E6E6", - "text-disabled": "#B3B3B3", - "skeleton-like": "#B3B3B3" - }, - "dark": { - "primary": "#B27BF2", - "text-primary": "#B27BF2", - "on-primary": "#000000", - "primary-hover": "#CBA1FA", - "secondary": "#FFFFFF", - "text-secondary": "#FFFFFF", - "on-secondary": "#000000", - "secondary-hover": "#929292", - "tertiary": "#B3B3B3", - "text-tertiary": "#B3B3B3", - "on-tertiary": "#000000", - "tertiary-hover": "#B3B3B3", - "accent": "#FFFFFF", - "on-accent": "#000000", - "background": "#26044D", - "on-background": "#B3B3B3", - "surface": "#000000", - "on-surface": "#FFFFFF", - "alert-background": "#3E0004", - "alert-background-hover": "#6E0000", - "alert-text": "#FEDFDF", - "error": "#F75959", - "on-error": "#000000", - "error-hover": "#FE9696", - "warning": "#FA9F00", - "on-warning": "#000000", - "warning-hover": "#FACC4B", - "success": "#30A849", - "on-success": "#000000", - "success-hover": "#53CA6A", - "information": "#2997F0", - "on-information": "#FFFFFF", - "information-hover": "#0276D5", - "information-background": "#E8F4FB", - "border": "#333333", - "dark-background": "#202124", - "dark-grey": "#333333", - "dark-grey-hover": "#292828", - "on-dark-grey": "#FFFFFF", - "dark-grey-opacity": "#333333CD", - "disabled": "#333333", - "text-disabled": "#666666", - "skeleton-like": "#333333" - } + "light": { + "primary": "#9941FF", + "textPrimary": "#9941FF", + "onPrimary": "#FFFFFF", + "primaryHover": "#871EFF", + "secondary": "#000000", + "textSecondary": "#000000", + "onSecondary": "#FFFFFF", + "secondaryHover": "#666666", + "tertiary": "#757575", + "textTertiary": "#757575", + "onTertiary": "#FFFFFF", + "tertiaryHover": "#929292", + "accent": "#FFFFFF", + "onAccent": "#000000", + "background": "#F5F0FD", + "onBackground": "#757575", + "surface": "#FFFFFF", + "onSurface": "#929292", + "alertBackground": "#FFEEF2", + "alertBackgroundHover": "#FEDFDF", + "alertText": "#CD0000", + "error": "#E61D1D", + "onError": "#FFFFFF", + "errorHover": "#CD0000", + "warning": "#BE5702", + "onWarning": "#FFFFFF", + "warningHover": "#A64C03", + "success": "#1C8731", + "onSuccess": "#FFFFFF", + "successHover": "#1F7629", + "information": "#0276D5", + "onInformation": "#FFFFFF", + "informationHover": "#2997F0", + "informationBackground": "#E8F4FB", + "border": "#E6E6E6", + "darkBackground": "#202124", + "darkGrey": "#333333", + "darkGreyHover": "#292828", + "onDarkGrey": "#FFFFFF", + "darkGreyOpacity": "#333333CD", + "disabled": "#E6E6E6", + "textDisabled": "#B3B3B3", + "skeletonLike": "#B3B3B3" }, - "borderRadius": { - "none": "0px", - "extra-small": "2px", - "small": "4px", - "medium": "8px", - "large": "12px", - "extra-large": "24px" + "dark": { + "primary": "#B27BF2", + "textPrimary": "#B27BF2", + "onPrimary": "#000000", + "primaryHover": "#CBA1FA", + "secondary": "#FFFFFF", + "textSecondary": "#FFFFFF", + "onSecondary": "#000000", + "secondaryHover": "#929292", + "tertiary": "#B3B3B3", + "textTertiary": "#B3B3B3", + "onTertiary": "#000000", + "tertiaryHover": "#B3B3B3", + "accent": "#FFFFFF", + "onAccent": "#000000", + "background": "#26044D", + "onBackground": "#B3B3B3", + "surface": "#000000", + "onSurface": "#FFFFFF", + "alertBackground": "#3E0004", + "alertBackgroundHover": "#6E0000", + "alertText": "#FEDFDF", + "error": "#F75959", + "onError": "#000000", + "errorHover": "#FE9696", + "warning": "#FA9F00", + "onWarning": "#000000", + "warningHover": "#FACC4B", + "success": "#30A849", + "onSuccess": "#000000", + "successHover": "#53CA6A", + "information": "#2997F0", + "onInformation": "#FFFFFF", + "informationHover": "#0276D5", + "informationBackground": "#E8F4FB", + "border": "#333333", + "darkBackground": "#202124", + "darkGrey": "#333333", + "darkGreyHover": "#292828", + "onDarkGrey": "#FFFFFF", + "darkGreyOpacity": "#333333CD", + "disabled": "#333333", + "textDisabled": "#666666", + "skeletonLike": "#333333" }, - "fontFamily": { - "plain": "Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS" + "borderRadiusNone": "0px", + "borderRadiusExtraSmall": "2px", + "borderRadiusSmall": "4px", + "borderRadiusMedium": "8px", + "borderRadiusLarge": "12px", + "borderRadiusExtraLarge": "24px", + "fontFamilyPlain": "Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS", + "headline": { + "fontSize": "4.125rem", + "lineHeight": "5.5rem", + "fontWeight": "500", + "mobileFontSize": "2rem", + "mobileLineHeight": "2.5rem", + "mobileFontWeight": "500" }, - "fontSize": { - "desktop": { - "headline": { - "fontSize": "4.125rem", - "lineHeight": "5.5rem", - "fontWeight": "500" - }, - "subtitle": { - "fontSize": "3.25rem", - "lineHeight": "4.25rem", - "fontWeight": "500" - }, - "heading-1": { - "fontSize": "2.5rem", - "lineHeight": "3.25rem", - "fontWeight": "500" - }, - "heading-2": { - "fontSize": "2rem", - "lineHeight": "2.75rem", - "fontWeight": "500" - }, - "heading-3": { - "fontSize": "1.625rem", - "lineHeight": "2.25rem", - "fontWeight": "500" - }, - "heading-4": { - "fontSize": "1.25rem", - "lineHeight": "1.75rem", - "fontWeight": "500" - }, - "body-extended": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "400" - }, - "body-extended-semibold": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "600" - }, - "body-base": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "400" - }, - "body-base-semibold": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "600" - }, - "caption": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "400" - }, - "caption-semibold": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "600" - } - }, - "mobile": { - "headline": { - "fontSize": "2rem", - "lineHeight": "2.5rem", - "fontWeight": "500" - }, - "subtitle": { - "fontSize": "1.875rem", - "lineHeight": "2.375rem", - "fontWeight": "500" - }, - "heading-1": { - "fontSize": "1.75rem", - "lineHeight": "2.25rem", - "fontWeight": "500" - }, - "heading-2": { - "fontSize": "1.5rem", - "lineHeight": "2rem", - "fontWeight": "500" - }, - "heading-3": { - "fontSize": "1.25rem", - "lineHeight": "1.75rem", - "fontWeight": "500" - }, - "heading-4": { - "fontSize": "1.125rem", - "lineHeight": "1.5rem", - "fontWeight": "500" - }, - "body-extended": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "400" - }, - "body-extended-semibold": { - "fontSize": "1rem", - "lineHeight": "1.5rem", - "fontWeight": "600" - }, - "body-base": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "400" - }, - "body-base-semibold": { - "fontSize": "0.875rem", - "lineHeight": "1.25rem", - "fontWeight": "600" - }, - "caption": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "400" - }, - "caption-semibold": { - "fontSize": "0.75rem", - "lineHeight": "1rem", - "fontWeight": "600" - } - } + "subtitle": { + "fontSize": "3.25rem", + "lineHeight": "4.25rem", + "fontWeight": "500", + "mobileFontSize": "1.875rem", + "mobileLineHeight": "2.375rem", + "mobileFontWeight": "500" }, - "fontWeight": { - "headline": 500, - "subtitle": 500, - "heading-1": 500, - "heading-2": 500, - "heading-3": 500, - "heading-4": 500, - "body-extended": 400, - "body-extended-semibold": 600, - "body-base": 400, - "body-base-semibold": 600, - "caption": 400, - "caption-semibold": 600 + "heading1": { + "fontSize": "2.5rem", + "lineHeight": "3.25rem", + "fontWeight": "500", + "mobileFontSize": "1.75rem", + "mobileLineHeight": "2.25rem", + "mobileFontWeight": "500" + }, + "heading2": { + "fontSize": "2rem", + "lineHeight": "2.75rem", + "fontWeight": "500", + "mobileFontSize": "1.5rem", + "mobileLineHeight": "2rem", + "mobileFontWeight": "500" + }, + "heading3": { + "fontSize": "1.625rem", + "lineHeight": "2.25rem", + "fontWeight": "500", + "mobileFontSize": "1.25rem", + "mobileLineHeight": "1.75rem", + "mobileFontWeight": "500" + }, + "heading4": { + "fontSize": "1.25rem", + "lineHeight": "1.75rem", + "fontWeight": "500", + "mobileFontSize": "1.125rem", + "mobileLineHeight": "1.5rem", + "mobileFontWeight": "500" + }, + "bodyExtended": { + "fontSize": "1rem", + "lineHeight": "1.5rem", + "fontWeight": "400", + "mobileFontSize": "1rem", + "mobileLineHeight": "1.5rem", + "mobileFontWeight": "400" + }, + "bodyExtendedSemibold": { + "fontSize": "1rem", + "lineHeight": "1.5rem", + "fontWeight": "600", + "mobileFontSize": "1rem", + "mobileLineHeight": "1.5rem", + "mobileFontWeight": "600" + }, + "bodyBase": { + "fontSize": "0.875rem", + "lineHeight": "1.25rem", + "fontWeight": "400", + "mobileFontSize": "0.875rem", + "mobileLineHeight": "1.25rem", + "mobileFontWeight": "400" + }, + "bodyBaseSemibold": { + "fontSize": "0.875rem", + "lineHeight": "1.25rem", + "fontWeight": "600", + "mobileFontSize": "0.875rem", + "mobileLineHeight": "1.25rem", + "mobileFontWeight": "600" + }, + "caption": { + "fontSize": "0.75rem", + "lineHeight": "1rem", + "fontWeight": "400", + "mobileFontSize": "0.75rem", + "mobileLineHeight": "1rem", + "mobileFontWeight": "400" + }, + "captionSemibold": { + "fontSize": "0.75rem", + "lineHeight": "1rem", + "fontWeight": "600", + "mobileFontSize": "0.75rem", + "mobileLineHeight": "1rem", + "mobileFontWeight": "600" } } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts index 7e12a001..4fc9c188 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/designTokens.ts @@ -1,11 +1,11 @@ import typography from './tokens/typography'; import color from './tokens/color'; -import shape from './tokens/shape'; +import border from './tokens/border'; const designTokens = { typography, color, - shape, + border, }; export default designTokens; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts index 99195193..e4601898 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts @@ -1,149 +1,145 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import designTokens from '../designTokens.js'; -import type { Device, ThemeTypeface, ThemeTypeScale, ThemeWeight } from '@ui/theme'; - -const outputFile = path.resolve('libs/ui/src/theme/helpers/designTokens/designTokens.json'); - -type FontSize = { - fontSize: string; - lineHeight: string; - fontWeight: string; -}; - -type UnwrappedTokens = { - lightColor: Record; - darkColor: Record; - shape: Record; - elevation: Record; - state: Record; - motion: { - duration: Record; - easing: Record; - }; - typography: { - typeface: Record; - weight: Record; - typeScale: Record< - Device, - Record< - ThemeTypeScale, - { - fontSize: string; - lineHeight: string; - fontWeight: number; - } - > - >; - }; -}; +import type { VeraUIConfig } from '@ui/theme/helpers/veraUI.types'; /** - * Converts the design tokens to tailwind format and writes them to a JSON file. + * Transforms design tokens into VeraUIConfig shape and writes to JSON file. + * @param outputDirPath - Directory to write output file + * @param outputFileName - Name of output file */ -function designTokensToJson() { - // Ensure parent directory exists - fs.mkdirSync(path.dirname(outputFile), { recursive: true }); - - const unwrappedTokens = unwrapValue({ - ...designTokens, - lightColor: designTokens.color.light, - darkColor: designTokens.color.dark, - }) as UnwrappedTokens; - - const desktopFontSize = parseResponsiveFontSize(unwrappedTokens.typography.typeScale.desktop); - const mobileFontSize = parseResponsiveFontSize(unwrappedTokens.typography.typeScale.mobile); - - const tailwindExtend = { - colors: { - light: unwrappedTokens.lightColor, - dark: unwrappedTokens.darkColor, - }, - borderRadius: unwrappedTokens.shape, - boxShadow: unwrappedTokens.elevation, - opacity: unwrappedTokens.state, - transitionDuration: unwrappedTokens.motion?.duration, - transitionTimingFunction: unwrappedTokens.motion?.easing, - fontFamily: unwrappedTokens.typography?.typeface, - fontSize: { - desktop: desktopFontSize, - mobile: mobileFontSize, - }, - fontWeight: unwrappedTokens.typography?.weight, - }; - - // Write or overwrite the file - fs.writeFileSync(outputFile, JSON.stringify(tailwindExtend, null, 2) + '\n', { - flag: 'w', - }); - - console.log(`\x1b[32m✔ Design tokens JSON written to ${outputFile}\x1b[0m`); +export function tokensToJson(outputDirPath: string, outputFileName: string): void { + const outputFilePath = path.resolve(outputDirPath, outputFileName); + const veraConfig = buildVeraUIConfig(); + + fs.mkdirSync(path.dirname(outputFilePath), { recursive: true }); + fs.writeFileSync(outputFilePath, JSON.stringify(veraConfig, null, 2) + '\n', { flag: 'w' }); + + console.log(`\x1b[32m✔ Design tokens JSON written to ${outputFilePath}\x1b[0m`); } /** - * Recursively unwraps the `value` properties from the design tokens. - * @param {unknown} obj - The object to unwrap. - * @returns {unknown} The unwrapped object. + * Transforms unwrapped design tokens into VeraUIConfig shape. */ -function unwrapValue(obj: unknown): unknown { - if (!isRecord(obj)) { - return obj; - } - if (!isUndefined(obj.value)) { - return obj.value; - } +function buildVeraUIConfig(): VeraUIConfig { + const unwrapped = unwrapValue(designTokens) as Record; - return Object.fromEntries( - Object.entries(obj) - .filter(([, value]) => value !== undefined) - .map(([key, value]) => [key, unwrapValue(value)]) + const kebabToCamelCase = (str: string): string => + str.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase()); + + // Light colors + const colorObj = unwrapped.color as Record> | undefined; + const lightColor = colorObj?.light ?? {}; + + const light = Object.fromEntries( + Object.entries(lightColor) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [kebabToCamelCase(k), v]) ); -} -/** - * Type guard to check if a value is a Record. - * @param {unknown} value - The value to check. - * @returns {boolean} True if the value is a Record, false otherwise. - */ -function isRecord(value: unknown): value is Record { - return typeof value === 'object' && value !== null; -} + // Dark colors + const darkColor = colorObj?.dark ?? {}; -/** - * Type guard to check if a value is undefined. - * @param {unknown} value - The value to check. - * @returns {boolean} True if the value is undefined, false otherwise. - */ -function isUndefined(value: unknown): value is undefined { - return typeof value === 'undefined'; + const dark = Object.fromEntries( + Object.entries(darkColor) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [kebabToCamelCase(k), v]) + ); + + // Border radius + const border = (unwrapped.border as Record | undefined) ?? {}; + const borderRadiusConfig = Object.fromEntries( + Object.entries(border) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [`borderRadius${kebabToCamelCase(`-${k}`)}`, v]) + ); + + // Font family + const typography = (unwrapped.typography as Record | undefined) ?? {}; + const typeface = (typography.typeface as Record | undefined) ?? {}; + + const fontFamilyConfig = Object.fromEntries( + Object.entries(typeface) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([k, v]) => [`fontFamily${kebabToCamelCase(`-${k}`)}`, v]) + ); + + // Typography + const typeScaleObj = typography.typeScale as + | Record>> + | undefined; + const typeScale = typeScaleObj ?? {}; + const desktop = (typeScale.desktop as Record> | undefined) ?? {}; + const mobile = (typeScale.mobile as Record> | undefined) ?? {}; + + const typographyKeysByConfig = { + headline: 'headline', + subtitle: 'subtitle', + heading1: 'heading-1', + heading2: 'heading-2', + heading3: 'heading-3', + heading4: 'heading-4', + bodyExtended: 'body-extended', + bodyExtendedSemibold: 'body-extended-semibold', + bodyBase: 'body-base', + bodyBaseSemibold: 'body-base-semibold', + caption: 'caption', + captionSemibold: 'caption-semibold', + } as const; + + const typographyConfig = Object.fromEntries( + Object.entries(typographyKeysByConfig).map(([configKey, tokenKey]) => { + const dtObj = desktop[tokenKey] ?? {}; + const mtObj = mobile[tokenKey] ?? {}; + + const fontSize = dtObj.fontSize as string | undefined; + const lineHeight = dtObj.lineHeight as string | undefined; + const fontWeight = dtObj.fontWeight as string | number | undefined; + const mobileFontSize = mtObj.fontSize as string | undefined; + const mobileLineHeight = mtObj.lineHeight as string | undefined; + const mobileFontWeight = mtObj.fontWeight as string | number | undefined; + + return [ + configKey, + { + ...(fontSize !== undefined ? { fontSize } : {}), + ...(lineHeight !== undefined ? { lineHeight } : {}), + ...(fontWeight !== undefined ? { fontWeight: String(fontWeight) } : {}), + ...(mobileFontSize !== undefined ? { mobileFontSize } : {}), + ...(mobileLineHeight !== undefined ? { mobileLineHeight } : {}), + ...(mobileFontWeight !== undefined ? { mobileFontWeight: String(mobileFontWeight) } : {}), + }, + ]; + }) + ); + + return { + light: light as VeraUIConfig['light'], + dark: dark as VeraUIConfig['dark'], + ...borderRadiusConfig, + ...fontFamilyConfig, + ...typographyConfig, + } as VeraUIConfig; } /** - * Transforms responsive font size objects into the desired format. - * @param {Record} fontSizes - The font size objects to transform. - * @returns {Record} The transformed font sizes. + * Recursively unwraps `value` properties from token objects. */ -function parseResponsiveFontSize( - fontSizes: Record< - ThemeTypeScale, - { - fontSize: string; - lineHeight: string; - fontWeight: number; - } - > -): Record { - return Object.entries(fontSizes).reduce( - (acc, [key, val]) => { - acc[key] = { - fontSize: val.fontSize, - lineHeight: val.lineHeight, - fontWeight: val.fontWeight.toString(), - }; - return acc; - }, - {} as Record +function unwrapValue(obj: unknown): unknown { + if (typeof obj !== 'object' || obj === null) return obj; + if (typeof (obj as Record).value !== 'undefined') + return (obj as Record).value; + + return Object.fromEntries( + Object.entries(obj as Record) + .filter(([, v]) => v !== undefined) + .map(([k, v]) => [k, unwrapValue(v)]) ); } -designTokensToJson(); +if (process.argv[1] === fileURLToPath(import.meta.url)) { + tokensToJson('.', 'designTokens.example.json'); +} + +export default tokensToJson; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/shape.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts similarity index 94% rename from tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/shape.ts rename to tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts index 4826ed46..01164a3e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/shape.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/border.ts @@ -1,11 +1,11 @@ /** - * Shape Tokens + * Border Tokens * * These tokens define the corner radius values used throughout the design system. * They provide a consistent approach to rounding corners on various UI components, * enhancing the overall visual coherence and user experience. */ -const shape = { +const border = { none: { value: '0px', type: 'radius', @@ -38,4 +38,4 @@ const shape = { }, }; -export default shape; +export default border; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts index 5c780387..457ed334 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/designTokens/tokens/color.ts @@ -1,4 +1,4 @@ -import type { ThemeTokens } from '../../../themeContext.types'; +import type { ThemeTokens } from '../../../ThemeProvider.types'; /** * Color Tokens diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts index fda8f314..24d82c08 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.spec.ts @@ -1,10 +1,7 @@ import { describe, it, expect } from 'vitest'; import getMuiCustomTheme from './getMuiCustomTheme'; -import getTokensByMode from './getTokensByMode'; -const customTheme = getMuiCustomTheme({ - tokens: getTokensByMode('light'), -}); +const customTheme = getMuiCustomTheme(); describe('customTheme', () => { it('should have palette defined', () => { @@ -34,18 +31,15 @@ describe('customTheme', () => { expect(customTheme.components?.MuiButton?.styleOverrides).toBeDefined(); }); - it('should have custom palette colors', () => { - const { palette } = customTheme; - expect(palette.tertiary).toBeDefined(); - expect(palette.hover).toBeDefined(); - expect(palette.disabled).toBeDefined(); - }); - it('should have text colors defined', () => { const { text } = customTheme.palette; expect(text.primary).toBeDefined(); expect(text.secondary).toBeDefined(); - expect(text.tertiary).toBeDefined(); - expect(text.main).toBeDefined(); + }); + + it('should add a border to dialog paper in dark mode', () => { + expect(customTheme.components?.MuiDialog?.defaultProps?.slotProps?.paper).toMatchObject({ + className: expect.stringContaining('dark:border'), + }); }); }); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts index d5b325f8..a05192cb 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getMuiCustomTheme.ts @@ -1,109 +1,123 @@ -import { createTheme, type PaletteColor, type PaletteColorOptions } from '@mui/material'; -import type { Theme } from '@ui/theme'; -import isDarkMode from './isDarkMode'; - -// Extend theme options -declare module '@mui/material' { - interface TypeText { - tertiary: string; - main: string; - } - - interface Palette { - tertiary: PaletteColor; - hover: PaletteColor; - disabled: PaletteColor; - } - - interface PaletteOptions { - tertiary?: PaletteColorOptions; - hover?: PaletteColorOptions; - disabled?: PaletteColorOptions; - } -} +import { createTheme, Theme } from '@mui/material/styles'; +import { + veraTypographyCssVariableNames, + type VeraCssVariable, + type VeraTypographyTokenKey, +} from './veraUI.types'; export type GetMuiCustomThemeProps = { - tokens: Theme; container?: HTMLElement | null; }; -const getMuiCustomTheme = ({ tokens, container }: GetMuiCustomThemeProps) => { +const temporaryTypographyVariables = getTemporaryTypographyVariables(); + +const getMuiCustomTheme = ({ container }: GetMuiCustomThemeProps = {}): Theme => { + const getCssVariable = (name: VeraCssVariable): string => { + return `var(${name})`; + }; + + const getTemporaryTypography = ( + variant: keyof ReturnType + ) => { + const variableNames = temporaryTypographyVariables[variant].desktop; + + return { + fontSize: getCssVariable(variableNames.fontSize), + lineHeight: getCssVariable(variableNames.lineHeight), + fontWeight: getCssVariable(variableNames.fontWeight), + }; + }; + const buttonSx = { height: 40, // 40px textTransform: 'none', - borderRadius: tokens.shapes.borderRadiusMedium, + borderRadius: getCssVariable('--vera-border-radius-medium'), } as const; - const { colors } = tokens; + const cssVariables = container + ? { + rootSelector: ':host', + colorSchemeSelector: 'class', + } + : true; return createTheme({ + cssVariables, palette: { - mode: isDarkMode() ? 'dark' : 'light', primary: { - main: colors.primary, - contrastText: colors.onPrimary, - dark: colors.primary, - light: colors.background, + main: getCssVariable('--vera-primary'), + contrastText: getCssVariable('--vera-on-primary'), + dark: getCssVariable('--vera-primary-dark'), + light: getCssVariable('--vera-primary-light'), }, secondary: { - main: colors.secondary, - contrastText: colors.onSecondary, - dark: colors.secondary, - light: colors.background, + main: getCssVariable('--vera-secondary'), + contrastText: getCssVariable('--vera-on-secondary'), + dark: getCssVariable('--vera-secondary-dark'), + light: getCssVariable('--vera-secondary-light'), }, tertiary: { - main: colors.tertiary, - contrastText: colors.onTertiary, - dark: colors.tertiary, - light: colors.background, + main: getCssVariable('--vera-tertiary'), + contrastText: getCssVariable('--vera-on-tertiary'), + dark: getCssVariable('--vera-tertiary-dark'), + light: getCssVariable('--vera-tertiary-light'), }, success: { - main: colors.success, - contrastText: colors.onSuccess, - dark: colors.successHover, - light: colors.background, + main: getCssVariable('--vera-success'), + contrastText: getCssVariable('--vera-on-success'), + dark: getCssVariable('--vera-success-hover'), + light: getCssVariable('--vera-success-light'), }, warning: { - main: colors.warning, - contrastText: colors.onWarning, - dark: colors.warningHover, - light: colors.background, + main: getCssVariable('--vera-warning'), + contrastText: getCssVariable('--vera-on-warning'), + dark: getCssVariable('--vera-warning-hover'), + light: getCssVariable('--vera-warning-light'), }, error: { - main: colors.error, - contrastText: colors.onError, - dark: colors.errorHover, - light: colors.background, + main: getCssVariable('--vera-error'), + contrastText: getCssVariable('--vera-on-error'), + dark: getCssVariable('--vera-error-hover'), + light: getCssVariable('--vera-error-light'), }, background: { - default: colors.background, - paper: colors.surface, + default: getCssVariable('--vera-background'), + paper: getCssVariable('--vera-surface'), }, text: { - primary: colors.textSecondary, // This is the default text color - main: colors.textPrimary, // This is primary color for specific uses - secondary: colors.textSecondary, - tertiary: colors.textTertiary, - }, - divider: colors.border, + primary: getCssVariable('--vera-text-secondary'), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + main: getCssVariable('--vera-text-primary'), + secondary: getCssVariable('--vera-text-secondary'), + tertiary: getCssVariable('--vera-text-tertiary'), + }, + divider: getCssVariable('--vera-border'), hover: { - main: colors.primaryHover, + main: getCssVariable('--vera-primary-hover'), }, disabled: { - main: colors.disabled, + main: getCssVariable('--vera-disabled'), }, }, components: { + MuiTextField: { + styleOverrides: { + root: { + borderColor: getCssVariable('--vera-border'), + }, + }, + }, MuiButton: { styleOverrides: { root: { ...buttonSx, - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, - fontWeight: tokens.typography.weight['caption-semibold'].value, + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), + fontWeight: getCssVariable('--vera-typography-caption-semibold-font-weight'), }, outlined: { - borderColor: colors.primary, + borderColor: getCssVariable('--vera-primary'), }, }, }, @@ -122,87 +136,101 @@ const getMuiCustomTheme = ({ tokens, container }: GetMuiCustomThemeProps) => { MuiAppBar: { styleOverrides: { root: { - backgroundColor: colors.surface, - color: colors.onSurface, + backgroundColor: getCssVariable('--vera-surface'), + color: getCssVariable('--vera-on-surface'), }, }, }, MuiPaper: { styleOverrides: { root: { - backgroundColor: colors.background, - color: colors.onBackground, + backgroundColor: getCssVariable('--vera-background'), + color: getCssVariable('--vera-on-background'), }, }, }, MuiDialog: { + defaultProps: { + slotProps: { + paper: { + className: 'dark:border dark:border-vera-border', + }, + }, + }, styleOverrides: { paper: { - backgroundColor: colors.surface, - color: colors.onSurface, + backgroundColor: getCssVariable('--vera-surface'), + color: getCssVariable('--vera-on-surface'), }, }, }, MuiOutlinedInput: { styleOverrides: { root: { - backgroundColor: colors.surface, - borderRadius: tokens.shapes.borderRadiusMedium, + backgroundColor: getCssVariable('--vera-surface'), + borderRadius: getCssVariable('--vera-border-radius-medium'), backgroundClip: 'padding-box', }, + notchedOutline: { + borderColor: getCssVariable('--vera-border'), + }, + input: { + // backward compatibility after migrating to mui9 + '&:-webkit-autofill': { + WebkitBoxShadow: 'unset', + WebkitTextFillColor: 'unset', + caretColor: 'unset', + }, + }, }, }, MuiInputLabel: { styleOverrides: { sizeSmall: { - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), }, }, }, MuiFormHelperText: { styleOverrides: { root: { - color: colors.onSurface, + color: getCssVariable('--vera-on-surface'), }, }, }, MuiMenuItem: { styleOverrides: { root: { - color: colors.textSecondary, - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, + color: getCssVariable('--vera-text-secondary'), + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), }, }, }, MuiList: { styleOverrides: { root: { - backgroundColor: colors.onSecondary, - color: colors.textSecondary, - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, + backgroundColor: getCssVariable('--vera-on-secondary'), + color: getCssVariable('--vera-text-secondary'), + fontSize: getCssVariable('--vera-typography-body-base-font-size'), + lineHeight: getCssVariable('--vera-typography-body-base-line-height'), }, }, }, MuiTypography: { styleOverrides: { - h1: createResponsiveTypography(tokens, 'headline', 'headline'), - h2: createResponsiveTypography(tokens, 'subtitle', 'subtitle'), - h3: createResponsiveTypography(tokens, 'heading-1', 'heading-1'), - h4: createResponsiveTypography(tokens, 'heading-2', 'heading-2'), - h5: createResponsiveTypography(tokens, 'heading-3', 'heading-3'), - h6: createResponsiveTypography(tokens, 'heading-4', 'heading-4'), - subtitle1: createResponsiveTypography( - tokens, - 'body-extended-semibold', - 'body-extended-semibold' - ), - subtitle2: createResponsiveTypography(tokens, 'body-base-semibold', 'body-base-semibold'), - body1: createResponsiveTypography(tokens, 'body-extended', 'body-extended'), - body2: createResponsiveTypography(tokens, 'body-base', 'body-base'), - caption: createResponsiveTypography(tokens, 'caption', 'caption'), + h1: createResponsiveTypography('headline'), + h2: createResponsiveTypography('subtitle'), + h3: createResponsiveTypography('heading-1'), + h4: createResponsiveTypography('heading-2'), + h5: createResponsiveTypography('heading-3'), + h6: createResponsiveTypography('heading-4'), + subtitle1: createResponsiveTypography('body-extended-semibold'), + subtitle2: createResponsiveTypography('body-base-semibold'), + body1: createResponsiveTypography('body-extended'), + body2: createResponsiveTypography('body-base'), + caption: createResponsiveTypography('caption'), }, }, // Redirect MUI portals into the shadow root when running as an embed. @@ -221,82 +249,73 @@ const getMuiCustomTheme = ({ tokens, container }: GetMuiCustomThemeProps) => { }), }, typography: { - fontFamily: tokens.typography.typeface.plain.value, - h1: { - fontSize: tokens.typography.typeScale.desktop.headline.fontSize.value, - lineHeight: tokens.typography.typeScale.desktop.headline.lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop.headline.fontWeight.value, - }, - h2: { - fontSize: tokens.typography.typeScale.desktop.subtitle.fontSize.value, - lineHeight: tokens.typography.typeScale.desktop.subtitle.lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop.subtitle.fontWeight.value, - }, - h3: { - fontSize: tokens.typography.typeScale.desktop['heading-1'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-1'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-1'].fontWeight.value, - }, - h4: { - fontSize: tokens.typography.typeScale.desktop['heading-2'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-2'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-2'].fontWeight.value, - }, - h5: { - fontSize: tokens.typography.typeScale.desktop['heading-3'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-3'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-3'].fontWeight.value, - }, - h6: { - fontSize: tokens.typography.typeScale.desktop['heading-4'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['heading-4'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['heading-4'].fontWeight.value, - }, - subtitle1: { - fontSize: tokens.typography.typeScale.desktop['body-extended-semibold'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-extended-semibold'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-extended-semibold'].fontWeight.value, - }, - subtitle2: { - fontSize: tokens.typography.typeScale.desktop['body-base-semibold'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base-semibold'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-base-semibold'].fontWeight.value, - }, - body1: { - fontSize: tokens.typography.typeScale.desktop['body-extended'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-extended'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-extended'].fontWeight.value, - }, - body2: { - fontSize: tokens.typography.typeScale.desktop['body-base'].fontSize.value, - lineHeight: tokens.typography.typeScale.desktop['body-base'].lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop['body-base'].fontWeight.value, - }, - caption: { - fontSize: tokens.typography.typeScale.desktop.caption.fontSize.value, - lineHeight: tokens.typography.typeScale.desktop.caption.lineHeight.value, - fontWeight: tokens.typography.typeScale.desktop.caption.fontWeight.value, - }, + fontFamily: getCssVariable('--vera-font-family-plain'), + h1: getTemporaryTypography('headline'), + h2: getTemporaryTypography('subtitle'), + h3: getTemporaryTypography('heading-1'), + h4: getTemporaryTypography('heading-2'), + h5: getTemporaryTypography('heading-3'), + h6: getTemporaryTypography('heading-4'), + subtitle1: getTemporaryTypography('body-extended-semibold'), + subtitle2: getTemporaryTypography('body-base-semibold'), + body1: getTemporaryTypography('body-extended'), + body2: getTemporaryTypography('body-base'), + caption: getTemporaryTypography('caption'), }, }); }; -// Helper function to generate responsive typography +function getTemporaryTypographyVariables() { + type TypographyTokenKeyForTheme = Exclude; + + function createTypographyVariablesByToken(tokenKey: TypographyTokenKeyForTheme) { + return { + desktop: { + fontSize: veraTypographyCssVariableNames[tokenKey].fontSize, + lineHeight: veraTypographyCssVariableNames[tokenKey].lineHeight, + fontWeight: veraTypographyCssVariableNames[tokenKey].fontWeight, + }, + mobile: { + fontSize: `--vera-typography-${tokenKey}-mobile-font-size` as VeraCssVariable, + lineHeight: `--vera-typography-${tokenKey}-mobile-line-height` as VeraCssVariable, + fontWeight: `--vera-typography-${tokenKey}-mobile-font-weight` as VeraCssVariable, + }, + }; + } + + return { + headline: createTypographyVariablesByToken('headline'), + subtitle: createTypographyVariablesByToken('subtitle'), + 'heading-1': createTypographyVariablesByToken('heading-1'), + 'heading-2': createTypographyVariablesByToken('heading-2'), + 'heading-3': createTypographyVariablesByToken('heading-3'), + 'heading-4': createTypographyVariablesByToken('heading-4'), + 'body-extended': createTypographyVariablesByToken('body-extended'), + 'body-extended-semibold': createTypographyVariablesByToken('body-extended-semibold'), + 'body-base': createTypographyVariablesByToken('body-base'), + 'body-base-semibold': createTypographyVariablesByToken('body-base-semibold'), + caption: createTypographyVariablesByToken('caption'), + } as const; +} + function createResponsiveTypography( - tokens: Theme, - desktopVariant: keyof typeof tokens.typography.typeScale.desktop, - mobileVariant: keyof typeof tokens.typography.typeScale.mobile + variant: keyof ReturnType ) { + const variableKey = temporaryTypographyVariables[variant]; + const mobileVariableNames = variableKey.mobile; + const isHeadline = variant === 'headline'; + const tabletScale = isHeadline ? 1.5 : 1.15; + return { '@media (max-width:1199px)': { - fontSize: `calc(${tokens.typography.typeScale.mobile[mobileVariant].fontSize.value} * ${desktopVariant === 'headline' ? 1.5 : 1.15})`, - lineHeight: `calc(${tokens.typography.typeScale.mobile[mobileVariant].lineHeight.value} * ${desktopVariant === 'headline' ? 1.5 : 1.15})`, - fontWeight: tokens.typography.typeScale.mobile[mobileVariant].fontWeight.value, + fontSize: `calc(var(${mobileVariableNames.fontSize}) * ${tabletScale})`, + lineHeight: `calc(var(${mobileVariableNames.lineHeight}) * ${tabletScale})`, + fontWeight: `var(${mobileVariableNames.fontWeight})`, }, '@media (max-width:899px)': { - fontSize: tokens.typography.typeScale.mobile[mobileVariant].fontSize.value, - lineHeight: tokens.typography.typeScale.mobile[mobileVariant].lineHeight.value, - fontWeight: tokens.typography.typeScale.mobile[mobileVariant].fontWeight.value, + fontSize: `var(${mobileVariableNames.fontSize})`, + lineHeight: `var(${mobileVariableNames.lineHeight})`, + fontWeight: `var(${mobileVariableNames.fontWeight})`, }, }; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts deleted file mode 100644 index e5f2d729..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/getTokensByMode.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { Theme, ThemeColors } from '@ui/theme'; -import designTokens from './designTokens'; - -const getTokensByMode = (mode: 'light' | 'dark'): Theme => { - const colors = mode === 'light' ? designTokens.color.light : designTokens.color.dark; - - return { - /** - * { primary: string; onPrimary: string; secondary: string; onSecondary: string; ... } - */ - colors: Object.keys(colors).reduce((acc, originalKey): ThemeColors => { - let key = originalKey; - - if (key.includes('-')) { - key = key.replaceAll(/-([a-z])/g, (_, char: string) => char.toUpperCase()); - } - - acc[key as keyof ThemeColors] = colors[originalKey as keyof typeof colors].value; - - return acc; - }, {} as ThemeColors), - - shapes: { - borderRadiusNone: designTokens.shape.none.value, - borderRadiusExtraSmall: designTokens.shape['extra-small'].value, - borderRadiusSmall: designTokens.shape.small.value, - borderRadiusMedium: designTokens.shape.medium.value, - borderRadiusLarge: designTokens.shape.large.value, - borderRadiusExtraLarge: designTokens.shape['extra-large'].value, - }, - - typography: designTokens.typography, - }; -}; - -export default getTokensByMode; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts deleted file mode 100644 index 7ac26475..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/mergeThemeConfigurations.ts +++ /dev/null @@ -1,40 +0,0 @@ -import Theme, { PartialTheme } from '../themeContext.types'; - -export function mergeThemeConfigurations({ - defaultValue, - overrides = {}, -}: { - defaultValue: Theme; - overrides: PartialTheme; -}): Theme { - const typeface = { - ...defaultValue.typography.typeface, - ...overrides.typography?.typeface, - } as Theme['typography']['typeface']; - - const typeScale = { - ...defaultValue.typography.typeScale, - ...overrides.typography?.typeScale, - } as Theme['typography']['typeScale']; - - const weight = { - ...defaultValue.typography.weight, - ...overrides.typography?.weight, - } as Theme['typography']['weight']; - - return { - colors: { - ...defaultValue.colors, - ...overrides.colors, - }, - shapes: { - ...defaultValue.shapes, - ...overrides.shapes, - }, - typography: { - typeface, - typeScale, - weight, - }, - }; -} diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts index 6dfddeec..071d54c6 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts @@ -1,10 +1,415 @@ import * as fs from 'node:fs'; import * as path from 'node:path'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import kebabToCamel from '../../../../../common/src/helpers/kebabToCamel'; import designTokens from '../designTokens/designTokens.json'; +import tsDesignTokens from '../designTokens/designTokens.js'; +import type { + VeraTypographyTokenKey, + VeraTypographyVariableNamesByToken, + VeraUIConfig, +} from '../veraUI.types'; +import { veraTypographyCssVariableNames } from '../veraUI.types'; const VERA_DARK_MODE_CLASS = 'vera-dark-mode'; const pluginFile = path.resolve('libs/ui/src/theme/helpers/tailwind/veraUI.cjs'); +const veraTypographyVariableNames: Record< + VeraTypographyTokenKey, + VeraTypographyVariableNamesByToken +> = veraTypographyCssVariableNames; + +const VERA_UI_CONFIG_JSDOC = `/** + * @typedef {Object} VeraTypographyProperties + * @property {string} [fontSize] + * @property {string} [lineHeight] + * @property {string} [fontWeight] + * @property {string} [mobileFontSize] + * @property {string} [mobileLineHeight] + * @property {string} [mobileFontWeight] + */ +/** + * @typedef {Object} VeraColorThemeConfig + * @property {string} [accent] + * @property {string} [alertBackground] + * @property {string} [alertBackgroundHover] + * @property {string} [alertText] + * @property {string} [background] + * @property {string} [border] + * @property {string} [darkBackground] + * @property {string} [darkGrey] + * @property {string} [darkGreyHover] + * @property {string} [darkGreyOpacity] + * @property {string} [disabled] + * @property {string} [error] + * @property {string} [errorHover] + * @property {string} [information] + * @property {string} [informationBackground] + * @property {string} [informationHover] + * @property {string} [onAccent] + * @property {string} [onBackground] + * @property {string} [onDarkGrey] + * @property {string} [onError] + * @property {string} [onInformation] + * @property {string} [onPrimary] + * @property {string} [onSecondary] + * @property {string} [onSuccess] + * @property {string} [onSurface] + * @property {string} [onTertiary] + * @property {string} [onWarning] + * @property {string} [primary] + * @property {string} [primaryHover] + * @property {string} [secondary] + * @property {string} [secondaryHover] + * @property {string} [skeletonLike] + * @property {string} [success] + * @property {string} [successHover] + * @property {string} [surface] + * @property {string} [tertiary] + * @property {string} [tertiaryHover] + * @property {string} [textDisabled] + * @property {string} [textPrimary] + * @property {string} [textSecondary] + * @property {string} [textTertiary] + * @property {string} [warning] + * @property {string} [warningHover] + */ +/** + * @typedef {Object} VeraUIConfig + * @property {VeraColorThemeConfig} [light] + * @property {VeraColorThemeConfig} [dark] + * @property {string} [borderRadiusExtraLarge] + * @property {string} [borderRadiusExtraSmall] + * @property {string} [borderRadiusLarge] + * @property {string} [borderRadiusMedium] + * @property {string} [borderRadiusNone] + * @property {string} [borderRadiusSmall] + * @property {string} [fontFamilyPlain] + * @property {VeraTypographyProperties} [headline] + * @property {VeraTypographyProperties} [subtitle] + * @property {VeraTypographyProperties} [heading1] + * @property {VeraTypographyProperties} [heading2] + * @property {VeraTypographyProperties} [heading3] + * @property {VeraTypographyProperties} [heading4] + * @property {VeraTypographyProperties} [bodyExtended] + * @property {VeraTypographyProperties} [bodyExtendedSemibold] + * @property {VeraTypographyProperties} [bodyBase] + * @property {VeraTypographyProperties} [bodyBaseSemibold] + * @property {VeraTypographyProperties} [caption] + * @property {VeraTypographyProperties} [captionSemibold] + */ + +/** + * @param {VeraUIConfig} [config={}] + */`; + +const typographyTokenByConfigKey = { + headline: 'headline', + subtitle: 'subtitle', + heading1: 'heading-1', + heading2: 'heading-2', + heading3: 'heading-3', + heading4: 'heading-4', + bodyExtended: 'body-extended', + bodyExtendedSemibold: 'body-extended-semibold', + bodyBase: 'body-base', + bodyBaseSemibold: 'body-base-semibold', + caption: 'caption', + captionSemibold: 'caption-semibold', +} as const; + +function camelToKebab(value: string): string { + return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase(); +} + +function buildDefaultVeraUIConfig(): VeraUIConfig { + const { color, border, typography } = tsDesignTokens; + + const light = Object.fromEntries( + Object.entries(color.light).map(([key, token]) => [kebabToCamel(key), token.value]) + ) as VeraUIConfig['light']; + + const dark = Object.fromEntries( + Object.entries(color.dark).map(([key, token]) => [kebabToCamel(key), token.value]) + ) as VeraUIConfig['dark']; + + const typo = (tokenKey: keyof typeof typographyTokenByConfigKey): VeraUIConfig['headline'] => { + const tsKey = typographyTokenByConfigKey[tokenKey]; + const desktop = typography.typeScale.desktop[tsKey]; + const mobile = typography.typeScale.mobile[tsKey]; + return { + fontSize: desktop.fontSize.value, + lineHeight: desktop.lineHeight.value, + fontWeight: String(desktop.fontWeight.value), + mobileFontSize: mobile.fontSize.value, + mobileLineHeight: mobile.lineHeight.value, + mobileFontWeight: String(mobile.fontWeight.value), + }; + }; + + return { + light, + dark, + borderRadiusNone: border.none.value, + borderRadiusExtraSmall: border['extra-small'].value, + borderRadiusSmall: border.small.value, + borderRadiusMedium: border.medium.value, + borderRadiusLarge: border.large.value, + borderRadiusExtraLarge: border['extra-large'].value, + fontFamilyPlain: typography.typeface.plain.value, + headline: typo('headline'), + subtitle: typo('subtitle'), + heading1: typo('heading1'), + heading2: typo('heading2'), + heading3: typo('heading3'), + heading4: typo('heading4'), + bodyExtended: typo('bodyExtended'), + bodyExtendedSemibold: typo('bodyExtendedSemibold'), + bodyBase: typo('bodyBase'), + bodyBaseSemibold: typo('bodyBaseSemibold'), + caption: typo('caption'), + captionSemibold: typo('captionSemibold'), + }; +} + +function mergeVeraUIConfig(defaults: VeraUIConfig, partial: VeraUIConfig): VeraUIConfig { + return { + ...defaults, + ...partial, + light: { ...defaults.light, ...partial.light }, + dark: { ...defaults.dark, ...partial.dark }, + headline: { ...defaults.headline, ...partial.headline }, + subtitle: { ...defaults.subtitle, ...partial.subtitle }, + heading1: { ...defaults.heading1, ...partial.heading1 }, + heading2: { ...defaults.heading2, ...partial.heading2 }, + heading3: { ...defaults.heading3, ...partial.heading3 }, + heading4: { ...defaults.heading4, ...partial.heading4 }, + bodyExtended: { ...defaults.bodyExtended, ...partial.bodyExtended }, + bodyExtendedSemibold: { ...defaults.bodyExtendedSemibold, ...partial.bodyExtendedSemibold }, + bodyBase: { ...defaults.bodyBase, ...partial.bodyBase }, + bodyBaseSemibold: { ...defaults.bodyBaseSemibold, ...partial.bodyBaseSemibold }, + caption: { ...defaults.caption, ...partial.caption }, + captionSemibold: { ...defaults.captionSemibold, ...partial.captionSemibold }, + }; +} + +function normalizeDesignTokensFromConfig(config: VeraUIConfig): { + colors: { + light: Record; + dark: Record; + }; + borderRadius: Record; + fontFamily: Record; + fontSize: { + desktop: Record; + mobile: Record; + }; +} { + const lightColors = Object.fromEntries( + Object.entries(config.light ?? {}).map(([key, tokenValue]) => [camelToKebab(key), tokenValue]) + ); + + const darkColors = Object.fromEntries( + Object.entries(config.dark ?? {}).map(([key, tokenValue]) => [camelToKebab(key), tokenValue]) + ); + + const borderRadius = Object.fromEntries( + Object.entries(config) + .filter(([key]) => key.startsWith('borderRadius')) + .map(([key, tokenValue]) => [camelToKebab(key.replace('borderRadius', '')), tokenValue]) + ) as Record; + + const fontFamily = Object.fromEntries( + Object.entries(config) + .filter(([key]) => key.startsWith('fontFamily')) + .map(([key, tokenValue]) => [camelToKebab(key.replace('fontFamily', '')), tokenValue]) + ) as Record; + + const desktopFontSize: Record< + string, + { + fontSize: string; + lineHeight: string; + fontWeight: string; + } + > = {}; + + const mobileFontSize: Record< + string, + { + fontSize: string; + lineHeight: string; + fontWeight: string; + } + > = {}; + + for (const [configKey, tokenKey] of Object.entries(typographyTokenByConfigKey)) { + const typographyValues = config[configKey as keyof VeraUIConfig] as + | { + fontSize?: string; + lineHeight?: string; + fontWeight?: string; + mobileFontSize?: string; + mobileLineHeight?: string; + mobileFontWeight?: string; + } + | undefined; + + desktopFontSize[tokenKey] = { + fontSize: typographyValues?.fontSize ?? '', + lineHeight: typographyValues?.lineHeight ?? '', + fontWeight: typographyValues?.fontWeight ?? '', + }; + + mobileFontSize[tokenKey] = { + fontSize: typographyValues?.mobileFontSize ?? typographyValues?.fontSize ?? '', + lineHeight: typographyValues?.mobileLineHeight ?? typographyValues?.lineHeight ?? '', + fontWeight: typographyValues?.mobileFontWeight ?? typographyValues?.fontWeight ?? '', + }; + } + + return { + colors: { + light: lightColors, + dark: darkColors, + }, + borderRadius, + fontFamily, + fontSize: { + desktop: desktopFontSize, + mobile: mobileFontSize, + }, + }; +} + +/** + * Extracts the config path from a CSS variable name. + * Examples: + * - '--vera-accent' -> 'accent' + * - '--vera-alert-background' -> 'alertBackground' + * - '--vera-typography-headline-font-size' -> 'headline?.fontSize' + * - '--vera-typography-heading-1-font-size' -> 'heading1?.fontSize' + * - '--vera-typography-body-extended-font-size' -> 'bodyExtended?.fontSize' + */ +function getCssVariableConfigPath(variableName: string): string { + // Remove '--vera-' prefix + const withoutPrefix = variableName.replace('--vera-', ''); + + // Handle typography special case: strip the known property suffix from the end + // Properties are always: font-size, line-height, or font-weight + if (withoutPrefix.startsWith('typography-')) { + const typographySuffix = withoutPrefix.replace('typography-', ''); + const propertySuffixes = [ + '-mobile-font-size', + '-mobile-line-height', + '-mobile-font-weight', + '-font-size', + '-line-height', + '-font-weight', + ]; + + for (const suffix of propertySuffixes) { + if (typographySuffix.endsWith(suffix)) { + const tokenKey = typographySuffix.slice(0, -suffix.length); + const propertyKey = kebabToCamel(suffix.slice(1)); + return `${kebabToCamel(tokenKey)}?.${propertyKey}`; + } + } + } + + return kebabToCamel(withoutPrefix); +} + +/** + * Generates a config lookup expression with fallback value. + * Example: 'light.accent ?? "#FFFFFF"' + */ +function generateConfigLookup( + theme: 'light' | 'dark', + configPath: string, + fallbackValue: string +): string { + return `config.${configPath} ?? ${theme}.${configPath} ?? '${fallbackValue}'`; +} + +/** + * Generates a config lookup expression for non-theme-aware variables. + * All layout, font, and typography tokens are configurable at the root level. + */ +function generateGlobalConfigLookup(variableName: string, fallbackValue: string): string { + if (variableName.startsWith('--vera-typography-')) { + const configPath = getCssVariableConfigPath(variableName); + return `config.${configPath} ?? '${fallbackValue}'`; + } + + if (variableName.startsWith('--vera-border-radius-')) { + const key = variableName.replace('--vera-', ''); + const configKey = kebabToCamel(key); + return `config.${configKey} ?? '${fallbackValue}'`; + } + + if (variableName.startsWith('--vera-font-family-')) { + const key = variableName.replace('--vera-', ''); + const configKey = kebabToCamel(key); + return `config.${configKey} ?? '${fallbackValue}'`; + } + + return `'${fallbackValue}'`; +} + +/** + * Generates addBase color and typography variables with config lookups. + */ +function generateAddBaseVariablesWithConfig( + lightColors: Record, + darkColors: Record, + typographyAndLayoutVariables: Record, + indentation: string +): { rootVars: string; darkVars: string } { + const rootLines: string[] = []; + const darkLines: string[] = []; + + const colorKeys = Object.keys(lightColors).sort((a, b) => a.localeCompare(b)); + + // Generate variables in original order: for each key, add theme-aware then static variants + for (const key of colorKeys) { + const lightValue = lightColors[key]; + const darkValue = darkColors[key]; + const cssVarName = `--vera-${key}`; + const configPath = getCssVariableConfigPath(cssVarName); + const lightConfigLookup = generateConfigLookup('light', configPath, lightValue); + const darkConfigLookup = generateConfigLookup('dark', configPath, darkValue); + + // Theme-aware color (changes with theme) + rootLines.push(`${indentation}'${cssVarName}': ${lightConfigLookup},`); + darkLines.push(`${indentation}'${cssVarName}': ${darkConfigLookup},`); + + // Light variant (always uses light theme from config) + rootLines.push(`${indentation}'--vera-${key}-light': ${lightConfigLookup},`); + + // Dark variant (always uses dark theme from config) + rootLines.push(`${indentation}'--vera-${key}-dark': ${darkConfigLookup},`); + } + + // Add typography and layout variables (remain static) + const typographyKeys = Object.keys(typographyAndLayoutVariables); + + // Add blank line and comment before typography section + rootLines.push(''); + rootLines.push(`${indentation}// Typography and layout design tokens`); + + for (const key of typographyKeys) { + const value = typographyAndLayoutVariables[key]; + const configLookup = generateGlobalConfigLookup(key, value); + rootLines.push(`${indentation}'${key}': ${configLookup},`); + } + + return { + rootVars: rootLines.join('\n'), + darkVars: darkLines.join('\n'), + }; +} + /** * Generates a comprehensive Tailwind plugin with all Vera design tokens. * This script reads from designTokens.json and generates veraUI.cjs @@ -14,78 +419,114 @@ const pluginFile = path.resolve('libs/ui/src/theme/helpers/tailwind/veraUI.cjs') * - Overridable by the user */ function generateVeraUIPlugin() { - const { colorVariables, colorTokens } = generateColorTokens( - designTokens.colors.light, - designTokens.colors.dark + const mergedConfig = mergeVeraUIConfig(buildDefaultVeraUIConfig(), designTokens as VeraUIConfig); + const normalizedDesignTokens = normalizeDesignTokensFromConfig(mergedConfig); + const { desktop: fontSizeDesktop, mobile: fontSizeMobile } = normalizedDesignTokens.fontSize; + + const { colorTokens } = generateColorTokens( + normalizedDesignTokens.colors.light, + normalizedDesignTokens.colors.dark ); - const borderRadius = generateBorderRadiusTokens(designTokens.borderRadius); - const fontFamily = generateFontFamilyTokens(designTokens.fontFamily); + const typographyAndLayoutVariables = generateTypographyAndLayoutVariables({ + borderRadius: normalizedDesignTokens.borderRadius, + fontFamily: normalizedDesignTokens.fontFamily, + fontSizeDesktop, + fontSizeMobile, + }); + + const borderRadius = generateBorderRadiusTokens(normalizedDesignTokens.borderRadius); + const fontFamily = generateFontFamilyTokens(normalizedDesignTokens.fontFamily); const screens = { 'vera-mobile': { max: '767px' }, 'vera-desktop': { min: '768px' }, }; + // Generate addBase variables with config lookups + const { rootVars, darkVars } = generateAddBaseVariablesWithConfig( + normalizedDesignTokens.colors.light, + normalizedDesignTokens.colors.dark, + typographyAndLayoutVariables, + ' ' + ); + let plugin = `/** * Auto-generated Tailwind plugin for Vera design system * DO NOT EDIT MANUALLY - Generated by generateTailwindPlugin.ts */ +// eslint-disable-next-line @typescript-eslint/no-require-imports const plugin = require('tailwindcss/plugin'); -const veraUI = plugin(({ addUtilities, addBase, addVariant }) => { - const fontSizeUtilities = {}; - const fontWeightUtilities = {}; +${VERA_UI_CONFIG_JSDOC} - // Add custom variants - addVariant('child', '& > *'); +const veraUI = (config = {}) => { +return plugin( + ({ addUtilities, addBase, addVariant }) => { + const { light = {}, dark = {} } = config; // also includes typography and layout + const fontSizeUtilities = {}; + const fontWeightUtilities = {}; - // Add CSS variables for theme-aware colors - addBase({ - ':root': ${JSON.stringify(colorVariables.root, null, 6).replace(/\n/g, '\n ')}, - 'html.vera-dark-mode': ${JSON.stringify(colorVariables.dark, null, 6).replace(/\n/g, '\n ')}, - }); + // Add custom variants + addVariant('child', '& > *'); + // Add CSS variables for theme-aware colors + addBase({ + ':host, :root': { +${rootVars} + }, + ':host(.vera-dark-mode), :host(.dark), html.vera-dark-mode': { +${darkVars} + }, + }); `; - const { desktop: fontSizeDesktop, mobile: fontSizeMobile } = designTokens.fontSize; - // Generate font size utilities for (const key of Object.keys(fontSizeDesktop)) { - const desktop = fontSizeDesktop[key as keyof typeof fontSizeDesktop]; - const mobile = fontSizeMobile[key as keyof typeof fontSizeMobile]; - - plugin += ` // ${key}\n`; - plugin += ` fontSizeUtilities['.text-vera-${key}'] = {\n`; - plugin += ` fontSize: '${mobile.fontSize}',\n`; - plugin += ` lineHeight: '${mobile.lineHeight}',\n`; - plugin += ` fontWeight: ${mobile.fontWeight},\n`; - plugin += ` '@media (min-width: 768px)': {\n`; - plugin += ` fontSize: '${desktop.fontSize}',\n`; - plugin += ` lineHeight: '${desktop.lineHeight}',\n`; - plugin += ` fontWeight: ${desktop.fontWeight},\n`; - plugin += ` },\n`; - plugin += ` };\n\n`; + const mobile = fontSizeMobile[key] ?? { + fontSize: '1rem', + lineHeight: '1.5rem', + fontWeight: '400', + }; + + const desktop = fontSizeDesktop[key] ?? mobile; + + const desktopVariableNames = veraTypographyVariableNames[key as VeraTypographyTokenKey]; + + plugin += ` // ${key}\n`; + plugin += ` fontSizeUtilities['.text-vera-${key}'] = {\n`; + plugin += ` fontSize: '${mobile.fontSize}',\n`; + plugin += ` lineHeight: '${mobile.lineHeight}',\n`; + plugin += ` fontWeight: ${mobile.fontWeight},\n`; + plugin += ` '@media (min-width: 768px)': {\n`; + plugin += ` fontSize: 'var(${desktopVariableNames.fontSize}, ${desktop.fontSize})',\n`; + plugin += ` lineHeight: 'var(${desktopVariableNames.lineHeight}, ${desktop.lineHeight})',\n`; + plugin += ` fontWeight: 'var(${desktopVariableNames.fontWeight}, ${desktop.fontWeight})',\n`; + plugin += ` },\n`; + plugin += ` };\n\n`; // Generate responsive font weight utilities - plugin += ` fontWeightUtilities['.font-vera-${key}'] = {\n`; - plugin += ` fontWeight: ${mobile.fontWeight},\n`; - plugin += ` '@media (min-width: 768px)': {\n`; - plugin += ` fontWeight: ${desktop.fontWeight},\n`; - plugin += ` },\n`; - plugin += ` };\n\n`; + plugin += ` fontWeightUtilities['.font-vera-${key}'] = {\n`; + plugin += ` fontWeight: ${mobile.fontWeight},\n`; + plugin += ` '@media (min-width: 768px)': {\n`; + plugin += ` fontWeight: 'var(${desktopVariableNames.fontWeight}, ${desktop.fontWeight})',\n`; + plugin += ` },\n`; + plugin += ` };\n\n`; } - plugin += ` addUtilities(fontSizeUtilities); - addUtilities(fontWeightUtilities); -}, { - theme: { - extend: { - borderRadius: ${JSON.stringify(borderRadius, null, 6).replace(/\n/g, '\n ')}, - colors: ${JSON.stringify(colorTokens, null, 6).replace(/\n/g, '\n ')}, - fontFamily: ${JSON.stringify(fontFamily, null, 6).replace(/\n/g, '\n ')}, - screens: ${JSON.stringify(screens, null, 6).replace(/\n/g, '\n ')}, - }, + plugin += ` addUtilities(fontSizeUtilities); + addUtilities(fontWeightUtilities); }, -}); + { + theme: { + extend: { + borderRadius: ${generateBorderRadiusThemeConfig(borderRadius)}, + colors: ${JSON.stringify(colorTokens, null, 6).replace(/\n/g, '\n ')}, + fontFamily: ${generateFontFamilyThemeConfig(fontFamily)}, + screens: ${JSON.stringify(screens, null, 6).replace(/\n/g, '\n ')}, + }, + }, + } +); +}; veraUI.safelist = ['${VERA_DARK_MODE_CLASS}']; @@ -161,37 +602,117 @@ function generateColorTokens( /** * Generates border radius tokens with vera- prefix. + * Values reference CSS variables with fallbacks for runtime customization. * Tokens are sorted alphabetically for consistent output. */ -function generateBorderRadiusTokens(shape: Record): Record { +function generateBorderRadiusTokens(border: Record): Record { const borderRadius: Record = {}; // Sort keys alphabetically for consistent output - const sortedKeys = Object.keys(shape).sort((a, b) => a.localeCompare(b)); + const sortedKeys = Object.keys(border).sort((a, b) => a.localeCompare(b)); for (const key of sortedKeys) { - borderRadius[`vera-${key}`] = shape[key]; + borderRadius[`vera-${key}`] = `var(--vera-border-radius-${key}, ${border[key]})`; } return borderRadius; } +/** + * Generates a JS object literal string for the borderRadius theme config. + */ +function generateBorderRadiusThemeConfig(borderRadius: Record): string { + const entries = Object.entries(borderRadius) + .map(([key, value]) => ` '${key}': '${value}',`) + .join('\n'); + return `{\n${entries}\n }`; +} + /** * Generates font family tokens with vera- prefix. + * Values reference CSS variables for runtime customization. * Tokens are sorted alphabetically for consistent output. */ -function generateFontFamilyTokens(typeface: Record): Record { - const fontFamily: Record = {}; +function generateFontFamilyTokens(typeface: Record): Record { + const fontFamily: Record = {}; // Sort keys alphabetically for consistent output const sortedKeys = Object.keys(typeface).sort((a, b) => a.localeCompare(b)); for (const key of sortedKeys) { - fontFamily[`vera-${key}`] = typeface[key].split(', '); + fontFamily[`vera-${key}`] = `var(--vera-font-family-${key}, ${typeface[key]})`; } return fontFamily; } +/** + * Generates a JS object literal string for the fontFamily theme config. + */ +function generateFontFamilyThemeConfig(fontFamily: Record): string { + const entries = Object.entries(fontFamily) + .map(([key, value]) => ` '${key}': ['${value}'],`) + .join('\n'); + return `{\n${entries}\n }`; +} + +/** + * Generates typography and layout CSS variables for the Vera framework. + * The temporary MUI custom theme can consume these variables, but the variables + * themselves are framework design tokens rather than adapter-only values. + */ +function generateTypographyAndLayoutVariables(args: { + borderRadius: Record; + fontFamily: Record; + fontSizeDesktop: Record; + fontSizeMobile: Record; +}): Record { + const variables: Record = {}; + + // Add ALL border radius CSS variables + const borderRadiusKeys = Object.keys(args.borderRadius).sort((a, b) => a.localeCompare(b)); + for (const key of borderRadiusKeys) { + const cssVarName = `--vera-border-radius-${key}` as const; + variables[cssVarName] = args.borderRadius[key]; + } + + // Add font family CSS variables + const fontFamilyKeys = Object.keys(args.fontFamily).sort((a, b) => a.localeCompare(b)); + for (const key of fontFamilyKeys) { + const cssVarName = `--vera-font-family-${key}` as const; + variables[cssVarName] = args.fontFamily[key]; + } + + const usedTokenKeys: VeraTypographyTokenKey[] = [ + 'headline', + 'subtitle', + 'heading-1', + 'heading-2', + 'heading-3', + 'heading-4', + 'body-extended', + 'body-extended-semibold', + 'body-base', + 'body-base-semibold', + 'caption', + 'caption-semibold', + ]; + + for (const tokenKey of usedTokenKeys) { + const cssVariableNames = veraTypographyVariableNames[tokenKey]; + const desktop = args.fontSizeDesktop[tokenKey]; + const mobile = args.fontSizeMobile[tokenKey]; + + variables[cssVariableNames.fontSize] = desktop.fontSize; + variables[cssVariableNames.lineHeight] = desktop.lineHeight; + variables[cssVariableNames.fontWeight] = desktop.fontWeight; + variables[`--vera-typography-${tokenKey}-mobile-font-size`] = mobile.fontSize; + variables[`--vera-typography-${tokenKey}-mobile-line-height`] = mobile.lineHeight; + variables[`--vera-typography-${tokenKey}-mobile-font-weight`] = mobile.fontWeight; + } + + return variables; +} + // Run the generation generateVeraUIPlugin(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs index 266e98cb..0352140b 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/tailwind/veraUI.cjs @@ -2,591 +2,819 @@ * Auto-generated Tailwind plugin for Vera design system * DO NOT EDIT MANUALLY - Generated by generateTailwindPlugin.ts */ +// eslint-disable-next-line @typescript-eslint/no-require-imports const plugin = require('tailwindcss/plugin'); -const veraUI = plugin( - ({ addUtilities, addBase, addVariant }) => { - const fontSizeUtilities = {}; - const fontWeightUtilities = {}; - - // Add custom variants - addVariant('child', '& > *'); - - // Add CSS variables for theme-aware colors - addBase({ - ':root': { - '--vera-accent': '#FFFFFF', - '--vera-accent-light': '#FFFFFF', - '--vera-accent-dark': '#FFFFFF', - '--vera-alert-background': '#FFEEF2', - '--vera-alert-background-light': '#FFEEF2', - '--vera-alert-background-dark': '#3E0004', - '--vera-alert-background-hover': '#FEDFDF', - '--vera-alert-background-hover-light': '#FEDFDF', - '--vera-alert-background-hover-dark': '#6E0000', - '--vera-alert-text': '#CD0000', - '--vera-alert-text-light': '#CD0000', - '--vera-alert-text-dark': '#FEDFDF', - '--vera-background': '#F5F0FD', - '--vera-background-light': '#F5F0FD', - '--vera-background-dark': '#26044D', - '--vera-border': '#E6E6E6', - '--vera-border-light': '#E6E6E6', - '--vera-border-dark': '#333333', - '--vera-dark-background': '#202124', - '--vera-dark-background-light': '#202124', - '--vera-dark-background-dark': '#202124', - '--vera-dark-grey': '#333333', - '--vera-dark-grey-light': '#333333', - '--vera-dark-grey-dark': '#333333', - '--vera-dark-grey-hover': '#292828', - '--vera-dark-grey-hover-light': '#292828', - '--vera-dark-grey-hover-dark': '#292828', - '--vera-dark-grey-opacity': '#333333CD', - '--vera-dark-grey-opacity-light': '#333333CD', - '--vera-dark-grey-opacity-dark': '#333333CD', - '--vera-disabled': '#E6E6E6', - '--vera-disabled-light': '#E6E6E6', - '--vera-disabled-dark': '#333333', - '--vera-error': '#E61D1D', - '--vera-error-light': '#E61D1D', - '--vera-error-dark': '#F75959', - '--vera-error-hover': '#CD0000', - '--vera-error-hover-light': '#CD0000', - '--vera-error-hover-dark': '#FE9696', - '--vera-information': '#0276D5', - '--vera-information-light': '#0276D5', - '--vera-information-dark': '#2997F0', - '--vera-information-background': '#E8F4FB', - '--vera-information-background-light': '#E8F4FB', - '--vera-information-background-dark': '#E8F4FB', - '--vera-information-hover': '#2997F0', - '--vera-information-hover-light': '#2997F0', - '--vera-information-hover-dark': '#0276D5', - '--vera-on-accent': '#000000', - '--vera-on-accent-light': '#000000', - '--vera-on-accent-dark': '#000000', - '--vera-on-background': '#757575', - '--vera-on-background-light': '#757575', - '--vera-on-background-dark': '#B3B3B3', - '--vera-on-dark-grey': '#FFFFFF', - '--vera-on-dark-grey-light': '#FFFFFF', - '--vera-on-dark-grey-dark': '#FFFFFF', - '--vera-on-error': '#FFFFFF', - '--vera-on-error-light': '#FFFFFF', - '--vera-on-error-dark': '#000000', - '--vera-on-information': '#FFFFFF', - '--vera-on-information-light': '#FFFFFF', - '--vera-on-information-dark': '#FFFFFF', - '--vera-on-primary': '#FFFFFF', - '--vera-on-primary-light': '#FFFFFF', - '--vera-on-primary-dark': '#000000', - '--vera-on-secondary': '#FFFFFF', - '--vera-on-secondary-light': '#FFFFFF', - '--vera-on-secondary-dark': '#000000', - '--vera-on-success': '#FFFFFF', - '--vera-on-success-light': '#FFFFFF', - '--vera-on-success-dark': '#000000', - '--vera-on-surface': '#929292', - '--vera-on-surface-light': '#929292', - '--vera-on-surface-dark': '#FFFFFF', - '--vera-on-tertiary': '#FFFFFF', - '--vera-on-tertiary-light': '#FFFFFF', - '--vera-on-tertiary-dark': '#000000', - '--vera-on-warning': '#FFFFFF', - '--vera-on-warning-light': '#FFFFFF', - '--vera-on-warning-dark': '#000000', - '--vera-primary': '#9941FF', - '--vera-primary-light': '#9941FF', - '--vera-primary-dark': '#B27BF2', - '--vera-primary-hover': '#871EFF', - '--vera-primary-hover-light': '#871EFF', - '--vera-primary-hover-dark': '#CBA1FA', - '--vera-secondary': '#000000', - '--vera-secondary-light': '#000000', - '--vera-secondary-dark': '#FFFFFF', - '--vera-secondary-hover': '#666666', - '--vera-secondary-hover-light': '#666666', - '--vera-secondary-hover-dark': '#929292', - '--vera-skeleton-like': '#B3B3B3', - '--vera-skeleton-like-light': '#B3B3B3', - '--vera-skeleton-like-dark': '#333333', - '--vera-success': '#1C8731', - '--vera-success-light': '#1C8731', - '--vera-success-dark': '#30A849', - '--vera-success-hover': '#1F7629', - '--vera-success-hover-light': '#1F7629', - '--vera-success-hover-dark': '#53CA6A', - '--vera-surface': '#FFFFFF', - '--vera-surface-light': '#FFFFFF', - '--vera-surface-dark': '#000000', - '--vera-tertiary': '#757575', - '--vera-tertiary-light': '#757575', - '--vera-tertiary-dark': '#B3B3B3', - '--vera-tertiary-hover': '#929292', - '--vera-tertiary-hover-light': '#929292', - '--vera-tertiary-hover-dark': '#B3B3B3', - '--vera-text-disabled': '#B3B3B3', - '--vera-text-disabled-light': '#B3B3B3', - '--vera-text-disabled-dark': '#666666', - '--vera-text-primary': '#9941FF', - '--vera-text-primary-light': '#9941FF', - '--vera-text-primary-dark': '#B27BF2', - '--vera-text-secondary': '#000000', - '--vera-text-secondary-light': '#000000', - '--vera-text-secondary-dark': '#FFFFFF', - '--vera-text-tertiary': '#757575', - '--vera-text-tertiary-light': '#757575', - '--vera-text-tertiary-dark': '#B3B3B3', - '--vera-warning': '#BE5702', - '--vera-warning-light': '#BE5702', - '--vera-warning-dark': '#FA9F00', - '--vera-warning-hover': '#A64C03', - '--vera-warning-hover-light': '#A64C03', - '--vera-warning-hover-dark': '#FACC4B', - }, - 'html.vera-dark-mode': { - '--vera-accent': '#FFFFFF', - '--vera-alert-background': '#3E0004', - '--vera-alert-background-hover': '#6E0000', - '--vera-alert-text': '#FEDFDF', - '--vera-background': '#26044D', - '--vera-border': '#333333', - '--vera-dark-background': '#202124', - '--vera-dark-grey': '#333333', - '--vera-dark-grey-hover': '#292828', - '--vera-dark-grey-opacity': '#333333CD', - '--vera-disabled': '#333333', - '--vera-error': '#F75959', - '--vera-error-hover': '#FE9696', - '--vera-information': '#2997F0', - '--vera-information-background': '#E8F4FB', - '--vera-information-hover': '#0276D5', - '--vera-on-accent': '#000000', - '--vera-on-background': '#B3B3B3', - '--vera-on-dark-grey': '#FFFFFF', - '--vera-on-error': '#000000', - '--vera-on-information': '#FFFFFF', - '--vera-on-primary': '#000000', - '--vera-on-secondary': '#000000', - '--vera-on-success': '#000000', - '--vera-on-surface': '#FFFFFF', - '--vera-on-tertiary': '#000000', - '--vera-on-warning': '#000000', - '--vera-primary': '#B27BF2', - '--vera-primary-hover': '#CBA1FA', - '--vera-secondary': '#FFFFFF', - '--vera-secondary-hover': '#929292', - '--vera-skeleton-like': '#333333', - '--vera-success': '#30A849', - '--vera-success-hover': '#53CA6A', - '--vera-surface': '#000000', - '--vera-tertiary': '#B3B3B3', - '--vera-tertiary-hover': '#B3B3B3', - '--vera-text-disabled': '#666666', - '--vera-text-primary': '#B27BF2', - '--vera-text-secondary': '#FFFFFF', - '--vera-text-tertiary': '#B3B3B3', - '--vera-warning': '#FA9F00', - '--vera-warning-hover': '#FACC4B', - }, - }); - - // headline - fontSizeUtilities['.text-vera-headline'] = { - fontSize: '2rem', - lineHeight: '2.5rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '4.125rem', - lineHeight: '5.5rem', - fontWeight: 500, - }, - }; +/** + * @typedef {Object} VeraTypographyProperties + * @property {string} [fontSize] + * @property {string} [lineHeight] + * @property {string} [fontWeight] + * @property {string} [mobileFontSize] + * @property {string} [mobileLineHeight] + * @property {string} [mobileFontWeight] + */ +/** + * @typedef {Object} VeraColorThemeConfig + * @property {string} [accent] + * @property {string} [alertBackground] + * @property {string} [alertBackgroundHover] + * @property {string} [alertText] + * @property {string} [background] + * @property {string} [border] + * @property {string} [darkBackground] + * @property {string} [darkGrey] + * @property {string} [darkGreyHover] + * @property {string} [darkGreyOpacity] + * @property {string} [disabled] + * @property {string} [error] + * @property {string} [errorHover] + * @property {string} [information] + * @property {string} [informationBackground] + * @property {string} [informationHover] + * @property {string} [onAccent] + * @property {string} [onBackground] + * @property {string} [onDarkGrey] + * @property {string} [onError] + * @property {string} [onInformation] + * @property {string} [onPrimary] + * @property {string} [onSecondary] + * @property {string} [onSuccess] + * @property {string} [onSurface] + * @property {string} [onTertiary] + * @property {string} [onWarning] + * @property {string} [primary] + * @property {string} [primaryHover] + * @property {string} [secondary] + * @property {string} [secondaryHover] + * @property {string} [skeletonLike] + * @property {string} [success] + * @property {string} [successHover] + * @property {string} [surface] + * @property {string} [tertiary] + * @property {string} [tertiaryHover] + * @property {string} [textDisabled] + * @property {string} [textPrimary] + * @property {string} [textSecondary] + * @property {string} [textTertiary] + * @property {string} [warning] + * @property {string} [warningHover] + */ +/** + * @typedef {Object} VeraUIConfig + * @property {VeraColorThemeConfig} [light] + * @property {VeraColorThemeConfig} [dark] + * @property {string} [borderRadiusExtraLarge] + * @property {string} [borderRadiusExtraSmall] + * @property {string} [borderRadiusLarge] + * @property {string} [borderRadiusMedium] + * @property {string} [borderRadiusNone] + * @property {string} [borderRadiusSmall] + * @property {string} [fontFamilyPlain] + * @property {VeraTypographyProperties} [headline] + * @property {VeraTypographyProperties} [subtitle] + * @property {VeraTypographyProperties} [heading1] + * @property {VeraTypographyProperties} [heading2] + * @property {VeraTypographyProperties} [heading3] + * @property {VeraTypographyProperties} [heading4] + * @property {VeraTypographyProperties} [bodyExtended] + * @property {VeraTypographyProperties} [bodyExtendedSemibold] + * @property {VeraTypographyProperties} [bodyBase] + * @property {VeraTypographyProperties} [bodyBaseSemibold] + * @property {VeraTypographyProperties} [caption] + * @property {VeraTypographyProperties} [captionSemibold] + */ - fontWeightUtilities['.font-vera-headline'] = { - fontWeight: 500, - '@media (min-width: 768px)': { - fontWeight: 500, - }, - }; - - // subtitle - fontSizeUtilities['.text-vera-subtitle'] = { - fontSize: '1.875rem', - lineHeight: '2.375rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '3.25rem', - lineHeight: '4.25rem', +/** + * @param {VeraUIConfig} [config={}] + */ + +const veraUI = (config = {}) => { + return plugin( + ({ addUtilities, addBase, addVariant }) => { + const { light = {}, dark = {} } = config; // also includes typography and layout + const fontSizeUtilities = {}; + const fontWeightUtilities = {}; + + // Add custom variants + addVariant('child', '& > *'); + + // Add CSS variables for theme-aware colors + addBase({ + ':host, :root': { + '--vera-accent': config.accent ?? light.accent ?? '#FFFFFF', + '--vera-accent-light': config.accent ?? light.accent ?? '#FFFFFF', + '--vera-accent-dark': config.accent ?? dark.accent ?? '#FFFFFF', + '--vera-alert-background': config.alertBackground ?? light.alertBackground ?? '#FFEEF2', + '--vera-alert-background-light': + config.alertBackground ?? light.alertBackground ?? '#FFEEF2', + '--vera-alert-background-dark': + config.alertBackground ?? dark.alertBackground ?? '#3E0004', + '--vera-alert-background-hover': + config.alertBackgroundHover ?? light.alertBackgroundHover ?? '#FEDFDF', + '--vera-alert-background-hover-light': + config.alertBackgroundHover ?? light.alertBackgroundHover ?? '#FEDFDF', + '--vera-alert-background-hover-dark': + config.alertBackgroundHover ?? dark.alertBackgroundHover ?? '#6E0000', + '--vera-alert-text': config.alertText ?? light.alertText ?? '#CD0000', + '--vera-alert-text-light': config.alertText ?? light.alertText ?? '#CD0000', + '--vera-alert-text-dark': config.alertText ?? dark.alertText ?? '#FEDFDF', + '--vera-background': config.background ?? light.background ?? '#F5F0FD', + '--vera-background-light': config.background ?? light.background ?? '#F5F0FD', + '--vera-background-dark': config.background ?? dark.background ?? '#26044D', + '--vera-border': config.border ?? light.border ?? '#E6E6E6', + '--vera-border-light': config.border ?? light.border ?? '#E6E6E6', + '--vera-border-dark': config.border ?? dark.border ?? '#333333', + '--vera-dark-background': config.darkBackground ?? light.darkBackground ?? '#202124', + '--vera-dark-background-light': + config.darkBackground ?? light.darkBackground ?? '#202124', + '--vera-dark-background-dark': config.darkBackground ?? dark.darkBackground ?? '#202124', + '--vera-dark-grey': config.darkGrey ?? light.darkGrey ?? '#333333', + '--vera-dark-grey-light': config.darkGrey ?? light.darkGrey ?? '#333333', + '--vera-dark-grey-dark': config.darkGrey ?? dark.darkGrey ?? '#333333', + '--vera-dark-grey-hover': config.darkGreyHover ?? light.darkGreyHover ?? '#292828', + '--vera-dark-grey-hover-light': config.darkGreyHover ?? light.darkGreyHover ?? '#292828', + '--vera-dark-grey-hover-dark': config.darkGreyHover ?? dark.darkGreyHover ?? '#292828', + '--vera-dark-grey-opacity': + config.darkGreyOpacity ?? light.darkGreyOpacity ?? '#333333CD', + '--vera-dark-grey-opacity-light': + config.darkGreyOpacity ?? light.darkGreyOpacity ?? '#333333CD', + '--vera-dark-grey-opacity-dark': + config.darkGreyOpacity ?? dark.darkGreyOpacity ?? '#333333CD', + '--vera-disabled': config.disabled ?? light.disabled ?? '#E6E6E6', + '--vera-disabled-light': config.disabled ?? light.disabled ?? '#E6E6E6', + '--vera-disabled-dark': config.disabled ?? dark.disabled ?? '#333333', + '--vera-error': config.error ?? light.error ?? '#E61D1D', + '--vera-error-light': config.error ?? light.error ?? '#E61D1D', + '--vera-error-dark': config.error ?? dark.error ?? '#F75959', + '--vera-error-hover': config.errorHover ?? light.errorHover ?? '#CD0000', + '--vera-error-hover-light': config.errorHover ?? light.errorHover ?? '#CD0000', + '--vera-error-hover-dark': config.errorHover ?? dark.errorHover ?? '#FE9696', + '--vera-information': config.information ?? light.information ?? '#0276D5', + '--vera-information-light': config.information ?? light.information ?? '#0276D5', + '--vera-information-dark': config.information ?? dark.information ?? '#2997F0', + '--vera-information-background': + config.informationBackground ?? light.informationBackground ?? '#E8F4FB', + '--vera-information-background-light': + config.informationBackground ?? light.informationBackground ?? '#E8F4FB', + '--vera-information-background-dark': + config.informationBackground ?? dark.informationBackground ?? '#E8F4FB', + '--vera-information-hover': + config.informationHover ?? light.informationHover ?? '#2997F0', + '--vera-information-hover-light': + config.informationHover ?? light.informationHover ?? '#2997F0', + '--vera-information-hover-dark': + config.informationHover ?? dark.informationHover ?? '#0276D5', + '--vera-on-accent': config.onAccent ?? light.onAccent ?? '#000000', + '--vera-on-accent-light': config.onAccent ?? light.onAccent ?? '#000000', + '--vera-on-accent-dark': config.onAccent ?? dark.onAccent ?? '#000000', + '--vera-on-background': config.onBackground ?? light.onBackground ?? '#757575', + '--vera-on-background-light': config.onBackground ?? light.onBackground ?? '#757575', + '--vera-on-background-dark': config.onBackground ?? dark.onBackground ?? '#B3B3B3', + '--vera-on-dark-grey': config.onDarkGrey ?? light.onDarkGrey ?? '#FFFFFF', + '--vera-on-dark-grey-light': config.onDarkGrey ?? light.onDarkGrey ?? '#FFFFFF', + '--vera-on-dark-grey-dark': config.onDarkGrey ?? dark.onDarkGrey ?? '#FFFFFF', + '--vera-on-error': config.onError ?? light.onError ?? '#FFFFFF', + '--vera-on-error-light': config.onError ?? light.onError ?? '#FFFFFF', + '--vera-on-error-dark': config.onError ?? dark.onError ?? '#000000', + '--vera-on-information': config.onInformation ?? light.onInformation ?? '#FFFFFF', + '--vera-on-information-light': config.onInformation ?? light.onInformation ?? '#FFFFFF', + '--vera-on-information-dark': config.onInformation ?? dark.onInformation ?? '#FFFFFF', + '--vera-on-primary': config.onPrimary ?? light.onPrimary ?? '#FFFFFF', + '--vera-on-primary-light': config.onPrimary ?? light.onPrimary ?? '#FFFFFF', + '--vera-on-primary-dark': config.onPrimary ?? dark.onPrimary ?? '#000000', + '--vera-on-secondary': config.onSecondary ?? light.onSecondary ?? '#FFFFFF', + '--vera-on-secondary-light': config.onSecondary ?? light.onSecondary ?? '#FFFFFF', + '--vera-on-secondary-dark': config.onSecondary ?? dark.onSecondary ?? '#000000', + '--vera-on-success': config.onSuccess ?? light.onSuccess ?? '#FFFFFF', + '--vera-on-success-light': config.onSuccess ?? light.onSuccess ?? '#FFFFFF', + '--vera-on-success-dark': config.onSuccess ?? dark.onSuccess ?? '#000000', + '--vera-on-surface': config.onSurface ?? light.onSurface ?? '#929292', + '--vera-on-surface-light': config.onSurface ?? light.onSurface ?? '#929292', + '--vera-on-surface-dark': config.onSurface ?? dark.onSurface ?? '#FFFFFF', + '--vera-on-tertiary': config.onTertiary ?? light.onTertiary ?? '#FFFFFF', + '--vera-on-tertiary-light': config.onTertiary ?? light.onTertiary ?? '#FFFFFF', + '--vera-on-tertiary-dark': config.onTertiary ?? dark.onTertiary ?? '#000000', + '--vera-on-warning': config.onWarning ?? light.onWarning ?? '#FFFFFF', + '--vera-on-warning-light': config.onWarning ?? light.onWarning ?? '#FFFFFF', + '--vera-on-warning-dark': config.onWarning ?? dark.onWarning ?? '#000000', + '--vera-primary': config.primary ?? light.primary ?? '#9941FF', + '--vera-primary-light': config.primary ?? light.primary ?? '#9941FF', + '--vera-primary-dark': config.primary ?? dark.primary ?? '#B27BF2', + '--vera-primary-hover': config.primaryHover ?? light.primaryHover ?? '#871EFF', + '--vera-primary-hover-light': config.primaryHover ?? light.primaryHover ?? '#871EFF', + '--vera-primary-hover-dark': config.primaryHover ?? dark.primaryHover ?? '#CBA1FA', + '--vera-secondary': config.secondary ?? light.secondary ?? '#000000', + '--vera-secondary-light': config.secondary ?? light.secondary ?? '#000000', + '--vera-secondary-dark': config.secondary ?? dark.secondary ?? '#FFFFFF', + '--vera-secondary-hover': config.secondaryHover ?? light.secondaryHover ?? '#666666', + '--vera-secondary-hover-light': + config.secondaryHover ?? light.secondaryHover ?? '#666666', + '--vera-secondary-hover-dark': config.secondaryHover ?? dark.secondaryHover ?? '#929292', + '--vera-skeleton-like': config.skeletonLike ?? light.skeletonLike ?? '#B3B3B3', + '--vera-skeleton-like-light': config.skeletonLike ?? light.skeletonLike ?? '#B3B3B3', + '--vera-skeleton-like-dark': config.skeletonLike ?? dark.skeletonLike ?? '#333333', + '--vera-success': config.success ?? light.success ?? '#1C8731', + '--vera-success-light': config.success ?? light.success ?? '#1C8731', + '--vera-success-dark': config.success ?? dark.success ?? '#30A849', + '--vera-success-hover': config.successHover ?? light.successHover ?? '#1F7629', + '--vera-success-hover-light': config.successHover ?? light.successHover ?? '#1F7629', + '--vera-success-hover-dark': config.successHover ?? dark.successHover ?? '#53CA6A', + '--vera-surface': config.surface ?? light.surface ?? '#FFFFFF', + '--vera-surface-light': config.surface ?? light.surface ?? '#FFFFFF', + '--vera-surface-dark': config.surface ?? dark.surface ?? '#000000', + '--vera-tertiary': config.tertiary ?? light.tertiary ?? '#757575', + '--vera-tertiary-light': config.tertiary ?? light.tertiary ?? '#757575', + '--vera-tertiary-dark': config.tertiary ?? dark.tertiary ?? '#B3B3B3', + '--vera-tertiary-hover': config.tertiaryHover ?? light.tertiaryHover ?? '#929292', + '--vera-tertiary-hover-light': config.tertiaryHover ?? light.tertiaryHover ?? '#929292', + '--vera-tertiary-hover-dark': config.tertiaryHover ?? dark.tertiaryHover ?? '#B3B3B3', + '--vera-text-disabled': config.textDisabled ?? light.textDisabled ?? '#B3B3B3', + '--vera-text-disabled-light': config.textDisabled ?? light.textDisabled ?? '#B3B3B3', + '--vera-text-disabled-dark': config.textDisabled ?? dark.textDisabled ?? '#666666', + '--vera-text-primary': config.textPrimary ?? light.textPrimary ?? '#9941FF', + '--vera-text-primary-light': config.textPrimary ?? light.textPrimary ?? '#9941FF', + '--vera-text-primary-dark': config.textPrimary ?? dark.textPrimary ?? '#B27BF2', + '--vera-text-secondary': config.textSecondary ?? light.textSecondary ?? '#000000', + '--vera-text-secondary-light': config.textSecondary ?? light.textSecondary ?? '#000000', + '--vera-text-secondary-dark': config.textSecondary ?? dark.textSecondary ?? '#FFFFFF', + '--vera-text-tertiary': config.textTertiary ?? light.textTertiary ?? '#757575', + '--vera-text-tertiary-light': config.textTertiary ?? light.textTertiary ?? '#757575', + '--vera-text-tertiary-dark': config.textTertiary ?? dark.textTertiary ?? '#B3B3B3', + '--vera-warning': config.warning ?? light.warning ?? '#BE5702', + '--vera-warning-light': config.warning ?? light.warning ?? '#BE5702', + '--vera-warning-dark': config.warning ?? dark.warning ?? '#FA9F00', + '--vera-warning-hover': config.warningHover ?? light.warningHover ?? '#A64C03', + '--vera-warning-hover-light': config.warningHover ?? light.warningHover ?? '#A64C03', + '--vera-warning-hover-dark': config.warningHover ?? dark.warningHover ?? '#FACC4B', + + // Typography and layout design tokens + '--vera-border-radius-extra-large': config.borderRadiusExtraLarge ?? '24px', + '--vera-border-radius-extra-small': config.borderRadiusExtraSmall ?? '2px', + '--vera-border-radius-large': config.borderRadiusLarge ?? '12px', + '--vera-border-radius-medium': config.borderRadiusMedium ?? '8px', + '--vera-border-radius-none': config.borderRadiusNone ?? '0px', + '--vera-border-radius-small': config.borderRadiusSmall ?? '4px', + '--vera-font-family-plain': + config.fontFamilyPlain ?? + 'Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS', + '--vera-typography-headline-font-size': config.headline?.fontSize ?? '4.125rem', + '--vera-typography-headline-line-height': config.headline?.lineHeight ?? '5.5rem', + '--vera-typography-headline-font-weight': config.headline?.fontWeight ?? '500', + '--vera-typography-headline-mobile-font-size': config.headline?.mobileFontSize ?? '2rem', + '--vera-typography-headline-mobile-line-height': + config.headline?.mobileLineHeight ?? '2.5rem', + '--vera-typography-headline-mobile-font-weight': + config.headline?.mobileFontWeight ?? '500', + '--vera-typography-subtitle-font-size': config.subtitle?.fontSize ?? '3.25rem', + '--vera-typography-subtitle-line-height': config.subtitle?.lineHeight ?? '4.25rem', + '--vera-typography-subtitle-font-weight': config.subtitle?.fontWeight ?? '500', + '--vera-typography-subtitle-mobile-font-size': + config.subtitle?.mobileFontSize ?? '1.875rem', + '--vera-typography-subtitle-mobile-line-height': + config.subtitle?.mobileLineHeight ?? '2.375rem', + '--vera-typography-subtitle-mobile-font-weight': + config.subtitle?.mobileFontWeight ?? '500', + '--vera-typography-heading-1-font-size': config.heading1?.fontSize ?? '2.5rem', + '--vera-typography-heading-1-line-height': config.heading1?.lineHeight ?? '3.25rem', + '--vera-typography-heading-1-font-weight': config.heading1?.fontWeight ?? '500', + '--vera-typography-heading-1-mobile-font-size': + config.heading1?.mobileFontSize ?? '1.75rem', + '--vera-typography-heading-1-mobile-line-height': + config.heading1?.mobileLineHeight ?? '2.25rem', + '--vera-typography-heading-1-mobile-font-weight': + config.heading1?.mobileFontWeight ?? '500', + '--vera-typography-heading-2-font-size': config.heading2?.fontSize ?? '2rem', + '--vera-typography-heading-2-line-height': config.heading2?.lineHeight ?? '2.75rem', + '--vera-typography-heading-2-font-weight': config.heading2?.fontWeight ?? '500', + '--vera-typography-heading-2-mobile-font-size': + config.heading2?.mobileFontSize ?? '1.5rem', + '--vera-typography-heading-2-mobile-line-height': + config.heading2?.mobileLineHeight ?? '2rem', + '--vera-typography-heading-2-mobile-font-weight': + config.heading2?.mobileFontWeight ?? '500', + '--vera-typography-heading-3-font-size': config.heading3?.fontSize ?? '1.625rem', + '--vera-typography-heading-3-line-height': config.heading3?.lineHeight ?? '2.25rem', + '--vera-typography-heading-3-font-weight': config.heading3?.fontWeight ?? '500', + '--vera-typography-heading-3-mobile-font-size': + config.heading3?.mobileFontSize ?? '1.25rem', + '--vera-typography-heading-3-mobile-line-height': + config.heading3?.mobileLineHeight ?? '1.75rem', + '--vera-typography-heading-3-mobile-font-weight': + config.heading3?.mobileFontWeight ?? '500', + '--vera-typography-heading-4-font-size': config.heading4?.fontSize ?? '1.25rem', + '--vera-typography-heading-4-line-height': config.heading4?.lineHeight ?? '1.75rem', + '--vera-typography-heading-4-font-weight': config.heading4?.fontWeight ?? '500', + '--vera-typography-heading-4-mobile-font-size': + config.heading4?.mobileFontSize ?? '1.125rem', + '--vera-typography-heading-4-mobile-line-height': + config.heading4?.mobileLineHeight ?? '1.5rem', + '--vera-typography-heading-4-mobile-font-weight': + config.heading4?.mobileFontWeight ?? '500', + '--vera-typography-body-extended-font-size': config.bodyExtended?.fontSize ?? '1rem', + '--vera-typography-body-extended-line-height': + config.bodyExtended?.lineHeight ?? '1.5rem', + '--vera-typography-body-extended-font-weight': config.bodyExtended?.fontWeight ?? '400', + '--vera-typography-body-extended-mobile-font-size': + config.bodyExtended?.mobileFontSize ?? '1rem', + '--vera-typography-body-extended-mobile-line-height': + config.bodyExtended?.mobileLineHeight ?? '1.5rem', + '--vera-typography-body-extended-mobile-font-weight': + config.bodyExtended?.mobileFontWeight ?? '400', + '--vera-typography-body-extended-semibold-font-size': + config.bodyExtendedSemibold?.fontSize ?? '1rem', + '--vera-typography-body-extended-semibold-line-height': + config.bodyExtendedSemibold?.lineHeight ?? '1.5rem', + '--vera-typography-body-extended-semibold-font-weight': + config.bodyExtendedSemibold?.fontWeight ?? '600', + '--vera-typography-body-extended-semibold-mobile-font-size': + config.bodyExtendedSemibold?.mobileFontSize ?? '1rem', + '--vera-typography-body-extended-semibold-mobile-line-height': + config.bodyExtendedSemibold?.mobileLineHeight ?? '1.5rem', + '--vera-typography-body-extended-semibold-mobile-font-weight': + config.bodyExtendedSemibold?.mobileFontWeight ?? '600', + '--vera-typography-body-base-font-size': config.bodyBase?.fontSize ?? '0.875rem', + '--vera-typography-body-base-line-height': config.bodyBase?.lineHeight ?? '1.25rem', + '--vera-typography-body-base-font-weight': config.bodyBase?.fontWeight ?? '400', + '--vera-typography-body-base-mobile-font-size': + config.bodyBase?.mobileFontSize ?? '0.875rem', + '--vera-typography-body-base-mobile-line-height': + config.bodyBase?.mobileLineHeight ?? '1.25rem', + '--vera-typography-body-base-mobile-font-weight': + config.bodyBase?.mobileFontWeight ?? '400', + '--vera-typography-body-base-semibold-font-size': + config.bodyBaseSemibold?.fontSize ?? '0.875rem', + '--vera-typography-body-base-semibold-line-height': + config.bodyBaseSemibold?.lineHeight ?? '1.25rem', + '--vera-typography-body-base-semibold-font-weight': + config.bodyBaseSemibold?.fontWeight ?? '600', + '--vera-typography-body-base-semibold-mobile-font-size': + config.bodyBaseSemibold?.mobileFontSize ?? '0.875rem', + '--vera-typography-body-base-semibold-mobile-line-height': + config.bodyBaseSemibold?.mobileLineHeight ?? '1.25rem', + '--vera-typography-body-base-semibold-mobile-font-weight': + config.bodyBaseSemibold?.mobileFontWeight ?? '600', + '--vera-typography-caption-font-size': config.caption?.fontSize ?? '0.75rem', + '--vera-typography-caption-line-height': config.caption?.lineHeight ?? '1rem', + '--vera-typography-caption-font-weight': config.caption?.fontWeight ?? '400', + '--vera-typography-caption-mobile-font-size': config.caption?.mobileFontSize ?? '0.75rem', + '--vera-typography-caption-mobile-line-height': + config.caption?.mobileLineHeight ?? '1rem', + '--vera-typography-caption-mobile-font-weight': config.caption?.mobileFontWeight ?? '400', + '--vera-typography-caption-semibold-font-size': + config.captionSemibold?.fontSize ?? '0.75rem', + '--vera-typography-caption-semibold-line-height': + config.captionSemibold?.lineHeight ?? '1rem', + '--vera-typography-caption-semibold-font-weight': + config.captionSemibold?.fontWeight ?? '600', + '--vera-typography-caption-semibold-mobile-font-size': + config.captionSemibold?.mobileFontSize ?? '0.75rem', + '--vera-typography-caption-semibold-mobile-line-height': + config.captionSemibold?.mobileLineHeight ?? '1rem', + '--vera-typography-caption-semibold-mobile-font-weight': + config.captionSemibold?.mobileFontWeight ?? '600', + }, + ':host(.vera-dark-mode), :host(.dark), html.vera-dark-mode': { + '--vera-accent': config.accent ?? dark.accent ?? '#FFFFFF', + '--vera-alert-background': config.alertBackground ?? dark.alertBackground ?? '#3E0004', + '--vera-alert-background-hover': + config.alertBackgroundHover ?? dark.alertBackgroundHover ?? '#6E0000', + '--vera-alert-text': config.alertText ?? dark.alertText ?? '#FEDFDF', + '--vera-background': config.background ?? dark.background ?? '#26044D', + '--vera-border': config.border ?? dark.border ?? '#333333', + '--vera-dark-background': config.darkBackground ?? dark.darkBackground ?? '#202124', + '--vera-dark-grey': config.darkGrey ?? dark.darkGrey ?? '#333333', + '--vera-dark-grey-hover': config.darkGreyHover ?? dark.darkGreyHover ?? '#292828', + '--vera-dark-grey-opacity': config.darkGreyOpacity ?? dark.darkGreyOpacity ?? '#333333CD', + '--vera-disabled': config.disabled ?? dark.disabled ?? '#333333', + '--vera-error': config.error ?? dark.error ?? '#F75959', + '--vera-error-hover': config.errorHover ?? dark.errorHover ?? '#FE9696', + '--vera-information': config.information ?? dark.information ?? '#2997F0', + '--vera-information-background': + config.informationBackground ?? dark.informationBackground ?? '#E8F4FB', + '--vera-information-hover': config.informationHover ?? dark.informationHover ?? '#0276D5', + '--vera-on-accent': config.onAccent ?? dark.onAccent ?? '#000000', + '--vera-on-background': config.onBackground ?? dark.onBackground ?? '#B3B3B3', + '--vera-on-dark-grey': config.onDarkGrey ?? dark.onDarkGrey ?? '#FFFFFF', + '--vera-on-error': config.onError ?? dark.onError ?? '#000000', + '--vera-on-information': config.onInformation ?? dark.onInformation ?? '#FFFFFF', + '--vera-on-primary': config.onPrimary ?? dark.onPrimary ?? '#000000', + '--vera-on-secondary': config.onSecondary ?? dark.onSecondary ?? '#000000', + '--vera-on-success': config.onSuccess ?? dark.onSuccess ?? '#000000', + '--vera-on-surface': config.onSurface ?? dark.onSurface ?? '#FFFFFF', + '--vera-on-tertiary': config.onTertiary ?? dark.onTertiary ?? '#000000', + '--vera-on-warning': config.onWarning ?? dark.onWarning ?? '#000000', + '--vera-primary': config.primary ?? dark.primary ?? '#B27BF2', + '--vera-primary-hover': config.primaryHover ?? dark.primaryHover ?? '#CBA1FA', + '--vera-secondary': config.secondary ?? dark.secondary ?? '#FFFFFF', + '--vera-secondary-hover': config.secondaryHover ?? dark.secondaryHover ?? '#929292', + '--vera-skeleton-like': config.skeletonLike ?? dark.skeletonLike ?? '#333333', + '--vera-success': config.success ?? dark.success ?? '#30A849', + '--vera-success-hover': config.successHover ?? dark.successHover ?? '#53CA6A', + '--vera-surface': config.surface ?? dark.surface ?? '#000000', + '--vera-tertiary': config.tertiary ?? dark.tertiary ?? '#B3B3B3', + '--vera-tertiary-hover': config.tertiaryHover ?? dark.tertiaryHover ?? '#B3B3B3', + '--vera-text-disabled': config.textDisabled ?? dark.textDisabled ?? '#666666', + '--vera-text-primary': config.textPrimary ?? dark.textPrimary ?? '#B27BF2', + '--vera-text-secondary': config.textSecondary ?? dark.textSecondary ?? '#FFFFFF', + '--vera-text-tertiary': config.textTertiary ?? dark.textTertiary ?? '#B3B3B3', + '--vera-warning': config.warning ?? dark.warning ?? '#FA9F00', + '--vera-warning-hover': config.warningHover ?? dark.warningHover ?? '#FACC4B', + }, + }); + // headline + fontSizeUtilities['.text-vera-headline'] = { + fontSize: '2rem', + lineHeight: '2.5rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-headline-font-size, 4.125rem)', + lineHeight: 'var(--vera-typography-headline-line-height, 5.5rem)', + fontWeight: 'var(--vera-typography-headline-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-subtitle'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-headline'] = { fontWeight: 500, - }, - }; - - // heading-1 - fontSizeUtilities['.text-vera-heading-1'] = { - fontSize: '1.75rem', - lineHeight: '2.25rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '2.5rem', - lineHeight: '3.25rem', + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-headline-font-weight, 500)', + }, + }; + + // subtitle + fontSizeUtilities['.text-vera-subtitle'] = { + fontSize: '1.875rem', + lineHeight: '2.375rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-subtitle-font-size, 3.25rem)', + lineHeight: 'var(--vera-typography-subtitle-line-height, 4.25rem)', + fontWeight: 'var(--vera-typography-subtitle-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-1'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-subtitle'] = { fontWeight: 500, - }, - }; - - // heading-2 - fontSizeUtilities['.text-vera-heading-2'] = { - fontSize: '1.5rem', - lineHeight: '2rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '2rem', - lineHeight: '2.75rem', + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-subtitle-font-weight, 500)', + }, + }; + + // heading-1 + fontSizeUtilities['.text-vera-heading-1'] = { + fontSize: '1.75rem', + lineHeight: '2.25rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-1-font-size, 2.5rem)', + lineHeight: 'var(--vera-typography-heading-1-line-height, 3.25rem)', + fontWeight: 'var(--vera-typography-heading-1-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-2'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-heading-1'] = { fontWeight: 500, - }, - }; - - // heading-3 - fontSizeUtilities['.text-vera-heading-3'] = { - fontSize: '1.25rem', - lineHeight: '1.75rem', - fontWeight: 500, - '@media (min-width: 768px)': { - fontSize: '1.625rem', - lineHeight: '2.25rem', + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-1-font-weight, 500)', + }, + }; + + // heading-2 + fontSizeUtilities['.text-vera-heading-2'] = { + fontSize: '1.5rem', + lineHeight: '2rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-2-font-size, 2rem)', + lineHeight: 'var(--vera-typography-heading-2-line-height, 2.75rem)', + fontWeight: 'var(--vera-typography-heading-2-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-3'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-heading-2'] = { fontWeight: 500, - }, - }; - - // heading-4 - fontSizeUtilities['.text-vera-heading-4'] = { - fontSize: '1.125rem', - lineHeight: '1.5rem', - fontWeight: 500, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-2-font-weight, 500)', + }, + }; + + // heading-3 + fontSizeUtilities['.text-vera-heading-3'] = { fontSize: '1.25rem', lineHeight: '1.75rem', fontWeight: 500, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-3-font-size, 1.625rem)', + lineHeight: 'var(--vera-typography-heading-3-line-height, 2.25rem)', + fontWeight: 'var(--vera-typography-heading-3-font-weight, 500)', + }, + }; - fontWeightUtilities['.font-vera-heading-4'] = { - fontWeight: 500, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-heading-3'] = { fontWeight: 500, - }, - }; - - // body-extended - fontSizeUtilities['.text-vera-body-extended'] = { - fontSize: '1rem', - lineHeight: '1.5rem', - fontWeight: 400, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-3-font-weight, 500)', + }, + }; + + // heading-4 + fontSizeUtilities['.text-vera-heading-4'] = { + fontSize: '1.125rem', + lineHeight: '1.5rem', + fontWeight: 500, + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-heading-4-font-size, 1.25rem)', + lineHeight: 'var(--vera-typography-heading-4-line-height, 1.75rem)', + fontWeight: 'var(--vera-typography-heading-4-font-weight, 500)', + }, + }; + + fontWeightUtilities['.font-vera-heading-4'] = { + fontWeight: 500, + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-heading-4-font-weight, 500)', + }, + }; + + // body-extended + fontSizeUtilities['.text-vera-body-extended'] = { fontSize: '1rem', lineHeight: '1.5rem', fontWeight: 400, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-extended-font-size, 1rem)', + lineHeight: 'var(--vera-typography-body-extended-line-height, 1.5rem)', + fontWeight: 'var(--vera-typography-body-extended-font-weight, 400)', + }, + }; - fontWeightUtilities['.font-vera-body-extended'] = { - fontWeight: 400, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-extended'] = { fontWeight: 400, - }, - }; - - // body-extended-semibold - fontSizeUtilities['.text-vera-body-extended-semibold'] = { - fontSize: '1rem', - lineHeight: '1.5rem', - fontWeight: 600, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-extended-font-weight, 400)', + }, + }; + + // body-extended-semibold + fontSizeUtilities['.text-vera-body-extended-semibold'] = { fontSize: '1rem', lineHeight: '1.5rem', fontWeight: 600, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-extended-semibold-font-size, 1rem)', + lineHeight: 'var(--vera-typography-body-extended-semibold-line-height, 1.5rem)', + fontWeight: 'var(--vera-typography-body-extended-semibold-font-weight, 600)', + }, + }; - fontWeightUtilities['.font-vera-body-extended-semibold'] = { - fontWeight: 600, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-extended-semibold'] = { fontWeight: 600, - }, - }; - - // body-base - fontSizeUtilities['.text-vera-body-base'] = { - fontSize: '0.875rem', - lineHeight: '1.25rem', - fontWeight: 400, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-extended-semibold-font-weight, 600)', + }, + }; + + // body-base + fontSizeUtilities['.text-vera-body-base'] = { fontSize: '0.875rem', lineHeight: '1.25rem', fontWeight: 400, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-base-font-size, 0.875rem)', + lineHeight: 'var(--vera-typography-body-base-line-height, 1.25rem)', + fontWeight: 'var(--vera-typography-body-base-font-weight, 400)', + }, + }; - fontWeightUtilities['.font-vera-body-base'] = { - fontWeight: 400, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-base'] = { fontWeight: 400, - }, - }; - - // body-base-semibold - fontSizeUtilities['.text-vera-body-base-semibold'] = { - fontSize: '0.875rem', - lineHeight: '1.25rem', - fontWeight: 600, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-base-font-weight, 400)', + }, + }; + + // body-base-semibold + fontSizeUtilities['.text-vera-body-base-semibold'] = { fontSize: '0.875rem', lineHeight: '1.25rem', fontWeight: 600, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-body-base-semibold-font-size, 0.875rem)', + lineHeight: 'var(--vera-typography-body-base-semibold-line-height, 1.25rem)', + fontWeight: 'var(--vera-typography-body-base-semibold-font-weight, 600)', + }, + }; - fontWeightUtilities['.font-vera-body-base-semibold'] = { - fontWeight: 600, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-body-base-semibold'] = { fontWeight: 600, - }, - }; - - // caption - fontSizeUtilities['.text-vera-caption'] = { - fontSize: '0.75rem', - lineHeight: '1rem', - fontWeight: 400, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-body-base-semibold-font-weight, 600)', + }, + }; + + // caption + fontSizeUtilities['.text-vera-caption'] = { fontSize: '0.75rem', lineHeight: '1rem', fontWeight: 400, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-caption-font-size, 0.75rem)', + lineHeight: 'var(--vera-typography-caption-line-height, 1rem)', + fontWeight: 'var(--vera-typography-caption-font-weight, 400)', + }, + }; - fontWeightUtilities['.font-vera-caption'] = { - fontWeight: 400, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-caption'] = { fontWeight: 400, - }, - }; - - // caption-semibold - fontSizeUtilities['.text-vera-caption-semibold'] = { - fontSize: '0.75rem', - lineHeight: '1rem', - fontWeight: 600, - '@media (min-width: 768px)': { + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-caption-font-weight, 400)', + }, + }; + + // caption-semibold + fontSizeUtilities['.text-vera-caption-semibold'] = { fontSize: '0.75rem', lineHeight: '1rem', fontWeight: 600, - }, - }; + '@media (min-width: 768px)': { + fontSize: 'var(--vera-typography-caption-semibold-font-size, 0.75rem)', + lineHeight: 'var(--vera-typography-caption-semibold-line-height, 1rem)', + fontWeight: 'var(--vera-typography-caption-semibold-font-weight, 600)', + }, + }; - fontWeightUtilities['.font-vera-caption-semibold'] = { - fontWeight: 600, - '@media (min-width: 768px)': { + fontWeightUtilities['.font-vera-caption-semibold'] = { fontWeight: 600, - }, - }; - - addUtilities(fontSizeUtilities); - addUtilities(fontWeightUtilities); - }, - { - theme: { - extend: { - borderRadius: { - 'vera-extra-large': '24px', - 'vera-extra-small': '2px', - 'vera-large': '12px', - 'vera-medium': '8px', - 'vera-none': '0px', - 'vera-small': '4px', - }, - colors: { - 'vera-accent': 'var(--vera-accent, #FFFFFF)', - 'vera-accent-light': 'var(--vera-accent-light, #FFFFFF)', - 'vera-accent-dark': 'var(--vera-accent-dark, #FFFFFF)', - 'vera-alert-background': 'var(--vera-alert-background, #FFEEF2)', - 'vera-alert-background-light': 'var(--vera-alert-background-light, #FFEEF2)', - 'vera-alert-background-dark': 'var(--vera-alert-background-dark, #3E0004)', - 'vera-alert-background-hover': 'var(--vera-alert-background-hover, #FEDFDF)', - 'vera-alert-background-hover-light': 'var(--vera-alert-background-hover-light, #FEDFDF)', - 'vera-alert-background-hover-dark': 'var(--vera-alert-background-hover-dark, #6E0000)', - 'vera-alert-text': 'var(--vera-alert-text, #CD0000)', - 'vera-alert-text-light': 'var(--vera-alert-text-light, #CD0000)', - 'vera-alert-text-dark': 'var(--vera-alert-text-dark, #FEDFDF)', - 'vera-background': 'var(--vera-background, #F5F0FD)', - 'vera-background-light': 'var(--vera-background-light, #F5F0FD)', - 'vera-background-dark': 'var(--vera-background-dark, #26044D)', - 'vera-border': 'var(--vera-border, #E6E6E6)', - 'vera-border-light': 'var(--vera-border-light, #E6E6E6)', - 'vera-border-dark': 'var(--vera-border-dark, #333333)', - 'vera-dark-background': 'var(--vera-dark-background, #202124)', - 'vera-dark-background-light': 'var(--vera-dark-background-light, #202124)', - 'vera-dark-background-dark': 'var(--vera-dark-background-dark, #202124)', - 'vera-dark-grey': 'var(--vera-dark-grey, #333333)', - 'vera-dark-grey-light': 'var(--vera-dark-grey-light, #333333)', - 'vera-dark-grey-dark': 'var(--vera-dark-grey-dark, #333333)', - 'vera-dark-grey-hover': 'var(--vera-dark-grey-hover, #292828)', - 'vera-dark-grey-hover-light': 'var(--vera-dark-grey-hover-light, #292828)', - 'vera-dark-grey-hover-dark': 'var(--vera-dark-grey-hover-dark, #292828)', - 'vera-dark-grey-opacity': 'var(--vera-dark-grey-opacity, #333333CD)', - 'vera-dark-grey-opacity-light': 'var(--vera-dark-grey-opacity-light, #333333CD)', - 'vera-dark-grey-opacity-dark': 'var(--vera-dark-grey-opacity-dark, #333333CD)', - 'vera-disabled': 'var(--vera-disabled, #E6E6E6)', - 'vera-disabled-light': 'var(--vera-disabled-light, #E6E6E6)', - 'vera-disabled-dark': 'var(--vera-disabled-dark, #333333)', - 'vera-error': 'var(--vera-error, #E61D1D)', - 'vera-error-light': 'var(--vera-error-light, #E61D1D)', - 'vera-error-dark': 'var(--vera-error-dark, #F75959)', - 'vera-error-hover': 'var(--vera-error-hover, #CD0000)', - 'vera-error-hover-light': 'var(--vera-error-hover-light, #CD0000)', - 'vera-error-hover-dark': 'var(--vera-error-hover-dark, #FE9696)', - 'vera-information': 'var(--vera-information, #0276D5)', - 'vera-information-light': 'var(--vera-information-light, #0276D5)', - 'vera-information-dark': 'var(--vera-information-dark, #2997F0)', - 'vera-information-background': 'var(--vera-information-background, #E8F4FB)', - 'vera-information-background-light': 'var(--vera-information-background-light, #E8F4FB)', - 'vera-information-background-dark': 'var(--vera-information-background-dark, #E8F4FB)', - 'vera-information-hover': 'var(--vera-information-hover, #2997F0)', - 'vera-information-hover-light': 'var(--vera-information-hover-light, #2997F0)', - 'vera-information-hover-dark': 'var(--vera-information-hover-dark, #0276D5)', - 'vera-on-accent': 'var(--vera-on-accent, #000000)', - 'vera-on-accent-light': 'var(--vera-on-accent-light, #000000)', - 'vera-on-accent-dark': 'var(--vera-on-accent-dark, #000000)', - 'vera-on-background': 'var(--vera-on-background, #757575)', - 'vera-on-background-light': 'var(--vera-on-background-light, #757575)', - 'vera-on-background-dark': 'var(--vera-on-background-dark, #B3B3B3)', - 'vera-on-dark-grey': 'var(--vera-on-dark-grey, #FFFFFF)', - 'vera-on-dark-grey-light': 'var(--vera-on-dark-grey-light, #FFFFFF)', - 'vera-on-dark-grey-dark': 'var(--vera-on-dark-grey-dark, #FFFFFF)', - 'vera-on-error': 'var(--vera-on-error, #FFFFFF)', - 'vera-on-error-light': 'var(--vera-on-error-light, #FFFFFF)', - 'vera-on-error-dark': 'var(--vera-on-error-dark, #000000)', - 'vera-on-information': 'var(--vera-on-information, #FFFFFF)', - 'vera-on-information-light': 'var(--vera-on-information-light, #FFFFFF)', - 'vera-on-information-dark': 'var(--vera-on-information-dark, #FFFFFF)', - 'vera-on-primary': 'var(--vera-on-primary, #FFFFFF)', - 'vera-on-primary-light': 'var(--vera-on-primary-light, #FFFFFF)', - 'vera-on-primary-dark': 'var(--vera-on-primary-dark, #000000)', - 'vera-on-secondary': 'var(--vera-on-secondary, #FFFFFF)', - 'vera-on-secondary-light': 'var(--vera-on-secondary-light, #FFFFFF)', - 'vera-on-secondary-dark': 'var(--vera-on-secondary-dark, #000000)', - 'vera-on-success': 'var(--vera-on-success, #FFFFFF)', - 'vera-on-success-light': 'var(--vera-on-success-light, #FFFFFF)', - 'vera-on-success-dark': 'var(--vera-on-success-dark, #000000)', - 'vera-on-surface': 'var(--vera-on-surface, #929292)', - 'vera-on-surface-light': 'var(--vera-on-surface-light, #929292)', - 'vera-on-surface-dark': 'var(--vera-on-surface-dark, #FFFFFF)', - 'vera-on-tertiary': 'var(--vera-on-tertiary, #FFFFFF)', - 'vera-on-tertiary-light': 'var(--vera-on-tertiary-light, #FFFFFF)', - 'vera-on-tertiary-dark': 'var(--vera-on-tertiary-dark, #000000)', - 'vera-on-warning': 'var(--vera-on-warning, #FFFFFF)', - 'vera-on-warning-light': 'var(--vera-on-warning-light, #FFFFFF)', - 'vera-on-warning-dark': 'var(--vera-on-warning-dark, #000000)', - 'vera-primary': 'var(--vera-primary, #9941FF)', - 'vera-primary-light': 'var(--vera-primary-light, #9941FF)', - 'vera-primary-dark': 'var(--vera-primary-dark, #B27BF2)', - 'vera-primary-hover': 'var(--vera-primary-hover, #871EFF)', - 'vera-primary-hover-light': 'var(--vera-primary-hover-light, #871EFF)', - 'vera-primary-hover-dark': 'var(--vera-primary-hover-dark, #CBA1FA)', - 'vera-secondary': 'var(--vera-secondary, #000000)', - 'vera-secondary-light': 'var(--vera-secondary-light, #000000)', - 'vera-secondary-dark': 'var(--vera-secondary-dark, #FFFFFF)', - 'vera-secondary-hover': 'var(--vera-secondary-hover, #666666)', - 'vera-secondary-hover-light': 'var(--vera-secondary-hover-light, #666666)', - 'vera-secondary-hover-dark': 'var(--vera-secondary-hover-dark, #929292)', - 'vera-skeleton-like': 'var(--vera-skeleton-like, #B3B3B3)', - 'vera-skeleton-like-light': 'var(--vera-skeleton-like-light, #B3B3B3)', - 'vera-skeleton-like-dark': 'var(--vera-skeleton-like-dark, #333333)', - 'vera-success': 'var(--vera-success, #1C8731)', - 'vera-success-light': 'var(--vera-success-light, #1C8731)', - 'vera-success-dark': 'var(--vera-success-dark, #30A849)', - 'vera-success-hover': 'var(--vera-success-hover, #1F7629)', - 'vera-success-hover-light': 'var(--vera-success-hover-light, #1F7629)', - 'vera-success-hover-dark': 'var(--vera-success-hover-dark, #53CA6A)', - 'vera-surface': 'var(--vera-surface, #FFFFFF)', - 'vera-surface-light': 'var(--vera-surface-light, #FFFFFF)', - 'vera-surface-dark': 'var(--vera-surface-dark, #000000)', - 'vera-tertiary': 'var(--vera-tertiary, #757575)', - 'vera-tertiary-light': 'var(--vera-tertiary-light, #757575)', - 'vera-tertiary-dark': 'var(--vera-tertiary-dark, #B3B3B3)', - 'vera-tertiary-hover': 'var(--vera-tertiary-hover, #929292)', - 'vera-tertiary-hover-light': 'var(--vera-tertiary-hover-light, #929292)', - 'vera-tertiary-hover-dark': 'var(--vera-tertiary-hover-dark, #B3B3B3)', - 'vera-text-disabled': 'var(--vera-text-disabled, #B3B3B3)', - 'vera-text-disabled-light': 'var(--vera-text-disabled-light, #B3B3B3)', - 'vera-text-disabled-dark': 'var(--vera-text-disabled-dark, #666666)', - 'vera-text-primary': 'var(--vera-text-primary, #9941FF)', - 'vera-text-primary-light': 'var(--vera-text-primary-light, #9941FF)', - 'vera-text-primary-dark': 'var(--vera-text-primary-dark, #B27BF2)', - 'vera-text-secondary': 'var(--vera-text-secondary, #000000)', - 'vera-text-secondary-light': 'var(--vera-text-secondary-light, #000000)', - 'vera-text-secondary-dark': 'var(--vera-text-secondary-dark, #FFFFFF)', - 'vera-text-tertiary': 'var(--vera-text-tertiary, #757575)', - 'vera-text-tertiary-light': 'var(--vera-text-tertiary-light, #757575)', - 'vera-text-tertiary-dark': 'var(--vera-text-tertiary-dark, #B3B3B3)', - 'vera-warning': 'var(--vera-warning, #BE5702)', - 'vera-warning-light': 'var(--vera-warning-light, #BE5702)', - 'vera-warning-dark': 'var(--vera-warning-dark, #FA9F00)', - 'vera-warning-hover': 'var(--vera-warning-hover, #A64C03)', - 'vera-warning-hover-light': 'var(--vera-warning-hover-light, #A64C03)', - 'vera-warning-hover-dark': 'var(--vera-warning-hover-dark, #FACC4B)', - }, - fontFamily: { - 'vera-plain': [ - 'Inter', - 'sans-serif', - 'system-ui', - 'ui-sans-serif', - 'Marker Felt', - 'Trebuchet MS', - ], + '@media (min-width: 768px)': { + fontWeight: 'var(--vera-typography-caption-semibold-font-weight, 600)', }, - screens: { - 'vera-mobile': { - max: '767px', + }; + + addUtilities(fontSizeUtilities); + addUtilities(fontWeightUtilities); + }, + { + theme: { + extend: { + borderRadius: { + 'vera-extra-large': 'var(--vera-border-radius-extra-large, 24px)', + 'vera-extra-small': 'var(--vera-border-radius-extra-small, 2px)', + 'vera-large': 'var(--vera-border-radius-large, 12px)', + 'vera-medium': 'var(--vera-border-radius-medium, 8px)', + 'vera-none': 'var(--vera-border-radius-none, 0px)', + 'vera-small': 'var(--vera-border-radius-small, 4px)', + }, + colors: { + 'vera-accent': 'var(--vera-accent, #FFFFFF)', + 'vera-accent-light': 'var(--vera-accent-light, #FFFFFF)', + 'vera-accent-dark': 'var(--vera-accent-dark, #FFFFFF)', + 'vera-alert-background': 'var(--vera-alert-background, #FFEEF2)', + 'vera-alert-background-light': 'var(--vera-alert-background-light, #FFEEF2)', + 'vera-alert-background-dark': 'var(--vera-alert-background-dark, #3E0004)', + 'vera-alert-background-hover': 'var(--vera-alert-background-hover, #FEDFDF)', + 'vera-alert-background-hover-light': + 'var(--vera-alert-background-hover-light, #FEDFDF)', + 'vera-alert-background-hover-dark': 'var(--vera-alert-background-hover-dark, #6E0000)', + 'vera-alert-text': 'var(--vera-alert-text, #CD0000)', + 'vera-alert-text-light': 'var(--vera-alert-text-light, #CD0000)', + 'vera-alert-text-dark': 'var(--vera-alert-text-dark, #FEDFDF)', + 'vera-background': 'var(--vera-background, #F5F0FD)', + 'vera-background-light': 'var(--vera-background-light, #F5F0FD)', + 'vera-background-dark': 'var(--vera-background-dark, #26044D)', + 'vera-border': 'var(--vera-border, #E6E6E6)', + 'vera-border-light': 'var(--vera-border-light, #E6E6E6)', + 'vera-border-dark': 'var(--vera-border-dark, #333333)', + 'vera-dark-background': 'var(--vera-dark-background, #202124)', + 'vera-dark-background-light': 'var(--vera-dark-background-light, #202124)', + 'vera-dark-background-dark': 'var(--vera-dark-background-dark, #202124)', + 'vera-dark-grey': 'var(--vera-dark-grey, #333333)', + 'vera-dark-grey-light': 'var(--vera-dark-grey-light, #333333)', + 'vera-dark-grey-dark': 'var(--vera-dark-grey-dark, #333333)', + 'vera-dark-grey-hover': 'var(--vera-dark-grey-hover, #292828)', + 'vera-dark-grey-hover-light': 'var(--vera-dark-grey-hover-light, #292828)', + 'vera-dark-grey-hover-dark': 'var(--vera-dark-grey-hover-dark, #292828)', + 'vera-dark-grey-opacity': 'var(--vera-dark-grey-opacity, #333333CD)', + 'vera-dark-grey-opacity-light': 'var(--vera-dark-grey-opacity-light, #333333CD)', + 'vera-dark-grey-opacity-dark': 'var(--vera-dark-grey-opacity-dark, #333333CD)', + 'vera-disabled': 'var(--vera-disabled, #E6E6E6)', + 'vera-disabled-light': 'var(--vera-disabled-light, #E6E6E6)', + 'vera-disabled-dark': 'var(--vera-disabled-dark, #333333)', + 'vera-error': 'var(--vera-error, #E61D1D)', + 'vera-error-light': 'var(--vera-error-light, #E61D1D)', + 'vera-error-dark': 'var(--vera-error-dark, #F75959)', + 'vera-error-hover': 'var(--vera-error-hover, #CD0000)', + 'vera-error-hover-light': 'var(--vera-error-hover-light, #CD0000)', + 'vera-error-hover-dark': 'var(--vera-error-hover-dark, #FE9696)', + 'vera-information': 'var(--vera-information, #0276D5)', + 'vera-information-light': 'var(--vera-information-light, #0276D5)', + 'vera-information-dark': 'var(--vera-information-dark, #2997F0)', + 'vera-information-background': 'var(--vera-information-background, #E8F4FB)', + 'vera-information-background-light': + 'var(--vera-information-background-light, #E8F4FB)', + 'vera-information-background-dark': 'var(--vera-information-background-dark, #E8F4FB)', + 'vera-information-hover': 'var(--vera-information-hover, #2997F0)', + 'vera-information-hover-light': 'var(--vera-information-hover-light, #2997F0)', + 'vera-information-hover-dark': 'var(--vera-information-hover-dark, #0276D5)', + 'vera-on-accent': 'var(--vera-on-accent, #000000)', + 'vera-on-accent-light': 'var(--vera-on-accent-light, #000000)', + 'vera-on-accent-dark': 'var(--vera-on-accent-dark, #000000)', + 'vera-on-background': 'var(--vera-on-background, #757575)', + 'vera-on-background-light': 'var(--vera-on-background-light, #757575)', + 'vera-on-background-dark': 'var(--vera-on-background-dark, #B3B3B3)', + 'vera-on-dark-grey': 'var(--vera-on-dark-grey, #FFFFFF)', + 'vera-on-dark-grey-light': 'var(--vera-on-dark-grey-light, #FFFFFF)', + 'vera-on-dark-grey-dark': 'var(--vera-on-dark-grey-dark, #FFFFFF)', + 'vera-on-error': 'var(--vera-on-error, #FFFFFF)', + 'vera-on-error-light': 'var(--vera-on-error-light, #FFFFFF)', + 'vera-on-error-dark': 'var(--vera-on-error-dark, #000000)', + 'vera-on-information': 'var(--vera-on-information, #FFFFFF)', + 'vera-on-information-light': 'var(--vera-on-information-light, #FFFFFF)', + 'vera-on-information-dark': 'var(--vera-on-information-dark, #FFFFFF)', + 'vera-on-primary': 'var(--vera-on-primary, #FFFFFF)', + 'vera-on-primary-light': 'var(--vera-on-primary-light, #FFFFFF)', + 'vera-on-primary-dark': 'var(--vera-on-primary-dark, #000000)', + 'vera-on-secondary': 'var(--vera-on-secondary, #FFFFFF)', + 'vera-on-secondary-light': 'var(--vera-on-secondary-light, #FFFFFF)', + 'vera-on-secondary-dark': 'var(--vera-on-secondary-dark, #000000)', + 'vera-on-success': 'var(--vera-on-success, #FFFFFF)', + 'vera-on-success-light': 'var(--vera-on-success-light, #FFFFFF)', + 'vera-on-success-dark': 'var(--vera-on-success-dark, #000000)', + 'vera-on-surface': 'var(--vera-on-surface, #929292)', + 'vera-on-surface-light': 'var(--vera-on-surface-light, #929292)', + 'vera-on-surface-dark': 'var(--vera-on-surface-dark, #FFFFFF)', + 'vera-on-tertiary': 'var(--vera-on-tertiary, #FFFFFF)', + 'vera-on-tertiary-light': 'var(--vera-on-tertiary-light, #FFFFFF)', + 'vera-on-tertiary-dark': 'var(--vera-on-tertiary-dark, #000000)', + 'vera-on-warning': 'var(--vera-on-warning, #FFFFFF)', + 'vera-on-warning-light': 'var(--vera-on-warning-light, #FFFFFF)', + 'vera-on-warning-dark': 'var(--vera-on-warning-dark, #000000)', + 'vera-primary': 'var(--vera-primary, #9941FF)', + 'vera-primary-light': 'var(--vera-primary-light, #9941FF)', + 'vera-primary-dark': 'var(--vera-primary-dark, #B27BF2)', + 'vera-primary-hover': 'var(--vera-primary-hover, #871EFF)', + 'vera-primary-hover-light': 'var(--vera-primary-hover-light, #871EFF)', + 'vera-primary-hover-dark': 'var(--vera-primary-hover-dark, #CBA1FA)', + 'vera-secondary': 'var(--vera-secondary, #000000)', + 'vera-secondary-light': 'var(--vera-secondary-light, #000000)', + 'vera-secondary-dark': 'var(--vera-secondary-dark, #FFFFFF)', + 'vera-secondary-hover': 'var(--vera-secondary-hover, #666666)', + 'vera-secondary-hover-light': 'var(--vera-secondary-hover-light, #666666)', + 'vera-secondary-hover-dark': 'var(--vera-secondary-hover-dark, #929292)', + 'vera-skeleton-like': 'var(--vera-skeleton-like, #B3B3B3)', + 'vera-skeleton-like-light': 'var(--vera-skeleton-like-light, #B3B3B3)', + 'vera-skeleton-like-dark': 'var(--vera-skeleton-like-dark, #333333)', + 'vera-success': 'var(--vera-success, #1C8731)', + 'vera-success-light': 'var(--vera-success-light, #1C8731)', + 'vera-success-dark': 'var(--vera-success-dark, #30A849)', + 'vera-success-hover': 'var(--vera-success-hover, #1F7629)', + 'vera-success-hover-light': 'var(--vera-success-hover-light, #1F7629)', + 'vera-success-hover-dark': 'var(--vera-success-hover-dark, #53CA6A)', + 'vera-surface': 'var(--vera-surface, #FFFFFF)', + 'vera-surface-light': 'var(--vera-surface-light, #FFFFFF)', + 'vera-surface-dark': 'var(--vera-surface-dark, #000000)', + 'vera-tertiary': 'var(--vera-tertiary, #757575)', + 'vera-tertiary-light': 'var(--vera-tertiary-light, #757575)', + 'vera-tertiary-dark': 'var(--vera-tertiary-dark, #B3B3B3)', + 'vera-tertiary-hover': 'var(--vera-tertiary-hover, #929292)', + 'vera-tertiary-hover-light': 'var(--vera-tertiary-hover-light, #929292)', + 'vera-tertiary-hover-dark': 'var(--vera-tertiary-hover-dark, #B3B3B3)', + 'vera-text-disabled': 'var(--vera-text-disabled, #B3B3B3)', + 'vera-text-disabled-light': 'var(--vera-text-disabled-light, #B3B3B3)', + 'vera-text-disabled-dark': 'var(--vera-text-disabled-dark, #666666)', + 'vera-text-primary': 'var(--vera-text-primary, #9941FF)', + 'vera-text-primary-light': 'var(--vera-text-primary-light, #9941FF)', + 'vera-text-primary-dark': 'var(--vera-text-primary-dark, #B27BF2)', + 'vera-text-secondary': 'var(--vera-text-secondary, #000000)', + 'vera-text-secondary-light': 'var(--vera-text-secondary-light, #000000)', + 'vera-text-secondary-dark': 'var(--vera-text-secondary-dark, #FFFFFF)', + 'vera-text-tertiary': 'var(--vera-text-tertiary, #757575)', + 'vera-text-tertiary-light': 'var(--vera-text-tertiary-light, #757575)', + 'vera-text-tertiary-dark': 'var(--vera-text-tertiary-dark, #B3B3B3)', + 'vera-warning': 'var(--vera-warning, #BE5702)', + 'vera-warning-light': 'var(--vera-warning-light, #BE5702)', + 'vera-warning-dark': 'var(--vera-warning-dark, #FA9F00)', + 'vera-warning-hover': 'var(--vera-warning-hover, #A64C03)', + 'vera-warning-hover-light': 'var(--vera-warning-hover-light, #A64C03)', + 'vera-warning-hover-dark': 'var(--vera-warning-hover-dark, #FACC4B)', }, - 'vera-desktop': { - min: '768px', + fontFamily: { + 'vera-plain': [ + 'var(--vera-font-family-plain, Inter, sans-serif, system-ui, ui-sans-serif, Marker Felt, Trebuchet MS)', + ], + }, + screens: { + 'vera-mobile': { + max: '767px', + }, + 'vera-desktop': { + min: '768px', + }, }, }, }, - }, - } -); + } + ); +}; veraUI.safelist = ['vera-dark-mode']; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts new file mode 100644 index 00000000..d3033c75 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/helpers/veraUI.types.ts @@ -0,0 +1,244 @@ +export type VeraTypographyTokenKey = + | 'headline' + | 'subtitle' + | 'heading-1' + | 'heading-2' + | 'heading-3' + | 'heading-4' + | 'body-extended' + | 'body-extended-semibold' + | 'body-base' + | 'body-base-semibold' + | 'caption' + | 'caption-semibold'; + +type VeraTypographyPropertyKey = + | 'font-size' + | 'line-height' + | 'font-weight' + | 'mobile-font-size' + | 'mobile-line-height' + | 'mobile-font-weight'; + +export type VeraTypographyCssVariable = + `--vera-typography-${VeraTypographyTokenKey}-${VeraTypographyPropertyKey}`; + +export type VeraTypographyVariableNamesByToken = { + fontSize: VeraTypographyCssVariable; + lineHeight: VeraTypographyCssVariable; + fontWeight: VeraTypographyCssVariable; +}; + +export const veraTypographyCssVariableNames: Record< + VeraTypographyTokenKey, + VeraTypographyVariableNamesByToken +> = { + headline: { + fontSize: '--vera-typography-headline-font-size', + lineHeight: '--vera-typography-headline-line-height', + fontWeight: '--vera-typography-headline-font-weight', + }, + subtitle: { + fontSize: '--vera-typography-subtitle-font-size', + lineHeight: '--vera-typography-subtitle-line-height', + fontWeight: '--vera-typography-subtitle-font-weight', + }, + 'heading-1': { + fontSize: '--vera-typography-heading-1-font-size', + lineHeight: '--vera-typography-heading-1-line-height', + fontWeight: '--vera-typography-heading-1-font-weight', + }, + 'heading-2': { + fontSize: '--vera-typography-heading-2-font-size', + lineHeight: '--vera-typography-heading-2-line-height', + fontWeight: '--vera-typography-heading-2-font-weight', + }, + 'heading-3': { + fontSize: '--vera-typography-heading-3-font-size', + lineHeight: '--vera-typography-heading-3-line-height', + fontWeight: '--vera-typography-heading-3-font-weight', + }, + 'heading-4': { + fontSize: '--vera-typography-heading-4-font-size', + lineHeight: '--vera-typography-heading-4-line-height', + fontWeight: '--vera-typography-heading-4-font-weight', + }, + 'body-extended': { + fontSize: '--vera-typography-body-extended-font-size', + lineHeight: '--vera-typography-body-extended-line-height', + fontWeight: '--vera-typography-body-extended-font-weight', + }, + 'body-extended-semibold': { + fontSize: '--vera-typography-body-extended-semibold-font-size', + lineHeight: '--vera-typography-body-extended-semibold-line-height', + fontWeight: '--vera-typography-body-extended-semibold-font-weight', + }, + 'body-base': { + fontSize: '--vera-typography-body-base-font-size', + lineHeight: '--vera-typography-body-base-line-height', + fontWeight: '--vera-typography-body-base-font-weight', + }, + 'body-base-semibold': { + fontSize: '--vera-typography-body-base-semibold-font-size', + lineHeight: '--vera-typography-body-base-semibold-line-height', + fontWeight: '--vera-typography-body-base-semibold-font-weight', + }, + caption: { + fontSize: '--vera-typography-caption-font-size', + lineHeight: '--vera-typography-caption-line-height', + fontWeight: '--vera-typography-caption-font-weight', + }, + 'caption-semibold': { + fontSize: '--vera-typography-caption-semibold-font-size', + lineHeight: '--vera-typography-caption-semibold-line-height', + fontWeight: '--vera-typography-caption-semibold-font-weight', + }, +}; + +export type VeraLayoutCssVariable = + | '--vera-border-radius-none' + | '--vera-border-radius-extra-small' + | '--vera-border-radius-small' + | '--vera-border-radius-medium' + | '--vera-border-radius-large' + | '--vera-border-radius-extra-large'; +export type VeraFontCssVariable = '--vera-font-family-plain'; + +export type VeraColorCssVariable = + | '--vera-primary' + | '--vera-on-primary' + | '--vera-primary-dark' + | '--vera-primary-light' + | '--vera-primary-hover' + | '--vera-secondary' + | '--vera-on-secondary' + | '--vera-secondary-dark' + | '--vera-secondary-light' + | '--vera-tertiary' + | '--vera-on-tertiary' + | '--vera-tertiary-dark' + | '--vera-tertiary-light' + | '--vera-success' + | '--vera-on-success' + | '--vera-success-hover' + | '--vera-success-light' + | '--vera-warning' + | '--vera-on-warning' + | '--vera-warning-hover' + | '--vera-warning-light' + | '--vera-error' + | '--vera-on-error' + | '--vera-error-hover' + | '--vera-error-light' + | '--vera-background' + | '--vera-surface' + | '--vera-on-surface' + | '--vera-on-background' + | '--vera-text-primary' + | '--vera-text-secondary' + | '--vera-text-tertiary' + | '--vera-border' + | '--vera-disabled'; + +export type VeraCssVariable = + | VeraLayoutCssVariable + | VeraFontCssVariable + | VeraColorCssVariable + | VeraTypographyCssVariable; + +type VeraTypographyProperties = Partial<{ + fontSize: string; + lineHeight: string; + fontWeight: string; + mobileFontSize: string; + mobileLineHeight: string; + mobileFontWeight: string; +}>; + +type VeraColorProperties = Partial<{ + accent: string; + alertBackground: string; + alertBackgroundHover: string; + alertText: string; + background: string; + border: string; + darkBackground: string; + darkGrey: string; + darkGreyHover: string; + darkGreyOpacity: string; + disabled: string; + error: string; + errorHover: string; + information: string; + informationBackground: string; + informationHover: string; + onAccent: string; + onBackground: string; + onDarkGrey: string; + onError: string; + onInformation: string; + onPrimary: string; + onSecondary: string; + onSuccess: string; + onSurface: string; + onTertiary: string; + onWarning: string; + primary: string; + primaryHover: string; + secondary: string; + secondaryHover: string; + skeletonLike: string; + success: string; + successHover: string; + surface: string; + tertiary: string; + tertiaryHover: string; + textDisabled: string; + textPrimary: string; + textSecondary: string; + textTertiary: string; + warning: string; + warningHover: string; +}>; + +/** + * Configuration for the veraUI Tailwind plugin. + * Allows overriding design tokens for colors, typography, border radius, and font family. + * All tokens are optional and will fall back to design system defaults. + * + * @example + * // Using default values + * plugins: [veraUI()] + * + * @example + * // Overriding specific tokens + * plugins: [veraUI({ + * light: { primary: '#FF5733', accent: '#00FF00' }, + * dark: { primary: '#AA2211', accent: '#00AA00' }, + * borderRadiusMedium: '12px', + * headline: { fontSize: '5rem' }, + * })] + */ +export type VeraUIConfig = { + light?: VeraColorProperties; + dark?: VeraColorProperties; + borderRadiusNone?: string; + borderRadiusExtraSmall?: string; + borderRadiusSmall?: string; + borderRadiusMedium?: string; + borderRadiusLarge?: string; + borderRadiusExtraLarge?: string; + fontFamilyPlain?: string; + headline?: VeraTypographyProperties; + subtitle?: VeraTypographyProperties; + heading1?: VeraTypographyProperties; + heading2?: VeraTypographyProperties; + heading3?: VeraTypographyProperties; + heading4?: VeraTypographyProperties; + bodyExtended?: VeraTypographyProperties; + bodyExtendedSemibold?: VeraTypographyProperties; + bodyBase?: VeraTypographyProperties; + bodyBaseSemibold?: VeraTypographyProperties; + caption?: VeraTypographyProperties; + captionSemibold?: VeraTypographyProperties; +}; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts index c1ae9f7a..c5e6d940 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.test.ts @@ -8,7 +8,6 @@ describe('useSynchronizeThemeAndMedia', () => { }); it('should set initial light mode classes and subscribe to media changes', () => { - const setTokens = vi.fn(); const addEventListenerSpy = vi.fn(); const matchMediaMock = vi.fn().mockReturnValue({ matches: false, @@ -17,7 +16,7 @@ describe('useSynchronizeThemeAndMedia', () => { vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + renderHook(() => useSynchronizeThemeAndMedia()); expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(false); expect(document.documentElement.classList.contains('dark')).toBe(false); @@ -30,7 +29,6 @@ describe('useSynchronizeThemeAndMedia', () => { }); it('should set initial dark mode classes when media prefers dark', () => { - const setTokens = vi.fn(); const matchMediaMock = vi.fn().mockReturnValue({ matches: true, addEventListener: vi.fn(), @@ -38,41 +36,44 @@ describe('useSynchronizeThemeAndMedia', () => { vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + renderHook(() => useSynchronizeThemeAndMedia()); expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(true); expect(document.documentElement.classList.contains('dark')).toBe(true); }); - it('should call setTokens when media query changes', () => { - const setTokens = vi.fn(); - let changeHandler: (() => void) | undefined; + it('should synchronize classes when media query changes', () => { + let isDarkModeEnabled = false; + let changeHandler: ((event: MediaQueryListEvent) => void) | undefined; const addEventListenerSpy = vi.fn((event, handler) => { if (event === 'change') { changeHandler = handler; } }); - const matchMediaMock = vi.fn().mockReturnValue({ - matches: false, + const matchMediaMock = vi.fn().mockImplementation(() => ({ + matches: isDarkModeEnabled, addEventListener: addEventListenerSpy, - }); + })); vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + renderHook(() => useSynchronizeThemeAndMedia()); - // Change to dark mode - matchMediaMock.mockReturnValue({ matches: true, addEventListener: vi.fn() }); - changeHandler!(); + isDarkModeEnabled = true; + changeHandler!({ matches: true } as MediaQueryListEvent); - expect(setTokens).toHaveBeenCalled(); expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(true); expect(document.documentElement.classList.contains('dark')).toBe(true); + + isDarkModeEnabled = false; + changeHandler!({ matches: false } as MediaQueryListEvent); + + expect(document.documentElement.classList.contains('vera-dark-mode')).toBe(false); + expect(document.documentElement.classList.contains('dark')).toBe(false); }); it('should cleanup by aborting the controller', () => { - const setTokens = vi.fn(); const abortController = new AbortController(); const abortSpy = vi.spyOn(abortController, 'abort'); const addEventListenerSpy = vi.fn(); @@ -86,7 +87,7 @@ describe('useSynchronizeThemeAndMedia', () => { vi.spyOn(window, 'matchMedia').mockImplementation(matchMediaMock); - const { unmount } = renderHook(() => useSynchronizeThemeAndMedia({ setTokens })); + const { unmount } = renderHook(() => useSynchronizeThemeAndMedia()); unmount(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts index 2005695b..2fdb3eca 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia.ts @@ -1,17 +1,10 @@ -import React from 'react'; import isDarkMode from '../../helpers/isDarkMode'; -import getTokensByMode from '../../helpers/getTokensByMode'; -import type { Theme } from '@ui/theme'; import useStableRef from '@web/hooks/useStableRef'; import useMountEffect from '@web/hooks/useMountEffect'; const VERA_DARK_MODE_CLASSES = ['vera-dark-mode', 'dark']; -const useSynchronizeThemeAndMedia = ({ - setTokens, -}: { - setTokens: React.Dispatch>; -}) => { +const useSynchronizeThemeAndMedia = () => { const modeRef = useStableRef<'light' | 'dark'>(isDarkMode() ? 'dark' : 'light'); useMountEffect(() => { @@ -26,20 +19,19 @@ const useSynchronizeThemeAndMedia = ({ if (mode === 'dark') { documentElement.classList.add(...VERA_DARK_MODE_CLASSES); - } else { - documentElement.classList.remove(...VERA_DARK_MODE_CLASSES); + return; } + + documentElement.classList.remove(...VERA_DARK_MODE_CLASSES); }; const toggleTheme = () => { const newMode = isDarkMode() ? 'dark' : 'light'; const didChange = modeRef.current !== newMode; - if (!didChange) { - return; - } + if (!didChange) return; - setTokens(getTokensByMode(newMode)); + modeRef.current = newMode; setDocumentMode(newMode); }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts deleted file mode 100644 index 9c47c391..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './useTheme'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx deleted file mode 100644 index 7cddddce..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { renderHook } from '@testing-library/react'; -import { ReactNode } from 'react'; -import { describe, it, expect } from 'vitest'; -import { ThemeProvider } from '../../themeContext'; -import useTheme from '.'; - -describe('useTheme', () => { - it('should return colors object with all color tokens', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(result.current.colors).toBeDefined(); - expect(result.current.colors.primary).toBeDefined(); - expect(result.current.colors.secondary).toBeDefined(); - expect(result.current.colors.tertiary).toBeDefined(); - expect(result.current.colors.background).toBeDefined(); - expect(result.current.colors.surface).toBeDefined(); - expect(result.current.colors.error).toBeDefined(); - expect(result.current.colors.warning).toBeDefined(); - expect(result.current.colors.success).toBeDefined(); - }); - - it('should return shapes object with all border radius tokens', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(result.current.shapes).toBeDefined(); - expect(result.current.shapes.borderRadiusNone).toBeDefined(); - expect(result.current.shapes.borderRadiusExtraSmall).toBeDefined(); - expect(result.current.shapes.borderRadiusSmall).toBeDefined(); - expect(result.current.shapes.borderRadiusMedium).toBeDefined(); - expect(result.current.shapes.borderRadiusLarge).toBeDefined(); - expect(result.current.shapes.borderRadiusExtraLarge).toBeDefined(); - }); - - it('should return numeric values for border radius', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(typeof result.current.shapes.borderRadiusNone).toBe('string'); - expect(typeof result.current.shapes.borderRadiusMedium).toBe('string'); - }); - - it('should return hex color strings', () => { - const wrapper = ({ children }: { children: ReactNode }) => ( - {children} - ); - - const { result } = renderHook(() => useTheme(), { wrapper }); - - expect(typeof result.current.colors.primary).toBe('string'); - expect(result.current.colors.primary).toMatch(/^#[0-9A-F]{6}$/i); - }); -}); diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts deleted file mode 100644 index 56a01e46..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/hooks/useTheme/useTheme.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useContext } from 'react'; -import themeContext from '../../themeContext'; - -const useTheme = () => { - const customTheme = useContext(themeContext); - - if (!customTheme) { - throw new Error('useTheme must be used within a ThemeProvider'); - } - - return customTheme; -}; - -export default useTheme; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts index ee3dbf4a..0d643b30 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/index.ts @@ -1,3 +1,2 @@ -export type * from './themeContext.types'; -export { ThemeProvider } from './themeContext'; -export { default } from './hooks/useTheme'; +export type * from './ThemeProvider.types'; +export { ThemeProvider, type ThemeProviderProps } from './ThemeProvider'; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx deleted file mode 100644 index 489019ad..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/src/theme/themeContext.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { ThemeProvider as ThemeProviderBase, CssBaseline } from '@mui/material'; -import React, { PropsWithChildren, useMemo, useState } from 'react'; -import getTokensByMode from './helpers/getTokensByMode'; -import isDarkMode from './helpers/isDarkMode'; -import useSynchronizeThemeAndMedia from './hooks/useSynchronizeThemeAndMedia/useSynchronizeThemeAndMedia'; -import getMuiCustomTheme, { GetMuiCustomThemeProps } from './helpers/getMuiCustomTheme'; -import Theme, { PartialTheme } from './themeContext.types'; -import { mergeThemeConfigurations } from './helpers/mergeThemeConfigurations'; - -const defaultLightValue: Theme = getTokensByMode('light'); -const defaultDarkValue: Theme = getTokensByMode('dark'); - -const themeContext = React.createContext(defaultLightValue); - -export type ThemeProviderPropsBase = { - theme?: { - lightMode: PartialTheme; - darkMode?: PartialTheme; - base?: Omit; - }; -}; - -export type ThemeProviderProps = PropsWithChildren; - -export const ThemeProvider: React.FC = ({ children, theme }) => { - const themeSource: { - light: Theme; - dark: Theme; - } = useMemo(() => { - return { - light: mergeThemeConfigurations({ - defaultValue: defaultLightValue, - overrides: theme?.lightMode ?? {}, - }), - dark: mergeThemeConfigurations({ - defaultValue: defaultDarkValue, - overrides: theme?.darkMode ?? {}, - }), - }; - }, [theme]); - - const [tokens, setTokens] = useState(() => { - return isDarkMode() ? themeSource.dark : themeSource.light; - }); - - const muiTheme = useMemo( - () => getMuiCustomTheme({ ...theme?.base, tokens }), - [tokens, theme?.base] - ); - - useSynchronizeThemeAndMedia({ setTokens }); - - return ( - - - {children} - - ); -}; - -export default themeContext; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs index 22902029..4d98b088 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tailwind.config.cjs @@ -1,5 +1,7 @@ // eslint-disable-next-line @typescript-eslint/no-require-imports const veraUI = require('./src/theme/helpers/tailwind/veraUI.cjs'); +// eslint-disable-next-line @typescript-eslint/no-require-imports +const designTokens = require('../../designTokens.json'); const config = { darkMode: 'class', @@ -15,7 +17,7 @@ const config = { }, // classes to always allow even if not found in files safelist: [...veraUI.safelist], - plugins: [veraUI], + plugins: [veraUI(designTokens)], }; module.exports = config; diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json index 2f37cdc0..ff69e0e3 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.json @@ -19,7 +19,13 @@ "@web-test": ["../common/testBrowser"], "@web-test/*": ["../common/testBrowser/*"], "@core": ["../core/src"], - "@core/*": ["../core/src/*"] + "@core/*": ["../core/src/*"], + "@core-test": ["../core/test"], + "@core-test/*": ["../core/test/*"], + + // video-router paths (this is just for linter and types) + "@api-lib/*": ["../api/src/*"], + "@node/*": ["../common/srcNode/*"] }, "lib": ["DOM", "DOM.Iterable", "ESNext"] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json index 8399b3f7..d6183c3e 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.lib.json @@ -22,7 +22,18 @@ "../common/testBrowser/**/*.ts", "../common/testBrowser/**/*.tsx", "../core/src/**/*.ts", - "../core/src/**/*.tsx" + "../core/src/**/*.tsx", + + // video-router(this is just for linter and types) + "../api/src/**/*.ts", + "../common/srcNode/**/*.ts" ], - "exclude": ["**/*.spec.*", "**/*.test.*"] + "exclude": [ + "**/*.spec.*", + "**/*.test.*", + "../api/**/*.test.*", + "../api/**/*.spec.*", + "../core/**/*.test.*", + "../core/**/*.spec.*" + ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json index 225d06b0..b08c0035 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/tsconfig.spec.json @@ -19,6 +19,8 @@ "src/**/*.ts", "src/**/*.tsx", "../common/test/**/*.ts", + "../common/testBrowser/**/*.ts", + "../common/srcBrowser/**/*.ts", "../core/src/**/*.ts" ] } diff --git a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts index 00ae86c3..87a4c343 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/libs/ui/vite.config.ts @@ -60,6 +60,13 @@ export default defineConfig(() => ({ reportsDirectory: './coverage', provider: 'v8' as const, reporter: ['text', 'lcov'], + allowExternal: true, + include: [ + `${path.resolve(__dirname, 'src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/src')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../common/srcBrowser')}/**/*.{ts,tsx}`, + `${path.resolve(__dirname, '../core/src')}/**/*.{ts,tsx}`, + ], exclude: ['test/**', '**/index.ts'], }, }, diff --git a/tutorials/vonage_video_react_app-feature-config/project/nx.json b/tutorials/vonage_video_react_app-feature-config/project/nx.json index acad1a99..d2d54ed9 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/nx.json +++ b/tutorials/vonage_video_react_app-feature-config/project/nx.json @@ -93,5 +93,6 @@ "unitTestRunner": "jest" } } - } + }, + "analytics": false } diff --git a/tutorials/vonage_video_react_app-feature-config/project/package-lock.json b/tutorials/vonage_video_react_app-feature-config/project/package-lock.json new file mode 100644 index 00000000..b7909b61 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/package-lock.json @@ -0,0 +1,26680 @@ +{ + "name": "vonage-video-react-app", + "version": "1.4.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vonage-video-react-app", + "version": "1.4.2", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@emotion/css": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.1", + "@mui/icons-material": "9.0.0", + "@mui/material": "9.0.0", + "@tanstack/react-query": "5.99.0", + "@trpc/client": "11.11.0", + "@trpc/server": "11.11.0", + "@vonage/auth": "1.14.0", + "@vonage/client-sdk-video": "2.34.0", + "@vonage/server-sdk": "3.25.1", + "@vonage/vcr-sdk": "1.3.0", + "@vonage/video": "1.26.1", + "@vonage/video-client-network-test": "5.0.0", + "@vonage/vivid": "5.15.1", + "autolinker": "4.1.5", + "axios": "1.16.0", + "body-parser": "1.20.4", + "classnames": "2.5.1", + "cors": "2.8.6", + "dotenv": "16.6.1", + "easy-cancelable-promise": "2.0.1", + "events": "3.3.0", + "express": "4.22.1", + "form-data": "4.0.5", + "i18next": "25.8.8", + "i18next-browser-languagedetector": "8.2.1", + "json-storage-formatter": "3.0.2", + "jsonwebtoken": "9.0.3", + "motion": "12.38.0", + "normalize-range": "0.1.2", + "opentok": "2.22.0", + "opentok-jwt": "0.1.5", + "opentok-layout-js": "5.5.0", + "opentok-solutions-logging": "1.1.5", + "react": "19.2.4", + "react-dom": "19.2.4", + "react-global-state-hooks": "15.0.15", + "react-i18next": "15.7.4", + "react-router-dom": "6.30.3", + "react-syntax-highlighter": "16.1.1", + "resize-observer-polyfill": "1.5.1", + "status-code-enum": "1.0.0", + "tailwind-merge": "3.4.1", + "tailwind-variants": "3.2.2", + "ua-parser-js": "1.0.41", + "uuid": "9.0.1", + "zod": "4.3.6" + }, + "devDependencies": { + "@cspell/eslint-plugin": "9.6.4", + "@eslint/js": "9.39.2", + "@jest/globals": "29.7.0", + "@nx/eslint": "22.0.1", + "@nx/eslint-plugin": "22.5.1", + "@nx/jest": "22.0.1", + "@nx/js": "22.0.1", + "@nx/node": "22.0.1", + "@nx/react": "22.5.1", + "@nx/vite": "22.5.1", + "@playwright/test": "1.46.0", + "@rollup/plugin-replace": "5.0.7", + "@storybook/react": "10.3.5", + "@storybook/react-vite": "10.3.5", + "@tailwindcss/vite": "4.1.18", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/react": "16.3.0", + "@testing-library/user-event": "14.6.1", + "@types/body-parser": "1.19.6", + "@types/cors": "2.8.19", + "@types/express": "4.17.25", + "@types/jest": "29.5.14", + "@types/jsonwebtoken": "9.0.10", + "@types/node": "20.19.9", + "@types/opentok": "2.14.4", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@types/react-syntax-highlighter": "15.5.13", + "@types/supertest": "6.0.3", + "@types/ua-parser-js": "0.7.39", + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@vitejs/plugin-react": "5.1.4", + "@vitejs/plugin-react-swc": "4.2.3", + "@vitest/coverage-v8": "1.6.1", + "@vitest/ui": "1.6.1", + "concurrently": "9.2.1", + "copy-webpack-plugin": "13.0.1", + "eslint": "8.57.1", + "eslint-config-prettier": "10.1.8", + "eslint-import-resolver-node": "0.3.9", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-filename-rules": "1.3.1", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-jsx-a11y": "6.10.1", + "eslint-plugin-prettier": "5.5.5", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-refresh": "0.4.26", + "eslint-plugin-tailwindcss": "4.0.0-beta.0", + "husky": "9.1.7", + "jest": "29.7.0", + "jiti": "2.4.2", + "jsdom": "22.1.0", + "license-checker": "25.0.1", + "minimatch": "10.2.0", + "nodemon": "3.1.11", + "nx": "22.5.1", + "prettier": "3.8.1", + "storybook": "10.3.5", + "supertest": "7.2.2", + "tailwindcss": "4.1.18", + "terser": "5.46.0", + "ts-jest": "29.4.6", + "ts-loader": "9.5.4", + "tslib": "2.8.1", + "tsx": "4.21.0", + "typedoc": "0.26.11", + "typescript": "5.9.3", + "typescript-eslint": "8.55.0", + "vite": "5.4.21", + "vite-plugin-checker": "0.11.0", + "vite-plugin-dts": "4.5.4", + "vitest": "1.6.1", + "webpack": "5.105.2", + "webpack-cli": "6.0.1" + }, + "engines": { + "node": ">=22.x", + "npm": "9.x" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.10", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.11", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.28", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.17", + "@cspell/dict-filetypes": "^3.0.15", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.8", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^5.0.0", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.14", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.32", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.15", + "@cspell/dict-python": "^4.2.25", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.0", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.1.20", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-performance-monitor": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^4.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/dict-ada": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-al": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-aws": { + "version": "4.0.17", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-bash": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-shell": "1.1.2" + } + }, + "node_modules/@cspell/dict-companies": { + "version": "3.2.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-cpp": { + "version": "7.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-cryptocurrencies": { + "version": "5.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-csharp": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-css": { + "version": "4.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-dart": { + "version": "2.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-data-science": { + "version": "2.0.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-django": { + "version": "4.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-docker": { + "version": "1.1.17", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-dotnet": { + "version": "5.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-elixir": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-en_us": { + "version": "4.4.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-en-common-misspellings": { + "version": "2.1.12", + "dev": true, + "license": "CC BY-SA 4.0" + }, + "node_modules/@cspell/dict-en-gb-mit": { + "version": "3.1.18", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-filetypes": { + "version": "3.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-flutter": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fonts": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fsharp": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-fullstack": { + "version": "3.2.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-gaming-terms": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-git": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-golang": { + "version": "6.0.26", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-google": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-haskell": { + "version": "4.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-html": { + "version": "4.0.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-html-symbol-entities": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-java": { + "version": "5.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-julia": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-k8s": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-kotlin": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-latex": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-lorem-ipsum": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-lua": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-makefile": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-markdown": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cspell/dict-css": "^4.0.19", + "@cspell/dict-html": "^4.0.14", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-typescript": "^3.2.3" + } + }, + "node_modules/@cspell/dict-monkeyc": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-node": { + "version": "5.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-npm": { + "version": "5.2.34", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-php": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-powershell": { + "version": "5.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-public-licenses": { + "version": "2.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-python": { + "version": "4.2.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-data-science": "^2.0.13" + } + }, + "node_modules/@cspell/dict-r": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-ruby": { + "version": "5.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-rust": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-scala": { + "version": "5.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-shell": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-software-terms": { + "version": "5.1.21", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-sql": { + "version": "2.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-svelte": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-swift": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-terraform": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-typescript": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-vue": { + "version": "3.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspell/dynamic-import": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.4", + "import-meta-resolve": "^4.2.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/eslint-plugin": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.4", + "@cspell/url": "9.6.4", + "cspell-lib": "9.6.4", + "synckit": "^0.11.12" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "eslint": "^7 || ^8 || ^9" + } + }, + "node_modules/@cspell/filetypes": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/rpc": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/strong-weak-map": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/url": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/css": { + "version": "11.13.5", + "license": "MIT", + "dependencies": { + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/console/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/reporters": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/core/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/environment/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/pattern/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/console": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/test-result": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/transform": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jest/reporters/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/@jest/reporters/node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/snapshot-utils/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/snapshot-utils/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@jest/types/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^13.0.1", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/glob": { + "version": "13.0.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.0", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/lru-cache": { + "version": "11.2.6", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/path-scurry": { + "version": "2.0.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.56.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.32.2", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.21.0", + "@rushstack/ts-command-line": "5.2.0", + "diff": "~8.0.2", + "lodash": "~4.17.23", + "minimatch": "10.1.2", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.32.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.0", + "@rushstack/node-core-library": "5.19.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/minimatch": { + "version": "10.1.2", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@microsoft/fast-element": { + "version": "2.8.3", + "license": "MIT" + }, + "node_modules/@microsoft/fast-web-utilities": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "exenv-es6": "^1.1.1" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.21.6", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/bridge-react-webpack-plugin/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/cli": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/sdk": "0.21.6", + "chalk": "3.0.0", + "commander": "11.1.0", + "jiti": "2.4.2" + }, + "bin": { + "mf": "bin/mf.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@module-federation/cli/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/cli/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/data-prefetch": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.6", + "@module-federation/sdk": "0.21.6", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@module-federation/data-prefetch/node_modules/@module-federation/runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/data-prefetch/node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/dts-plugin": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/sdk": "0.21.6", + "@module-federation/third-party-dts-extractor": "0.21.6", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.12.0", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "3.0.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/dts-plugin/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/enhanced": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.6", + "@module-federation/cli": "0.21.6", + "@module-federation/data-prefetch": "0.21.6", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/error-codes": "0.21.6", + "@module-federation/inject-external-runtime-core-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/manifest": "0.21.6", + "@module-federation/rspack": "0.21.6", + "@module-federation/runtime-tools": "0.21.6", + "@module-federation/sdk": "0.21.6", + "btoa": "^1.2.1", + "schema-utils": "^4.3.0", + "upath": "2.0.1" + }, + "bin": { + "mf": "bin/mf.js" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/error-codes": { + "version": "0.21.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@module-federation/runtime-tools": "0.21.6" + } + }, + "node_modules/@module-federation/managers": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.21.6", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/manifest": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/sdk": "0.21.6", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/manifest/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/manifest/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/node": { + "version": "2.7.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/enhanced": "2.0.1", + "@module-federation/runtime": "2.0.1", + "@module-federation/sdk": "2.0.1", + "btoa": "1.2.1", + "encoding": "^0.1.13", + "node-fetch": "2.7.0" + }, + "peerDependencies": { + "webpack": "^5.40.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/bridge-react-webpack-plugin": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "2.0.1", + "@types/semver": "7.5.8", + "semver": "7.6.3" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/cli": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/sdk": "2.0.1", + "chalk": "3.0.0", + "commander": "11.1.0", + "jiti": "2.4.2" + }, + "bin": { + "mf": "bin/mf.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/data-prefetch": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "2.0.1", + "@module-federation/sdk": "2.0.1", + "fs-extra": "9.1.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/dts-plugin": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/sdk": "2.0.1", + "@module-federation/third-party-dts-extractor": "2.0.1", + "adm-zip": "^0.5.10", + "ansi-colors": "^4.1.3", + "axios": "^1.12.0", + "chalk": "3.0.0", + "fs-extra": "9.1.0", + "isomorphic-ws": "5.0.0", + "koa": "3.0.3", + "lodash.clonedeepwith": "4.5.0", + "log4js": "6.9.1", + "node-schedule": "2.1.1", + "rambda": "^9.1.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/enhanced": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "2.0.1", + "@module-federation/cli": "2.0.1", + "@module-federation/data-prefetch": "2.0.1", + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/error-codes": "2.0.1", + "@module-federation/inject-external-runtime-core-plugin": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/manifest": "2.0.1", + "@module-federation/rspack": "2.0.1", + "@module-federation/runtime-tools": "2.0.1", + "@module-federation/sdk": "2.0.1", + "btoa": "^1.2.1", + "schema-utils": "^4.3.0", + "upath": "2.0.1" + }, + "bin": { + "mf": "bin/mf.js" + }, + "peerDependencies": { + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/error-codes": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/node/node_modules/@module-federation/inject-external-runtime-core-plugin": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@module-federation/runtime-tools": "2.0.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/managers": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "2.0.1", + "find-pkg": "2.0.0", + "fs-extra": "9.1.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/manifest": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/sdk": "2.0.1", + "chalk": "3.0.0", + "find-pkg": "2.0.0" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/rspack": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "2.0.1", + "@module-federation/dts-plugin": "2.0.1", + "@module-federation/inject-external-runtime-core-plugin": "2.0.1", + "@module-federation/managers": "2.0.1", + "@module-federation/manifest": "2.0.1", + "@module-federation/runtime-tools": "2.0.1", + "@module-federation/sdk": "2.0.1", + "btoa": "1.2.1" + }, + "peerDependencies": { + "@rspack/core": "^0.7.0 || ^1.0.0 || ^2.0.0-0", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/runtime-tools": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "2.0.1", + "@module-federation/webpack-bundler-runtime": "2.0.1" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/sdk": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/node/node_modules/@module-federation/third-party-dts-extractor": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/node/node_modules/@module-federation/webpack-bundler-runtime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "2.0.1", + "@module-federation/sdk": "2.0.1" + } + }, + "node_modules/@module-federation/node/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/node/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@module-federation/node/node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@module-federation/node/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@module-federation/rspack": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "0.21.6", + "@module-federation/dts-plugin": "0.21.6", + "@module-federation/inject-external-runtime-core-plugin": "0.21.6", + "@module-federation/managers": "0.21.6", + "@module-federation/manifest": "0.21.6", + "@module-federation/runtime-tools": "0.21.6", + "@module-federation/sdk": "0.21.6", + "btoa": "1.2.1" + }, + "peerDependencies": { + "@rspack/core": ">=0.7", + "typescript": "^4.9.0 || ^5.0.0", + "vue-tsc": ">=1.0.24" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/@module-federation/runtime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "2.0.1", + "@module-federation/runtime-core": "2.0.1", + "@module-federation/sdk": "2.0.1" + } + }, + "node_modules/@module-federation/runtime-core": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "2.0.1", + "@module-federation/sdk": "2.0.1" + } + }, + "node_modules/@module-federation/runtime-core/node_modules/@module-federation/error-codes": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime-core/node_modules/@module-federation/sdk": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.6", + "@module-federation/webpack-bundler-runtime": "0.21.6" + } + }, + "node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/runtime-tools/node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/runtime/node_modules/@module-federation/error-codes": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime/node_modules/@module-federation/sdk": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/sdk": { + "version": "0.21.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/third-party-dts-extractor": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "find-pkg": "2.0.0", + "fs-extra": "9.1.0", + "resolve": "1.22.8" + } + }, + "node_modules/@module-federation/third-party-dts-extractor/node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/runtime": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/runtime-core": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime/node_modules/@module-federation/runtime-core": { + "version": "0.21.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.21.6", + "@module-federation/sdk": "0.21.6" + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^9.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.0.0", + "@mui/system": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.4", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.0.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.2.5", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.0.0", + "@mui/styled-engine": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.0", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.0.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.2.5", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@napi-rs/wasm-runtime/node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nx/devkit": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "10.1.1", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/docker": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "enquirer": "~2.3.6", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/docker/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/docker/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/eslint": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "@nx/js": "22.0.1", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "typescript": "~5.9.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "@typescript-eslint/type-utils": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "globals": "^15.9.0", + "jsonc-eslint-parser": "^2.1.0", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.13.2 || ^7.0.0 || ^8.0.0", + "eslint-config-prettier": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/eslint-plugin/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/globals": { + "version": "15.15.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/eslint-plugin/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/eslint/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/eslint/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/reporters": "^30.0.2", + "@jest/test-result": "^30.0.2", + "@nx/devkit": "22.0.1", + "@nx/js": "22.0.1", + "@phenomnomnominal/tsquery": "~5.0.1", + "identity-obj-proxy": "3.0.0", + "jest-config": "^30.0.2", + "jest-resolve": "^30.0.2", + "jest-util": "^30.0.2", + "minimatch": "9.0.3", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/jest/node_modules/@jest/console": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/environment": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/fake-timers": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/globals": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/source-map": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/test-result": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/transform": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/jest/node_modules/@phenomnomnominal/tsquery": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.4.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@nx/jest/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@nx/jest/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@nx/jest/node_modules/@types/node/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nx/jest/node_modules/babel-jest": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/@nx/jest/node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nx/jest/node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/babel-preset-jest": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/@nx/jest/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/jest/node_modules/cjs-module-lexer": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/expect": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/jest-circus": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-config": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/@nx/jest/node_modules/jest-each": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-environment-node": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/@nx/jest/node_modules/jest-leak-detector": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-message-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-runner": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-runtime": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-snapshot": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-watcher": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@nx/jest/node_modules/pure-rand": { + "version": "7.0.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@nx/jest/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/jest/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nx/jest/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/js": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.0.1", + "@nx/workspace": "22.0.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.5.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/js/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/js/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/js/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/js/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/module-federation": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/enhanced": "^0.21.2", + "@module-federation/node": "^2.7.21", + "@module-federation/sdk": "^0.21.2", + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@nx/web": "22.5.1", + "@rspack/core": "1.6.8", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "picocolors": "^1.1.0", + "tslib": "^2.3.0", + "webpack": "^5.101.3" + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/module-federation/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/module-federation/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/module-federation/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/node": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "@nx/docker": "22.0.1", + "@nx/eslint": "22.0.1", + "@nx/jest": "22.0.1", + "@nx/js": "22.0.1", + "kill-port": "^1.6.1", + "tcp-port-used": "^1.0.2", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/node/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/node/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "22.5.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.5.1.tgz", + "integrity": "sha512-81Lb7+rp3Qltpgy33Kc1qxk+8IWqZLhqvdLdRFSVV1FN1pPSJDFKyPjCn9oMpRryNPSJ8DgZDpfIaVVyP85rUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.5.1.tgz", + "integrity": "sha512-Ig8yQN3lSz9R+Zf3NQWcvEnIzwDX4NSeaFtEliPnC3OHlQXGNXbOUfkExa0U0UUgyxa4rgnCgefmwuc12H9q2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.5.1.tgz", + "integrity": "sha512-C7tGoLnR9MjKLJsLMF2VsKcDChPiygAsw6dSVgU4B650H7sBWmkEHM/QjvyRvkcZuoQBDamS/eVs/UaJu9wNhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.5.1.tgz", + "integrity": "sha512-GNxei+lwhzhrO9m+nNkibgxLhbkYKyFXPSRpOKLwv9VavNzJn5UmLfKJyhjNQPBOSYuNhiVPbU1Ja/qOBcozYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.5.1.tgz", + "integrity": "sha512-VDJtdJP2nCgS8ommbfWFAKjoZCE51VH7tZyIfh8RFI5fxwoB3Pk6d6f6cmNHI/1t98YI3V7Onuf3Y9KBkYtyfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.5.1.tgz", + "integrity": "sha512-BZ/i+KTplEJmE8ZHKgPGD513Zl86DuSGyRAvbDZ7Qf19Tei7Of6vxW+ypvVDIwmDbyXfe13u54M5gDt8iiqFGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.5.1.tgz", + "integrity": "sha512-e0VdiV6fe88Dbhill2gUjYAD9jMhHjYsafGOPR+/uaGMAYPoI1jKur6uPGY+ik6fvwvDFFl0VT2+HACKVn7RoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.5.1.tgz", + "integrity": "sha512-3vWZO9y7uHKeyepcU55pE8VQTKGome3mLdicvx1TCoKKl0cA3bTR341Jdo2Zl4Waa2ENk7pGQbLWRQ3ZkaA92A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "22.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.5.1.tgz", + "integrity": "sha512-4e5LduuhpBx96JgD1J3fHUGCwC+/lL+tvXp3UVtjh/AOdINGsyI+scinT3uaI9vcB5GKBcybTxbBZzwcH50w9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/react": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/eslint": "22.5.1", + "@nx/js": "22.5.1", + "@nx/module-federation": "22.5.1", + "@nx/rollup": "22.5.1", + "@nx/web": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "@svgr/webpack": "^8.0.1", + "express": "^4.21.2", + "http-proxy-middleware": "^3.0.5", + "minimatch": "10.1.1", + "picocolors": "^1.1.0", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "@nx/vite": "22.5.1" + } + }, + "node_modules/@nx/react/node_modules/@nx/eslint": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "typescript": "~5.9.2" + }, + "peerDependencies": { + "@zkochan/js-yaml": "0.0.7", + "eslint": "^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "@zkochan/js-yaml": { + "optional": true + } + } + }, + "node_modules/@nx/react/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/react/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/react/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/react/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/react/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/rollup": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-image": "^3.0.3", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^12.1.0", + "autoprefixer": "^10.4.9", + "concat-with-sourcemaps": "^1.1.0", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "postcss": "^8.4.38", + "postcss-modules": "^6.0.1", + "rollup": "^4.14.0", + "rollup-plugin-typescript2": "^0.36.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/rollup/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/rollup/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/rollup/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/rollup/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/vite": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@nx/vitest": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "ajv": "^8.0.0", + "enquirer": "~2.3.6", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/@nx/vite/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/vite/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/vite/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/vite/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/vitest": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "@phenomnomnominal/tsquery": "~6.1.4", + "semver": "^7.6.3", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vitest": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@nx/vitest/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/vitest/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/vitest/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/vitest/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/web": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@nx/js": "22.5.1", + "detect-port": "^1.5.1", + "http-server": "^14.1.0", + "picocolors": "^1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nx/web/node_modules/@nx/js": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-proposal-decorators": "^7.22.7", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@nx/devkit": "22.5.1", + "@nx/workspace": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "^4.1.0", + "columnify": "^1.6.0", + "detect-port": "^1.5.1", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "jsonc-parser": "3.2.0", + "npm-run-path": "^4.0.1", + "picocolors": "^1.1.0", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "source-map-support": "0.5.19", + "tinyglobby": "^0.2.12", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "verdaccio": "^6.0.5" + }, + "peerDependenciesMeta": { + "verdaccio": { + "optional": true + } + } + }, + "node_modules/@nx/web/node_modules/@nx/workspace": { + "version": "22.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.5.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.5.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/web/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@nx/web/node_modules/source-map-support": { + "version": "0.5.19", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nx/workspace": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nx/devkit": "22.0.1", + "@zkochan/js-yaml": "0.0.7", + "chalk": "^4.1.0", + "enquirer": "~2.3.6", + "nx": "22.0.1", + "picomatch": "4.0.2", + "semver": "^7.6.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/devkit": { + "version": "22.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@zkochan/js-yaml": "0.0.7", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 21 <= 23 || ^22.0.0-0" + } + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-darwin-arm64": { + "version": "22.0.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-darwin-x64": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.0.1.tgz", + "integrity": "sha512-W5MAiesTGSVwYRoQa2WHARiEolqhioMwa8p1/gdQePb4LmM2ZdNOj6emVJYUecql6kt+ptHeO4bYaFc8n+XLEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-freebsd-x64": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.0.1.tgz", + "integrity": "sha512-3n7nzFmRtUvfnP5rtJtaSqv9MxRTXe3RnwXF9N1oXE3gYmGJZXCo8cIYNzrt8oTeWxRUDTm/leJQnQ/aC7/v0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.0.1.tgz", + "integrity": "sha512-4cTCWWa4yonTE1lrH+1bX3urozJjVr0xjHysBktwc1W8VNg65oA6p29yC1FDZcTBgo9rY/y/1WIL1E61y64BgA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.0.1.tgz", + "integrity": "sha512-cC61gqNy+Z3DBr8FBWysLCnIEPbrSxWU/GtnVWH/4r4fMzDlaQwl51g8nm2KCtQXOgyqyWkXEd5jykr3z2u7QA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-arm64-musl": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.0.1.tgz", + "integrity": "sha512-43I82qkAvXUsRySzDkhstg9kpGegZG5EWRMFYtEatgJRXeVRssPwHZHsLP2alj/gopJFq1H2yjWOWTziJxG3pw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-gnu": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.0.1.tgz", + "integrity": "sha512-HRtVR9g57gzjikXsUHVcP6UsrHWMzXq+WJz7PzgcRU1RT/AP/4QxV6HegA1O2filcGLxSYwt5JOYwy73OYuYDg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-linux-x64-musl": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.0.1.tgz", + "integrity": "sha512-v/ZScgI8fwTMfIZgnLXSq2XB//3uX+qhq/dzzbQQKvOuo/vtrnhxOKcoo4mCGVKuFtT/mr0bv66/5uPpUPct2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.0.1.tgz", + "integrity": "sha512-xajcwSOJUISp+OaL/NU2ulhXvEEo1KwmgEvYpePWS5gvxogu8ps9D9wrtJGFcMSrKyPGurbPUbOCAKMbrk4LqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/workspace/node_modules/@nx/nx-win32-x64-msvc": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.0.1.tgz", + "integrity": "sha512-2w78FyjZwBeKxjdv0ZzdHin2UFPk0NBHtb5mcZ7lannBDHahdO4vA9iI8Pg+Y75ybKGrIsCyHK+BDdgH/S6UHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@nx/workspace/node_modules/dotenv": { + "version": "16.4.7", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@nx/workspace/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@nx/workspace/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/workspace/node_modules/nx": { + "version": "22.0.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.12.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^7.0.5", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "22.0.1", + "@nx/nx-darwin-x64": "22.0.1", + "@nx/nx-freebsd-x64": "22.0.1", + "@nx/nx-linux-arm-gnueabihf": "22.0.1", + "@nx/nx-linux-arm64-gnu": "22.0.1", + "@nx/nx-linux-arm64-musl": "22.0.1", + "@nx/nx-linux-x64-gnu": "22.0.1", + "@nx/nx-linux-x64-musl": "22.0.1", + "@nx/nx-win32-arm64-msvc": "22.0.1", + "@nx/nx-win32-x64-msvc": "22.0.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nx/workspace/node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "6.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/esquery": "^1.5.0", + "esquery": "^1.5.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.46.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-image": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "mini-svg-data-uri": "^1.4.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/@types/resolve": { + "version": "1.20.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding": { + "version": "1.6.8", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.6.8", + "@rspack/binding-darwin-x64": "1.6.8", + "@rspack/binding-linux-arm64-gnu": "1.6.8", + "@rspack/binding-linux-arm64-musl": "1.6.8", + "@rspack/binding-linux-x64-gnu": "1.6.8", + "@rspack/binding-linux-x64-musl": "1.6.8", + "@rspack/binding-wasm32-wasi": "1.6.8", + "@rspack/binding-win32-arm64-msvc": "1.6.8", + "@rspack/binding-win32-ia32-msvc": "1.6.8", + "@rspack/binding-win32-x64-msvc": "1.6.8" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.6.8", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.8.tgz", + "integrity": "sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.8.tgz", + "integrity": "sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.8.tgz", + "integrity": "sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.8.tgz", + "integrity": "sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.8.tgz", + "integrity": "sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.8.tgz", + "integrity": "sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "1.0.7" + } + }, + "node_modules/@rspack/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.8.tgz", + "integrity": "sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.8.tgz", + "integrity": "sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.8.tgz", + "integrity": "sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.21.6", + "@rspack/binding": "1.6.8", + "@rspack/lite-tapable": "1.1.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.19.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-formats": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "11.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.19.1", + "@rushstack/problem-matcher": "0.1.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.21.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@storybook/builder-vite": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "10.3.5", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^10.3.5", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^2.3.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "esbuild": "*", + "rollup": "*", + "storybook": "^10.3.5", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@storybook/react": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "10.3.5", + "react-docgen": "^8.0.2", + "react-docgen-typescript": "^2.2.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.3.5", + "typescript": ">= 4.9.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.3.5" + } + }, + "node_modules/@storybook/react-vite": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "10.3.5", + "@storybook/react": "10.3.5", + "empathic": "^2.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^8.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.3.5", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/core": { + "version": "1.15.11", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.11", + "@swc/core-darwin-x64": "1.15.11", + "@swc/core-linux-arm-gnueabihf": "1.15.11", + "@swc/core-linux-arm64-gnu": "1.15.11", + "@swc/core-linux-arm64-musl": "1.15.11", + "@swc/core-linux-x64-gnu": "1.15.11", + "@swc/core-linux-x64-musl": "1.15.11", + "@swc/core-win32-arm64-msvc": "1.15.11", + "@swc/core-win32-ia32-msvc": "1.15.11", + "@swc/core-win32-x64-msvc": "1.15.11" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.11", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz", + "integrity": "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz", + "integrity": "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz", + "integrity": "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz", + "integrity": "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz", + "integrity": "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz", + "integrity": "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz", + "integrity": "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz", + "integrity": "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz", + "integrity": "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.99.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.99.0", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.99.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trpc/client": { + "version": "11.11.0", + "funding": [ + "https://trpc.io/sponsor" + ], + "license": "MIT", + "peerDependencies": { + "@trpc/server": "11.11.0", + "typescript": ">=5.7.2" + } + }, + "node_modules/@trpc/server": { + "version": "11.11.0", + "funding": [ + "https://trpc.io/sponsor" + ], + "license": "MIT", + "peerDependencies": { + "typescript": ">=5.7.2" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/body-parser/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/body-parser/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/connect/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/cors/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/esquery": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-serve-static-core/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/express-serve-static-core/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/graceful-fs/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/http-proxy/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/jsonwebtoken/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/jsonwebtoken/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.23", + "license": "MIT" + }, + "node_modules/@types/lodash.omit": { + "version": "4.5.9", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.9", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/@types/node": { + "version": "25.2.3", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/node-fetch/node_modules/undici-types": { + "version": "7.16.0", + "license": "MIT" + }, + "node_modules/@types/opentok": { + "version": "2.14.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.6", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/send/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/superagent/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/superagent/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "license": "MIT", + "optional": true + }, + "node_modules/@types/ua-parser-js": { + "version": "0.7.39", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/type-utils": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.55.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.55.0", + "@typescript-eslint/types": "^8.55.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.55.0", + "@typescript-eslint/tsconfig-utils": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/visitor-keys": "8.55.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.55.0", + "@typescript-eslint/types": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.55.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@videojs/http-streaming": { + "version": "3.17.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "aes-decrypter": "^4.0.2", + "global": "^4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "7.1.0", + "video.js": "^7 || ^8" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^8.19.0" + } + }, + "node_modules/@videojs/vhs-utils": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/xhr": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2", + "@swc/core": "^1.15.11" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.1" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.1" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vonage/accounts": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/applications": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/auth": { + "version": "1.14.0", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.13.0", + "debug": "4.4.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/auth/node_modules/@vonage/jwt": { + "version": "1.13.0", + "license": "Apache-2.0", + "dependencies": { + "debug": "4.4.3", + "jsonwebtoken": "9.0.3", + "uuid": "13.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/auth/node_modules/uuid": { + "version": "13.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/@vonage/client-sdk-video": { + "version": "2.34.0", + "license": "https://www.vonage.com/legal/communications-apis/terms-of-use/" + }, + "node_modules/@vonage/conversations": { + "version": "1.12.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/messages": "1.22.1", + "@vonage/server-client": "1.18.1", + "@vonage/users": "1.12.1", + "@vonage/voice": "1.19.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/jwt": { + "version": "1.12.1", + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "jsonwebtoken": "9.0.2", + "uuid": "9.0.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/jwt/node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/jwt/node_modules/jsonwebtoken": { + "version": "9.0.2", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/@vonage/jwt/node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/@vonage/jwt/node_modules/jwa": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@vonage/jwt/node_modules/jws": { + "version": "3.2.3", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@vonage/jwt/node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/@vonage/messages": { + "version": "1.22.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/messages/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/number-insights": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/number-insights/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/number-insights/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/numbers": { + "version": "1.20.1", + "license": "Apache-2.0", + "dependencies": { + "@types/lodash.omit": "4.5.9", + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "lodash.omit": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/numbers/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/numbers/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/pricing": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/pricing/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/pricing/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/redact": { + "version": "1.17.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-client": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/vetch": "1.9.1", + "debug": "4.4.1", + "lodash.camelcase": "4.3.0", + "lodash.isobject": "3.0.2", + "lodash.kebabcase": "4.1.1", + "lodash.snakecase": "4.1.1", + "node-fetch": "2.7.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-client/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-client/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/server-sdk": { + "version": "3.25.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/accounts": "1.18.1", + "@vonage/applications": "1.18.1", + "@vonage/auth": "1.13.1", + "@vonage/conversations": "1.12.1", + "@vonage/messages": "1.22.1", + "@vonage/number-insights": "1.18.1", + "@vonage/numbers": "1.20.1", + "@vonage/pricing": "1.18.1", + "@vonage/redact": "1.17.1", + "@vonage/server-client": "1.18.1", + "@vonage/sms": "1.19.1", + "@vonage/users": "1.12.1", + "@vonage/verify": "1.18.1", + "@vonage/verify2": "1.17.1", + "@vonage/video": "1.26.1", + "@vonage/voice": "1.19.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-sdk/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/server-sdk/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/sms": { + "version": "1.19.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/sms/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/sms/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/users": { + "version": "1.12.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/vcr-sdk": { + "version": "1.3.0", + "dependencies": { + "agentkeepalive": "^4.2.1", + "axios": "^1.2.1", + "express": "^4.17.2", + "form-data": "^4.0.0", + "glob": "^10.3.3", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/@vonage/vcr-sdk/node_modules/glob": { + "version": "10.5.0", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vonage/vcr-sdk/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vonage/vcr-sdk/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@vonage/verify": { + "version": "1.18.1", + "license": "Apache-2.0", + "dependencies": { + "@types/lodash.omit": "4.5.9", + "@vonage/auth": "1.13.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "lodash.omit": "4.5.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/verify/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/verify/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/verify2": { + "version": "1.17.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/server-client": "1.18.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/vetch": { + "version": "1.9.1", + "license": "Apache-2.0", + "dependencies": { + "@types/node-fetch": "2.6.11", + "node-fetch": "2.7.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/video": { + "version": "1.26.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/auth": "1.13.1", + "@vonage/jwt": "1.12.1", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/video-client-network-test": { + "version": "5.0.0", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.8.3", + "opentok-solutions-logging": "^1.1.1", + "promise": "^8.0.1" + } + }, + "node_modules/@vonage/video/node_modules/@vonage/auth": { + "version": "1.13.1", + "license": "Apache-2.0", + "dependencies": { + "@vonage/jwt": "1.12.1", + "debug": "4.4.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/video/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vonage/vivid": { + "version": "5.15.1", + "license": "Apache-2.0", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@microsoft/fast-element": "2.8.3", + "@microsoft/fast-web-utilities": "^6.0.0", + "date-fns": "^3.0.0", + "dompurify": "^3.3.1", + "prosemirror-commands": "^1.7.1", + "prosemirror-dropcursor": "^1.8.2", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.11.0", + "prosemirror-view": "^1.41.6", + "ramda": "^0.32.0", + "uuid": "^11.1.0", + "vanilla-colorful": "^0.7.2", + "video.js": "^8.23.7" + } + }, + "node_modules/@vonage/vivid/node_modules/prosemirror-view": { + "version": "1.41.7", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/@vonage/vivid/node_modules/uuid": { + "version": "11.1.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@vonage/voice": { + "version": "1.19.1", + "license": "Apache-2.0", + "dependencies": { + "@types/debug": "4.1.12", + "@vonage/server-client": "1.18.1", + "@vonage/vetch": "1.9.1", + "debug": "4.4.1", + "ts-xor": "1.3.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vonage/voice/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.28", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "7.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.28", + "@vue/shared": "3.5.28" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.28", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webcontainer/env": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/aes-decrypter": { + "version": "4.0.2", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-timsort": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autolinker": { + "version": "4.1.5", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + }, + "engines": { + "pnpm": ">=10.10.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.24", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001766", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.1", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.16.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-const-enum": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/babel-plugin-macros/node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001770", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai/node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/chokidar/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/clear-module": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^2.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clear-module/node_modules/parent-module": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/columnify": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/comment-json": { + "version": "4.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concurrently": { + "version": "9.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/cookies": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "13.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-parent": "^6.0.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2", + "tinyglobby": "^0.2.12" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/corser": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cspell-config-lib": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.6.4", + "comment-json": "^4.5.1", + "smol-toml": "^1.6.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-dictionary": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-performance-monitor": "9.6.4", + "@cspell/cspell-pipe": "9.6.4", + "@cspell/cspell-types": "9.6.4", + "cspell-trie-lib": "9.6.4", + "fast-equals": "^6.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-glob": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/url": "9.6.4", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-grammar": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-pipe": "9.6.4", + "@cspell/cspell-types": "9.6.4" + }, + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-io": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-service-bus": "9.6.4", + "@cspell/url": "9.6.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-lib": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.6.4", + "@cspell/cspell-performance-monitor": "9.6.4", + "@cspell/cspell-pipe": "9.6.4", + "@cspell/cspell-resolver": "9.6.4", + "@cspell/cspell-types": "9.6.4", + "@cspell/dynamic-import": "9.6.4", + "@cspell/filetypes": "9.6.4", + "@cspell/rpc": "9.6.4", + "@cspell/strong-weak-map": "9.6.4", + "@cspell/url": "9.6.4", + "clear-module": "^4.1.2", + "cspell-config-lib": "9.6.4", + "cspell-dictionary": "9.6.4", + "cspell-glob": "9.6.4", + "cspell-grammar": "9.6.4", + "cspell-io": "9.6.4", + "cspell-trie-lib": "9.6.4", + "env-paths": "^4.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^3.3.1", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cspell-trie-lib": { + "version": "9.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@cspell/cspell-types": "9.6.4" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssstyle": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.3.3", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/easy-cancelable-promise": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "4.4.4", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.4.1", + "eslint-import-context": "^0.1.8", + "get-tsconfig": "^4.10.1", + "is-bun-module": "^2.0.0", + "stable-hash-x": "^0.2.0", + "tinyglobby": "^0.2.14", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^16.17.0 || >=18.6.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-filename-rules": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.1.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-tailwindcss": { + "version": "4.0.0-beta.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.5", + "postcss": "^8.4.4", + "synckit": "^0.11.4", + "tailwind-api-utils": "^1.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "tailwindcss": "^3.4.0 || ^4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/exenv-es6": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/exit-x": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/figures": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/find-file-up": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-pkg": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-file-up": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/gensequence": { + "version": "8.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-them-args": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/get-tsconfig": { + "version": "4.13.6", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-directory": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "license": "CC0-1.0" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/i18next": { + "version": "25.8.8", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-safe-filename": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is2": { + "version": "2.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-circus/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-haste-map/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-mock/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-mock/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/schemas": { + "version": "30.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/jest-haste-map": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-resolve/node_modules/jest-regex-util": { + "version": "30.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-validate": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/jest-worker": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/pretty-format": { + "version": "30.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-resolve/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-runner/node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-watcher/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/jest-worker/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/jsdom": { + "version": "22.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.19.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-storage-formatter": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kill-port": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-them-args": "1.3.2", + "shell-exec": "1.0.2" + }, + "bin": { + "kill-port": "cli.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/koa": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^1.3.8", + "content-disposition": "~0.5.4", + "content-type": "^1.0.5", + "cookies": "~0.9.1", + "delegates": "^1.0.0", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.5.0", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/koa/node_modules/media-typer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/mime-db": { + "version": "1.54.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/mime-types": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/koa/node_modules/type-is": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-checker": { + "version": "25.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "chalk": "^2.4.1", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "read-installed": "~4.0.3", + "semver": "^5.5.0", + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-satisfies": "^4.0.0", + "treeify": "^1.1.0" + }, + "bin": { + "license-checker": "bin/license-checker" + } + }, + "node_modules/license-checker/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/license-checker/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/license-checker/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/license-checker/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/license-checker/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/license-checker/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/local-pkg/node_modules/confbox": { + "version": "0.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.clonedeepwith": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/long-timeout": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/lunr": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.7.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/m3u8-parser": { + "version": "7.2.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.1.1", + "global": "^4.4.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.2", + "license": "MIT", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "10.2.0", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimatch/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/motion": { + "version": "12.38.0", + "license": "MIT", + "dependencies": { + "framer-motion": "^12.38.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "license": "MIT" + }, + "node_modules/mpd-parser": { + "version": "1.3.1", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mux.js": { + "version": "7.1.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/node-schedule": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cron-parser": "^4.2.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nodemon": { + "version": "3.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nonce": { + "version": "1.0.4", + "license": "Free as in Hugs", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/nopt": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "dev": true, + "license": "MIT" + }, + "node_modules/nx": { + "version": "22.5.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.12.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^7.0.5", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "10.1.1", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "picocolors": "^1.1.0", + "resolve.exports": "2.0.3", + "semver": "^7.6.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "22.5.1", + "@nx/nx-darwin-x64": "22.5.1", + "@nx/nx-freebsd-x64": "22.5.1", + "@nx/nx-linux-arm-gnueabihf": "22.5.1", + "@nx/nx-linux-arm64-gnu": "22.5.1", + "@nx/nx-linux-arm64-musl": "22.5.1", + "@nx/nx-linux-x64-gnu": "22.5.1", + "@nx/nx-linux-x64-musl": "22.5.1", + "@nx/nx-win32-arm64-msvc": "22.5.1", + "@nx/nx-win32-x64-msvc": "22.5.1" + }, + "peerDependencies": { + "@swc-node/register": "1.11.1", + "@swc/core": "1.15.8" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/dotenv": { + "version": "16.4.7", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/nx/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "10.1.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opentok": { + "version": "2.22.0", + "license": "MIT", + "dependencies": { + "@vonage/jwt": "1.11.0", + "debug": "4.4.0", + "jsonwebtoken": "9.0.2", + "lodash": "4.17.21", + "node-fetch": "2.7.0", + "opentok-token": "1.1.1", + "uuid": "11.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opentok-jwt": { + "version": "0.1.5", + "license": "MIT", + "dependencies": { + "jsonwebtoken": "^9.0.0" + } + }, + "node_modules/opentok-layout-js": { + "version": "5.5.0", + "license": "MIT" + }, + "node_modules/opentok-solutions-logging": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "axios": "^1.6.3" + } + }, + "node_modules/opentok-token": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11", + "nonce": "^1.0.3", + "unix-timestamp": "^0.1.2" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt": { + "version": "1.11.0", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.3.4", + "jsonwebtoken": "^9.0.2", + "uuid": "^9.0.1" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/debug": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/jsonwebtoken": { + "version": "9.0.3", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/jwa": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/jws": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/@vonage/jwt/node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/opentok/node_modules/debug": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/opentok/node_modules/jsonwebtoken": { + "version": "9.0.2", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/opentok/node_modules/jwa": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/jws": { + "version": "3.2.3", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/opentok/node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/opentok/node_modules/uuid": { + "version": "11.0.5", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/cli-spinners": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkcs7": { + "version": "1.0.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.5.5" + }, + "bin": { + "pkcs7": "bin/cli.js" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/pkg-types/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/playwright": { + "version": "1.46.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.46.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.46.0", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.3" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/prismjs": { + "version": "1.30.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.11.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.41.6", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.2", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rambda": { + "version": "9.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ramda": { + "version": "0.32.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.2.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-docgen": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@types/babel__core": "^7.20.5", + "@types/babel__traverse": "^7.20.7", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.9.0 || >=22" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/react-docgen/node_modules/strip-indent": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-global-state-hooks": { + "version": "15.0.15", + "license": "MIT", + "dependencies": { + "json-storage-formatter": "^3.0.2", + "react-hooks-global-states": "^15.0.16" + }, + "peerDependencies": { + "json-storage-formatter": "^3.0.2", + "react": ">=18.0.0" + }, + "peerDependenciesMeta": { + "json-storage-formatter": { + "optional": false + }, + "react": { + "optional": false + } + } + }, + "node_modules/react-hooks-global-states": { + "version": "15.0.16", + "license": "MIT", + "dependencies": { + "json-storage-formatter": "^3.0.2" + }, + "peerDependencies": { + "json-storage-formatter": "^3.0.2", + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + }, + "peerDependenciesMeta": { + "json-storage-formatter": { + "optional": false + }, + "react": { + "optional": false + } + } + }, + "node_modules/react-i18next": { + "version": "15.7.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.4.0", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-installed": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.2" + } + }, + "node_modules/read-installed/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-typescript2": { + "version": "0.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^4.1.2", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.0.0", + "semver": "^7.5.4", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-exec": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "dev": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sorted-array-functions": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-find-index": "^1.0.2", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdx-ranges": { + "version": "2.1.1", + "dev": true, + "license": "(MIT AND CC-BY-3.0)" + }, + "node_modules/spdx-satisfies": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-compare": "^1.0.0", + "spdx-expression-parse": "^3.0.0", + "spdx-ranges": "^2.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/status-code-enum": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/storybook": { + "version": "10.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/icons": "^2.0.1", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/user-event": "^14.6.1", + "@vitest/expect": "3.2.4", + "@vitest/spy": "3.2.4", + "@webcontainer/env": "^1.1.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", + "open": "^10.2.0", + "recast": "^0.23.5", + "semver": "^7.7.3", + "use-sync-external-store": "^1.5.0", + "ws": "^8.18.0" + }, + "bin": { + "storybook": "dist/bin/dispatcher.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/storybook/node_modules/@vitest/expect": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/spy": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/@vitest/utils": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/storybook/node_modules/chai": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/storybook/node_modules/check-error": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/storybook/node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/storybook/node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/loupe": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/storybook/node_modules/open": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/pathval": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/storybook/node_modules/tinyspy": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/storybook/node_modules/ws": { + "version": "8.19.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/superagent": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.15.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tailwind-api-utils": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "local-pkg": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/hyoban" + }, + "peerDependencies": { + "tailwindcss": "^3.3.0 || ^4.0.0 || ^4.0.0-beta" + } + }, + "node_modules/tailwind-api-utils/node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/tailwind-merge": { + "version": "3.4.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "license": "MIT", + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/terser": { + "version": "5.46.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.16", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/@types/node": { + "version": "25.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/treeify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.6", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ts-xor": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tsx": { + "version": "4.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.26.11", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.55.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@typescript-eslint/typescript-estree": "8.55.0", + "@typescript-eslint/utils": "8.55.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/union": { + "version": "0.5.0", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/union/node_modules/qs": { + "version": "6.15.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unix-timestamp": { + "version": "0.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "2.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/util-extend": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vanilla-colorful": { + "version": "0.7.2", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/video.js": { + "version": "8.23.7", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@videojs/http-streaming": "^3.17.3", + "@videojs/vhs-utils": "^4.1.1", + "@videojs/xhr": "2.7.0", + "aes-decrypter": "^4.0.2", + "global": "4.4.0", + "m3u8-parser": "^7.2.0", + "mpd-parser": "^1.3.1", + "mux.js": "^7.0.1", + "videojs-contrib-quality-levels": "4.1.0", + "videojs-font": "4.2.0", + "videojs-vtt.js": "0.15.5" + } + }, + "node_modules/videojs-contrib-quality-levels": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=16", + "npm": ">=8" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-font": { + "version": "4.2.0", + "license": "Apache-2.0" + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.3.1" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "chokidar": "^4.0.3", + "npm-run-path": "^6.0.0", + "picocolors": "^1.1.1", + "picomatch": "^4.0.3", + "tiny-invariant": "^1.3.3", + "tinyglobby": "^0.2.14", + "vscode-uri": "^3.1.0" + }, + "engines": { + "node": ">=16.11" + }, + "peerDependencies": { + "@biomejs/biome": ">=1.7", + "eslint": ">=7", + "meow": "^13.2.0", + "optionator": "^0.9.4", + "oxlint": ">=1", + "stylelint": ">=16", + "typescript": "*", + "vite": ">=5.4.20", + "vls": "*", + "vti": "*", + "vue-tsc": "~2.2.10 || ^3.0.0" + }, + "peerDependenciesMeta": { + "@biomejs/biome": { + "optional": true + }, + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "oxlint": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vite-plugin-checker/node_modules/npm-run-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-checker/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.1", + "@vitest/runner": "1.6.1", + "@vitest/snapshot": "1.6.1", + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.1", + "@vitest/ui": "1.6.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/local-pkg": { + "version": "0.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.105.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.19.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.3.1", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.16", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "12.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/tutorials/vonage_video_react_app-feature-config/project/package.json b/tutorials/vonage_video_react_app-feature-config/project/package.json index a0612056..6e78b87c 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/package.json +++ b/tutorials/vonage_video_react_app-feature-config/project/package.json @@ -10,7 +10,7 @@ "scripts": { "prepare": "husky", "postinstall": "nx postinstall integration-tests", - "generate:tokens": "npx tsx scripts/generateTokens.ts", + "sync:theme-tokens": "npx tsx scripts/generateTokens.ts", "quality-check": "npx tsx scripts/qualityCheck.ts", "build": "npx tsx scripts/build.ts", "dev": "npx tsx scripts/dev.ts", @@ -28,19 +28,21 @@ "test:core": "npx tsx scripts/testLibs.ts core", "test:ui": "npx tsx scripts/testLibs.ts ui", "test:common": "npx tsx scripts/testLibs.ts common", - "ts-check": "nx run-many --target=ts-check", + "ts-check": "npx tsx scripts/tsCheck.ts", "vcr:dev": "npx tsx scripts/vcrDev.ts" }, "scriptsInfo": { - "build": "Build projects. Usage: 'yarn build' (frontend+backend), 'yarn build frontend', 'yarn build backend', 'yarn build room' (VeraRoom web component)", - "dev": "Run dev servers. Usage: 'yarn dev' (frontend+backend), 'yarn dev frontend', 'yarn dev backend', 'yarn dev room' (Storybook for VeraRoom)", + "build": "Build projects. Usage: 'yarn build' (frontend+backend), 'yarn build frontend', 'yarn build backend', 'yarn build room' (VeraRoom artifact), 'yarn build room zip' (zip VeraRoom artifact)", + "dev": "Run dev servers. Usage: 'yarn dev' (frontend+backend), 'yarn dev frontend', 'yarn dev backend', 'yarn dev debug' (--inspect), 'yarn dev debug wait' (--inspect-brk), 'yarn dev room' (VeraRoom example), 'yarn dev studio' (Vera Studio + backend + Storybook)", + "sync:theme-tokens": "Sync theme token artifacts. Usage: 'yarn sync:theme-tokens'. Always regenerates designTokens.example.json, uses root designTokens.json as source of truth when present, bootstraps root designTokens.json from defaults when missing, rebuilds veraUI.cjs, and runs Prettier on the generated plugin file.", "lint:fix": "Format and lint fix (workspace-wide by default). Optionally scope to a single Nx project: 'yarn lint:fix '", - "quality-check": "Run ts-check + lint + prettier check (workspace-wide by default). Optionally scope to a single Nx project: 'yarn quality-check '", - "start": "Start production build. Usage: 'yarn start' (build frontend + start backend), 'yarn start room' (build and serve VeraRoom example)", + "quality-check": "Run ts-check + lint + prettier check (workspace-wide by default). Optionally scope to a single project alias: 'yarn quality-check frontend', 'yarn quality-check studio'", + "ts-check": "Run TypeScript checks (workspace-wide by default). Optionally scope to a single project alias: 'yarn ts-check frontend', 'yarn ts-check studio'", + "start": "Start production build. Usage: 'yarn start' (build frontend + start backend), 'yarn start room' (build VeraRoom artifact + example and serve example)", "start:backend": "Run backend server. Usage: 'yarn start:backend' (dev mode), 'yarn start:backend debug' (debug mode), 'yarn start:backend bundled' (bundled dev mode)", "test:backend": "Run backend tests. Usage: 'yarn test:backend' (all), 'yarn test:backend ' (specific), 'yarn test:backend watch ' (watch mode), 'yarn test:backend debug ' (debug mode)", "test:frontend": "Run frontend tests. Usage: 'yarn test:frontend' (all), 'yarn test:frontend ' (specific), 'yarn test:frontend watch ' (watch mode), 'yarn test:frontend debug ' (debug mode)", - "test:integration": "Run Playwright tests. Usage: 'yarn test:integration' (all browsers), 'yarn test:integration ' (headed), 'yarn test:integration debug|inspect|canon [name]', 'yarn test:integration update [name]' (screenshots)", + "test:integration": "Run integration tests. Usage: 'yarn test:integration' (all), 'yarn test:integration api' (API/Jest only), 'yarn test:integration playwright' (Playwright only), 'yarn test:integration ' (headed), 'yarn test:integration debug|inspect|canon [name]', 'yarn test:integration update [name]' (screenshots)", "vcr:dev": "Manage VCR dev instance. Usage: 'yarn vcr:dev' (deploy), 'yarn vcr:dev rm' or 'yarn vcr:dev --rm' (remove instance). Note: Copy vcr.yml.example as vcr-dev.yml and add your application ID before deploying" }, "repository": { @@ -48,152 +50,159 @@ "url": "git+https://github.com/Vonage/vonage-video-react-app.git" }, "author": "", + "contributors": [ + "Hossein Movahed ", + "Johnny Esteban Quesada ", + "Oscar Fava " + ], "license": "MIT", "bugs": { "url": "https://github.com/Vonage/vonage-video-react-app/issues" }, "homepage": "https://github.com/Vonage/vonage-video-react-app#readme", "devDependencies": { - "@cspell/eslint-plugin": "^9.3.0", - "@eslint/js": "^9.39.1", - "@jest/globals": "^29.7.0", + "@cspell/eslint-plugin": "9.6.4", + "@eslint/js": "9.39.2", + "@jest/globals": "29.7.0", "@nx/eslint": "22.0.1", - "@nx/eslint-plugin": "^22.1.3", + "@nx/eslint-plugin": "22.5.1", "@nx/jest": "22.0.1", "@nx/js": "22.0.1", "@nx/node": "22.0.1", - "@nx/react": "^22.2.0", - "@nx/vite": "^22.0.1", + "@nx/react": "22.5.1", + "@nx/vite": "22.5.1", "@playwright/test": "1.46.0", - "@rollup/plugin-replace": "^5.0.7", - "@storybook/react": "^10.1.11", - "@storybook/react-vite": "^10.1.11", - "@tailwindcss/vite": "^4.1.18", + "@rollup/plugin-replace": "5.0.7", + "@storybook/react": "10.3.5", + "@storybook/react-vite": "10.3.5", + "@tailwindcss/vite": "4.1.18", "@testing-library/dom": "10.4.0", - "@testing-library/jest-dom": "^6.6.3", + "@testing-library/jest-dom": "6.9.1", "@testing-library/react": "16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/body-parser": "^1.19.2", - "@types/cors": "^2.8.13", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.12", - "@types/lodash": "^4.17.1", + "@testing-library/user-event": "14.6.1", + "@types/body-parser": "1.19.6", + "@types/cors": "2.8.19", + "@types/express": "4.17.25", + "@types/jest": "29.5.14", + "@types/jsonwebtoken": "9.0.10", "@types/node": "20.19.9", - "@types/opentok": "^2.14.0", - "@types/react": "^19.2.7", - "@types/react-dom": "^19.2.3", - "@types/supertest": "^6.0.2", - "@types/ua-parser-js": "^0.7.39", - "@types/validator": "^13.15.2", - "@typescript-eslint/eslint-plugin": "^8.30.1", - "@typescript-eslint/parser": "^8.30.1", - "@vitejs/plugin-react": "^5.1.2", - "@vitejs/plugin-react-swc": "^4.2.2", - "@vitest/coverage-v8": "^1.0.4", - "@vitest/ui": "^1.3.1", - "concurrently": "^9.1.2", - "copy-webpack-plugin": "^13.0.1", - "eslint": "^8", - "eslint-config-prettier": "^10.1.8", - "eslint-import-resolver-node": "^0.3.9", - "eslint-import-resolver-typescript": "^4.4.4", - "eslint-plugin-filename-rules": "^1.3.1", - "eslint-plugin-import": "^2.32.0", + "@types/opentok": "2.14.4", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@types/react-syntax-highlighter": "15.5.13", + "@types/supertest": "6.0.3", + "@types/ua-parser-js": "0.7.39", + "@typescript-eslint/eslint-plugin": "8.55.0", + "@typescript-eslint/parser": "8.55.0", + "@vitejs/plugin-react": "5.1.4", + "@vitejs/plugin-react-swc": "4.2.3", + "@vitest/coverage-v8": "1.6.1", + "@vitest/ui": "1.6.1", + "concurrently": "9.2.1", + "copy-webpack-plugin": "13.0.1", + "eslint": "8.57.1", + "eslint-config-prettier": "10.1.8", + "eslint-import-resolver-node": "0.3.9", + "eslint-import-resolver-typescript": "4.4.4", + "eslint-plugin-filename-rules": "1.3.1", + "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.1", - "eslint-plugin-prettier": "^5.5.4", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.4.6", + "eslint-plugin-prettier": "5.5.5", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "7.0.1", + "eslint-plugin-react-refresh": "0.4.26", "eslint-plugin-tailwindcss": "4.0.0-beta.0", - "husky": "^9.0.11", - "jest": "^29.7.0", + "husky": "9.1.7", + "jest": "29.7.0", "jiti": "2.4.2", - "jsdom": "~22.1.0", - "license-checker": "^25.0.1", - "minimatch": "^10.1.1", - "nodemon": "^3.1.10", - "nx": "^22.0.3", - "prettier": "^3.6.2", - "storybook": "^10.1.11", - "supertest": "^7.0.0", - "tailwindcss": "^4.1.18", - "terser": "^5.46.0", - "ts-jest": "^29.2.5", - "ts-loader": "^9.5.4", - "tslib": "^2.3.0", - "tsx": "^4.10.5", - "typedoc": "^0.26.10", - "typescript": "^5.8.3", - "typescript-eslint": "^8.46.4", - "vite": "^5.4.19", - "vite-plugin-checker": "^0.11.0", - "vite-plugin-dts": "~4.5.0", - "vitest": "^1.6", - "webpack": "^5.104.0", - "webpack-cli": "^6.0.1" + "jsdom": "22.1.0", + "license-checker": "25.0.1", + "minimatch": "10.2.0", + "nodemon": "3.1.11", + "nx": "22.5.1", + "prettier": "3.8.1", + "storybook": "10.3.5", + "supertest": "7.2.2", + "tailwindcss": "4.1.18", + "terser": "5.46.0", + "ts-jest": "29.4.6", + "ts-loader": "9.5.4", + "tslib": "2.8.1", + "tsx": "4.21.0", + "typedoc": "0.26.11", + "typescript": "5.9.3", + "typescript-eslint": "8.55.0", + "vite": "5.4.21", + "vite-plugin-checker": "0.11.0", + "vite-plugin-dts": "4.5.4", + "vitest": "1.6.1", + "webpack": "5.105.2", + "webpack-cli": "6.0.1" }, "resolutions": { "wrap-ansi": "7.0.0", - "path-to-regexp": "^0.1.12", - "express": "^4.21.2", - "axios": "^1.13.5", - "cross-spawn": "^7.0.5", - "rollup": "^4.22.4", - "vite": "^5.4.19", - "nanoid": "^3.3.8", - "micromatch": "^4.0.8", - "@babel/helpers": "^7.27.0", - "@babel/runtime": "^7.26.10", + "path-to-regexp": "0.1.12", + "express": "4.22.1", + "axios": "1.16.0", + "cross-spawn": "7.0.6", + "rollup": "4.57.1", + "vite": "5.4.21", + "nanoid": "3.3.11", + "micromatch": "4.0.8", + "@babel/helpers": "7.28.6", + "@babel/runtime": "7.28.6", "brace-expansion": "2.0.2", - "form-data": "^4.0.4" + "form-data": "4.0.5" }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", "dependencies": { - "@emotion/css": "^11.11.2", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/icons-material": "^5.17.1", - "@mui/joy": "^5.0.0-beta.36", - "@mui/material": "^5.17.1", - "@vonage/auth": "^1.13.1", - "@vonage/client-sdk-video": "2.32.1", + "@emotion/css": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.1", + "@mui/icons-material": "9.0.0", + "@mui/material": "9.0.0", + "@trpc/client": "11.11.0", + "@trpc/server": "11.11.0", + "@tanstack/react-query": "5.99.0", + "@vonage/auth": "1.14.0", + "@vonage/client-sdk-video": "2.34.0", "@vonage/server-sdk": "3.25.1", "@vonage/vcr-sdk": "1.3.0", "@vonage/video": "1.26.1", - "@vonage/video-client-network-test": "^5.0.0", - "@vonage/vivid": "^5.15.1", - "autolinker": "^4.0.0", - "axios": "^1.13.5", - "body-parser": "^1.20.3", - "classnames": "^2.5.1", - "cors": "^2.8.5", - "dotenv": "^16.0.3", - "easy-cancelable-promise": "^2.0.0", - "events": "^3.3.0", - "express": "^4.21.2", - "form-data": "^4.0.4", - "i18next": "^25.3.2", - "i18next-browser-languagedetector": "^8.2.0", - "json-storage-formatter": "^3.0.2", - "lodash": "^4.17.21", - "normalize-range": "^0.1.2", + "@vonage/video-client-network-test": "5.0.0", + "@vonage/vivid": "5.15.1", + "autolinker": "4.1.5", + "axios": "1.16.0", + "body-parser": "1.20.4", + "classnames": "2.5.1", + "cors": "2.8.6", + "dotenv": "16.6.1", + "easy-cancelable-promise": "2.0.1", + "events": "3.3.0", + "express": "4.22.1", + "form-data": "4.0.5", + "i18next": "25.8.8", + "i18next-browser-languagedetector": "8.2.1", + "json-storage-formatter": "3.0.2", + "jsonwebtoken": "9.0.3", + "motion": "12.38.0", + "normalize-range": "0.1.2", "opentok": "2.22.0", - "opentok-jwt": "^0.1.5", - "opentok-layout-js": "^5.5.0", - "opentok-solutions-logging": "^1.1.5", - "react": "^19.2.1", - "react-dom": "^19.2.1", - "react-global-state-hooks": "^15.0.6", - "react-i18next": "^15.6.1", - "react-router-dom": "6.30.2", - "resize-observer-polyfill": "^1.5.1", - "status-code-enum": "^1.0.0", - "tailwind-merge": "^3.4.0", - "tailwind-variants": "^3.2.2", - "ua-parser-js": "^1.0.41", - "uuid": "^9.0.1", - "validator": "13.15.15", - "zod": "^4.3.5" + "opentok-jwt": "0.1.5", + "opentok-layout-js": "5.5.0", + "opentok-solutions-logging": "1.1.5", + "react": "19.2.4", + "react-dom": "19.2.4", + "react-global-state-hooks": "15.0.15", + "react-i18next": "15.7.4", + "react-router-dom": "6.30.3", + "react-syntax-highlighter": "16.1.1", + "resize-observer-polyfill": "1.5.1", + "status-code-enum": "1.0.0", + "tailwind-merge": "3.4.1", + "tailwind-variants": "3.2.2", + "ua-parser-js": "1.0.41", + "uuid": "9.0.1", + "zod": "4.3.6" }, "nx": { "includedScripts": [], diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts index 0d0af836..548c70bd 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/build.ts @@ -1,6 +1,7 @@ #!/usr/bin/env npx tsx import { execSync } from 'child_process'; +import { writeFileSync } from 'node:fs'; const args = process.argv.slice(2); @@ -16,7 +17,37 @@ const runCommand = (command: string) => { * Builds both frontend and backend projects. */ const buildAll = () => { - runCommand('nx run-many -t build -p frontend backend'); + // webpack does not clean its output dir - delete it manually before building. + // frontend/dist and frontend/distRoom are cleaned by Vite's emptyOutDir: true. + runCommand('rm -rf ./backend/dist'); + + // Build frontend, backend and room in parallel + runCommand(` + bash -c ' + nx run frontend:build & pid1=$! + nx run backend:build & pid2=$! + nx run frontend:build-room & pid3=$! + + status=0 + + wait "$pid1" || status=1 + wait "$pid2" || status=1 + wait "$pid3" || status=1 + + exit "$status" + ' + `); + + // Copy frontend assets to backend dist for serving + runCommand( + 'mkdir -p backend/dist/dist/assets && cp -R frontend/dist/assets/. backend/dist/dist/assets/' + ); + + // Copy room.js to backend dist for serving + runCommand('cp frontend/distRoom/room.js backend/dist/dist/assets/room.js'); + + // Write a manifest file with a timestamp to force cache busting of the VeraRoom web component + writeFileSync('backend/dist/dist/assets/room-manifest.json', JSON.stringify({ v: Date.now() })); }; /** @@ -30,6 +61,8 @@ const buildFrontend = () => { * Builds only the backend project. */ const buildBackend = () => { + // webpack does not clean its output dir - delete it manually before building. + runCommand('rm -rf ./backend/dist'); runCommand('nx run backend:build'); }; @@ -37,7 +70,15 @@ const buildBackend = () => { * Builds the VeraRoom web component. */ const buildRoom = () => { - runCommand('nx run frontend:build-room'); + runCommand('nx run frontend:build-room:standalone'); +}; + +/** + * Builds and packages the VeraRoom artifact into a zip file. + */ +const buildRoomZip = () => { + runCommand('nx run frontend:build-room:standalone'); + runCommand('rm -f room.zip && cd frontend/distRoom && zip -rq ../../room.zip .'); }; /** @@ -48,15 +89,17 @@ const buildRoom = () => { * - frontend: Build only frontend * - backend: Build only backend * - room: Build VeraRoom web component + * - room zip: Build and zip VeraRoom artifact * * Usage: * - yarn build (build frontend and backend) * - yarn build frontend (build only frontend) * - yarn build backend (build only backend) * - yarn build room (build VeraRoom web component) + * - yarn build room zip (build and zip VeraRoom artifact) */ const main = () => { - const [target] = args; + const [target, subTarget] = args; switch (target) { case 'frontend': @@ -66,6 +109,11 @@ const main = () => { buildBackend(); return; case 'room': + if (subTarget === 'zip') { + buildRoomZip(); + return; + } + buildRoom(); return; default: diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts index 1fe9fd57..bd436cef 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/dev.ts @@ -34,7 +34,35 @@ function devBackend(): void { } /** - * Runs Storybook focused on VeraRoom component. + * Runs only the backend in debug mode (node --inspect on port 9229). + */ +function devBackendDebug(): void { + runCommand('nx run backend:debug'); +} + +/** + * Runs only the backend in debug mode with --inspect-brk (waits for debugger). + */ +function devBackendDebugWait(): void { + runCommand('nx run backend:debug:wait'); +} + +/** + * Runs frontend in dev mode and backend in debug mode (node --inspect on port 9229). + */ +function devDebug(): void { + runCommand("concurrently 'nx run frontend:dev' 'nx run backend:debug'"); +} + +/** + * Runs frontend in dev mode and backend in debug mode with --inspect-brk (waits for debugger). + */ +function devDebugWait(): void { + runCommand("concurrently 'nx run frontend:dev' 'nx run backend:debug:wait'"); +} + +/** + * Runs VeraRoom Storybook and backend in dev mode. */ function devRoom(): void { const storyPath = '/story/veraroom-veraroomelement--default'; @@ -42,7 +70,9 @@ function devRoom(): void { console.log('\n📚 Starting Storybook for VeraRoom...\n'); console.log(`🌐 Opening: http://localhost:6006/?path=${storyPath}\n`); - runCommand(`nx run frontend:storybook -- --initial-path="${storyPath}"`); + runCommand( + `concurrently "nx run frontend:storybook -- --initial-path='${storyPath}'" "nx run backend:dev"` + ); } /** @@ -52,24 +82,49 @@ function devRoom(): void { * - No args: Run both frontend and backend in dev mode * - frontend: Run only frontend dev server * - backend: Run only backend dev server - * - room: Run Storybook focused on VeraRoom component + * - room: Run Storybook focused on VeraRoom component and backend dev server * * Usage: * - yarn dev (run frontend and backend) * - yarn dev frontend (run only frontend) - * - yarn dev backend (run only backend) - * - yarn dev room (run Storybook for VeraRoom) + * - yarn dev backend (run only backend) + * - yarn dev backend debug (run only backend with --inspect on port 9229) + * - yarn dev backend debug wait (run only backend with --inspect-brk, waits for debugger) + * - yarn dev debug (run frontend + backend with --inspect on port 9229) + * - yarn dev debug wait (run frontend + backend with --inspect-brk, waits for debugger) + * - yarn dev room (run VeraRoom Storybook and backend) + * - yarn dev studio (run Vera Studio + backend + frontend Storybook) */ function main(): void { - const [target] = args; + const [target, subTarget] = args; switch (target) { case 'frontend': devFrontend(); return; case 'backend': + if (subTarget === 'debug') { + const backendSubTarget = args[2]; + + if (backendSubTarget === 'wait') { + devBackendDebugWait(); + return; + } + + devBackendDebug(); + return; + } + devBackend(); return; + case 'debug': + if (subTarget === 'wait') { + devDebugWait(); + return; + } + + devDebug(); + return; case 'room': devRoom(); return; diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts index bd5e940c..a75b57da 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/generateTokens.ts @@ -1,30 +1,87 @@ #!/usr/bin/env tsx /** - * Generates all JSON files from design tokens - * Run: npm run generate:tokens - * Run with watch: npm run generate:tokens watch + * Syncs generated theme token artifacts. + * Run: yarn sync:theme-tokens */ -import { watch } from 'fs'; +import * as fs from 'fs'; import { execSync } from 'child_process'; import * as path from 'path'; +// eslint-disable-next-line @nx/enforce-module-boundaries +import tokensToJson from '../libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson'; -const scriptsToRun = [ - 'libs/ui/src/theme/helpers/designTokens/helpers/tokensToJson.ts', - 'libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts', -]; +const scriptsToRun = ['libs/ui/src/theme/helpers/tailwind/generateTailwindPlugin.ts']; +const commandName = 'sync:theme-tokens'; + +const rootDesignTokensFilePath = path.resolve('designTokens.json'); +const pluginDesignTokensFilePath = path.resolve( + 'libs/ui/src/theme/helpers/designTokens/designTokens.json' +); +const generatedPluginFilePath = path.resolve('libs/ui/src/theme/helpers/tailwind/veraUI.cjs'); + +function syncPluginTokensFromRootOrDefaults(): void { + console.log('\x1b[36m→ Syncing plugin token source\x1b[0m'); + + if (!fs.existsSync(rootDesignTokensFilePath)) { + console.log( + '\x1b[36m→ Root designTokens.json not found. Bootstrapping from TS defaults\x1b[0m' + ); + + tokensToJson('.', 'designTokens.json'); + const generatedRootTokens = fs.readFileSync(rootDesignTokensFilePath, 'utf-8'); + + fs.writeFileSync(pluginDesignTokensFilePath, generatedRootTokens, 'utf-8'); + + console.log( + `\x1b[32m✔ Root designTokens.json created from defaults at ${rootDesignTokensFilePath}\x1b[0m` + ); + + console.log( + `\x1b[32m✔ Plugin design tokens synced from root at ${pluginDesignTokensFilePath}\x1b[0m` + ); + + return; + } + + console.log('\x1b[36m→ Root designTokens.json found. Using it as source of truth\x1b[0m'); + const rootTokens = fs.readFileSync(rootDesignTokensFilePath, 'utf-8'); + + fs.writeFileSync( + pluginDesignTokensFilePath, + rootTokens.endsWith('\n') ? rootTokens : `${rootTokens}\n`, + 'utf-8' + ); + + console.log( + `\x1b[32m✔ Plugin design tokens synced from root at ${pluginDesignTokensFilePath}\x1b[0m` + ); +} /** - * Generates all design token JSON files and Tailwind plugin. - * Runs tokensToJson.ts and generateTailwindPlugin.ts in sequence. + * Syncs design token JSON files and Tailwind plugin. + * - Always regenerates designTokens.example.json from TS defaults. + * - Uses root designTokens.json as source of truth when it exists. + * - Bootstraps root designTokens.json from defaults when it does not exist. + * - Always rebuilds and formats veraUI.cjs. * Exits with error code 1 if any script fails. */ const generateTokens = () => { - console.log('\x1b[36m🔄 Generating design tokens...\x1b[0m\n'); + console.log(`\x1b[36m🔄 [${commandName}] Starting token sync\x1b[0m\n`); + + try { + console.log('\x1b[36m→ Generating root example token artifact\x1b[0m'); + tokensToJson('.', 'designTokens.example.json'); + + syncPluginTokensFromRootOrDefaults(); + } catch (error) { + console.error('\x1b[31m✖ Failed to generate design token JSON files\x1b[0m', error); + process.exit(1); + } for (const script of scriptsToRun) { const scriptPath = path.resolve(script); try { + console.log(`\x1b[36m→ Rebuilding Tailwind plugin via ${script}\x1b[0m`); execSync(`tsx ${scriptPath}`, { stdio: 'inherit' }); } catch (error) { console.error(`\x1b[31m✖ Failed to run ${script}\x1b[0m`, error); @@ -32,54 +89,25 @@ const generateTokens = () => { } } - console.log('\n\x1b[32m✔ All design tokens generated successfully!\x1b[0m'); -}; - -/** - * Watches the design tokens directory for changes and regenerates on change. - * Runs generation once on start, then watches for .ts file changes (excluding tokensToJson.ts). - */ -const runWatch = () => { - const tokensDir = path.resolve('libs/ui/src/theme/helpers/designTokens'); - - console.log('\x1b[36m👀 Watching design tokens for changes...\x1b[0m\n'); - - // Run once on start - generateTokens(); + try { + console.log(`\x1b[36m→ Formatting generated plugin file: ${generatedPluginFilePath}\x1b[0m`); + execSync(`npx prettier --write "${generatedPluginFilePath}"`, { stdio: 'inherit' }); + } catch (error) { + console.error('\x1b[31m✖ Failed to format generated plugin file\x1b[0m', error); + process.exit(1); + } - // Watch for changes - watch(tokensDir, { recursive: true }, (eventType, filename) => { - if (filename && filename.endsWith('.ts') && !filename.includes('helpers/tokensToJson')) { - console.log(`\n\x1b[33m📝 Detected change in ${filename}\x1b[0m`); - try { - generateTokens(); - } catch (error) { - console.error('\x1b[31m✖ Generation failed\x1b[0m', error); - } - } - }); + console.log(`\n\x1b[32m✔ [${commandName}] Token sync completed successfully\x1b[0m`); }; /** * Main entry point for design token generation. - * - * Modes: - * - No args: Generate tokens once - * - watch/--watch: Watch for changes and regenerate - * - * Usage: - * - yarn generate:tokens (generate once) - * - yarn generate:tokens watch (watch mode) */ const main = () => { - const args = process.argv.slice(2); - const [firstArg] = args; - - const isWatchMode = firstArg === 'watch' || firstArg === '--watch'; - - if (isWatchMode) { - runWatch(); - return; + if (process.argv.length > 2) { + console.log( + `\x1b[33m⚠ [${commandName}] This command no longer accepts modes/arguments. Running default sync flow.\x1b[0m` + ); } generateTokens(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts index 47061c8d..0dd3b737 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/lintFix.ts @@ -24,6 +24,7 @@ import { execSync } from 'child_process'; const PROJECT_ROOTS: Record = { frontend: 'frontend', backend: 'backend', + api: 'libs/api', core: 'libs/core', ui: 'libs/ui', common: 'libs/common', diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts index 8862b4a3..283c39ed 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/qualityCheck.ts @@ -74,14 +74,16 @@ function main() { process.exit(1); } + const resolvedProjectName = projectName ? PROJECT_ROOTS[projectName] : null; + const taskRunnerCommand = (() => { if (!projectName) return 'yarn nx run-many -t ts-check,lint --parallel'; - return `yarn nx run-many -t ts-check,lint -p ${projectName} --parallel`; + return `yarn nx run-many -t ts-check,lint -p ${resolvedProjectName} --parallel`; })(); runCommand(taskRunnerCommand); - const prettierTarget = projectName ? PROJECT_ROOTS[projectName] : '.'; + const prettierTarget = resolvedProjectName ?? '.'; runCommand(`yarn prettier ${prettierTarget} --check --log-level warn`); } diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts index a539720b..347080a2 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/start.ts @@ -24,33 +24,45 @@ function startAll(): void { * Builds VeraRoom and serves the example page with http-server. */ function startRoom(): void { + const roomPort = 3350; + // Build console.log('\n📦 Building VeraRoom...\n'); - runCommand('nx run frontend:build-room'); + runCommand('nx run frontend:build-room:standalone'); + runCommand('nx run frontend:build-room-example'); const distRoomPath = path.resolve(__dirname, '../frontend/distRoom'); - // Start http-server on port 3345 - const server = spawn('npx', ['http-server', distRoomPath, '-c-1', '-p', '3345'], { - stdio: ['inherit', 'pipe', 'inherit'], + // Start backend on default port 3345 + const backend = spawn('npx', ['nx', 'run', 'backend:start'], { + stdio: 'inherit', + shell: true, + env: { ...process.env, FRONTEND_TARGET: `http://localhost:${roomPort}/example.html` }, + }); + + // Start room example on separate port + const roomServer = spawn('npx', ['http-server', distRoomPath, '-c-1', '-p', String(roomPort)], { + stdio: 'inherit', shell: true, }); - server.stdout?.on('data', (data: Buffer) => { - const output = data.toString(); - process.stdout.write(output); - - // Print URL once server is ready - if (output.includes('Available on')) { - console.log('\n' + '='.repeat(50)); - console.log('🌐 VeraRoom Example:'); - console.log(' http://localhost:3345/example.html'); - console.log('='.repeat(50) + '\n'); - } + const shutdown = () => { + backend.kill('SIGTERM'); + roomServer.kill('SIGTERM'); + }; + + process.on('SIGINT', shutdown); + process.on('SIGTERM', shutdown); + + backend.on('error', (err) => { + console.error('Failed to start backend:', err); + shutdown(); + process.exit(1); }); - server.on('error', (err) => { + roomServer.on('error', (err) => { console.error('Failed to start http-server:', err); + shutdown(); process.exit(1); }); } diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts index 99e79c04..6335c2dc 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/testBackend.ts @@ -69,17 +69,23 @@ function runDebug(testFilePath?: string) { * Generates coverage reports for code quality analysis. * Optionally runs coverage for a specific test file. */ -function runCoverage(testFilePath?: string) { +function runCoverage(testFilePath?: string, html = false) { const target = testFilePath ? `file: ${testFilePath}` : 'all tests'; console.log(`\n📊 Coverage mode activated for ${target}\n`); + + const htmlReporter = html ? ' --coverageReporters=html' : ''; + if (testFilePath) { - execSync(`yarn nx test backend --configuration=coverage --testPathPattern="${testFilePath}"`, { - stdio: 'inherit', - }); + execSync( + `yarn nx test backend --configuration=coverage --testPathPattern="${testFilePath}"${htmlReporter}`, + { + stdio: 'inherit', + } + ); return; } - execSync('yarn nx test backend --configuration=coverage', { + execSync(`yarn nx test backend --configuration=coverage${htmlReporter}`, { stdio: 'inherit', }); } @@ -92,11 +98,12 @@ function runCoverage(testFilePath?: string) { * Defaults to running a specific test file if the first argument doesn't match a mode. * * @modes - * - (no args) - Run all backend tests - * - watch [file-path] - Watch mode (re-run on changes with coverage) - * - debug [file-path] - Debug mode (attach Node debugger, run serially) - * - coverage [file-path]- Run with coverage reports - * - - Run specific test file + * - (no args) - Run all backend tests + * - watch [file-path] - Watch mode (re-run on changes with coverage) + * - debug [file-path] - Debug mode (attach Node debugger, run serially) + * - coverage [file-path] - Run with coverage reports + * - coverage html [file-path]- Run with HTML coverage report + * - - Run specific test file * * @example * yarn test:backend @@ -106,10 +113,12 @@ function runCoverage(testFilePath?: string) { * yarn test:backend debug services/feedbackService.test.ts * yarn test:backend coverage * yarn test:backend coverage videoService + * yarn test:backend coverage html + * yarn test:backend coverage html routes/session.test.ts */ function main() { const args = process.argv.slice(2); - const [firstArg, secondArg] = args; + const [firstArg, secondArg, thirdArg] = args; const noArgs = args.length === 0; const isDebugMode = firstArg === 'debug'; @@ -149,7 +158,10 @@ function main() { } if (isCoverageMode) { - runCoverage(secondArg); + const isHtmlCoverage = secondArg === 'html'; + const testFilePath = isHtmlCoverage ? thirdArg : secondArg; + + runCoverage(testFilePath, isHtmlCoverage); return; } diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts index 97b14a60..8a050980 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/testIntegration.ts @@ -4,7 +4,15 @@ import { execSync } from 'child_process'; const args = process.argv.slice(2); -const VALID_MODES = ['debug', 'inspect', 'canon', 'update', 'updateScreenshots'] as const; +const VALID_MODES = [ + 'api', + 'debug', + 'inspect', + 'canon', + 'update', + 'updateScreenshots', + 'playwright', +] as const; type ValidMode = (typeof VALID_MODES)[number]; @@ -30,15 +38,49 @@ const runCommand = (command: string, { preserveNodeOptions = false } = {}) => { }; /** - * Runs all integration tests across all browsers. + * Checks if the given path points to an API integration test inside tests/api/. + */ +const isApiTestPath = (testPath: string): boolean => { + return testPath === 'api' || testPath.includes('test-api/') || testPath.includes('apiIntegrity'); +}; + +/** + * Runs API integration tests (Jest-based tests in tests/api/). + * Optionally filters by a specific test file path. + */ +const runApiTests = (testFilePath?: string) => { + const target = testFilePath ? `file: ${testFilePath}` : 'all API tests'; + console.log(`\n🤖 Running API integration tests: ${target}\n`); + const testPattern = testFilePath ? ` --testPathPattern="${testFilePath}"` : ''; + const command = `bash -c 'source ../../vcrBuild.env.sh && jest --maxWorkers=1${testPattern}'`; + console.log(`\n🚀 Running: ${command}\n`); + execSync(command, { + stdio: 'inherit', + cwd: 'integration-tests/test-api', + env: { ...process.env, NODE_OPTIONS: '--experimental-vm-modules' }, + }); +}; + +/** + * Runs all Playwright integration tests across all browsers. * Uses Playwright's default configuration (Chrome, Firefox, Mobile Chrome). * Uses nx target for caching benefits. */ -const runAllTests = () => { - console.log('\n🤖 Running all integration tests (Chrome, Firefox, Mobile Chrome)...\n'); +const runAllPlaywrightTests = () => { + console.log( + '\n🤖 Running all Playwright integration tests (Chrome, Firefox, Mobile Chrome)...\n' + ); runCommand('nx run integration-tests:test'); }; +/** + * Runs all integration tests: API tests (Jest) + Playwright tests. + */ +const runAllTests = () => { + runApiTests(); + runAllPlaywrightTests(); +}; + /** * Runs a specific test in headed Chrome mode. * Test runs in headed mode (browser window visible) for debugging. @@ -115,6 +157,8 @@ const updateScreenshots = (testNameOrPath?: string) => { * * @modes * - (no args) - Run all tests in all browsers (headless) + * - api - Run only API integration tests (Jest) + * - playwright - Run only Playwright tests (skip API tests) * - debug [test-name] - Debug mode (Playwright Inspector + Chrome DevTools, timeout disabled) * - inspect [test-name] - Inspect mode (Chrome DevTools, headed mode) * - canon [test-name] - Generate canonical screenshots (baseline for visual regression) @@ -123,6 +167,8 @@ const updateScreenshots = (testNameOrPath?: string) => { * * @example * yarn test:integration + * yarn test:integration api + * yarn test:integration playwright * yarn test:integration callQuality * yarn test:integration debug * yarn test:integration debug callQuality @@ -139,6 +185,7 @@ const main = () => { const isInspectMode = firstArg === 'inspect'; const isCanonMode = firstArg === 'canon'; const isUpdateMode = firstArg === 'update' || firstArg === 'updateScreenshots'; + const isPlaywrightMode = firstArg === 'playwright'; const isKnownMode = VALID_MODES.includes(firstArg as ValidMode); if (noArgs) { @@ -153,6 +200,7 @@ const main = () => { if (firstArg.startsWith('-') || firstArg.startsWith('--')) { console.error(`\n❌ Error: Unknown mode '${firstArg}'\n`); console.error('Valid modes:'); + console.error(' • playwright - Run only Playwright tests (skip API tests)'); console.error(' • debug - Debug mode (Playwright Inspector, no timeout)'); console.error(' • inspect - Inspect mode (Chrome DevTools, headed)'); console.error(' • canon - Generate canonical screenshots'); @@ -167,6 +215,11 @@ const main = () => { } } + if (isPlaywrightMode) { + runAllPlaywrightTests(); + return; + } + if (isDebugMode) { runDebug(secondArg); return; @@ -187,6 +240,11 @@ const main = () => { return; } + if (isApiTestPath(firstArg)) { + runApiTests(firstArg === 'api' ? undefined : firstArg); + return; + } + runHeadedTest(firstArg); }; diff --git a/tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts b/tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts new file mode 100644 index 00000000..680a08be --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/project/scripts/tsCheck.ts @@ -0,0 +1,67 @@ +#!/usr/bin/env node +import { execSync } from 'child_process'; + +const PROJECT_ALIASES: Record = { + frontend: 'frontend', + backend: 'backend', + api: 'api', + core: 'core', + ui: 'ui', + common: 'common', + 'integration-tests': 'integration-tests', +}; + +function runCommand(command: string) { + execSync(command, { stdio: 'inherit' }); +} + +function printHelp() { + console.log('Usage:'); + console.log(' yarn ts-check'); + console.log(' yarn ts-check '); + console.log(''); + console.log('Projects:'); + console.log(` ${Object.keys(PROJECT_ALIASES).join(', ')}`); + console.log(''); + console.log('Examples:'); + console.log(' yarn ts-check'); + console.log(' yarn ts-check frontend'); + console.log(' yarn ts-check studio'); +} + +function main() { + const commandLineArguments = process.argv.slice(2); + const [firstArgument, secondArgument] = commandLineArguments; + + const isHelpFlag = (value?: string) => value === '-h' || value === '--help'; + + if (isHelpFlag(firstArgument) || isHelpFlag(secondArgument)) { + printHelp(); + return; + } + + if (secondArgument) { + console.error('\nError: Only one project name is supported.\n'); + printHelp(); + process.exit(1); + } + + const projectName = firstArgument; + + if (!projectName) { + runCommand('yarn nx run-many -t ts-check --parallel'); + return; + } + + const resolvedProjectName = PROJECT_ALIASES[projectName]; + + if (!resolvedProjectName) { + console.error(`\nError: Unknown project '${projectName}'.\n`); + printHelp(); + process.exit(1); + } + + runCommand(`yarn nx run-many -t ts-check -p ${resolvedProjectName}`); +} + +main(); diff --git a/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties b/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties index c2cb70d4..96543df4 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties +++ b/tutorials/vonage_video_react_app-feature-config/project/sonar-project.properties @@ -35,7 +35,6 @@ customWordList.mjs,\ libs/ui/src/theme/helpers/designTokens/**,\ libs/ui/src/theme/helpers/tailwind/**,\ frontend/src/test/mocks/vonageVideo.ts,\ -# Exclude all Storybook files **/.storybook/**,\ **/*.stories.tsx,\ **/*.stories.ts,\ @@ -43,6 +42,8 @@ frontend/src/test/mocks/vonageVideo.ts,\ **/*.story.ts,\ libs/common/test/**/*,\ libs/common/testBrowser/**,\ +libs/common/testNode/**,\ +backend/jest/setEnvVars.js,\ **/index.ts,\ **/index.tsx, \ **/example/** diff --git a/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml b/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml index 70483a46..e3df97e1 100644 --- a/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml +++ b/tutorials/vonage_video_react_app-feature-config/project/vcr-gha.yml @@ -40,5 +40,9 @@ instance: secret: JIRA_EPIC_LINK - name: JIRA_EPIC_URL secret: JIRA_EPIC_URL + - name: JIRA_SEVERITY_ID + secret: JIRA_SEVERITY_ID + - name: SESSION_KEY_SECRET + secret: SESSION_KEY_SECRET debug: entrypoint: [node, bundle.cjs] diff --git a/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh b/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh index 2446134b..7e023aec 100755 --- a/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh +++ b/tutorials/vonage_video_react_app-feature-config/project/vcrBuild.env.sh @@ -7,6 +7,11 @@ export ALLOW_BACKGROUND_EFFECTS=true export ALLOW_CAMERA_CONTROL=true export ALLOW_VIDEO_ON_JOIN=true export DEFAULT_RESOLUTION='1280x720' +export PUBLISHER_MAX_RESOLUTION='1920x1080' +export NOTIFICATION_DURATION_MS=4000 +export MIN_CUSTOM_VIDEO_BITRATE_BPS=5000 +export MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000 +export SUPPORTED_FRAME_RATES='30|15|7|1' export ALLOW_ADVANCED_NOISE_SUPPRESSION=true export ALLOW_AUDIO_ON_JOIN=true export ALLOW_MICROPHONE_CONTROL=true @@ -20,3 +25,5 @@ export ALLOW_EMOJIS=true export ALLOW_SCREEN_SHARE=true export DEFAULT_LAYOUT_MODE='active-speaker' export SHOW_PARTICIPANT_LIST=true +export MEETING_ROOM_ALLOW_ADVANCED_SETTINGS=true +export WAITING_ROOM_ALLOW_ADVANCED_SETTINGS=true \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/project/yarn.lock b/tutorials/vonage_video_react_app-feature-config/project/yarn.lock deleted file mode 100644 index b130e4f1..00000000 --- a/tutorials/vonage_video_react_app-feature-config/project/yarn.lock +++ /dev/null @@ -1,14608 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adobe/css-tools@^4.4.0": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.4.tgz#2856c55443d3d461693f32d2b96fb6ea92e1ffa9" - integrity sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg== - -"@ampproject/remapping@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== - dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" - integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.23.2", "@babel/core@^7.23.9", "@babel/core@^7.24.4", "@babel/core@^7.27.4", "@babel/core@^7.28.0", "@babel/core@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" - integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== - dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.27.5", "@babel/generator@^7.29.0", "@babel/generator@^7.7.2": - version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" - integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== - dependencies: - "@babel/parser" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== - dependencies: - "@babel/types" "^7.27.3" - -"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz#611ff5482da9ef0db6291bcd24303400bca170fb" - integrity sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.6" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1", "@babel/helper-create-regexp-features-plugin@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz#7c1ddd64b2065c7f78034b25b43346a7e19ed997" - integrity sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - regexpu-core "^6.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.6": - version "0.6.6" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz#714dfe33d8bd710f556df59953720f6eeb6c1a14" - integrity sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA== - dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - debug "^4.4.3" - lodash.debounce "^4.0.8" - resolve "^1.22.11" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-member-expression-to-functions@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz#f3e07a10be37ed7a63461c63e6929575945a6150" - integrity sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg== - dependencies: - "@babel/traverse" "^7.28.5" - "@babel/types" "^7.28.5" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== - dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" - -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.8.0": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" - integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== - -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-replace-supers@^7.27.1", "@babel/helper-replace-supers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz#94aa9a1d7423a00aead3f204f78834ce7d53fe44" - integrity sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.28.5" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.28.6" - -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helper-wrap-function@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz#4e349ff9222dab69a93a019cc296cdd8442e279a" - integrity sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ== - dependencies: - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helpers@^7.27.0", "@babel/helpers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" - integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== - dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" - integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== - dependencies: - "@babel/types" "^7.29.0" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz#fbde57974707bbfa0376d34d425ff4fa6c732421" - integrity sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz#0e8289cec28baaf05d54fd08d81ae3676065f69f" - integrity sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-proposal-decorators@^7.22.7": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz#d159f26f78740e47bf3ef075882b155b2d54ca81" - integrity sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-decorators" "^7.28.6" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz#8c3293a0fef033e4c786b35ce1e159fc1d676153" - integrity sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-assertions@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz#ae9bc1923a6ba527b70104dd2191b0cd872c8507" - integrity sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz#b71d5914665f60124e133696f17cd7669062c503" - integrity sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.28.6", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz#f8ca28bbd84883b5fea0e447c635b81ba73997ee" - integrity sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.27.1", "@babel/plugin-syntax-typescript@^7.28.6", "@babel/plugin-syntax-typescript@^7.3.3", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz#c7b2ddf1d0a811145b1de800d1abd146af92e3a2" - integrity sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-async-generator-functions@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz#63ed829820298f0bf143d5a4a68fb8c06ffd742f" - integrity sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.29.0" - -"@babel/plugin-transform-async-to-generator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz#bd97b42237b2d1bc90d74bcb486c39be5b4d7e77" - integrity sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-remap-async-to-generator" "^7.27.1" - -"@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-block-scoping@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz#e1ef5633448c24e76346125c2534eeb359699a99" - integrity sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-class-properties@^7.22.5", "@babel/plugin-transform-class-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz#d274a4478b6e782d9ea987fda09bdb6d28d66b72" - integrity sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-class-static-block@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz#1257491e8259c6d125ac4d9a6f39f9d2bf3dba70" - integrity sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-classes@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz#8f6fb79ba3703978e701ce2a97e373aae7dda4b7" - integrity sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-replace-supers" "^7.28.6" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-transform-computed-properties@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz#936824fc71c26cb5c433485776d79c8e7b0202d2" - integrity sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/template" "^7.28.6" - -"@babel/plugin-transform-destructuring@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz#b8402764df96179a2070bb7b501a1586cf8ad7a7" - integrity sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.5" - -"@babel/plugin-transform-dotall-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz#def31ed84e0fb6e25c71e53c124e7b76a4ab8e61" - integrity sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz#8014b8a6cfd0e7b92762724443bf0d2400f26df1" - integrity sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-explicit-resource-management@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz#dd6788f982c8b77e86779d1d029591e39d9d8be7" - integrity sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - -"@babel/plugin-transform-exponentiation-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz#5e477eb7eafaf2ab5537a04aaafcf37e2d7f1091" - integrity sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== - dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-transform-json-strings@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz#4c8c15b2dc49e285d110a4cf3dac52fd2dfc3038" - integrity sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-logical-assignment-operators@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz#53028a3d77e33c50ef30a8fce5ca17065936e605" - integrity sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-commonjs@^7.27.1", "@babel/plugin-transform-modules-commonjs@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz#c0232e0dfe66a734cc4ad0d5e75fc3321b6fdef1" - integrity sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA== - dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-modules-systemjs@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz#e458a95a17807c415924106a3ff188a3b8dee964" - integrity sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ== - dependencies: - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.29.0" - -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz#a26cd51e09c4718588fc4cce1c5d1c0152102d6a" - integrity sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz#9bc62096e90ab7a887f3ca9c469f6adec5679757" - integrity sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-numeric-separator@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz#1310b0292762e7a4a335df5f580c3320ee7d9e9f" - integrity sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-object-rest-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz#fdd4bc2d72480db6ca42aed5c051f148d7b067f7" - integrity sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA== - dependencies: - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.6" - -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - -"@babel/plugin-transform-optional-catch-binding@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz#75107be14c78385978201a49c86414a150a20b4c" - integrity sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-optional-chaining@^7.27.1", "@babel/plugin-transform-optional-chaining@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz#926cf150bd421fc8362753e911b4a1b1ce4356cd" - integrity sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-private-methods@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz#c76fbfef3b86c775db7f7c106fff544610bdb411" - integrity sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-private-property-in-object@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz#4fafef1e13129d79f1d75ac180c52aafefdb2811" - integrity sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-constant-elements@^7.21.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz#6c6b50424e749a6e48afd14cf7b92f98cb9383f9" - integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-display-name@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" - integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-development@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" - integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.27.1" - -"@babel/plugin-transform-react-jsx-self@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-source@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz#f51cb70a90b9529fbb71ee1f75ea27b7078eed62" - integrity sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/plugin-syntax-jsx" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/plugin-transform-react-pure-annotations@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" - integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-regenerator@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz#dec237cec1b93330876d6da9992c4abd42c9d18b" - integrity sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-regexp-modifiers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz#7ef0163bd8b4a610481b2509c58cf217f065290b" - integrity sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-runtime@^7.23.2": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz#a5fded13cc656700804bfd6e5ebd7fffd5266803" - integrity sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-spread@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz#40a2b423f6db7b70f043ad027a58bcb44a9757b6" - integrity sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA== - dependencies: - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typescript@^7.28.5": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz#1e93d96da8adbefdfdade1d4956f73afa201a158" - integrity sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.28.6" - -"@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-property-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz#63a7a6c21a0e75dae9b1861454111ea5caa22821" - integrity sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-sets-regex@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz#924912914e5df9fe615ec472f88ff4788ce04d4e" - integrity sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.28.5" - "@babel/helper-plugin-utils" "^7.28.6" - -"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.23.2": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.0.tgz#c55db400c515a303662faaefd2d87e796efa08d0" - integrity sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w== - dependencies: - "@babel/compat-data" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-plugin-utils" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.28.5" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.6" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.28.6" - "@babel/plugin-syntax-import-attributes" "^7.28.6" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.29.0" - "@babel/plugin-transform-async-to-generator" "^7.28.6" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.6" - "@babel/plugin-transform-class-properties" "^7.28.6" - "@babel/plugin-transform-class-static-block" "^7.28.6" - "@babel/plugin-transform-classes" "^7.28.6" - "@babel/plugin-transform-computed-properties" "^7.28.6" - "@babel/plugin-transform-destructuring" "^7.28.5" - "@babel/plugin-transform-dotall-regex" "^7.28.6" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.6" - "@babel/plugin-transform-exponentiation-operator" "^7.28.6" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.28.6" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.28.6" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.28.6" - "@babel/plugin-transform-modules-systemjs" "^7.29.0" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.0" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.28.6" - "@babel/plugin-transform-numeric-separator" "^7.28.6" - "@babel/plugin-transform-object-rest-spread" "^7.28.6" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.28.6" - "@babel/plugin-transform-optional-chaining" "^7.28.6" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.28.6" - "@babel/plugin-transform-private-property-in-object" "^7.28.6" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.29.0" - "@babel/plugin-transform-regexp-modifiers" "^7.28.6" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.28.6" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.28.6" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.28.6" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.15" - babel-plugin-polyfill-corejs3 "^0.14.0" - babel-plugin-polyfill-regenerator "^0.6.6" - core-js-compat "^3.48.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.18.6": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.28.5.tgz#6fcc0400fa79698433d653092c3919bb4b0878d9" - integrity sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-transform-react-display-name" "^7.28.0" - "@babel/plugin-transform-react-jsx" "^7.27.1" - "@babel/plugin-transform-react-jsx-development" "^7.27.1" - "@babel/plugin-transform-react-pure-annotations" "^7.27.1" - -"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz#540359efa3028236958466342967522fd8f2a60c" - integrity sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-typescript" "^7.28.5" - -"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.22.6", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.26.10", "@babel/runtime@^7.27.6", "@babel/runtime@^7.28.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b" - integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== - -"@babel/template@^7.28.6", "@babel/template@^7.3.3": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/traverse@^7.16.0", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" - integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== - dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.5", "@babel/types@^7.28.6", "@babel/types@^7.29.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@cspell/cspell-bundled-dicts@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.6.4.tgz#e0ee7d45053e0f8f675e1b655146ea09b416f323" - integrity sha512-OIiPQuB7XQ6rnUv4KaCwHr9vNwbh6VZ4GfgQjcThT0oz0hkL6E5Ar3tq54K9jyqE9ylcHqpRuXUgnKgio6Hlig== - dependencies: - "@cspell/dict-ada" "^4.1.1" - "@cspell/dict-al" "^1.1.1" - "@cspell/dict-aws" "^4.0.17" - "@cspell/dict-bash" "^4.2.2" - "@cspell/dict-companies" "^3.2.10" - "@cspell/dict-cpp" "^7.0.2" - "@cspell/dict-cryptocurrencies" "^5.0.5" - "@cspell/dict-csharp" "^4.0.8" - "@cspell/dict-css" "^4.0.19" - "@cspell/dict-dart" "^2.3.2" - "@cspell/dict-data-science" "^2.0.13" - "@cspell/dict-django" "^4.1.6" - "@cspell/dict-docker" "^1.1.17" - "@cspell/dict-dotnet" "^5.0.11" - "@cspell/dict-elixir" "^4.0.8" - "@cspell/dict-en-common-misspellings" "^2.1.12" - "@cspell/dict-en-gb-mit" "^3.1.17" - "@cspell/dict-en_us" "^4.4.28" - "@cspell/dict-filetypes" "^3.0.15" - "@cspell/dict-flutter" "^1.1.1" - "@cspell/dict-fonts" "^4.0.5" - "@cspell/dict-fsharp" "^1.1.1" - "@cspell/dict-fullstack" "^3.2.8" - "@cspell/dict-gaming-terms" "^1.1.2" - "@cspell/dict-git" "^3.1.0" - "@cspell/dict-golang" "^6.0.26" - "@cspell/dict-google" "^1.0.9" - "@cspell/dict-haskell" "^4.0.6" - "@cspell/dict-html" "^4.0.14" - "@cspell/dict-html-symbol-entities" "^4.0.5" - "@cspell/dict-java" "^5.0.12" - "@cspell/dict-julia" "^1.1.1" - "@cspell/dict-k8s" "^1.0.12" - "@cspell/dict-kotlin" "^1.1.1" - "@cspell/dict-latex" "^5.0.0" - "@cspell/dict-lorem-ipsum" "^4.0.5" - "@cspell/dict-lua" "^4.0.8" - "@cspell/dict-makefile" "^1.0.5" - "@cspell/dict-markdown" "^2.0.14" - "@cspell/dict-monkeyc" "^1.0.12" - "@cspell/dict-node" "^5.0.9" - "@cspell/dict-npm" "^5.2.32" - "@cspell/dict-php" "^4.1.1" - "@cspell/dict-powershell" "^5.0.15" - "@cspell/dict-public-licenses" "^2.0.15" - "@cspell/dict-python" "^4.2.25" - "@cspell/dict-r" "^2.1.1" - "@cspell/dict-ruby" "^5.1.0" - "@cspell/dict-rust" "^4.1.2" - "@cspell/dict-scala" "^5.0.9" - "@cspell/dict-shell" "^1.1.2" - "@cspell/dict-software-terms" "^5.1.20" - "@cspell/dict-sql" "^2.2.1" - "@cspell/dict-svelte" "^1.0.7" - "@cspell/dict-swift" "^2.0.6" - "@cspell/dict-terraform" "^1.1.3" - "@cspell/dict-typescript" "^3.2.3" - "@cspell/dict-vue" "^3.0.5" - "@cspell/dict-zig" "^1.0.0" - -"@cspell/cspell-performance-monitor@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.6.4.tgz#17719196e9c242b09bb804972f2f4dc0076c74c7" - integrity sha512-exuqxV1IVfZkasg57ZjUbaHeZDd6Mdbsbe5FBT3+XaVnRij+wpY2oEW9+kIOL5MOQE3bgQKgu37iMtA1NlCrGA== - -"@cspell/cspell-pipe@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-9.6.4.tgz#521b542ef0759460c25366b392943625c507e1a1" - integrity sha512-vVxajTG9Ko01oHk8HPsMLajcLrd9AfkOk6vdgFI4FD7ZPq1CY0hfTmfmJ8bzZ4/QkqXglTvePdSgHQVJeltwWw== - -"@cspell/cspell-resolver@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-9.6.4.tgz#0c527ebbee041aada1276bf122557c7b8b39d066" - integrity sha512-3xsgZEqqH9Uj8ZYLBnWbnsHz8wphgaeuWKcNDqgwoMjvwTMQLGoXjHht8Jx5yxd2e080lB7fJax8TaBdCzmFFA== - dependencies: - global-directory "^4.0.1" - -"@cspell/cspell-service-bus@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-9.6.4.tgz#54308fef3e27e6cedc8d6a381f31957bc766bf37" - integrity sha512-oGNEzP1gJ43rLklJQjOk5PsfX0mZkLjV19djGptb9xZQeC2qAUxnaAbZtWt5CE8ni2iiTaRmgNRbUqAhRCnjew== - -"@cspell/cspell-types@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-9.6.4.tgz#78a60dddb76c0283425cfea2b305b3076817067b" - integrity sha512-lf6d+BdMkJIFCxx2FpajLpqVGGyaGUNFU6jhEM6QUPeGuoA5et2kJXrL0NSY2uWLOVyYYc/FPjzlbe8trA9tBQ== - -"@cspell/dict-ada@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.1.1.tgz#78c0c9916e8c96cd38908c02b0c4979f9622c650" - integrity sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ== - -"@cspell/dict-al@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-al/-/dict-al-1.1.1.tgz#d6581e7801daa0f4e7512d3431e7f00c1e7d53e1" - integrity sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ== - -"@cspell/dict-aws@^4.0.17": - version "4.0.17" - resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.17.tgz#73dba92ce69868babe114d6e436a5e4dd45b6c6c" - integrity sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w== - -"@cspell/dict-bash@^4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.2.2.tgz#44250d9f64067cf20a8d76dc885963c6902c6e21" - integrity sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q== - dependencies: - "@cspell/dict-shell" "1.1.2" - -"@cspell/dict-companies@^3.2.10": - version "3.2.10" - resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.2.10.tgz#0c6f5ad5e55319ff04b5b8a3a4e53c34042fcdf3" - integrity sha512-bJ1qnO1DkTn7JYGXvxp8FRQc4yq6tRXnrII+jbP8hHmq5TX5o1Wu+rdfpoUQaMWTl6balRvcMYiINDesnpR9Bw== - -"@cspell/dict-cpp@^7.0.2": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz#bbedeb669e56956f2da7e0977a3a1ad4dc660f83" - integrity sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA== - -"@cspell/dict-cryptocurrencies@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz#843a6ac45216227f5436c442a8683c1571e57160" - integrity sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA== - -"@cspell/dict-csharp@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz#27f6d5873f4dde77c03c78bb7d3c51bc8d8d78c1" - integrity sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ== - -"@cspell/dict-css@^4.0.19": - version "4.0.19" - resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.19.tgz#0d7c78ff00ee73420ad9f8588d30df00bc290090" - integrity sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg== - -"@cspell/dict-dart@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.3.2.tgz#aae782dcf6c673857945b9bbe03beeaa79649222" - integrity sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw== - -"@cspell/dict-data-science@^2.0.13": - version "2.0.13" - resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz#234e399bd7af8cd6c1be6054be7b65aed6974479" - integrity sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA== - -"@cspell/dict-django@^4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.6.tgz#a92408ba8971ca3df3c602b9e3750a14be69a8f6" - integrity sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w== - -"@cspell/dict-docker@^1.1.17": - version "1.1.17" - resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.17.tgz#8674b3613dfa9c7d2922f6ec29ff845cb16e6650" - integrity sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ== - -"@cspell/dict-dotnet@^5.0.11": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.12.tgz#c856db0896b6833bde1e727d590d85cec96a1f8d" - integrity sha512-FiV934kNieIjGTkiApu/WKvLYi/KBpvfWB2TSqpDQtmXZlt3uSa5blwblO1ZC8OvjH8RCq/31H5IdEYmTaZS7A== - -"@cspell/dict-elixir@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz#c1b2a30d0fc654a001f718f196beb60c01e0e1f6" - integrity sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q== - -"@cspell/dict-en-common-misspellings@^2.1.12": - version "2.1.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz#5e15fdbdd65d6624518cb2812d0cc2c445faada8" - integrity sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw== - -"@cspell/dict-en-gb-mit@^3.1.17": - version "3.1.18" - resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.18.tgz#6f93c5339921dc0bb4719f9a11b7721e01ce7890" - integrity sha512-AXaMzbaxhSc32MSzKX0cpwT+Thv1vPfxQz1nTly1VHw3wQcwPqVFSqrLOYwa8VNqAPR45583nnhD6iqJ9YESoQ== - -"@cspell/dict-en_us@^4.4.28": - version "4.4.29" - resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.4.29.tgz#b83162051201f35a7c7728678f738b931955ec0e" - integrity sha512-G3B27++9ziRdgbrY/G/QZdFAnMzzx17u8nCb2Xyd4q6luLpzViRM/CW3jA+Mb/cGT5zR/9N+Yz9SrGu1s0bq7g== - -"@cspell/dict-filetypes@^3.0.15": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.15.tgz#63e39ffcfd25a4787d88b1ba8b461d20833c514f" - integrity sha512-uDMeqYlLlK476w/muEFQGBy9BdQWS0mQ7BJiy/iQv5XUWZxE2O54ZQd9nW8GyQMzAgoyg5SG4hf9l039Qt66oA== - -"@cspell/dict-flutter@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz#fab57cf189a8012e870d2e1f21526b18345038d7" - integrity sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A== - -"@cspell/dict-fonts@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz#21ff391df20722c7d370ce79c89665e4b8980200" - integrity sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ== - -"@cspell/dict-fsharp@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz#46414a8177b1c3373f1edb156df446088147cc22" - integrity sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA== - -"@cspell/dict-fullstack@^3.2.8": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.2.8.tgz#8ae90638263bc16cfeccac41c97d8a8c65ad2f29" - integrity sha512-J6EeoeThvx/DFrcA2rJiCA6vfqwJMbkG0IcXhlsmRZmasIpanmxgt90OEaUazbZahFiuJT8wrhgQ1QgD1MsqBw== - -"@cspell/dict-gaming-terms@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz#459aa470b43eacbd3cbf7b32bd5bbb259cb78812" - integrity sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q== - -"@cspell/dict-git@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.1.0.tgz#7ac48114425c74e0a1c00f154138cf81b04f250b" - integrity sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ== - -"@cspell/dict-golang@^6.0.26": - version "6.0.26" - resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.26.tgz#8d0a6f09ade1c489a92b594475bba2b6020b6d28" - integrity sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg== - -"@cspell/dict-google@^1.0.9": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@cspell/dict-google/-/dict-google-1.0.9.tgz#5bf72aecf2ae8289bd2427245ca13ee77b39399c" - integrity sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA== - -"@cspell/dict-haskell@^4.0.6": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz#881436f944a6901cff8fab1af776277ca96f1b8c" - integrity sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ== - -"@cspell/dict-html-symbol-entities@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz#cbdd8c133c7d649d32e10f48b58bd4a9304b5cb6" - integrity sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA== - -"@cspell/dict-html@^4.0.14": - version "4.0.14" - resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.14.tgz#bc188c7094ed02be9aef3b7be65c601363026c99" - integrity sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q== - -"@cspell/dict-java@^5.0.12": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.12.tgz#869ab27a972c7c0854a7a4854b770c4cf941fb8b" - integrity sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A== - -"@cspell/dict-julia@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.1.1.tgz#78601c0e9397c2cba1aecfcc01dcc0654c5d2b9a" - integrity sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA== - -"@cspell/dict-k8s@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz#f4dd4e780fd698af8b9e3ac9106d10c35a96df18" - integrity sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg== - -"@cspell/dict-kotlin@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz#830d7b3d33685c0998ef5b922b0d7779f6669706" - integrity sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q== - -"@cspell/dict-latex@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-5.0.0.tgz#3c43e77df6a7abe84176bc5395fdb5dbb417e5f8" - integrity sha512-HUrIqUVohM6P0+5b7BsdAdb0STIv0aaFBvguI7pLcreljlcX3FSPUxea7ticzNlCNeVrEaiEn/ws9m6rYUeuNw== - -"@cspell/dict-lorem-ipsum@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz#0321cef57b09387ea3dbae1ecd52123da9ec810f" - integrity sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q== - -"@cspell/dict-lua@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.8.tgz#0bb1683212cdac2acb60483bd5c8970d62a41972" - integrity sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA== - -"@cspell/dict-makefile@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz#fe6e7df2360ff694ef41c90a0d4b422e81f560ef" - integrity sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ== - -"@cspell/dict-markdown@^2.0.14": - version "2.0.14" - resolved "https://registry.yarnpkg.com/@cspell/dict-markdown/-/dict-markdown-2.0.14.tgz#9c3f83af1608acf601f396344a15d8844b04b6f2" - integrity sha512-uLKPNJsUcumMQTsZZgAK9RgDLyQhUz/uvbQTEkvF/Q4XfC1i/BnA8XrOrd0+Vp6+tPOKyA+omI5LRWfMu5K/Lw== - -"@cspell/dict-monkeyc@^1.0.12": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz#76d4127d19d861acfb047a24fdc841b781416ef4" - integrity sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw== - -"@cspell/dict-node@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-5.0.9.tgz#ca894e62b85deaf2f55e9d9c86fdbb260ba923eb" - integrity sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ== - -"@cspell/dict-npm@^5.2.32": - version "5.2.34" - resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.2.34.tgz#6a37cfb680156e51d96dfcda827e42f61d64ecfb" - integrity sha512-M2MtfmYeHIPBuC8esMU4JQXHKma7Xt7VyBWUk67B62KDu61sxebQ2HeizdqmN2sLEJsTkq3bZT5PGzHpZ0LEWQ== - -"@cspell/dict-php@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.1.1.tgz#39117cde87706f843a0476c56b807c16d71a9e4b" - integrity sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA== - -"@cspell/dict-powershell@^5.0.15": - version "5.0.15" - resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz#4ad8b6a741c96508f7b5acbcda2a15978be351c6" - integrity sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg== - -"@cspell/dict-public-licenses@^2.0.15": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz#e5a627fec1e08a482adef9e2e1a4f27e30740abf" - integrity sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg== - -"@cspell/dict-python@^4.2.25": - version "4.2.25" - resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.2.25.tgz#faa0933aaeb121570f2faa00967b3cf6c298b6a5" - integrity sha512-hDdN0YhKgpbtZVRjQ2c8jk+n0wQdidAKj1Fk8w7KEHb3YlY5uPJ0mAKJk7AJKPNLOlILoUmN+HAVJz+cfSbWYg== - dependencies: - "@cspell/dict-data-science" "^2.0.13" - -"@cspell/dict-r@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.1.1.tgz#ace8d66799cae4148411bb6483d9c8a8a3c8a50f" - integrity sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw== - -"@cspell/dict-ruby@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.1.0.tgz#daf18ae87ad6dbfa7d7292e46b61f004eb40347f" - integrity sha512-9PJQB3cfkBULrMLp5kSAcFPpzf8oz9vFN+QYZABhQwWkGbuzCIXSorHrmWSASlx4yejt3brjaWS57zZ/YL5ZQQ== - -"@cspell/dict-rust@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.1.2.tgz#6a151e72dc3be916c040111bba7358401ba57e15" - integrity sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg== - -"@cspell/dict-scala@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.9.tgz#181d6b9cad0596bec2f8df198a79576f97112b6e" - integrity sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg== - -"@cspell/dict-shell@1.1.2", "@cspell/dict-shell@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-shell/-/dict-shell-1.1.2.tgz#33634372214d3a3466b409e94392f6aaee6a0e9b" - integrity sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA== - -"@cspell/dict-software-terms@^5.1.20": - version "5.1.21" - resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-5.1.21.tgz#94f1d4a5635124fbbd9a9be2edd0696931d55df0" - integrity sha512-3lAB4OXsf6rs5zbwe4/nKmwyAJAvjs5KTRrPckzHx7q9dYpviW+UxDyhevCCsRfmcu24OhYP7BVQWXxLvYk4xA== - -"@cspell/dict-sql@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.2.1.tgz#7dd2f1da1c32d3837c98986ab65727bb94332597" - integrity sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg== - -"@cspell/dict-svelte@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz#c2d9edabc34052b56f6b19754672d392caa315e0" - integrity sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ== - -"@cspell/dict-swift@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.6.tgz#bd2f7684b6fbf287fe82c4ebc0736bb38170bd2c" - integrity sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA== - -"@cspell/dict-terraform@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz#ccd45bd1e4a4ae69cdf8f8649a881c63b7295c66" - integrity sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA== - -"@cspell/dict-typescript@^3.2.3": - version "3.2.3" - resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz#cf90e8248d6e5749daaa49bff460060b77d12301" - integrity sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg== - -"@cspell/dict-vue@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.5.tgz#e915b6a004d0352f5c27a2e4583c42dba62b6ce0" - integrity sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA== - -"@cspell/dict-zig@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-zig/-/dict-zig-1.0.0.tgz#f75fef19f2fdad6f5bc4d02b95b8bec824e82ab9" - integrity sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ== - -"@cspell/dynamic-import@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-9.6.4.tgz#fa7dfb4c0d5489d15461da91627bed4f00913409" - integrity sha512-1VnL9ahT3s17DLWl4MeO1pYg7zcVT3X9cKynI2/U86zNK5xMGS5icvjp7X65tsCAVNcWOtkqVFfrxi7kWxn67g== - dependencies: - "@cspell/url" "9.6.4" - import-meta-resolve "^4.2.0" - -"@cspell/eslint-plugin@^9.3.0": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/eslint-plugin/-/eslint-plugin-9.6.4.tgz#a4f6bc68c1a97efa688095703305edcf45450fea" - integrity sha512-MldCPtfj7XWQY7bnnLS/7A/YfLKWGUQALg2hSNy6AQ28R26o1HesGYY27lzePa2sbgTTy2X1tONCyaOIkmnSmQ== - dependencies: - "@cspell/cspell-types" "9.6.4" - "@cspell/url" "9.6.4" - cspell-lib "9.6.4" - synckit "^0.11.12" - -"@cspell/filetypes@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/filetypes/-/filetypes-9.6.4.tgz#cc4fadb60baf430fccaa8505ace97f2cbe723981" - integrity sha512-a1aZ/8vGnhTknxTukjzo3m8CISyHW2MWnbedywg5SDEl5RMJitmzX90QZiQdSvEcqzqmtoAgSEZNBT2LX2gIKg== - -"@cspell/rpc@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/rpc/-/rpc-9.6.4.tgz#0d035ed105ab548cbd6b79d9d9d1ae13d9357977" - integrity sha512-vGI1788Rx5Yml9N1/pD4zGd8Vrchi2Y01ADf9NiiOaNVVdf4PU1GCssLCsiIzhYQneErpQ8pJi/mS2F/QMZbRA== - -"@cspell/strong-weak-map@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-9.6.4.tgz#4264fa2119cec48ec6a7e546012e452ce50263d8" - integrity sha512-AQrUbA0JUOEQgwItnfUQ6Ydk0hWY/uV3VhLwZWyrnT9eiQynmTnRTHtOCkkSl9+M4P0N4Raa2eGFRLcPAFksaw== - -"@cspell/url@9.6.4": - version "9.6.4" - resolved "https://registry.yarnpkg.com/@cspell/url/-/url-9.6.4.tgz#37488bd963ab483647055288f9619bcd7cdb7a82" - integrity sha512-h6VMlb7bDyGJfwLtipxxtHlT+ojzUXZz14AqZ/NEzY3LfOhfJTGpRcWLYFsgG/L0Ma4qjsYbPJt/Sj1C14j0VA== - -"@discoveryjs/json-ext@^0.6.1": - version "0.6.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" - integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== - -"@emnapi/core@^1.1.0", "@emnapi/core@^1.4.3", "@emnapi/core@^1.5.0", "@emnapi/core@^1.7.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" - integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg== - dependencies: - "@emnapi/wasi-threads" "1.1.0" - tslib "^2.4.0" - -"@emnapi/runtime@^1.1.0", "@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.5.0", "@emnapi/runtime@^1.7.1": - version "1.8.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" - integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== - dependencies: - tslib "^2.4.0" - -"@emnapi/wasi-threads@1.1.0", "@emnapi/wasi-threads@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" - integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== - dependencies: - tslib "^2.4.0" - -"@emotion/babel-plugin@^11.13.5": - version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" - integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.2" - "@emotion/memoize" "^0.9.0" - "@emotion/serialize" "^1.3.3" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" - integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== - dependencies: - "@emotion/memoize" "^0.9.0" - "@emotion/sheet" "^1.4.0" - "@emotion/utils" "^1.4.2" - "@emotion/weak-memoize" "^0.4.0" - stylis "4.2.0" - -"@emotion/css@^11.11.2": - version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.13.5.tgz#db2d3be6780293640c082848e728a50544b9dfa4" - integrity sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w== - dependencies: - "@emotion/babel-plugin" "^11.13.5" - "@emotion/cache" "^11.13.5" - "@emotion/serialize" "^1.3.3" - "@emotion/sheet" "^1.4.0" - "@emotion/utils" "^1.4.2" - -"@emotion/hash@^0.9.2": - version "0.9.2" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" - integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== - -"@emotion/is-prop-valid@^1.3.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz#e9ad47adff0b5c94c72db3669ce46de33edf28c0" - integrity sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw== - dependencies: - "@emotion/memoize" "^0.9.0" - -"@emotion/memoize@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" - integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== - -"@emotion/react@^11.11.4": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" - integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.13.5" - "@emotion/cache" "^11.14.0" - "@emotion/serialize" "^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" - "@emotion/utils" "^1.4.2" - "@emotion/weak-memoize" "^0.4.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" - integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== - dependencies: - "@emotion/hash" "^0.9.2" - "@emotion/memoize" "^0.9.0" - "@emotion/unitless" "^0.10.0" - "@emotion/utils" "^1.4.2" - csstype "^3.0.2" - -"@emotion/sheet@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" - integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== - -"@emotion/styled@^11.11.5": - version "11.14.1" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.14.1.tgz#8c34bed2948e83e1980370305614c20955aacd1c" - integrity sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.13.5" - "@emotion/is-prop-valid" "^1.3.0" - "@emotion/serialize" "^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" - "@emotion/utils" "^1.4.2" - -"@emotion/unitless@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" - integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== - -"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" - integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== - -"@emotion/utils@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" - integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== - -"@emotion/weak-memoize@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" - integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/aix-ppc64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2" - integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8" - integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-arm@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b" - integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/android-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac" - integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd" - integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/darwin-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a" - integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b" - integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/freebsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead" - integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6" - integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-arm@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11" - integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-ia32@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29" - integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-loong64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed" - integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-mips64el@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1" - integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-ppc64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78" - integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-riscv64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d" - integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-s390x@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d" - integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/linux-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5" - integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA== - -"@esbuild/netbsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7" - integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/netbsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b" - integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA== - -"@esbuild/openbsd-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5" - integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/openbsd-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b" - integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ== - -"@esbuild/openharmony-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e" - integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/sunos-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537" - integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-arm64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e" - integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-ia32@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c" - integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@esbuild/win32-x64@0.27.3": - version "0.27.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17" - integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" - integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.2", "@eslint-community/regexpp@^4.6.1": - version "4.12.2" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" - integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@eslint/js@^9.39.1": - version "9.39.2" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" - integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== - -"@floating-ui/core@^1.7.4": - version "1.7.4" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.4.tgz#4a006a6e01565c0f87ba222c317b056a2cffd2f4" - integrity sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg== - dependencies: - "@floating-ui/utils" "^0.2.10" - -"@floating-ui/core@^1.7.5": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.7.5.tgz#d4af157a03330af5a60e69da7a4692507ada0622" - integrity sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ== - dependencies: - "@floating-ui/utils" "^0.2.11" - -"@floating-ui/dom@^1.7.5": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.5.tgz#60bfc83a4d1275b2a90db76bf42ca2a5f2c231c2" - integrity sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg== - dependencies: - "@floating-ui/core" "^1.7.4" - "@floating-ui/utils" "^0.2.10" - -"@floating-ui/dom@^1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.7.6.tgz#f915bba5abbb177e1f227cacee1b4d0634b187bf" - integrity sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ== - dependencies: - "@floating-ui/core" "^1.7.5" - "@floating-ui/utils" "^0.2.11" - -"@floating-ui/react-dom@^2.0.8": - version "2.1.7" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.7.tgz#529475cc16ee4976ba3387968117e773d9aa703e" - integrity sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg== - dependencies: - "@floating-ui/dom" "^1.7.5" - -"@floating-ui/utils@^0.2.10": - version "0.2.10" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.10.tgz#a2a1e3812d14525f725d011a73eceb41fef5bc1c" - integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== - -"@floating-ui/utils@^0.2.11": - version "0.2.11" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.11.tgz#a269e055e40e2f45873bae9d1a2fdccbd314ea3f" - integrity sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg== - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/balanced-match@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" - integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== - -"@isaacs/brace-expansion@^5.0.0", "@isaacs/brace-expansion@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz#0ef5a92d91f2fff2a37646ce54da9e5f599f6eff" - integrity sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ== - dependencies: - "@isaacs/balanced-match" "^4.0.1" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.2.0.tgz#c52fcd5b58fdd2e8eb66b2fd8ae56f2f64d05b28" - integrity sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - jest-message-util "30.2.0" - jest-util "30.2.0" - slash "^3.0.0" - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/diff-sequences@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be" - integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== - -"@jest/environment@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.2.0.tgz#1e673cdb8b93ded707cf6631b8353011460831fa" - integrity sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g== - dependencies: - "@jest/fake-timers" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - jest-mock "30.2.0" - -"@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.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.2.0.tgz#4f95413d4748454fdb17404bf1141827d15e6011" - integrity sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA== - dependencies: - "@jest/get-type" "30.1.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.2.0.tgz#9a5968499bb8add2bbb09136f69f7df5ddbf3185" - integrity sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA== - dependencies: - expect "30.2.0" - jest-snapshot "30.2.0" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.2.0.tgz#0941ddc28a339b9819542495b5408622dc9e94ec" - integrity sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw== - dependencies: - "@jest/types" "30.2.0" - "@sinonjs/fake-timers" "^13.0.0" - "@types/node" "*" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - -"@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.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/get-type@30.1.0": - version "30.1.0" - resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.1.0.tgz#4fcb4dc2ebcf0811be1c04fd1cb79c2dba431cbc" - integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== - -"@jest/globals@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.2.0.tgz#2f4b696d5862664b89c4ee2e49ae24d2bb7e0988" - integrity sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw== - dependencies: - "@jest/environment" "30.2.0" - "@jest/expect" "30.2.0" - "@jest/types" "30.2.0" - jest-mock "30.2.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/pattern@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz#d5304147f49a052900b4b853dedb111d080e199f" - integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA== - dependencies: - "@types/node" "*" - jest-regex-util "30.0.1" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/reporters@^30.0.2": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.2.0.tgz#a36b28fcbaf0c4595250b108e6f20e363348fd91" - integrity sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - "@types/node" "*" - chalk "^4.1.2" - collect-v8-coverage "^1.0.2" - exit-x "^0.2.2" - glob "^10.3.10" - graceful-fs "^4.2.11" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^5.0.0" - istanbul-reports "^3.1.3" - jest-message-util "30.2.0" - jest-util "30.2.0" - jest-worker "30.2.0" - slash "^3.0.0" - string-length "^4.0.2" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@30.0.5": - version "30.0.5" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473" - integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== - dependencies: - "@sinclair/typebox" "^0.34.0" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/snapshot-utils@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz#387858eb90c2f98f67bff327435a532ac5309fbe" - integrity sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug== - dependencies: - "@jest/types" "30.2.0" - chalk "^4.1.2" - graceful-fs "^4.2.11" - natural-compare "^1.4.0" - -"@jest/source-map@30.0.1": - version "30.0.1" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-30.0.1.tgz#305ebec50468f13e658b3d5c26f85107a5620aaa" - integrity sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - callsites "^3.1.0" - graceful-fs "^4.2.11" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@30.2.0", "@jest/test-result@^30.0.2": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.2.0.tgz#9c0124377fb7996cdffb86eda3dbc56eacab363d" - integrity sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg== - dependencies: - "@jest/console" "30.2.0" - "@jest/types" "30.2.0" - "@types/istanbul-lib-coverage" "^2.0.6" - collect-v8-coverage "^1.0.2" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz#bf0066bc72e176d58f5dfa7f212b6e7eee44f221" - integrity sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q== - dependencies: - "@jest/test-result" "30.2.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - slash "^3.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.2.0.tgz#54bef1a4510dcbd58d5d4de4fe2980a63077ef2a" - integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA== - dependencies: - "@babel/core" "^7.27.4" - "@jest/types" "30.2.0" - "@jridgewell/trace-mapping" "^0.3.25" - babel-plugin-istanbul "^7.0.1" - chalk "^4.1.2" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-regex-util "30.0.1" - jest-util "30.2.0" - micromatch "^4.0.8" - pirates "^4.0.7" - slash "^3.0.0" - write-file-atomic "^5.0.1" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@30.2.0": - version "30.2.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8" - integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg== - dependencies: - "@jest/pattern" "30.0.1" - "@jest/schemas" "30.0.5" - "@types/istanbul-lib-coverage" "^2.0.6" - "@types/istanbul-reports" "^3.0.4" - "@types/node" "*" - "@types/yargs" "^17.0.33" - chalk "^4.1.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.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" - -"@joshwooding/vite-plugin-react-docgen-typescript@^0.6.3": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.4.tgz#9cfa58703ae8122329c52a5989244818ee4cdcbe" - integrity sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA== - dependencies: - glob "^13.0.1" - react-docgen-typescript "^2.2.2" - -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.4", "@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.11" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba" - integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@microsoft/api-extractor-model@7.32.2": - version "7.32.2" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.32.2.tgz#2b891b2bad26d6ba19d7cc21c23510c8c6f05476" - integrity sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww== - dependencies: - "@microsoft/tsdoc" "~0.16.0" - "@microsoft/tsdoc-config" "~0.18.0" - "@rushstack/node-core-library" "5.19.1" - -"@microsoft/api-extractor@^7.50.1": - version "7.56.3" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.56.3.tgz#77ffac4dba7c192e42dc9aed0535bda5bec75aef" - integrity sha512-fRqok4aRNq5GpgGBv2fKlSSKbirPKTJ75vQefthB5x9dwt4Zz+AezUzdc1p/AG4wUBIgmhjcEwn/Rj+N4Wh4Mw== - dependencies: - "@microsoft/api-extractor-model" "7.32.2" - "@microsoft/tsdoc" "~0.16.0" - "@microsoft/tsdoc-config" "~0.18.0" - "@rushstack/node-core-library" "5.19.1" - "@rushstack/rig-package" "0.6.0" - "@rushstack/terminal" "0.21.0" - "@rushstack/ts-command-line" "5.2.0" - diff "~8.0.2" - lodash "~4.17.23" - minimatch "10.1.2" - resolve "~1.22.1" - semver "~7.5.4" - source-map "~0.6.1" - typescript "5.8.2" - -"@microsoft/fast-element@2.8.3": - version "2.8.3" - resolved "https://registry.yarnpkg.com/@microsoft/fast-element/-/fast-element-2.8.3.tgz#6f98430d17988360e9df4838b383610adb04c929" - integrity sha512-dQPyOoMCJMIMdsIicNcKPvLu3Um8VM5wk/UARFXRYJAdZ7j9cEvEn5trc7y0blnXlPk9tTkah77oWqUSFi0pyg== - -"@microsoft/fast-web-utilities@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@microsoft/fast-web-utilities/-/fast-web-utilities-6.0.0.tgz#7678c2b2cd12aeef785f4e2288da93a4db9e38a6" - integrity sha512-ckCA4Xn91ja1Qz+jhGGL1Q3ZeuRpA5VvYcRA7GzA1NP545sl14bwz3tbHCq8jIk+PL7mkSaIveGMYuJB2L4Izg== - dependencies: - exenv-es6 "^1.1.1" - -"@microsoft/tsdoc-config@~0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.18.0.tgz#02fd9924b888053ecbc3c0385a24532bf2106c98" - integrity sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw== - dependencies: - "@microsoft/tsdoc" "0.16.0" - ajv "~8.12.0" - jju "~1.4.0" - resolve "~1.22.2" - -"@microsoft/tsdoc@0.16.0", "@microsoft/tsdoc@~0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz#2249090633e04063176863a050c8f0808d2b6d2b" - integrity sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA== - -"@module-federation/bridge-react-webpack-plugin@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.21.6.tgz#67f543576328bafe022106686f859d01b3496a9f" - integrity sha512-lJMmdhD4VKVkeg8RHb+Jwe6Ou9zKVgjtb1inEURDG/sSS2ksdZA8pVKLYbRPRbdmjr193Y8gJfqFbI2dqoyc/g== - dependencies: - "@module-federation/sdk" "0.21.6" - "@types/semver" "7.5.8" - semver "7.6.3" - -"@module-federation/bridge-react-webpack-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.0.1.tgz#d50b1d63d037c3c599b11616d302e553b3036b30" - integrity sha512-D7LMW5EMAJShOMR1aZDAJ6s+MdsYDHaQyJADLQ3LaY0sne/BkVqkPikUwcO1IwOwKbXjYsDlQVOEvk9wZVRFhA== - dependencies: - "@module-federation/sdk" "2.0.1" - "@types/semver" "7.5.8" - semver "7.6.3" - -"@module-federation/cli@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/cli/-/cli-0.21.6.tgz#a8acd0eca6b1c33a45f2fb5fd7c70d12c38b6aaf" - integrity sha512-qNojnlc8pTyKtK7ww3i/ujLrgWwgXqnD5DcDPsjADVIpu7STaoaVQ0G5GJ7WWS/ajXw6EyIAAGW/AMFh4XUxsQ== - dependencies: - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/sdk" "0.21.6" - chalk "3.0.0" - commander "11.1.0" - jiti "2.4.2" - -"@module-federation/cli@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/cli/-/cli-2.0.1.tgz#56c082adb0f8e7938ca1963a495d2bf500210b46" - integrity sha512-2SL5Y8iODNX10y9T3CBLhHjSXo4afnA1BK82m4sNfZebuVO+o34bxewqwod9xfWq9xhTZmOSFZ+n+lgTKRv+CQ== - dependencies: - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/sdk" "2.0.1" - chalk "3.0.0" - commander "11.1.0" - jiti "2.4.2" - -"@module-federation/data-prefetch@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/data-prefetch/-/data-prefetch-0.21.6.tgz#b79fda013967b4098ea753766094e150654ef999" - integrity sha512-8HD7ZhtWZ9vl6i3wA7M8cEeCRdtvxt09SbMTfqIPm+5eb/V4ijb8zGTYSRhNDb5RCB+BAixaPiZOWKXJ63/rVw== - dependencies: - "@module-federation/runtime" "0.21.6" - "@module-federation/sdk" "0.21.6" - fs-extra "9.1.0" - -"@module-federation/data-prefetch@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/data-prefetch/-/data-prefetch-2.0.1.tgz#79c98752d106b4066ed0359c1f240e669959c8ee" - integrity sha512-Kq0P1OABGt6QAvs6TaE/zY9Ut9Y/oJFrzoSF3eWaCYbUAr2KD2SpTyMsPz4ssBzjeKXTgimugh6tHHd6mpCBIQ== - dependencies: - "@module-federation/runtime" "2.0.1" - "@module-federation/sdk" "2.0.1" - fs-extra "9.1.0" - -"@module-federation/dts-plugin@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/dts-plugin/-/dts-plugin-0.21.6.tgz#a73e5883fbbede846138fff667994a6176837c6a" - integrity sha512-YIsDk8/7QZIWn0I1TAYULniMsbyi2LgKTi9OInzVmZkwMC6644x/ratTWBOUDbdY1Co+feNkoYeot1qIWv2L7w== - dependencies: - "@module-federation/error-codes" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/sdk" "0.21.6" - "@module-federation/third-party-dts-extractor" "0.21.6" - adm-zip "^0.5.10" - ansi-colors "^4.1.3" - axios "^1.12.0" - chalk "3.0.0" - fs-extra "9.1.0" - isomorphic-ws "5.0.0" - koa "3.0.3" - lodash.clonedeepwith "4.5.0" - log4js "6.9.1" - node-schedule "2.1.1" - rambda "^9.1.0" - ws "8.18.0" - -"@module-federation/dts-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/dts-plugin/-/dts-plugin-2.0.1.tgz#109bb138c5ba316dea3a12942343e28f6a8c1783" - integrity sha512-PLneTsf1fQS5/RTBedtLAAmCPRdMfIlhfJkOa8QH3WDJaQsqm8Wb3r2cTUBf2aNj/bP3aH/y6Hs9JFB/4x0l5g== - dependencies: - "@module-federation/error-codes" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/sdk" "2.0.1" - "@module-federation/third-party-dts-extractor" "2.0.1" - adm-zip "^0.5.10" - ansi-colors "^4.1.3" - axios "^1.12.0" - chalk "3.0.0" - fs-extra "9.1.0" - isomorphic-ws "5.0.0" - koa "3.0.3" - lodash.clonedeepwith "4.5.0" - log4js "6.9.1" - node-schedule "2.1.1" - rambda "^9.1.0" - ws "8.18.0" - -"@module-federation/enhanced@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/enhanced/-/enhanced-2.0.1.tgz#b4359685328da17a18fcace5501847b9d2f34ea6" - integrity sha512-EZIARQ/8ScoTP6PV8+E4SsmMYWK4ErrikZJ0G/FX8wvK8mCtdoKatFtvDN9++P6Nl78kN9zHYgAV4AHKdBVjfQ== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "2.0.1" - "@module-federation/cli" "2.0.1" - "@module-federation/data-prefetch" "2.0.1" - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/error-codes" "2.0.1" - "@module-federation/inject-external-runtime-core-plugin" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/manifest" "2.0.1" - "@module-federation/rspack" "2.0.1" - "@module-federation/runtime-tools" "2.0.1" - "@module-federation/sdk" "2.0.1" - btoa "^1.2.1" - schema-utils "^4.3.0" - upath "2.0.1" - -"@module-federation/enhanced@^0.21.2": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/enhanced/-/enhanced-0.21.6.tgz#c917485505998c854307e7504f24755a3017d583" - integrity sha512-8PFQxtmXc6ukBC4CqGIoc96M2Ly9WVwCPu4Ffvt+K/SB6rGbeFeZoYAwREV1zGNMJ5v5ly6+AHIEOBxNuSnzSg== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "0.21.6" - "@module-federation/cli" "0.21.6" - "@module-federation/data-prefetch" "0.21.6" - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/error-codes" "0.21.6" - "@module-federation/inject-external-runtime-core-plugin" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/manifest" "0.21.6" - "@module-federation/rspack" "0.21.6" - "@module-federation/runtime-tools" "0.21.6" - "@module-federation/sdk" "0.21.6" - btoa "^1.2.1" - schema-utils "^4.3.0" - upath "2.0.1" - -"@module-federation/error-codes@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.21.6.tgz#d0c9fa71f9469b2150165ef4461dfd5be0e7f79b" - integrity sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ== - -"@module-federation/error-codes@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-2.0.1.tgz#a1e70eeeeba1e9ef619a8fa17214e930ea0d91dc" - integrity sha512-2bJF/ft+qL9L6Zvq2t/G9/f/0wFL73cM8/NJ04uyYz9BjIgvx28K5qu8/6+IwgEEKATG7vOhBBVj6wH3S+5ASA== - -"@module-federation/inject-external-runtime-core-plugin@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.21.6.tgz#d87fdfa6df94059c0b3b12f333394989c555e489" - integrity sha512-DJQne7NQ988AVi3QB8byn12FkNb+C2lBeU1NRf8/WbL0gmHsr6kW8hiEJCm8LYaURwtsQqtsEV7i+8+51qjSmQ== - -"@module-federation/inject-external-runtime-core-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.0.1.tgz#e187594715d833bc86095a4a7fec67b697fd7b93" - integrity sha512-oAA7G+4GCHM+WRYfscR/x4GwCyM9CEqfdD9/x2L6y8mtLWK9anRLKTocsI759AvzXsbT1m3EQ5ki1O6wlwDu3g== - -"@module-federation/managers@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/managers/-/managers-0.21.6.tgz#dc854f1ae24508322d71bae91d6c9380b3fc1e5f" - integrity sha512-BeV6m2/7kF5MDVz9JJI5T8h8lMosnXkH2bOxxFewcra7ZjvDOgQu7WIio0mgk5l1zjNPvnEVKhnhrenEdcCiWg== - dependencies: - "@module-federation/sdk" "0.21.6" - find-pkg "2.0.0" - fs-extra "9.1.0" - -"@module-federation/managers@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/managers/-/managers-2.0.1.tgz#ded855100cefcbd168e081f88dcc8bf507037a1a" - integrity sha512-KR01lSlcYRQ9C6hW2a8CQQtAE0LvfTLgtV/6ZNUTagw8sRfeDln+ggrZsYilKu9zl0i8RPDgpv/kS60o4lcxCQ== - dependencies: - "@module-federation/sdk" "2.0.1" - find-pkg "2.0.0" - fs-extra "9.1.0" - -"@module-federation/manifest@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/manifest/-/manifest-0.21.6.tgz#4790467e788e0031e054366a85e2625a98ab6c42" - integrity sha512-yg93+I1qjRs5B5hOSvjbjmIoI2z3th8/yst9sfwvx4UDOG1acsE3HHMyPN0GdoIGwplC/KAnU5NmUz4tREUTGQ== - dependencies: - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/sdk" "0.21.6" - chalk "3.0.0" - find-pkg "2.0.0" - -"@module-federation/manifest@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/manifest/-/manifest-2.0.1.tgz#332742ffa35deea459db0576fa3892bf2d3b6857" - integrity sha512-p8nYGjHWp17MsYdW/Vv0ogBDiTTsI1PHWPQbvVIqLQXDqwiesaRSRR1zziECXQoEL8lV5Bs+uSkcaJGhea9P+A== - dependencies: - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/sdk" "2.0.1" - chalk "3.0.0" - find-pkg "2.0.0" - -"@module-federation/node@^2.7.21": - version "2.7.32" - resolved "https://registry.yarnpkg.com/@module-federation/node/-/node-2.7.32.tgz#098a9ecd958575afc1082fed2c1b899189a1cb22" - integrity sha512-hUj5v2GGwpNzl2gaJS4AyzCYRzJBhN8875A+ucKF9tq3jaQb5zpy3izYMISqqbN2q9a7jz3nEUgwAh3pjri+rQ== - dependencies: - "@module-federation/enhanced" "2.0.1" - "@module-federation/runtime" "2.0.1" - "@module-federation/sdk" "2.0.1" - btoa "1.2.1" - encoding "^0.1.13" - node-fetch "2.7.0" - -"@module-federation/rspack@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/rspack/-/rspack-0.21.6.tgz#7c5f39e870d56c735cf4d12698aed0779ad7482b" - integrity sha512-SB+z1P+Bqe3R6geZje9dp0xpspX6uash+zO77nodmUy8PTTBlkL7800Cq2FMLKUdoTZHJTBVXf0K6CqQWSlItg== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "0.21.6" - "@module-federation/dts-plugin" "0.21.6" - "@module-federation/inject-external-runtime-core-plugin" "0.21.6" - "@module-federation/managers" "0.21.6" - "@module-federation/manifest" "0.21.6" - "@module-federation/runtime-tools" "0.21.6" - "@module-federation/sdk" "0.21.6" - btoa "1.2.1" - -"@module-federation/rspack@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/rspack/-/rspack-2.0.1.tgz#637b836a7445c3eb021f965ccffce7d0cae4cd75" - integrity sha512-SAlNE8iclFmzrKtx3/C2GivXYx6nPzx4MgQV01QG/a4LpnLbwlxzdZu3rqQ2swp4NNWT/t/GT7Y+7gfhyVa7mg== - dependencies: - "@module-federation/bridge-react-webpack-plugin" "2.0.1" - "@module-federation/dts-plugin" "2.0.1" - "@module-federation/inject-external-runtime-core-plugin" "2.0.1" - "@module-federation/managers" "2.0.1" - "@module-federation/manifest" "2.0.1" - "@module-federation/runtime-tools" "2.0.1" - "@module-federation/sdk" "2.0.1" - btoa "1.2.1" - -"@module-federation/runtime-core@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz#2bcd24db2192179c96ce49772b09d72820ab9ea3" - integrity sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw== - dependencies: - "@module-federation/error-codes" "0.21.6" - "@module-federation/sdk" "0.21.6" - -"@module-federation/runtime-core@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-2.0.1.tgz#17bf9e067c598870b5673c129228a3229b9f4577" - integrity sha512-gOuCPSHoQGUGwlxfSTMInFX+QvLxdEWegGGMiLdU5vqbXuva4E9M+kXBBO7/0MkcBPMmVs0wOJGm0XOLeV2f1Q== - dependencies: - "@module-federation/error-codes" "2.0.1" - "@module-federation/sdk" "2.0.1" - -"@module-federation/runtime-tools@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.21.6.tgz#40cbcc16af4c597169834a2d8b71a9d31779ab0c" - integrity sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q== - dependencies: - "@module-federation/runtime" "0.21.6" - "@module-federation/webpack-bundler-runtime" "0.21.6" - -"@module-federation/runtime-tools@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-2.0.1.tgz#187500d3f63c1708eaa2087f7cdabe40df9b64fd" - integrity sha512-AStdwBtsGB3jIfDg9oP+KyVPsimdaeHsP855gqCxDp1hi2+GKjlZWZx9ThkS8NytVSXSUysxqoUL1ivDoKgcCQ== - dependencies: - "@module-federation/runtime" "2.0.1" - "@module-federation/webpack-bundler-runtime" "2.0.1" - -"@module-federation/runtime@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.21.6.tgz#8d4a29a792ed4a94e5a811fe097d314a6f9dcab7" - integrity sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ== - dependencies: - "@module-federation/error-codes" "0.21.6" - "@module-federation/runtime-core" "0.21.6" - "@module-federation/sdk" "0.21.6" - -"@module-federation/runtime@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-2.0.1.tgz#dbfc8e5e93a16d0ee40c0320cb8627ad0196e35b" - integrity sha512-UQ72P5Oo40dS6vdhHetwTtIsbGciEr+bjoYvDgh1WLPfFlTYd8zo9cLfqaf3juuPfV3cMVARAVPmh16lQYpUGA== - dependencies: - "@module-federation/error-codes" "2.0.1" - "@module-federation/runtime-core" "2.0.1" - "@module-federation/sdk" "2.0.1" - -"@module-federation/sdk@0.21.6", "@module-federation/sdk@^0.21.2": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.21.6.tgz#8aac1159ff37f418ed72bc79afccbbfb025f847a" - integrity sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw== - -"@module-federation/sdk@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-2.0.1.tgz#0b83d13a63887bb1956d27913088945c85ab409a" - integrity sha512-32PwudojGjog51cwpTali7D6ud82oVgsyvOx9JjAzhvXBX96YI4mRsursuWcthDxmigJP9ZvUTXDuRUEDh1OQA== - -"@module-federation/third-party-dts-extractor@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.21.6.tgz#c99b3ae9243893b0064598eb19a13fd542b64a82" - integrity sha512-Il6x4hLsvCgZNk1DFwuMBNeoxD1BsZ5AW2BI/nUgu0k5FiAvfcz1OFawRFEHtaM/kVrCsymMOW7pCao90DaX3A== - dependencies: - find-pkg "2.0.0" - fs-extra "9.1.0" - resolve "1.22.8" - -"@module-federation/third-party-dts-extractor@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.0.1.tgz#d09b0bbb63b10f58ef7e82807cf50456e40b61ce" - integrity sha512-neKSr6FNUeGRh+YR57l/QZUzPytJXuJx+babF7j5iGJG3FP+kfizr6QD0hgVis5KEoXMVbQ8yyvG0slERizeyw== - dependencies: - find-pkg "2.0.0" - fs-extra "9.1.0" - resolve "1.22.8" - -"@module-federation/webpack-bundler-runtime@0.21.6": - version "0.21.6" - resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.6.tgz#6831eaf147356fe5b096d24c7a902c323e810bb9" - integrity sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ== - dependencies: - "@module-federation/runtime" "0.21.6" - "@module-federation/sdk" "0.21.6" - -"@module-federation/webpack-bundler-runtime@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.0.1.tgz#bdabe25262c8c6f357da78a4c96df4018d41f3e2" - integrity sha512-u1NId3SF4lHDTmD2CHFEszulmXmIq1TGw9JYvnLx5rKJL7xt3aNxcb1GvkaYbRNVBXhSMjJ75E5LsQlZzyBx9A== - dependencies: - "@module-federation/runtime" "2.0.1" - "@module-federation/sdk" "2.0.1" - -"@mui/base@5.0.0-beta.40-1": - version "5.0.0-beta.40-1" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.40-1.tgz#6da6229e5e675e811f319149f6e29d7a77522851" - integrity sha512-agKXuNNy0bHUmeU7pNmoZwNFr7Hiyhojkb9+2PVyDG5+6RafYuyMgbrav8CndsB7KUc/U51JAw9vKNDLYBzaUA== - dependencies: - "@babel/runtime" "^7.23.9" - "@floating-ui/react-dom" "^2.0.8" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - "@popperjs/core" "^2.11.8" - clsx "^2.1.0" - prop-types "^15.8.1" - -"@mui/core-downloads-tracker@^5.17.1", "@mui/core-downloads-tracker@^5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz#85019a8704b0f63305fc5600635ee663810f2b66" - integrity sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA== - -"@mui/icons-material@^5.17.1": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.18.0.tgz#97d87f1b7bee5fa7b9ba844518631de3112c1e57" - integrity sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg== - dependencies: - "@babel/runtime" "^7.23.9" - -"@mui/joy@^5.0.0-beta.36": - version "5.0.0-beta.52" - resolved "https://registry.yarnpkg.com/@mui/joy/-/joy-5.0.0-beta.52.tgz#9c7cd9629603089c80e8f8f7b78a41534ef06e91" - integrity sha512-e8jQanA5M1f/X52mJrw0UIW8Er7EAHuLuigmGFw7yIsAgIluhIP4rZ7JcbVrUi6z5Gk0weC9QWUUtjLejAbO8g== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.40-1" - "@mui/core-downloads-tracker" "^5.17.1" - "@mui/system" "^5.17.1" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - clsx "^2.1.0" - prop-types "^15.8.1" - -"@mui/material@^5.17.1": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.18.0.tgz#71e72d52338252edc6f8d9461e04fdf0d61905cd" - integrity sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/core-downloads-tracker" "^5.18.0" - "@mui/system" "^5.18.0" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - "@popperjs/core" "^2.11.8" - "@types/react-transition-group" "^4.4.10" - clsx "^2.1.0" - csstype "^3.1.3" - prop-types "^15.8.1" - react-is "^19.0.0" - react-transition-group "^4.4.5" - -"@mui/private-theming@^5.17.1": - version "5.17.1" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.17.1.tgz#b4b6fbece27830754ef78186e3f1307dca42f295" - integrity sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/utils" "^5.17.1" - prop-types "^15.8.1" - -"@mui/styled-engine@^5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.18.0.tgz#914cca1385bb33ce0cde31721f529c8bd7fa301c" - integrity sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg== - dependencies: - "@babel/runtime" "^7.23.9" - "@emotion/cache" "^11.13.5" - "@emotion/serialize" "^1.3.3" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/system@^5.17.1", "@mui/system@^5.18.0": - version "5.18.0" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.18.0.tgz#e55331203a40584b26c5a855a07949ac8973bfb6" - integrity sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/private-theming" "^5.17.1" - "@mui/styled-engine" "^5.18.0" - "@mui/types" "~7.2.15" - "@mui/utils" "^5.17.1" - clsx "^2.1.0" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/types@~7.2.15": - version "7.2.24" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.24.tgz#5eff63129d9c29d80bbf2d2e561bd0690314dec2" - integrity sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw== - -"@mui/utils@^5.17.1": - version "5.17.1" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.17.1.tgz#72ba4ffa79f7bdf69d67458139390f18484b6e6b" - integrity sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg== - dependencies: - "@babel/runtime" "^7.23.9" - "@mui/types" "~7.2.15" - "@types/prop-types" "^15.7.12" - clsx "^2.1.1" - prop-types "^15.8.1" - react-is "^19.0.0" - -"@napi-rs/wasm-runtime@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz#d27788176f250d86e498081e3c5ff48a17606918" - integrity sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ== - dependencies: - "@emnapi/core" "^1.1.0" - "@emnapi/runtime" "^1.1.0" - "@tybys/wasm-util" "^0.9.0" - -"@napi-rs/wasm-runtime@1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c" - integrity sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw== - dependencies: - "@emnapi/core" "^1.5.0" - "@emnapi/runtime" "^1.5.0" - "@tybys/wasm-util" "^0.10.1" - -"@napi-rs/wasm-runtime@^0.2.11": - version "0.2.12" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" - integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== - dependencies: - "@emnapi/core" "^1.4.3" - "@emnapi/runtime" "^1.4.3" - "@tybys/wasm-util" "^0.10.0" - -"@napi-rs/wasm-runtime@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz#c3705ab549d176b8dc5172723d6156c3dc426af2" - integrity sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A== - dependencies: - "@emnapi/core" "^1.7.1" - "@emnapi/runtime" "^1.7.1" - "@tybys/wasm-util" "^0.10.1" - -"@noble/hashes@^1.1.5": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" - integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nx/devkit@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-22.0.1.tgz#3116e3f322cad98ee7232d0ad3c563c0302f1fc6" - integrity sha512-pam3RuHI+1vwg4pKyq4zq4oFuXvqllJvuArsCWYCv6m10NYPu0cXRXaAbZfffcmW6Kvh1cRSb80OCs8ZzN4cXA== - dependencies: - "@zkochan/js-yaml" "0.0.7" - ejs "^3.1.7" - enquirer "~2.3.6" - minimatch "9.0.3" - semver "^7.5.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/devkit@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-22.5.1.tgz#eb6994be392dd2de05d6aecd4ffb96596ccd6793" - integrity sha512-1ZJ8pCB+6EWC8X6q8tfBweg92WzFAwliBhtBkOPP8Li8GQq71ulPWRdY4lDd5pH3Ea1zKqhOtBKWdOlyDPOKYA== - dependencies: - "@zkochan/js-yaml" "0.0.7" - ejs "^3.1.7" - enquirer "~2.3.6" - minimatch "10.1.1" - semver "^7.6.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/docker@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/docker/-/docker-22.0.1.tgz#d5a12e67b359c4e6d91c14c2e93cc59b4d1e083f" - integrity sha512-CQgzBLqQj1CN1qTpFoNUTIJVeTq+dcUCI6/OROjH9y4tob8g5NyKYC8sVMV5Dl+Pc0VUriH5xAv3+MaZAK6zuQ== - dependencies: - "@nx/devkit" "22.0.1" - enquirer "~2.3.6" - tslib "^2.3.0" - -"@nx/eslint-plugin@^22.1.3": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-22.5.1.tgz#ae1d4247ce3208f77400e44d63296e05fc118328" - integrity sha512-TUUsvdfCtr6EoUxmnqp2uQANI3CQb9g0RmJALbGQAOSGeyr7TQc4wEeW0VjFl/1PQB//9TiK9lnPUkOF76SV/Q== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - "@typescript-eslint/type-utils" "^8.0.0" - "@typescript-eslint/utils" "^8.0.0" - chalk "^4.1.0" - confusing-browser-globals "^1.0.9" - globals "^15.9.0" - jsonc-eslint-parser "^2.1.0" - semver "^7.6.3" - tslib "^2.3.0" - -"@nx/eslint@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-22.0.1.tgz#bd72d08fbdcae8a11b9bd58212eefb1d644f38e8" - integrity sha512-6FnalNF+l3XXVoelnBc5STXehiAMy4L6afWWYGlpdnxersLoemFLbE/cdelo2pTqyqOTsoe+qdfeGphnao7MaA== - dependencies: - "@nx/devkit" "22.0.1" - "@nx/js" "22.0.1" - semver "^7.5.3" - tslib "^2.3.0" - typescript "~5.9.2" - -"@nx/eslint@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-22.5.1.tgz#6913a7ed5add15d98a2d8cdfd0ac6383c3702fce" - integrity sha512-878xSsfOKtnQBJlRyeeHANVr5+HJMeMfPgpsffRfFDoat7pF/B2KoK2UJx/wQlAHUyVubKNhm7x46fA/shqBow== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - semver "^7.6.3" - tslib "^2.3.0" - typescript "~5.9.2" - -"@nx/jest@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-22.0.1.tgz#c5848fd325c756e61604fcb5dac49c8cd622544a" - integrity sha512-sOYcLxs4FLSqmrKT16P7LFL62WRtwQ+T7zsEt/t+Vk2swgNAZTljuRfykScfuFxL9xXLTJ4gumlvLvZUWf9ofg== - dependencies: - "@jest/reporters" "^30.0.2" - "@jest/test-result" "^30.0.2" - "@nx/devkit" "22.0.1" - "@nx/js" "22.0.1" - "@phenomnomnominal/tsquery" "~5.0.1" - identity-obj-proxy "3.0.0" - jest-config "^30.0.2" - jest-resolve "^30.0.2" - jest-util "^30.0.2" - minimatch "9.0.3" - picocolors "^1.1.0" - resolve.exports "2.0.3" - semver "^7.5.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/js@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-22.0.1.tgz#3ef038f83baa611439678b58e6080cbe47e0e52a" - integrity sha512-uuvPA0gw7DsH7xfJ5hS2VcSNAZYq1Cm4bZVNUaV8IJkdCnV812dJxU2I2bk5CXWPDRTD1ECcS+LfZ17G0mgDOw== - dependencies: - "@babel/core" "^7.23.2" - "@babel/plugin-proposal-decorators" "^7.22.7" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-runtime" "^7.23.2" - "@babel/preset-env" "^7.23.2" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@nx/devkit" "22.0.1" - "@nx/workspace" "22.0.1" - "@zkochan/js-yaml" "0.0.7" - babel-plugin-const-enum "^1.0.1" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-typescript-metadata "^0.3.1" - chalk "^4.1.0" - columnify "^1.6.0" - detect-port "^1.5.1" - ignore "^5.0.4" - js-tokens "^4.0.0" - jsonc-parser "3.2.0" - npm-run-path "^4.0.1" - picocolors "^1.1.0" - picomatch "4.0.2" - semver "^7.5.3" - source-map-support "0.5.19" - tinyglobby "^0.2.12" - tslib "^2.3.0" - -"@nx/js@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-22.5.1.tgz#221316c99392bfc15c1f7617af18bf809504147d" - integrity sha512-g/0x9P7e2KDsY5po9RxvsNR2Z8xPWpWqTs82gll1G/h5Jot2QJ6oIuZTfjdHramVXWd6pi6KoruxThnNv5DmYQ== - dependencies: - "@babel/core" "^7.23.2" - "@babel/plugin-proposal-decorators" "^7.22.7" - "@babel/plugin-transform-class-properties" "^7.22.5" - "@babel/plugin-transform-runtime" "^7.23.2" - "@babel/preset-env" "^7.23.2" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@nx/devkit" "22.5.1" - "@nx/workspace" "22.5.1" - "@zkochan/js-yaml" "0.0.7" - babel-plugin-const-enum "^1.0.1" - babel-plugin-macros "^3.1.0" - babel-plugin-transform-typescript-metadata "^0.3.1" - chalk "^4.1.0" - columnify "^1.6.0" - detect-port "^1.5.1" - ignore "^5.0.4" - js-tokens "^4.0.0" - jsonc-parser "3.2.0" - npm-run-path "^4.0.1" - picocolors "^1.1.0" - picomatch "4.0.2" - semver "^7.6.3" - source-map-support "0.5.19" - tinyglobby "^0.2.12" - tslib "^2.3.0" - -"@nx/module-federation@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/module-federation/-/module-federation-22.5.1.tgz#06a9ff1f2fc7b3930f967875506bfb9c914486bf" - integrity sha512-LiAN6Vy+5fdMvaKl0lPii0+yQODpf8v8kXVqUsKrXWWGlRI8IksElx8pVtoX9pL04MWGmcAckd0+G3PkvwGAPw== - dependencies: - "@module-federation/enhanced" "^0.21.2" - "@module-federation/node" "^2.7.21" - "@module-federation/sdk" "^0.21.2" - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@nx/web" "22.5.1" - "@rspack/core" "1.6.8" - express "^4.21.2" - http-proxy-middleware "^3.0.5" - picocolors "^1.1.0" - tslib "^2.3.0" - webpack "^5.101.3" - -"@nx/node@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-22.0.1.tgz#ee6d150a41efcc6e218ce3727d8ddd7237fe6cf7" - integrity sha512-QdcZ3LDD4niPa8RDW35bRANdzas7xP0IfUHYSiISccTh47h/iOwacxPLy/0w/drmjMpjJgFKAz/bVj4fRKDNIg== - dependencies: - "@nx/devkit" "22.0.1" - "@nx/docker" "22.0.1" - "@nx/eslint" "22.0.1" - "@nx/jest" "22.0.1" - "@nx/js" "22.0.1" - kill-port "^1.6.1" - tcp-port-used "^1.0.2" - tslib "^2.3.0" - -"@nx/nx-darwin-arm64@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.0.1.tgz#bbdbaf557d85b23d178e9f458e909509aeae5225" - integrity sha512-kbzgsDXHwpq1+PdKC9R23dvD9XescsxF42mizrt3H615cejJe8PBF93/Cx/sdfT+n5PEmKXRDwTRBDXQbUsX9g== - -"@nx/nx-darwin-arm64@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.5.1.tgz#993368d5859ea4c2bbb855c5649e2c4aa9b1b840" - integrity sha512-DuvOwhXPO6l9W7/zM4/BaAbGTIXFyHVcbbCD1c7HfgZ3VfJPmcE7H4+TuQH0cigHHtpg/eGqV100NQbd7N4zwg== - -"@nx/nx-darwin-x64@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-22.0.1.tgz#c77cac89bc16371ca3ccfb65e233235b25cf0bd4" - integrity sha512-W5MAiesTGSVwYRoQa2WHARiEolqhioMwa8p1/gdQePb4LmM2ZdNOj6emVJYUecql6kt+ptHeO4bYaFc8n+XLEw== - -"@nx/nx-darwin-x64@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-22.5.1.tgz#8087825d28c5bab20657e79ca2ce616a46bffa11" - integrity sha512-81Lb7+rp3Qltpgy33Kc1qxk+8IWqZLhqvdLdRFSVV1FN1pPSJDFKyPjCn9oMpRryNPSJ8DgZDpfIaVVyP85rUw== - -"@nx/nx-freebsd-x64@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.0.1.tgz#75ff787e74718bcc46ffb087bb8a2c07118459c4" - integrity sha512-3n7nzFmRtUvfnP5rtJtaSqv9MxRTXe3RnwXF9N1oXE3gYmGJZXCo8cIYNzrt8oTeWxRUDTm/leJQnQ/aC7/v0g== - -"@nx/nx-freebsd-x64@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.5.1.tgz#48de3848c73c3fedcd4bfa8a27be5e761ab2f34b" - integrity sha512-Ig8yQN3lSz9R+Zf3NQWcvEnIzwDX4NSeaFtEliPnC3OHlQXGNXbOUfkExa0U0UUgyxa4rgnCgefmwuc12H9q2Q== - -"@nx/nx-linux-arm-gnueabihf@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.0.1.tgz#a394e4b79d1f8f58406ffa4130fd12a55d0c1e45" - integrity sha512-4cTCWWa4yonTE1lrH+1bX3urozJjVr0xjHysBktwc1W8VNg65oA6p29yC1FDZcTBgo9rY/y/1WIL1E61y64BgA== - -"@nx/nx-linux-arm-gnueabihf@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.5.1.tgz#97898f52376cba43ea92b75b896fa42852537911" - integrity sha512-C7tGoLnR9MjKLJsLMF2VsKcDChPiygAsw6dSVgU4B650H7sBWmkEHM/QjvyRvkcZuoQBDamS/eVs/UaJu9wNhA== - -"@nx/nx-linux-arm64-gnu@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.0.1.tgz#f607f3746eaa15d17d79adff0a1365840eeba3a0" - integrity sha512-cC61gqNy+Z3DBr8FBWysLCnIEPbrSxWU/GtnVWH/4r4fMzDlaQwl51g8nm2KCtQXOgyqyWkXEd5jykr3z2u7QA== - -"@nx/nx-linux-arm64-gnu@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.5.1.tgz#d0f333112216febbbbed6ef72ae4806791276020" - integrity sha512-GNxei+lwhzhrO9m+nNkibgxLhbkYKyFXPSRpOKLwv9VavNzJn5UmLfKJyhjNQPBOSYuNhiVPbU1Ja/qOBcozYw== - -"@nx/nx-linux-arm64-musl@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.0.1.tgz#b94f25b1a3dc338dd8ec85f04d167d1876ae83c4" - integrity sha512-43I82qkAvXUsRySzDkhstg9kpGegZG5EWRMFYtEatgJRXeVRssPwHZHsLP2alj/gopJFq1H2yjWOWTziJxG3pw== - -"@nx/nx-linux-arm64-musl@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.5.1.tgz#9ee7c3d7d180afc1307b3b92ad5f6d1a4177e182" - integrity sha512-VDJtdJP2nCgS8ommbfWFAKjoZCE51VH7tZyIfh8RFI5fxwoB3Pk6d6f6cmNHI/1t98YI3V7Onuf3Y9KBkYtyfQ== - -"@nx/nx-linux-x64-gnu@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.0.1.tgz#bcfdfbfda14a51db43a478db0e99929d3c90e1fd" - integrity sha512-HRtVR9g57gzjikXsUHVcP6UsrHWMzXq+WJz7PzgcRU1RT/AP/4QxV6HegA1O2filcGLxSYwt5JOYwy73OYuYDg== - -"@nx/nx-linux-x64-gnu@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.5.1.tgz#7e432d2b1c7ed439e8791f215060d8191edaa05f" - integrity sha512-BZ/i+KTplEJmE8ZHKgPGD513Zl86DuSGyRAvbDZ7Qf19Tei7Of6vxW+ypvVDIwmDbyXfe13u54M5gDt8iiqFGQ== - -"@nx/nx-linux-x64-musl@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.0.1.tgz#d59c9d02a99e081c225786f16225a818d5553dad" - integrity sha512-v/ZScgI8fwTMfIZgnLXSq2XB//3uX+qhq/dzzbQQKvOuo/vtrnhxOKcoo4mCGVKuFtT/mr0bv66/5uPpUPct2A== - -"@nx/nx-linux-x64-musl@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.5.1.tgz#a3e218c3d3a36ac4b00d705d08d6c4a62b93702d" - integrity sha512-e0VdiV6fe88Dbhill2gUjYAD9jMhHjYsafGOPR+/uaGMAYPoI1jKur6uPGY+ik6fvwvDFFl0VT2+HACKVn7RoA== - -"@nx/nx-win32-arm64-msvc@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.0.1.tgz#53381edc0a79d480ba17147560694069dfc7538a" - integrity sha512-xajcwSOJUISp+OaL/NU2ulhXvEEo1KwmgEvYpePWS5gvxogu8ps9D9wrtJGFcMSrKyPGurbPUbOCAKMbrk4LqQ== - -"@nx/nx-win32-arm64-msvc@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.5.1.tgz#916775bfa1eacb2d402cbb6fd2c8584a4fe58956" - integrity sha512-3vWZO9y7uHKeyepcU55pE8VQTKGome3mLdicvx1TCoKKl0cA3bTR341Jdo2Zl4Waa2ENk7pGQbLWRQ3ZkaA92A== - -"@nx/nx-win32-x64-msvc@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.0.1.tgz#9161d031d0cb9ef37ec8dd638db45d44d8f92a3b" - integrity sha512-2w78FyjZwBeKxjdv0ZzdHin2UFPk0NBHtb5mcZ7lannBDHahdO4vA9iI8Pg+Y75ybKGrIsCyHK+BDdgH/S6UHQ== - -"@nx/nx-win32-x64-msvc@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.5.1.tgz#dcd432ab7dfea2fab308fd6410f190da3301cf28" - integrity sha512-4e5LduuhpBx96JgD1J3fHUGCwC+/lL+tvXp3UVtjh/AOdINGsyI+scinT3uaI9vcB5GKBcybTxbBZzwcH50w9g== - -"@nx/react@^22.2.0": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/react/-/react-22.5.1.tgz#5172ea050deafff09d050626df8624751e0fb380" - integrity sha512-KLf9dABJFJb05H8L8YF9aAwsUWsOjnbOq2FEZMJzb0NNsc96fTbe01etPgEoWYaLum7czHWbGEZCvgrl46+Oxw== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/eslint" "22.5.1" - "@nx/js" "22.5.1" - "@nx/module-federation" "22.5.1" - "@nx/rollup" "22.5.1" - "@nx/web" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - "@svgr/webpack" "^8.0.1" - express "^4.21.2" - http-proxy-middleware "^3.0.5" - minimatch "10.1.1" - picocolors "^1.1.0" - semver "^7.6.3" - tslib "^2.3.0" - optionalDependencies: - "@nx/vite" "22.5.1" - -"@nx/rollup@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/rollup/-/rollup-22.5.1.tgz#3bc1346369e6e8af5753eacf2812cae7501b04ff" - integrity sha512-W6MgEZKRTORUxLeGASBX+WrN+ZZEN+wa2ynUliKeLEvpFJUPGsK6iyYe5MO/9pbxjcATZCnbe4lVQAKLglVH4g== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@rollup/plugin-babel" "^6.0.4" - "@rollup/plugin-commonjs" "^25.0.7" - "@rollup/plugin-image" "^3.0.3" - "@rollup/plugin-json" "^6.1.0" - "@rollup/plugin-node-resolve" "^15.2.3" - "@rollup/plugin-typescript" "^12.1.0" - autoprefixer "^10.4.9" - concat-with-sourcemaps "^1.1.0" - picocolors "^1.1.0" - picomatch "4.0.2" - postcss "^8.4.38" - postcss-modules "^6.0.1" - rollup "^4.14.0" - rollup-plugin-typescript2 "^0.36.0" - tslib "^2.3.0" - -"@nx/vite@22.5.1", "@nx/vite@^22.0.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/vite/-/vite-22.5.1.tgz#30f3548b75c0219a2d4184548b125732804ca1d3" - integrity sha512-Og2q6JRBYBNpMupUn4UpCuBny++Um/MIpQcfv0u0jd0B1TyBtiogYAFVxE0Vv23UezJBkI0IWr9NcjpR5rkUFw== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@nx/vitest" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - ajv "^8.0.0" - enquirer "~2.3.6" - picomatch "4.0.2" - semver "^7.6.3" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - -"@nx/vitest@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/vitest/-/vitest-22.5.1.tgz#0519808d3f7159166163d0d151091f251a4ceef1" - integrity sha512-Uu97DJIgqcfqO9CYhlCY+QKgMPFgKDtJjl+9E1QBUMuGRyGMJbtPQpH0ekQJOZso7Ha31QAIOozHP6yO8Qo+hQ== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - "@phenomnomnominal/tsquery" "~6.1.4" - semver "^7.6.3" - tslib "^2.3.0" - -"@nx/web@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/web/-/web-22.5.1.tgz#f04feca0244893cf35d99ea96be634007245025f" - integrity sha512-kK46sX/nPFjNptqfwwXX29ALVthmbxts9YlqB80gT+sewgBgnRU6HN+d+9lvBJT+9AtHodJPb25HeRRKXspx3w== - dependencies: - "@nx/devkit" "22.5.1" - "@nx/js" "22.5.1" - detect-port "^1.5.1" - http-server "^14.1.0" - picocolors "^1.1.0" - tslib "^2.3.0" - -"@nx/workspace@22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-22.0.1.tgz#21fa59a93569a532bb48d40760945788a588ac25" - integrity sha512-isITIOtnzux2IRaIrpRJDra80/RpC6QZ9WOitprDRMXm+eXIZU6wX4vlBSFB9mmvb8eyPayyFszZO6/nObrRPg== - dependencies: - "@nx/devkit" "22.0.1" - "@zkochan/js-yaml" "0.0.7" - chalk "^4.1.0" - enquirer "~2.3.6" - nx "22.0.1" - picomatch "4.0.2" - semver "^7.6.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@nx/workspace@22.5.1": - version "22.5.1" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-22.5.1.tgz#01bfbc0f7a39dbafb633e31e0d32a76d013f6349" - integrity sha512-IZJ440ITiNpswacrTGGpo46adOszLAAZM9RYYvQg5ak8kZDmmrskTm0SWWVgZCuiJazw8s23vqDLQ07TN/t1NQ== - dependencies: - "@nx/devkit" "22.5.1" - "@zkochan/js-yaml" "0.0.7" - chalk "^4.1.0" - enquirer "~2.3.6" - nx "22.5.1" - picomatch "4.0.2" - semver "^7.6.3" - tslib "^2.3.0" - yargs-parser "21.1.1" - -"@paralleldrive/cuid2@^2.2.2": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz#3d62ea9e7be867d3fa94b9897fab5b0ae187d784" - integrity sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw== - dependencies: - "@noble/hashes" "^1.1.5" - -"@phenomnomnominal/tsquery@~5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz#a2a5abc89f92c01562a32806655817516653a388" - integrity sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA== - dependencies: - esquery "^1.4.0" - -"@phenomnomnominal/tsquery@~6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-6.1.4.tgz#091671c961a9ec9a823711317dfc28cf47bb273d" - integrity sha512-3tHlGy/fxjJCHqIV8nelAzbRTNkCUY+k7lqBGKNuQz99H2OKGRt6oU+U2SZs6LYrbOe8mxMFl6kq6gzHapFRkw== - dependencies: - "@types/esquery" "^1.5.0" - esquery "^1.5.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/core@^0.2.9": - version "0.2.9" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" - integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== - -"@playwright/test@1.46.0": - version "1.46.0" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.46.0.tgz#ccea6d22c40ee7fa567e4192fafbdf2a907e2714" - integrity sha512-/QYft5VArOrGRP5pgkrfKksqsKA6CEFyGQ/gjNe6q0y4tZ1aaPfq4gIjudr1s3D+pXyrPRdsy4opKDrjBabE5w== - dependencies: - playwright "1.46.0" - -"@polka/url@^1.0.0-next.24": - version "1.0.0-next.29" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.29.tgz#5a40109a1ab5f84d6fd8fc928b19f367cbe7e7b1" - integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== - -"@popperjs/core@^2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - -"@remix-run/router@1.23.1": - version "1.23.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.23.1.tgz#0ce8857b024e24fc427585316383ad9d295b3a7f" - integrity sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ== - -"@rolldown/pluginutils@1.0.0-rc.2": - version "1.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz#10324e74cb3396cb7b616042ea7e9e6aa7d8d458" - integrity sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw== - -"@rolldown/pluginutils@1.0.0-rc.3": - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz#8a88cc92a0f741befc7bc109cb1a4c6b9408e1c5" - integrity sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q== - -"@rollup/plugin-babel@^6.0.4": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz#5766913722057f28a56365bb6c1ca61306c7e527" - integrity sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@rollup/pluginutils" "^5.0.1" - -"@rollup/plugin-commonjs@^25.0.7": - version "25.0.8" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz#c77e608ab112a666b7f2a6bea625c73224f7dd34" - integrity sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A== - dependencies: - "@rollup/pluginutils" "^5.0.1" - commondir "^1.0.1" - estree-walker "^2.0.2" - glob "^8.0.3" - is-reference "1.2.1" - magic-string "^0.30.3" - -"@rollup/plugin-image@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-image/-/plugin-image-3.0.3.tgz#025b557180bae20f2349ff5130ef2114169feaac" - integrity sha512-qXWQwsXpvD4trSb8PeFPFajp8JLpRtqqOeNYRUKnEQNHm7e5UP7fuSRcbjQAJ7wDZBbnJvSdY5ujNBQd9B1iFg== - dependencies: - "@rollup/pluginutils" "^5.0.1" - mini-svg-data-uri "^1.4.4" - -"@rollup/plugin-json@^6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" - integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== - dependencies: - "@rollup/pluginutils" "^5.1.0" - -"@rollup/plugin-node-resolve@^15.2.3": - version "15.3.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz#66008953c2524be786aa319d49e32f2128296a78" - integrity sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA== - dependencies: - "@rollup/pluginutils" "^5.0.1" - "@types/resolve" "1.20.2" - deepmerge "^4.2.2" - is-module "^1.0.0" - resolve "^1.22.1" - -"@rollup/plugin-replace@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz#150c9ee9db8031d9e4580a61a0edeaaed3d37687" - integrity sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ== - dependencies: - "@rollup/pluginutils" "^5.0.1" - magic-string "^0.30.3" - -"@rollup/plugin-typescript@^12.1.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz#cc51b830973bc14c9456fe6532f322f2a40f5f12" - integrity sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big== - dependencies: - "@rollup/pluginutils" "^5.1.0" - resolve "^1.22.1" - -"@rollup/pluginutils@^4.1.2": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" - integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== - dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" - -"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2", "@rollup/pluginutils@^5.1.0", "@rollup/pluginutils@^5.1.4": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" - integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^4.0.2" - -"@rollup/rollup-android-arm-eabi@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz#add5e608d4e7be55bc3ca3d962490b8b1890e088" - integrity sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg== - -"@rollup/rollup-android-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz#10bd0382b73592beee6e9800a69401a29da625c4" - integrity sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w== - -"@rollup/rollup-darwin-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz#1e99ab04c0b8c619dd7bbde725ba2b87b55bfd81" - integrity sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg== - -"@rollup/rollup-darwin-x64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz#69e741aeb2839d2e8f0da2ce7a33d8bd23632423" - integrity sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w== - -"@rollup/rollup-freebsd-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz#3736c232a999c7bef7131355d83ebdf9651a0839" - integrity sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug== - -"@rollup/rollup-freebsd-x64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz#227dcb8f466684070169942bd3998901c9bfc065" - integrity sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q== - -"@rollup/rollup-linux-arm-gnueabihf@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz#ba004b30df31b724f99ce66e7128248bea17cb0c" - integrity sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw== - -"@rollup/rollup-linux-arm-musleabihf@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz#6929f3e07be6b6da5991f63c6b68b3e473d0a65a" - integrity sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw== - -"@rollup/rollup-linux-arm64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz#06e89fd4a25d21fe5575d60b6f913c0e65297bfa" - integrity sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g== - -"@rollup/rollup-linux-arm64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz#fddabf395b90990d5194038e6cd8c00156ed8ac0" - integrity sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q== - -"@rollup/rollup-linux-loong64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz#04c10bb764bbf09a3c1bd90432e92f58d6603c36" - integrity sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA== - -"@rollup/rollup-linux-loong64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz#f2450361790de80581d8687ea19142d8a4de5c0f" - integrity sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw== - -"@rollup/rollup-linux-ppc64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz#0474f4667259e407eee1a6d38e29041b708f6a30" - integrity sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w== - -"@rollup/rollup-linux-ppc64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz#9f32074819eeb1ddbe51f50ea9dcd61a6745ec33" - integrity sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw== - -"@rollup/rollup-linux-riscv64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz#3fdb9d4b1e29fb6b6a6da9f15654d42eb77b99b2" - integrity sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A== - -"@rollup/rollup-linux-riscv64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz#1de780d64e6be0e3e8762035c22e0d8ea68df8ed" - integrity sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw== - -"@rollup/rollup-linux-s390x-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz#1da022ffd2d9e9f0fd8344ea49e113001fbcac64" - integrity sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg== - -"@rollup/rollup-linux-x64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz#78c16eef9520bd10e1ea7a112593bb58e2842622" - integrity sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg== - -"@rollup/rollup-linux-x64-musl@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz#a7598591b4d9af96cb3167b50a5bf1e02dfea06c" - integrity sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw== - -"@rollup/rollup-openbsd-x64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz#c51d48c07cd6c466560e5bed934aec688ce02614" - integrity sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw== - -"@rollup/rollup-openharmony-arm64@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz#f09921d0b2a0b60afbf3586d2a7a7f208ba6df17" - integrity sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ== - -"@rollup/rollup-win32-arm64-msvc@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz#08d491717135376e4a99529821c94ecd433d5b36" - integrity sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ== - -"@rollup/rollup-win32-ia32-msvc@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz#b0c12aac1104a8b8f26a5e0098e5facbb3e3964a" - integrity sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew== - -"@rollup/rollup-win32-x64-gnu@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz#b9cccef26f5e6fdc013bf3c0911a3c77428509d0" - integrity sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ== - -"@rollup/rollup-win32-x64-msvc@4.57.1": - version "4.57.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz#a03348e7b559c792b6277cc58874b89ef46e1e72" - integrity sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA== - -"@rspack/binding-darwin-arm64@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.6.8.tgz#52987c0cbc487a240bdc6b1a31838372daddee2b" - integrity sha512-e8CTQtzaeGnf+BIzR7wRMUwKfIg0jd/sxMRc1Vd0bCMHBhSN9EsGoMuJJaKeRrSmy2nwMCNWHIG+TvT1CEKg+A== - -"@rspack/binding-darwin-x64@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.6.8.tgz#13c801ce8210d11b7b0bc4ac7bf036ec32862935" - integrity sha512-ku1XpTEPt6Za11zhpFWhfwrTQogcgi9RJrOUVC4FESiPO9aKyd4hJ+JiPgLY0MZOqsptK6vEAgOip+uDVXrCpg== - -"@rspack/binding-linux-arm64-gnu@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.6.8.tgz#d70321ac5bbd5bc101de9a2da01c6fb984601565" - integrity sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ== - -"@rspack/binding-linux-arm64-musl@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.6.8.tgz#4f9196b6233649ce43e6485a5d2714ef38dfc603" - integrity sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw== - -"@rspack/binding-linux-x64-gnu@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.6.8.tgz#b78e7f62b4157b31e181fe89d319a601782a802b" - integrity sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg== - -"@rspack/binding-linux-x64-musl@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.6.8.tgz#c578f730d8a9fab866e4a15920457ef9d7fd5f58" - integrity sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA== - -"@rspack/binding-wasm32-wasi@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.6.8.tgz#76d23589ec31ad6bab6784da89f7cc42c7df0275" - integrity sha512-VUwdhl/lI4m6o1OGCZ9JwtMjTV/yLY5VZTQdEPKb40JMTlmZ5MBlr5xk7ByaXXYHr6I+qnqEm73iMKQvg6iknw== - dependencies: - "@napi-rs/wasm-runtime" "1.0.7" - -"@rspack/binding-win32-arm64-msvc@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.6.8.tgz#b42cba4ab7588ce72f0c13c968d3d62e8a61ab46" - integrity sha512-23YX7zlOZlub+nPGDBUzktb4D5D6ETUAluKjXEeHIZ9m7fSlEYBnGL66YE+3t1DHXGd0OqsdwlvrNGcyo6EXDQ== - -"@rspack/binding-win32-ia32-msvc@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.6.8.tgz#293a23448c6a11f25a9abbb989613059c7da3ec4" - integrity sha512-cFgRE3APxrY4AEdooVk2LtipwNNT/9mrnjdC5lVbsIsz+SxvGbZR231bxDJEqP15+RJOaD07FO1sIjINFqXMEg== - -"@rspack/binding-win32-x64-msvc@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.6.8.tgz#f5fd3f01b6694ee08cbc382c3bd42d6490ab9446" - integrity sha512-cIuhVsZYd3o3Neo1JSAhJYw6BDvlxaBoqvgwRkG1rs0ExFmEmgYyG7ip9pFKnKNWph/tmW3rDYypmEfjs1is7g== - -"@rspack/binding@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/binding/-/binding-1.6.8.tgz#c2cd2c31a4313ab10ad8ed871a5b9be0444046f3" - integrity sha512-lUeL4mbwGo+nqRKqFDCm9vH2jv9FNMVt1X8jqayWRcOCPlj/2UVMEFgqjR7Pp2vlvnTKq//31KbDBJmDZq31RQ== - optionalDependencies: - "@rspack/binding-darwin-arm64" "1.6.8" - "@rspack/binding-darwin-x64" "1.6.8" - "@rspack/binding-linux-arm64-gnu" "1.6.8" - "@rspack/binding-linux-arm64-musl" "1.6.8" - "@rspack/binding-linux-x64-gnu" "1.6.8" - "@rspack/binding-linux-x64-musl" "1.6.8" - "@rspack/binding-wasm32-wasi" "1.6.8" - "@rspack/binding-win32-arm64-msvc" "1.6.8" - "@rspack/binding-win32-ia32-msvc" "1.6.8" - "@rspack/binding-win32-x64-msvc" "1.6.8" - -"@rspack/core@1.6.8": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@rspack/core/-/core-1.6.8.tgz#b1f945a1a167f74394304ea93723616428d66095" - integrity sha512-FolcIAH5FW4J2FET+qwjd1kNeFbCkd0VLuIHO0thyolEjaPSxw5qxG67DA7BZGm6PVcoiSgPLks1DL6eZ8c+fA== - dependencies: - "@module-federation/runtime-tools" "0.21.6" - "@rspack/binding" "1.6.8" - "@rspack/lite-tapable" "1.1.0" - -"@rspack/lite-tapable@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz#3cfdafeed01078e116bd4f191b684c8b484de425" - integrity sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@rushstack/node-core-library@5.19.1": - version "5.19.1" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.19.1.tgz#2bafbb81cdd886798db2adc44ad41506fa80195a" - integrity sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA== - dependencies: - ajv "~8.13.0" - ajv-draft-04 "~1.0.0" - ajv-formats "~3.0.1" - fs-extra "~11.3.0" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.22.1" - semver "~7.5.4" - -"@rushstack/problem-matcher@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz#db9303ef3c47010c8aba5841e8c9511e091159df" - integrity sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA== - -"@rushstack/rig-package@0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.6.0.tgz#c80f93fe2c0d9d4977fc925ed9ce9decb75047a5" - integrity sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw== - dependencies: - resolve "~1.22.1" - strip-json-comments "~3.1.1" - -"@rushstack/terminal@0.21.0": - version "0.21.0" - resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.21.0.tgz#216d4383d5c10d6f3fe7530af43717b2c2513329" - integrity sha512-cLaI4HwCNYmknM5ns4G+drqdEB6q3dCPV423+d3TZeBusYSSm09+nR7CnhzJMjJqeRcdMAaLnrA4M/3xDz4R3w== - dependencies: - "@rushstack/node-core-library" "5.19.1" - "@rushstack/problem-matcher" "0.1.1" - supports-color "~8.1.1" - -"@rushstack/ts-command-line@5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-5.2.0.tgz#2e6f6bc2c63f79a7422772a78edc52c50cfe8837" - integrity sha512-lYxCX0nDdkDtCkVpvF0m25ymf66SaMWuppbD6b7MdkIzvGXKBXNIVZlwBH/C0YfkanrupnICWf2n4z3AKSfaHw== - dependencies: - "@rushstack/terminal" "0.21.0" - "@types/argparse" "1.0.38" - argparse "~1.0.9" - string-argv "~0.3.1" - -"@shikijs/core@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.29.2.tgz#9c051d3ac99dd06ae46bd96536380c916e552bf3" - integrity sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ== - dependencies: - "@shikijs/engine-javascript" "1.29.2" - "@shikijs/engine-oniguruma" "1.29.2" - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - hast-util-to-html "^9.0.4" - -"@shikijs/engine-javascript@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz#a821ad713a3e0b7798a1926fd9e80116e38a1d64" - integrity sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A== - dependencies: - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - oniguruma-to-es "^2.2.0" - -"@shikijs/engine-oniguruma@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz#d879717ced61d44e78feab16f701f6edd75434f1" - integrity sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA== - dependencies: - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - -"@shikijs/langs@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-1.29.2.tgz#4f1de46fde8991468c5a68fa4a67dd2875d643cd" - integrity sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ== - dependencies: - "@shikijs/types" "1.29.2" - -"@shikijs/themes@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-1.29.2.tgz#293cc5c83dd7df3fdc8efa25cec8223f3a6acb0d" - integrity sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g== - dependencies: - "@shikijs/types" "1.29.2" - -"@shikijs/types@1.29.2": - version "1.29.2" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.29.2.tgz#a93fdb410d1af8360c67bf5fc1d1a68d58e21c4f" - integrity sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw== - dependencies: - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -"@shikijs/vscode-textmate@^10.0.1": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" - integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== - -"@sinclair/typebox@^0.27.8": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6" - integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== - -"@sinclair/typebox@^0.34.0": - version "0.34.48" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.48.tgz#75b0ead87e59e1adbd6dccdc42bad4fddee73b59" - integrity sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA== - -"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@sinonjs/fake-timers@^13.0.0": - version "13.0.5" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" - integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== - dependencies: - "@sinonjs/commons" "^3.0.1" - -"@storybook/builder-vite@10.2.8": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/builder-vite/-/builder-vite-10.2.8.tgz#c00da5d1646a0bfb6ca0875302c1f776c42a048f" - integrity sha512-+6/Lwi7W0YIbzHDh798GPp0IHUYDwp0yv0Y1eVNK/StZD0tnv4/1C28NKyP+O7JOsFsuWI1qHiDhw8kNURugZw== - dependencies: - "@storybook/csf-plugin" "10.2.8" - ts-dedent "^2.0.0" - -"@storybook/csf-plugin@10.2.8": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/csf-plugin/-/csf-plugin-10.2.8.tgz#9a142b4022b6730ce9f8090a4bbff9abe068c98f" - integrity sha512-kKkLYhRXb33YtIPdavD2DU25sb14sqPYdcQFpyqu4TaD9truPPqW8P5PLTUgERydt/eRvRlnhauPHavU1kjsnA== - dependencies: - unplugin "^2.3.5" - -"@storybook/global@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" - integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== - -"@storybook/icons@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-2.0.1.tgz#1bd351db1d33bfccbbafa7b64fb413168f1a6616" - integrity sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg== - -"@storybook/react-dom-shim@10.2.8": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-10.2.8.tgz#fcab1b8428c221287afe7e74fa43f59ce2871d77" - integrity sha512-Xde9X3VszFV1pTXfc2ZFM89XOCGRxJD8MUIzDwkcT9xaki5a+8srs/fsXj75fMY6gMYfcL5lNRZvCqg37HOmcQ== - -"@storybook/react-vite@^10.1.11": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react-vite/-/react-vite-10.2.8.tgz#0a12d2b4da3ea6ee3d91da109e2c5364db412078" - integrity sha512-x5kmw+TPhxkQV84n4e9X0q6/rA5T8V2QQFolMuN+U93q1HX1r+GZ6g/nXaaq9ox168PhHUJZQnn+LzSQKGCMBA== - dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript" "^0.6.3" - "@rollup/pluginutils" "^5.0.2" - "@storybook/builder-vite" "10.2.8" - "@storybook/react" "10.2.8" - empathic "^2.0.0" - magic-string "^0.30.0" - react-docgen "^8.0.0" - resolve "^1.22.8" - tsconfig-paths "^4.2.0" - -"@storybook/react@10.2.8", "@storybook/react@^10.1.11": - version "10.2.8" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-10.2.8.tgz#d8da5b9ca969b0310683f392a75218af9990ca39" - integrity sha512-nMFqQFUXq6Zg2O5SeuomyWnrIx61QfpNQMrfor8eCEzHrWNnXrrvVsz2RnHIgXN8RVyaWGDPh1srAECu/kDHXw== - dependencies: - "@storybook/global" "^5.0.0" - "@storybook/react-dom-shim" "10.2.8" - react-docgen "^8.0.2" - -"@svgr/babel-plugin-add-jsx-attribute@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" - integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== - -"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" - integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== - -"@svgr/babel-plugin-svg-dynamic-title@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" - integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== - -"@svgr/babel-plugin-svg-em-dimensions@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" - integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== - -"@svgr/babel-plugin-transform-react-native-svg@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" - integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== - -"@svgr/babel-plugin-transform-svg-component@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" - integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== - -"@svgr/babel-preset@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" - integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" - "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" - "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" - "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" - "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" - "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" - "@svgr/babel-plugin-transform-svg-component" "8.0.0" - -"@svgr/core@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" - integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== - dependencies: - "@babel/core" "^7.21.3" - "@svgr/babel-preset" "8.1.0" - camelcase "^6.2.0" - cosmiconfig "^8.1.3" - snake-case "^3.0.4" - -"@svgr/hast-util-to-babel-ast@8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" - integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== - dependencies: - "@babel/types" "^7.21.3" - entities "^4.4.0" - -"@svgr/plugin-jsx@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" - integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== - dependencies: - "@babel/core" "^7.21.3" - "@svgr/babel-preset" "8.1.0" - "@svgr/hast-util-to-babel-ast" "8.0.0" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" - integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== - dependencies: - cosmiconfig "^8.1.3" - deepmerge "^4.3.1" - svgo "^3.0.2" - -"@svgr/webpack@^8.0.1": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-8.1.0.tgz#16f1b5346f102f89fda6ec7338b96a701d8be0c2" - integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== - dependencies: - "@babel/core" "^7.21.3" - "@babel/plugin-transform-react-constant-elements" "^7.21.3" - "@babel/preset-env" "^7.20.2" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.21.0" - "@svgr/core" "8.1.0" - "@svgr/plugin-jsx" "8.1.0" - "@svgr/plugin-svgo" "8.1.0" - -"@swc/core-darwin-arm64@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.11.tgz#6f177125831b765e5dacdd1d8c07de576962ad16" - integrity sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg== - -"@swc/core-darwin-x64@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.15.11.tgz#31381b6560bbd8b8ca6a0755262df321e28c039d" - integrity sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA== - -"@swc/core-linux-arm-gnueabihf@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.11.tgz#ea7831776f7d8a548db4a8a5f38ef37faf5c0c66" - integrity sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg== - -"@swc/core-linux-arm64-gnu@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.11.tgz#c99a5843115ef57cbefd40b93c99cb130d6db12f" - integrity sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA== - -"@swc/core-linux-arm64-musl@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.11.tgz#9a7831f558b2ff504d3d6eaaf6a4c84e5232284b" - integrity sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w== - -"@swc/core-linux-x64-gnu@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.11.tgz#4a1fce9b9abedde04459fefe5da9dd9e405a2ae8" - integrity sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ== - -"@swc/core-linux-x64-musl@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.11.tgz#0865f23b1cc532d9d77e743a83279e074edbee25" - integrity sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw== - -"@swc/core-win32-arm64-msvc@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.11.tgz#73eda8b54c94046728f5983e5516223ad1009c59" - integrity sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA== - -"@swc/core-win32-ia32-msvc@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.11.tgz#0df41547974ba9f26ba3e903e803ff523c15650b" - integrity sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw== - -"@swc/core-win32-x64-msvc@1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.11.tgz#f6f97500472c0ea4ab756c383c5d97896075f95c" - integrity sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw== - -"@swc/core@^1.15.11": - version "1.15.11" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.15.11.tgz#8f52ab37b4d874b9cc1b1ae809778620b42dbf9f" - integrity sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w== - dependencies: - "@swc/counter" "^0.1.3" - "@swc/types" "^0.1.25" - optionalDependencies: - "@swc/core-darwin-arm64" "1.15.11" - "@swc/core-darwin-x64" "1.15.11" - "@swc/core-linux-arm-gnueabihf" "1.15.11" - "@swc/core-linux-arm64-gnu" "1.15.11" - "@swc/core-linux-arm64-musl" "1.15.11" - "@swc/core-linux-x64-gnu" "1.15.11" - "@swc/core-linux-x64-musl" "1.15.11" - "@swc/core-win32-arm64-msvc" "1.15.11" - "@swc/core-win32-ia32-msvc" "1.15.11" - "@swc/core-win32-x64-msvc" "1.15.11" - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/types@^0.1.25": - version "0.1.25" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.25.tgz#b517b2a60feb37dd933e542d93093719e4cf1078" - integrity sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g== - dependencies: - "@swc/counter" "^0.1.3" - -"@tailwindcss/node@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.1.18.tgz#9863be0d26178638794a38d6c7c14666fb992e8a" - integrity sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ== - dependencies: - "@jridgewell/remapping" "^2.3.4" - enhanced-resolve "^5.18.3" - jiti "^2.6.1" - lightningcss "1.30.2" - magic-string "^0.30.21" - source-map-js "^1.2.1" - tailwindcss "4.1.18" - -"@tailwindcss/oxide-android-arm64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz#79717f87e90135e5d3d23a3d3aecde4ca5595dd5" - integrity sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q== - -"@tailwindcss/oxide-darwin-arm64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz#7fa47608d62d60e9eb020682249d20159667fbb0" - integrity sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A== - -"@tailwindcss/oxide-darwin-x64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz#c05991c85aa2af47bf9d1f8172fe9e4636591e79" - integrity sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw== - -"@tailwindcss/oxide-freebsd-x64@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz#3d48e8d79fd08ece0e02af8e72d5059646be34d0" - integrity sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA== - -"@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz#982ecd1a65180807ccfde67dc17c6897f2e50aa8" - integrity sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA== - -"@tailwindcss/oxide-linux-arm64-gnu@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz#df49357bc9737b2e9810ea950c1c0647ba6573c3" - integrity sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw== - -"@tailwindcss/oxide-linux-arm64-musl@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz#b266c12822bf87883cf152615f8fffb8519d689c" - integrity sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg== - -"@tailwindcss/oxide-linux-x64-gnu@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz#5c737f13dd9529b25b314e6000ff54e05b3811da" - integrity sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g== - -"@tailwindcss/oxide-linux-x64-musl@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz#3380e17f7be391f1ef924be9f0afe1f304fe3478" - integrity sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ== - -"@tailwindcss/oxide-wasm32-wasi@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz#9464df0e28a499aab1c55e97682be37b3a656c88" - integrity sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA== - dependencies: - "@emnapi/core" "^1.7.1" - "@emnapi/runtime" "^1.7.1" - "@emnapi/wasi-threads" "^1.1.0" - "@napi-rs/wasm-runtime" "^1.1.0" - "@tybys/wasm-util" "^0.10.1" - tslib "^2.4.0" - -"@tailwindcss/oxide-win32-arm64-msvc@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz#bbcdd59c628811f6a0a4d5b09616967d8fb0c4d4" - integrity sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA== - -"@tailwindcss/oxide-win32-x64-msvc@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz#9c628d04623aa4c3536c508289f58d58ba4b3fb1" - integrity sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q== - -"@tailwindcss/oxide@4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.1.18.tgz#c8335cd0a83e9880caecd60abf7904f43ebab582" - integrity sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A== - optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.1.18" - "@tailwindcss/oxide-darwin-arm64" "4.1.18" - "@tailwindcss/oxide-darwin-x64" "4.1.18" - "@tailwindcss/oxide-freebsd-x64" "4.1.18" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.18" - "@tailwindcss/oxide-linux-arm64-gnu" "4.1.18" - "@tailwindcss/oxide-linux-arm64-musl" "4.1.18" - "@tailwindcss/oxide-linux-x64-gnu" "4.1.18" - "@tailwindcss/oxide-linux-x64-musl" "4.1.18" - "@tailwindcss/oxide-wasm32-wasi" "4.1.18" - "@tailwindcss/oxide-win32-arm64-msvc" "4.1.18" - "@tailwindcss/oxide-win32-x64-msvc" "4.1.18" - -"@tailwindcss/vite@^4.1.18": - version "4.1.18" - resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.1.18.tgz#614b9d5483559518c72d31bca05d686f8df28e9a" - integrity sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA== - dependencies: - "@tailwindcss/node" "4.1.18" - "@tailwindcss/oxide" "4.1.18" - tailwindcss "4.1.18" - -"@testing-library/dom@10.4.0": - version "10.4.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-10.4.0.tgz#82a9d9462f11d240ecadbf406607c6ceeeff43a8" - integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.3.0" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/jest-dom@^6.6.3": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz#7613a04e146dd2976d24ddf019730d57a89d56c2" - integrity sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== - dependencies: - "@adobe/css-tools" "^4.4.0" - aria-query "^5.0.0" - css.escape "^1.5.1" - dom-accessibility-api "^0.6.3" - picocolors "^1.1.1" - redent "^3.0.0" - -"@testing-library/react@16.3.0": - version "16.3.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-16.3.0.tgz#3a85bb9bdebf180cd76dba16454e242564d598a6" - integrity sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw== - dependencies: - "@babel/runtime" "^7.12.5" - -"@testing-library/user-event@^14.6.1": - version "14.6.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.6.1.tgz#13e09a32d7a8b7060fe38304788ebf4197cd2149" - integrity sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tybys/wasm-util@^0.10.0", "@tybys/wasm-util@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" - integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== - dependencies: - tslib "^2.4.0" - -"@tybys/wasm-util@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz#3e75eb00604c8d6db470bf18c37b7d984a0e3355" - integrity sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== - dependencies: - tslib "^2.4.0" - -"@types/argparse@1.0.38": - version "1.0.38" - resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" - integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== - -"@types/aria-query@^5.0.1": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" - integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== - -"@types/babel__core@^7.1.14", "@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.20.7": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" - integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== - dependencies: - "@babel/types" "^7.28.2" - -"@types/body-parser@*", "@types/body-parser@^1.19.2": - version "1.19.6" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.6.tgz#1859bebb8fd7dac9918a45d54c1971ab8b5af474" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/chai@^5.2.2": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" - integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== - dependencies: - "@types/deep-eql" "*" - assertion-error "^2.0.1" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cookiejar@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.5.tgz#14a3e83fa641beb169a2dd8422d91c3c345a9a78" - integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== - -"@types/cors@^2.8.13": - version "2.8.19" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" - integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== - dependencies: - "@types/node" "*" - -"@types/debug@4.1.12": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== - dependencies: - "@types/ms" "*" - -"@types/deep-eql@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" - integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== - -"@types/doctrine@^0.0.9": - version "0.0.9" - resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz#d86a5f452a15e3e3113b99e39616a9baa0f9863f" - integrity sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA== - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/esquery@^1.5.0": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/esquery/-/esquery-1.5.4.tgz#ebfd3a3bca6db50446688ba5592d18bb9b807e91" - integrity sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA== - dependencies: - "@types/estree" "*" - -"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/express-serve-static-core@^4.17.33": - version "4.19.8" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz#99b960322a4d576b239a640ab52ef191989b036f" - integrity sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@^4.17.17": - version "4.17.25" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" - integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "^1" - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/hast@^3.0.0", "@types/hast@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== - dependencies: - "@types/unist" "*" - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.5.tgz#5b749ab2b16ba113423feb1a64a95dcd30398472" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - -"@types/http-proxy@^1.17.15": - version "1.17.17" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.17.tgz#d9e2c4571fe3507343cb210cd41790375e59a533" - integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0", "@types/istanbul-reports@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.5.12": - version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" - integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash.omit@4.5.9": - version "4.5.9" - resolved "https://registry.yarnpkg.com/@types/lodash.omit/-/lodash.omit-4.5.9.tgz#cf4744d034961406d6dc41d9cd109773a9ed8fe3" - integrity sha512-zuAVFLUPJMOzsw6yawshsYGgq2hWUHtsZgeXHZmSFhaQQFC6EQ021uDKHkSjOpNhSvtNSU9165/o3o/Q51GpTw== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*", "@types/lodash@^4.17.1": - version "4.17.23" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.23.tgz#c1bb06db218acc8fc232da0447473fc2fb9d9841" - integrity sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA== - -"@types/mdast@^4.0.0": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" - integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== - dependencies: - "@types/unist" "*" - -"@types/methods@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@types/methods/-/methods-1.1.4.tgz#d3b7ac30ac47c91054ea951ce9eed07b1051e547" - integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/ms@*": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" - integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== - -"@types/node-fetch@2.6.11": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*": - version "25.2.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.2.3.tgz#9c18245be768bdb4ce631566c7da303a5c99a7f8" - integrity sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ== - dependencies: - undici-types "~7.16.0" - -"@types/node@20.19.9": - version "20.19.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.9.tgz#ca9a58193fec361cc6e859d88b52261853f1f0d3" - integrity sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw== - dependencies: - undici-types "~6.21.0" - -"@types/opentok@^2.14.0": - version "2.14.4" - resolved "https://registry.yarnpkg.com/@types/opentok/-/opentok-2.14.4.tgz#460722ec01deb4cf52cf8110107da661214e043d" - integrity sha512-m52tO9NbbWekxOcX6XoP5mAsjTBNcqBaZAiBXnYc6CF3TVAkTqEyXjcVMabch249iDwCMCpy1vg/yVfSgfypHg== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prop-types@^15.7.12": - version "15.7.15" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" - integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== - -"@types/qs@*": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/react-dom@^19.2.3": - version "19.2.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c" - integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== - -"@types/react-transition-group@^4.4.10": - version "4.4.12" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" - integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== - -"@types/react@^19.2.7": - version "19.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad" - integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== - dependencies: - csstype "^3.2.2" - -"@types/resolve@1.20.2": - version "1.20.2" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" - integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== - -"@types/resolve@^1.20.2": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" - integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== - -"@types/semver@7.5.8": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/send@*": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" - integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== - dependencies: - "@types/node" "*" - -"@types/send@<1": - version "0.17.6" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" - integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@^1": - version "1.15.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" - integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "<1" - -"@types/stack-utils@^2.0.0", "@types/stack-utils@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/superagent@^8.1.0": - version "8.1.9" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-8.1.9.tgz#28bfe4658e469838ed0bf66d898354bcab21f49f" - integrity sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ== - dependencies: - "@types/cookiejar" "^2.1.5" - "@types/methods" "^1.1.4" - "@types/node" "*" - form-data "^4.0.0" - -"@types/supertest@^6.0.2": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-6.0.3.tgz#d736f0e994b195b63e1c93e80271a2faf927388c" - integrity sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w== - dependencies: - "@types/methods" "^1.1.4" - "@types/superagent" "^8.1.0" - -"@types/trusted-types@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" - integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== - -"@types/ua-parser-js@^0.7.39": - version "0.7.39" - resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz#832c58e460c9435e4e34bb866e85e9146e12cdbb" - integrity sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg== - -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/validator@^13.15.2": - version "13.15.10" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.15.10.tgz#742b77ec34d58554b94a76a14cef30d59e3c16b9" - integrity sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.33", "@types/yargs@^17.0.8": - version "17.0.35" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" - integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@8.55.0", "@typescript-eslint/eslint-plugin@^8.30.1": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz#086d2ef661507b561f7b17f62d3179d692a0765f" - integrity sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.55.0" - "@typescript-eslint/type-utils" "8.55.0" - "@typescript-eslint/utils" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.4.0" - -"@typescript-eslint/parser@8.55.0", "@typescript-eslint/parser@^8.30.1": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.55.0.tgz#6eace4e9e95f178d3447ed1f17f3d6a5dfdb345c" - integrity sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw== - dependencies: - "@typescript-eslint/scope-manager" "8.55.0" - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - debug "^4.4.3" - -"@typescript-eslint/project-service@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.55.0.tgz#b8a71c06a625bdad481c24d5614b68e252f3ae9b" - integrity sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.55.0" - "@typescript-eslint/types" "^8.55.0" - debug "^4.4.3" - -"@typescript-eslint/scope-manager@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz#8a0752c31c788651840dc98f840b0c2ebe143b8c" - integrity sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q== - dependencies: - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - -"@typescript-eslint/tsconfig-utils@8.55.0", "@typescript-eslint/tsconfig-utils@^8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz#62f1d005419985e09d37a040b2f1450e4e805afa" - integrity sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q== - -"@typescript-eslint/type-utils@8.55.0", "@typescript-eslint/type-utils@^8.0.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz#195d854b3e56308ce475fdea2165313bb1190200" - integrity sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g== - dependencies: - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - "@typescript-eslint/utils" "8.55.0" - debug "^4.4.3" - ts-api-utils "^2.4.0" - -"@typescript-eslint/types@8.55.0", "@typescript-eslint/types@^8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.55.0.tgz#8449c5a7adac61184cac92dbf6315733569708c2" - integrity sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w== - -"@typescript-eslint/typescript-estree@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz#c83ac92c11ce79bedd984937c7780a65e7f7b2e3" - integrity sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw== - dependencies: - "@typescript-eslint/project-service" "8.55.0" - "@typescript-eslint/tsconfig-utils" "8.55.0" - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/visitor-keys" "8.55.0" - debug "^4.4.3" - minimatch "^9.0.5" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.4.0" - -"@typescript-eslint/utils@8.55.0", "@typescript-eslint/utils@^8.0.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.55.0.tgz#c1744d94a3901deb01f58b09d3478d811f96d619" - integrity sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.55.0" - "@typescript-eslint/types" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - -"@typescript-eslint/visitor-keys@8.55.0": - version "8.55.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz#3d9a40fd4e3705c63d8fae3af58988add3ed464d" - integrity sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA== - dependencies: - "@typescript-eslint/types" "8.55.0" - eslint-visitor-keys "^4.2.1" - -"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0", "@ungap/structured-clone@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -"@unrs/resolver-binding-android-arm-eabi@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81" - integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw== - -"@unrs/resolver-binding-android-arm64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f" - integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g== - -"@unrs/resolver-binding-darwin-arm64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf" - integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== - -"@unrs/resolver-binding-darwin-x64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc" - integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ== - -"@unrs/resolver-binding-freebsd-x64@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b" - integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw== - -"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a" - integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw== - -"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3" - integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw== - -"@unrs/resolver-binding-linux-arm64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d" - integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ== - -"@unrs/resolver-binding-linux-arm64-musl@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0" - integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w== - -"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44" - integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA== - -"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9" - integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ== - -"@unrs/resolver-binding-linux-riscv64-musl@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165" - integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew== - -"@unrs/resolver-binding-linux-s390x-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94" - integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg== - -"@unrs/resolver-binding-linux-x64-gnu@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz#36fb318eebdd690f6da32ac5e0499a76fa881935" - integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w== - -"@unrs/resolver-binding-linux-x64-musl@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz#bfb9af75f783f98f6a22c4244214efe4df1853d6" - integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA== - -"@unrs/resolver-binding-wasm32-wasi@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d" - integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ== - dependencies: - "@napi-rs/wasm-runtime" "^0.2.11" - -"@unrs/resolver-binding-win32-arm64-msvc@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35" - integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw== - -"@unrs/resolver-binding-win32-ia32-msvc@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6" - integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ== - -"@unrs/resolver-binding-win32-x64-msvc@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777" - integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== - -"@videojs/http-streaming@^3.17.3": - version "3.17.4" - resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-3.17.4.tgz#083cb53e2a19b59e5d0fbce98c1f62fe77e93ab5" - integrity sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.1.1" - aes-decrypter "^4.0.2" - global "^4.4.0" - m3u8-parser "^7.2.0" - mpd-parser "^1.3.1" - mux.js "7.1.0" - video.js "^7 || ^8" - -"@videojs/vhs-utils@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz#4d4dbf5d61a9fbd2da114b84ec747c3a483bc60d" - integrity sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg== - dependencies: - "@babel/runtime" "^7.12.5" - global "^4.4.0" - url-toolkit "^2.2.1" - -"@videojs/vhs-utils@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-4.1.1.tgz#44226fc5993f577490b5e08951ddc083714405cc" - integrity sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA== - dependencies: - "@babel/runtime" "^7.12.5" - global "^4.4.0" - -"@videojs/xhr@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@videojs/xhr/-/xhr-2.7.0.tgz#e272af6e2b5448aeb400905a5c6f4818f6b6ad47" - integrity sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ== - dependencies: - "@babel/runtime" "^7.5.5" - global "~4.4.0" - is-function "^1.0.1" - -"@vitejs/plugin-react-swc@^4.2.2": - version "4.2.3" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.3.tgz#ab92c8a00aab280951a04c06d99731cb7768c964" - integrity sha512-QIluDil2prhY1gdA3GGwxZzTAmLdi8cQ2CcuMW4PB/Wu4e/1pzqrwhYWVd09LInCRlDUidQjd0B70QWbjWtLxA== - dependencies: - "@rolldown/pluginutils" "1.0.0-rc.2" - "@swc/core" "^1.15.11" - -"@vitejs/plugin-react@^5.1.2": - version "5.1.4" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz#5b477e060bf612a7394c4febacc5de33a219b0e4" - integrity sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA== - dependencies: - "@babel/core" "^7.29.0" - "@babel/plugin-transform-react-jsx-self" "^7.27.1" - "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-rc.3" - "@types/babel__core" "^7.20.5" - react-refresh "^0.18.0" - -"@vitest/coverage-v8@^1.0.4": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-1.6.1.tgz#47230491ec73aa288a92e36b75c1671b3f741d4e" - integrity sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw== - dependencies: - "@ampproject/remapping" "^2.2.1" - "@bcoe/v8-coverage" "^0.2.3" - debug "^4.3.4" - istanbul-lib-coverage "^3.2.2" - istanbul-lib-report "^3.0.1" - istanbul-lib-source-maps "^5.0.4" - istanbul-reports "^3.1.6" - magic-string "^0.30.5" - magicast "^0.3.3" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - test-exclude "^6.0.0" - -"@vitest/expect@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.6.1.tgz#b90c213f587514a99ac0bf84f88cff9042b0f14d" - integrity sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog== - dependencies: - "@vitest/spy" "1.6.1" - "@vitest/utils" "1.6.1" - chai "^4.3.10" - -"@vitest/expect@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" - integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== - dependencies: - "@types/chai" "^5.2.2" - "@vitest/spy" "3.2.4" - "@vitest/utils" "3.2.4" - chai "^5.2.0" - tinyrainbow "^2.0.0" - -"@vitest/pretty-format@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" - integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== - dependencies: - tinyrainbow "^2.0.0" - -"@vitest/runner@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.6.1.tgz#10f5857c3e376218d58c2bfacfea1161e27e117f" - integrity sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA== - dependencies: - "@vitest/utils" "1.6.1" - p-limit "^5.0.0" - pathe "^1.1.1" - -"@vitest/snapshot@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.6.1.tgz#90414451a634bb36cd539ccb29ae0d048a8c0479" - integrity sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ== - dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" - -"@vitest/spy@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.6.1.tgz#33376be38a5ed1ecd829eb986edaecc3e798c95d" - integrity sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw== - dependencies: - tinyspy "^2.2.0" - -"@vitest/spy@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" - integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== - dependencies: - tinyspy "^4.0.3" - -"@vitest/ui@^1.3.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-1.6.1.tgz#e94c42af392ddb47531b2401d8871bc246f1947e" - integrity sha512-xa57bCPGuzEFqGjPs3vVLyqareG8DX0uMkr5U/v5vLv5/ZUrBrPL7gzxzTJedEyZxFMfsozwTIbbYfEQVo3kgg== - dependencies: - "@vitest/utils" "1.6.1" - fast-glob "^3.3.2" - fflate "^0.8.1" - flatted "^3.2.9" - pathe "^1.1.1" - picocolors "^1.0.0" - sirv "^2.0.4" - -"@vitest/utils@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.6.1.tgz#6d2f36cb6d866f2bbf59da854a324d6bf8040f17" - integrity sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g== - dependencies: - diff-sequences "^29.6.3" - estree-walker "^3.0.3" - loupe "^2.3.7" - pretty-format "^29.7.0" - -"@vitest/utils@3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" - integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== - dependencies: - "@vitest/pretty-format" "3.2.4" - loupe "^3.1.4" - tinyrainbow "^2.0.0" - -"@volar/language-core@2.4.28", "@volar/language-core@~2.4.11": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.28.tgz#c21f365a91c1dffe8bd7264fd491770c8d74fef3" - integrity sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ== - dependencies: - "@volar/source-map" "2.4.28" - -"@volar/source-map@2.4.28": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.28.tgz#b40254e8c96199e5f1e0796777c593c617ad270e" - integrity sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ== - -"@volar/typescript@^2.4.11": - version "2.4.28" - resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.28.tgz#83f86356e84eb101b8081a44c104f2f2ced8411f" - integrity sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw== - dependencies: - "@volar/language-core" "2.4.28" - path-browserify "^1.0.1" - vscode-uri "^3.0.8" - -"@vonage/accounts@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/accounts/-/accounts-1.18.1.tgz#7c32320b5587367d560d69279222f2c909c259a0" - integrity sha512-3pvmsBRh2ELjyV09AJSVcXEH+kEzLAI1k5a9lofak4wBVGSIB3XyFSNGak2V1GqWfgK6om8K5D6rZB2MFbUFmw== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/applications@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/applications/-/applications-1.18.1.tgz#b7c0f6c02d20b1037fa80104d4213ec48b029725" - integrity sha512-UKRvXJRnF9hU4GBEzK8C0DTwI7T07wQFS+ByVmK5ut3jJfDkHX3dEvXxc1xlDhFl2WaE5GkuF83KcniJvMpTbg== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/auth@1.13.1": - version "1.13.1" - resolved "https://registry.yarnpkg.com/@vonage/auth/-/auth-1.13.1.tgz#f622e25b24602a133a2986473188881f67f8577f" - integrity sha512-zQT0hb97d3zx3UOnkf47b5MKiluT0m60lExJepC7qi0gUQwKqMCBspth3QU9YbxoR2WANVziTrHbesxo9u/kCQ== - dependencies: - "@vonage/jwt" "1.12.1" - debug "4.4.1" - -"@vonage/auth@^1.13.1": - version "1.14.0" - resolved "https://registry.yarnpkg.com/@vonage/auth/-/auth-1.14.0.tgz#9850936c1f674bd23eead28d8b72a6a7674f4ccc" - integrity sha512-MlUoeyE9GN8elQIYR9MumECPiQ3SeO6xrWCCuc1Bphx7qbJgImoCPCzAH/RUNVP9FbVDQzI6qBoYAAWuu4OSaA== - dependencies: - "@vonage/jwt" "1.13.0" - debug "4.4.3" - -"@vonage/client-sdk-video@2.32.1": - version "2.32.1" - resolved "https://registry.yarnpkg.com/@vonage/client-sdk-video/-/client-sdk-video-2.32.1.tgz#08aa4ea559648bdbdc69259194cfd1298565fa05" - integrity sha512-ko0KRVMbhIHNUR/WgskOD6H3stz702pq2yDeRZf9STNb4srp4MADb7KgleoHeLMNxxFU+ipDMr49xmygZn9rhA== - -"@vonage/conversations@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vonage/conversations/-/conversations-1.12.1.tgz#a737b94fea58a8a0be3d05707442ab7b11a505ac" - integrity sha512-UBk/gV0oQaamMO7+yMdxbZqlfDfmybdxba9PkYOliPUReqRV6AWa5KGN9aAYOibV467chzOtgRMsVTeEnkROWA== - dependencies: - "@vonage/messages" "1.22.1" - "@vonage/server-client" "1.18.1" - "@vonage/users" "1.12.1" - "@vonage/voice" "1.19.1" - -"@vonage/jwt@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@vonage/jwt/-/jwt-1.11.0.tgz#491b82cd34d292fc180536fc3da9e5d86bad47fb" - integrity sha512-P9KM6QYBBkW8ruC+HeOxFGVQh123KCqgVuGyWjp+VjD64WikYAfT73N5isP4rQob0umpMDjGKNOIAYsVAaRdnA== - dependencies: - debug "^4.3.4" - jsonwebtoken "^9.0.2" - uuid "^9.0.1" - -"@vonage/jwt@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vonage/jwt/-/jwt-1.12.1.tgz#507d880f409eb169970337515bf74ea41321d341" - integrity sha512-WJuGXpvjTNYOEgy/kUcAqklFchcpPToQAmsOD4+ZkbuRg06Spf5VWMT0DtILaGWQ12n6tF8eHWKeojELY9mjoA== - dependencies: - debug "4.3.4" - jsonwebtoken "9.0.2" - uuid "9.0.1" - -"@vonage/jwt@1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@vonage/jwt/-/jwt-1.13.0.tgz#75a9446b11bd0b3820cc3404a3cfae5203df58ab" - integrity sha512-LmmsW4u8LaxnMIeO94k0RLCZ5y7J2hBV4uf3lqp9GaU2SRq115kOJFynulXyFDpAFHfLd8aO7P5c/BMGNvHvrw== - dependencies: - debug "4.4.3" - jsonwebtoken "9.0.3" - uuid "13.0.0" - -"@vonage/messages@1.22.1": - version "1.22.1" - resolved "https://registry.yarnpkg.com/@vonage/messages/-/messages-1.22.1.tgz#f6849b09aaa11827685bd5bca1fe1cd948f1ab9f" - integrity sha512-aaBmaoylcl5MFUgUNgzfJrvGCoJdBcNXGrBbtlDKu4yRc6TozevmVD3IcRgq/mrIT/PKAg5dVO+KUkt48Ae0gA== - dependencies: - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - debug "4.4.1" - -"@vonage/number-insights@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/number-insights/-/number-insights-1.18.1.tgz#4c2328f4d1700d8e9152cab5e2ad8956a20f34ef" - integrity sha512-+7zfdEA5jRrVKSXFS6pyDPGGV1AyvG0Y/Is+PjtLnj9sEulm2DVgltWw8A179FRmPbBa/mQyo+K6zZc02WJEtA== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - -"@vonage/numbers@1.20.1": - version "1.20.1" - resolved "https://registry.yarnpkg.com/@vonage/numbers/-/numbers-1.20.1.tgz#4120af41fd1e4920de5a3283bbe92f3cf469a86b" - integrity sha512-W4tRnaS3nh45th3mB0I91J7vXi8ByVKG7Grgkpldh3pthOW1OMvPSmANNgjq1K6Nf6T37plg41C17xWU4Pq8iw== - dependencies: - "@types/lodash.omit" "4.5.9" - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - lodash.omit "4.5.0" - -"@vonage/pricing@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/pricing/-/pricing-1.18.1.tgz#226699e78ba73654f5fc5eb219cac959d3d30eda" - integrity sha512-oJtJ0z5XKFeJxDfwmYXWFDu5Yn+HrwWU+vvaTJTDnwb8TK54E5I6pU4TwVJQ7fqgDamBWq4WvILmMdKC9yWOHw== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - -"@vonage/redact@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@vonage/redact/-/redact-1.17.1.tgz#545005c75b38537b7cc2920f27bb11bf19d01d13" - integrity sha512-QSg4CFnpPqcg+Z54EsXb6Q8wGSphKzBrEci8/G/3xX9LTDN7o/dZU/NEbFVZU41+6D1Ap5OJZi1Rai301lpoXA== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/server-client@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/server-client/-/server-client-1.18.1.tgz#9fa4a6b107381392d4e4c71fb778ec644038222a" - integrity sha512-HLOT4QoVpwsxIYAB/5tN6y8yh3AVPcqoITby3Lz/AR5tNViiTNS1X6S25+EiBg8b3tUklPddIhtbHTEVDmA+gQ== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/vetch" "1.9.1" - debug "4.4.1" - lodash.camelcase "4.3.0" - lodash.isobject "3.0.2" - lodash.kebabcase "4.1.1" - lodash.snakecase "4.1.1" - node-fetch "2.7.0" - -"@vonage/server-sdk@3.25.1": - version "3.25.1" - resolved "https://registry.yarnpkg.com/@vonage/server-sdk/-/server-sdk-3.25.1.tgz#45d0cf5c91c89ca9f0c22eb140ed20a585159134" - integrity sha512-8aDGQhLhM+m6A9+3ME+QoJ/NQLccQFHTwrreXatXGx51snSFP4olkngS2fRdWlApU0oqPQUaH65dGb5xPRIsNg== - dependencies: - "@vonage/accounts" "1.18.1" - "@vonage/applications" "1.18.1" - "@vonage/auth" "1.13.1" - "@vonage/conversations" "1.12.1" - "@vonage/messages" "1.22.1" - "@vonage/number-insights" "1.18.1" - "@vonage/numbers" "1.20.1" - "@vonage/pricing" "1.18.1" - "@vonage/redact" "1.17.1" - "@vonage/server-client" "1.18.1" - "@vonage/sms" "1.19.1" - "@vonage/users" "1.12.1" - "@vonage/verify" "1.18.1" - "@vonage/verify2" "1.17.1" - "@vonage/video" "1.26.1" - "@vonage/voice" "1.19.1" - -"@vonage/sms@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@vonage/sms/-/sms-1.19.1.tgz#649b81f79782d9aae764cff8b8128be72184fd4d" - integrity sha512-Jrry3LP/k1I9LtUZdmOgs6pa6kdffuUbYh98xKDtw1W5YUu5rsceeV64LxwcAorO7ughqmQdq9+63BKnGZzLTA== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - -"@vonage/users@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vonage/users/-/users-1.12.1.tgz#be9a66f5ec1633b81a0b3d25b0b5c7cf6045eb08" - integrity sha512-V4aCG2n1LnynAM0iR/wZtsB28Ze2ag/bp9G/DbgOjCmsIm460/UEuMfk1zyFWvgNmydLBVjxqmB7vAoe/XLV4w== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/vcr-sdk@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@vonage/vcr-sdk/-/vcr-sdk-1.3.0.tgz#9b2381ac6211a6be6b417d46f9efa4c1689f213f" - integrity sha512-drkttjmq4EBI4fNx1Qh4bK3sk04982clk6p+Pjg/XmEgNmF9ivWHt0hWjHqXYQDsqO2UgR10a90HA510o9LcUg== - dependencies: - agentkeepalive "^4.2.1" - axios "^1.2.1" - express "^4.17.2" - form-data "^4.0.0" - glob "^10.3.3" - jsonwebtoken "^9.0.0" - uuid "^8.3.2" - -"@vonage/verify2@1.17.1": - version "1.17.1" - resolved "https://registry.yarnpkg.com/@vonage/verify2/-/verify2-1.17.1.tgz#acfb660af79302f3ca2b8bf931437844eb05ed49" - integrity sha512-ctIvl/z4OsF6LaAyFBJodDJ6yYDlp+oHhGvZkKlp3Vlgowfyc/CSp2yrznY3Z7Kfpmp8rv7Qztur+SyXE7VziQ== - dependencies: - "@vonage/server-client" "1.18.1" - -"@vonage/verify@1.18.1": - version "1.18.1" - resolved "https://registry.yarnpkg.com/@vonage/verify/-/verify-1.18.1.tgz#cc896af2dafceed3e68432729f67c027e2ffbe08" - integrity sha512-7ydzRgeQSlZHr67FucuimD+rtGjvd3H5IFyuZKZwS3j6i3LcnH6BeXZjET5si6RLtopl5k8NsgCEYPOiM9YgxA== - dependencies: - "@types/lodash.omit" "4.5.9" - "@vonage/auth" "1.13.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - lodash.omit "4.5.0" - -"@vonage/vetch@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@vonage/vetch/-/vetch-1.9.1.tgz#cf1c4b338becbf2b620bf54497360f47c337c754" - integrity sha512-e8yzt0R4AU2d8iS+8J+bgQtz/y0AkGena9I58Dpi4e/0nN9UMMwfMxXx4s7IBwtHakWB38byouZpoV17ZSNXSQ== - dependencies: - "@types/node-fetch" "2.6.11" - node-fetch "2.7.0" - -"@vonage/video-client-network-test@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@vonage/video-client-network-test/-/video-client-network-test-5.0.0.tgz#c5d0a19f227c056bfed0fc747ea5d646c868ab5a" - integrity sha512-c+/thVawDDqJoih2kbc5y5oY8WgPbtrlkxvzgWSzoUroePPgB81htZHaN7ytk59YfrJ1WZC7BcAxCjdFm+2zWA== - dependencies: - axios "^1.8.3" - opentok-solutions-logging "^1.1.1" - promise "^8.0.1" - -"@vonage/video@1.26.1": - version "1.26.1" - resolved "https://registry.yarnpkg.com/@vonage/video/-/video-1.26.1.tgz#c20e8810bd9f2452e4e792cd478dd396d049647e" - integrity sha512-N+zgfjfZD3MWaKrTkYrpFzp7ouBUqTKoJauLkojat+z3kuKZj62PEBZ0fFMUKZVp78HnJ5nzW8foFvxA3b4mJg== - dependencies: - "@vonage/auth" "1.13.1" - "@vonage/jwt" "1.12.1" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - -"@vonage/vivid@^5.15.1": - version "5.15.1" - resolved "https://registry.yarnpkg.com/@vonage/vivid/-/vivid-5.15.1.tgz#6aa3294ac14ba30e1fc131b836b2024ee4b8843c" - integrity sha512-i4QxDhWIqNsw7DB0A9A6ZdNv8D3QZ3l2MF210pqjWC/lN/PFYBKcBS70dungGPGoYd0USXmsgCRI4QgVDS7S3Q== - dependencies: - "@floating-ui/dom" "^1.7.6" - "@microsoft/fast-element" "2.8.3" - "@microsoft/fast-web-utilities" "^6.0.0" - date-fns "^3.0.0" - dompurify "^3.3.1" - prosemirror-commands "^1.7.1" - prosemirror-dropcursor "^1.8.2" - prosemirror-gapcursor "^1.3.2" - prosemirror-history "^1.4.1" - prosemirror-inputrules "^1.4.0" - prosemirror-keymap "^1.2.3" - prosemirror-model "^1.25.4" - prosemirror-schema-basic "^1.2.3" - prosemirror-state "^1.4.4" - prosemirror-transform "^1.11.0" - prosemirror-view "^1.41.6" - ramda "^0.32.0" - uuid "^11.1.0" - vanilla-colorful "^0.7.2" - video.js "^8.23.7" - -"@vonage/voice@1.19.1": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@vonage/voice/-/voice-1.19.1.tgz#ea54ddb9fa461dc5104cf0aa4de4c23c461a9a5e" - integrity sha512-tdFMsJYxNrJbh0e+U5gwVPI8puy3zXmxqdR4F6wXDWFoyYSe9gvRsSmvM9ALYIlCn3N/bTgHLyMXKVBra7kX9A== - dependencies: - "@types/debug" "4.1.12" - "@vonage/server-client" "1.18.1" - "@vonage/vetch" "1.9.1" - debug "4.4.1" - ts-xor "1.3.0" - -"@vue/compiler-core@3.5.28": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.28.tgz#8298ab91d34b2c0d7d398384cd840471919e7e34" - integrity sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ== - dependencies: - "@babel/parser" "^7.29.0" - "@vue/shared" "3.5.28" - entities "^7.0.1" - estree-walker "^2.0.2" - source-map-js "^1.2.1" - -"@vue/compiler-dom@^3.5.0": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz#4e27b885898f4799d95305dfc56d14c2dcf8e5ba" - integrity sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA== - dependencies: - "@vue/compiler-core" "3.5.28" - "@vue/shared" "3.5.28" - -"@vue/compiler-vue2@^2.7.16": - version "2.7.16" - resolved "https://registry.yarnpkg.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249" - integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A== - dependencies: - de-indent "^1.0.2" - he "^1.2.0" - -"@vue/language-core@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.2.0.tgz#e48c54584f889f78b120ce10a050dfb316c7fcdf" - integrity sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw== - dependencies: - "@volar/language-core" "~2.4.11" - "@vue/compiler-dom" "^3.5.0" - "@vue/compiler-vue2" "^2.7.16" - "@vue/shared" "^3.5.0" - alien-signals "^0.4.9" - minimatch "^9.0.3" - muggle-string "^0.4.1" - path-browserify "^1.0.1" - -"@vue/shared@3.5.28", "@vue/shared@^3.5.0": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.28.tgz#ed9b6785e9452621ad3ab2f2775e9cba494a9ef4" - integrity sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ== - -"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" - integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== - -"@webpack-cli/info@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" - integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== - -"@webpack-cli/serve@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" - integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== - -"@xmldom/xmldom@^0.8.3": - version "0.8.11" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz#b79de2d67389734c57c52595f7a7305e30c2d608" - integrity sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -"@yarnpkg/parsers@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.2.tgz#48a1517a0f49124827f4c37c284a689c607b2f32" - integrity sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA== - dependencies: - js-yaml "^3.10.0" - tslib "^2.4.0" - -"@zkochan/js-yaml@0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz#4b0cb785220d7c28ce0ec4d0804deb5d821eae89" - integrity sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ== - dependencies: - argparse "^2.0.1" - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@^1.3.8, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.15.0, acorn@^8.5.0, acorn@^8.9.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -adm-zip@^0.5.10: - version "0.5.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909" - integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ== - -aes-decrypter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-4.0.2.tgz#90648181c68878f54093920a3b44776ec2dc4914" - integrity sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.1.1" - global "^4.4.0" - pkcs7 "^1.0.4" - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.2.1: - version "4.6.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.6.0.tgz#35f73e94b3f40bf65f105219c623ad19c136ea6a" - integrity sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ== - dependencies: - humanize-ms "^1.2.1" - -ajv-draft-04@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" - integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-formats@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" - integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc" - integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@~8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@~8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - -alien-signals@^0.4.9: - version "0.4.14" - resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-0.4.14.tgz#9ff8f72a272300a51692f54bd9bbbada78fbf539" - integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q== - -ansi-colors@^4.1.1, ansi-colors@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0, ansi-styles@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7, argparse@~1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -aria-query@^5.0.0, aria-query@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-find-index@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" - integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - get-intrinsic "^1.3.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array-timsort@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" - integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.2, array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -asap@^2.0.0, asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -assertion-error@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" - integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -ast-types@^0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" - integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== - dependencies: - tslib "^2.0.1" - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -async@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autolinker@^4.0.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-4.1.5.tgz#e0d45f04c41d62598bf80b809c422f732d3aafde" - integrity sha512-vEfYZPmvVOIuE567XBVCsx8SBgOYtjB2+S1iAaJ+HgH+DNjAcrHem2hmAeC9yaNGWayicv4yR+9UaJlkF3pvtw== - dependencies: - tslib "^2.8.1" - -autoprefixer@^10.4.9: - version "10.4.24" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.24.tgz#2c29595f3abd820a79976a609d0bf40eecf212fb" - integrity sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw== - dependencies: - browserslist "^4.28.1" - caniuse-lite "^1.0.30001766" - fraction.js "^5.3.4" - picocolors "^1.1.1" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@^4.10.0: - version "4.11.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.11.1.tgz#052ff9b2cbf543f5595028b583e4763b40c78ea7" - integrity sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A== - -axios@^1.12.0, axios@^1.13.5, axios@^1.2.1, axios@^1.6.3, axios@^1.8.3: - version "1.18.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.18.1.tgz#d63f9863bcd8938815c86f9e2abd380189d96dfe" - integrity sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g== - dependencies: - follow-redirects "^1.16.0" - form-data "^4.0.5" - https-proxy-agent "^5.0.1" - proxy-from-env "^2.1.0" - -axobject-query@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" - integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== - -babel-jest@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.2.0.tgz#fd44a1ec9552be35ead881f7381faa7d8f3b95ac" - integrity sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw== - dependencies: - "@jest/transform" "30.2.0" - "@types/babel__core" "^7.20.5" - babel-plugin-istanbul "^7.0.1" - babel-preset-jest "30.2.0" - chalk "^4.1.2" - graceful-fs "^4.2.11" - slash "^3.0.0" - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-const-enum@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz#3d25524106f68f081e187829ba736b251c289861" - integrity sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.3.3" - "@babel/traverse" "^7.16.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-istanbul@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92" - integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-instrument "^6.0.2" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz#94c250d36b43f95900f3a219241e0f4648191ce2" - integrity sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA== - dependencies: - "@types/babel__core" "^7.20.5" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz#808fa349686eea4741807cfaaa2aa3aa57ce120a" - integrity sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-define-polyfill-provider" "^0.6.6" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" - integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - core-js-compat "^3.43.0" - -babel-plugin-polyfill-corejs3@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz#65b06cda48d6e447e1e926681f5a247c6ae2b9cf" - integrity sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.6" - core-js-compat "^3.48.0" - -babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz#69f5dd263cab933c42fe5ea05e83443b374bd4bf" - integrity sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.6" - -babel-plugin-transform-typescript-metadata@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz#7a327842d8c36ffe07ee1b5276434e56c297c9b7" - integrity sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -babel-preset-current-node-syntax@^1.0.0, babel-preset-current-node-syntax@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6" - integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz#04717843e561347781d6d7f69c81e6bcc3ed11ce" - integrity sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ== - dependencies: - babel-plugin-jest-hoist "30.2.0" - babel-preset-current-node-syntax "^1.2.0" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -baseline-browser-mapping@^2.9.0: - version "2.9.19" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz#3e508c43c46d961eb4d7d2e5b8d1dd0f9ee4f488" - integrity sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg== - -basic-auth@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -body-parser@^1.20.3, body-parser@~1.20.3: - version "1.20.4" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" - integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== - dependencies: - bytes "~3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "~1.2.0" - http-errors "~2.0.1" - iconv-lite "~0.4.24" - on-finished "~2.4.1" - qs "~6.14.0" - raw-body "~2.5.3" - type-is "~1.6.18" - unpipe "~1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@2.0.2, brace-expansion@^1.1.7, brace-expansion@^2.0.1, brace-expansion@^5.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0, browserslist@^4.28.1: - version "4.28.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" - integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== - dependencies: - baseline-browser-mapping "^2.9.0" - caniuse-lite "^1.0.30001759" - electron-to-chromium "^1.5.263" - node-releases "^2.0.27" - update-browserslist-db "^1.2.0" - -bs-logger@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -btoa@1.2.1, btoa@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== - -buffer-equal-constant-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - -bytes@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0, callsites@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0, camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001766: - version "1.0.30001770" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz#4dc47d3b263a50fbb243448034921e0a88591a84" - integrity sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw== - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chai@^4.3.10: - version "4.5.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" - integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.1.0" - -chai@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" - integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== - dependencies: - assertion-error "^2.0.1" - check-error "^2.1.1" - deep-eql "^5.0.1" - loupe "^3.1.0" - pathval "^2.0.0" - -chalk@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -check-error@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" - integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== - -chokidar@^3.5.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -ci-info@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" - integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== - -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== - -cjs-module-lexer@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz#b3ca5101843389259ade7d88c77bd06ce55849ca" - integrity sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ== - -classnames@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -clear-module@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" - integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== - dependencies: - parent-module "^2.0.0" - resolve-from "^5.0.0" - -cli-cursor@3.1.0, cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -clsx@^2.1.0, clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0, collect-v8-coverage@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz#cc1f01eb8d02298cbc9a437c74c70ab4e5210b80" - integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.14: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -columnify@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" - integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== - dependencies: - strip-ansi "^6.0.1" - wcwidth "^1.0.0" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" - integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== - -commander@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -comment-json@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.5.1.tgz#2da1b85d5471b6494a344ed166fed3e831d268ed" - integrity sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg== - dependencies: - array-timsort "^1.0.3" - core-util-is "^1.0.3" - esprima "^4.0.1" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compare-versions@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" - integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== - -component-emitter@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - -concat-with-sourcemaps@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" - integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg== - dependencies: - source-map "^0.6.1" - -concurrently@^9.1.2: - version "9.2.1" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.1.tgz#248ea21b95754947be2dad9c3e4b60f18ca4e44f" - integrity sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng== - dependencies: - chalk "4.1.2" - rxjs "7.8.2" - shell-quote "1.8.3" - supports-color "8.1.1" - tree-kill "1.2.2" - yargs "17.7.2" - -confbox@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" - integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== - -confbox@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5" - integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ== - -confusing-browser-globals@^1.0.9: - version "1.0.11" - resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" - integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== - -content-disposition@~0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.5.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" - integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== - -cookie-signature@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" - integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== - -cookie@~0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -cookiejar@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -cookies@~0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" - integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== - dependencies: - depd "~2.0.0" - keygrip "~1.1.0" - -copy-webpack-plugin@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz#fba18c22bcab3633524e1b652580ff4489eddc0d" - integrity sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw== - dependencies: - glob-parent "^6.0.1" - normalize-path "^3.0.0" - schema-utils "^4.2.0" - serialize-javascript "^6.0.2" - tinyglobby "^0.2.12" - -core-js-compat@^3.43.0, core-js-compat@^3.48.0: - version "3.48.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" - integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== - dependencies: - browserslist "^4.28.1" - -core-util-is@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.5: - version "2.8.6" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.6.tgz#ff5dd69bd95e547503820d29aba4f8faf8dfec96" - integrity sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== - dependencies: - object-assign "^4" - vary "^1" - -corser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" - integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== - -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.1.3: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -cron-parser@^4.2.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" - integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== - dependencies: - luxon "^3.2.1" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.5, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cspell-config-lib@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-9.6.4.tgz#ffa961f2fa7fe0457581e594bc38f6cbbc08e9fd" - integrity sha512-MecJNR9bIlcPBhyZFsXP6Q2n8qQ2IR9N9HiIz0yh0gBNVydp3LR5JITP5Ji8m7hexmZzVeoXms/dVN74XbS95g== - dependencies: - "@cspell/cspell-types" "9.6.4" - comment-json "^4.5.1" - smol-toml "^1.6.0" - yaml "^2.8.2" - -cspell-dictionary@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-9.6.4.tgz#a01e6d0defa1edcdae8d85bd2a0e724967aa232f" - integrity sha512-Ik9ZQVqV/fJfMt5X6IkC7yHGVH46/qjcqCNWwrMSwvROLM3SemNxxZoLvh0wi0GXz9WF1lHcxLJVdeKUk6QB8g== - dependencies: - "@cspell/cspell-performance-monitor" "9.6.4" - "@cspell/cspell-pipe" "9.6.4" - "@cspell/cspell-types" "9.6.4" - cspell-trie-lib "9.6.4" - fast-equals "^6.0.0" - -cspell-glob@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-9.6.4.tgz#df6d58478d1f1b0f93cf01ab0e2fe7fd5a750f80" - integrity sha512-253VrjbR8QU15h8GtpDQLX5Ti9uNSuNod2T7f8YEElQOb9I/kUXoCj3Cq4P390IC99klqSHIDxHsxd77ex19lA== - dependencies: - "@cspell/url" "9.6.4" - picomatch "^4.0.3" - -cspell-grammar@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-9.6.4.tgz#e57a9584fc19a4a79fcc68ddf0b09ece6bb90cf4" - integrity sha512-rvZyTB45/XSRWx7eAsrvTTAZvBTREr/2G2JWVMdqrptFyq1XReAKHhw/x1HJkNgWC9LKAK3bVQJpjLsNG37U9A== - dependencies: - "@cspell/cspell-pipe" "9.6.4" - "@cspell/cspell-types" "9.6.4" - -cspell-io@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-9.6.4.tgz#8c5e05539b72bf39490cc88dc20f5e85f4eb1ced" - integrity sha512-bmvJ4yn5QK2FZWTkZA4sx2qJqIi8BrUUUV7W209drSwkYjhJtXqP0RyF6Qx4Xuu2D1s0UilEtO5Jd+E9UJkQ6w== - dependencies: - "@cspell/cspell-service-bus" "9.6.4" - "@cspell/url" "9.6.4" - -cspell-lib@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-9.6.4.tgz#2a6d9930bb20d9f544ddd00017e1d31e6353d4bf" - integrity sha512-fUodKcIHTwvokuowB25XyFzBxlk73yj1QRw2por3BxDz9fAim1zAIohAPAnGuzj3LowYnTMjHLYE7RFDUSxy5A== - dependencies: - "@cspell/cspell-bundled-dicts" "9.6.4" - "@cspell/cspell-performance-monitor" "9.6.4" - "@cspell/cspell-pipe" "9.6.4" - "@cspell/cspell-resolver" "9.6.4" - "@cspell/cspell-types" "9.6.4" - "@cspell/dynamic-import" "9.6.4" - "@cspell/filetypes" "9.6.4" - "@cspell/rpc" "9.6.4" - "@cspell/strong-weak-map" "9.6.4" - "@cspell/url" "9.6.4" - clear-module "^4.1.2" - cspell-config-lib "9.6.4" - cspell-dictionary "9.6.4" - cspell-glob "9.6.4" - cspell-grammar "9.6.4" - cspell-io "9.6.4" - cspell-trie-lib "9.6.4" - env-paths "^4.0.0" - gensequence "^8.0.8" - import-fresh "^3.3.1" - resolve-from "^5.0.0" - vscode-languageserver-textdocument "^1.0.12" - vscode-uri "^3.1.0" - xdg-basedir "^5.1.0" - -cspell-trie-lib@9.6.4: - version "9.6.4" - resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-9.6.4.tgz#9ef5726e5fe6b51e7896bd08e2c2600fae9c4d6e" - integrity sha512-JKwyRtyybbaTrixwI1OgU5Hvva2Z5zHVWl92WBa9U7KijAyiD/Ehp3T3DCYuBwGks7egw7MgWPySkXXnpme6mw== - -css-select@^5.1.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" - integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -css-tree@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" - integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== - dependencies: - mdn-data "2.0.28" - source-map-js "^1.0.1" - -css-what@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" - integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== - -css.escape@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csso@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" - integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== - dependencies: - css-tree "~2.2.0" - -cssstyle@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" - integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== - dependencies: - rrweb-cssom "^0.6.0" - -csstype@^3.0.2, csstype@^3.1.3, csstype@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" - integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-urls@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" - integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.0" - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -date-fns@^3.0.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" - integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== - -date-format@^4.0.14: - version "4.0.14" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" - integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== - -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" - integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@4.4.3, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -debug@4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - -decimal.js@^10.4.3: - version "10.6.0" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a" - integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== - -dedent@^1.0.0, dedent@^1.6.0: - version "1.7.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.1.tgz#364661eea3d73f3faba7089214420ec2f8f13e15" - integrity sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg== - -deep-eql@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" - integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== - dependencies: - type-detect "^4.0.0" - -deep-eql@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" - integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== - -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2, deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-browser-id@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" - integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== - -default-browser@^5.2.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" - integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -depd@2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -dequal@^2.0.0, dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -destroy@1.2.0, destroy@^1.2.0, destroy@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" - integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== - -detect-newline@^3.0.0, detect-newline@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-port@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" - integrity sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q== - dependencies: - address "^1.0.1" - debug "4" - -devlop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" - integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== - dependencies: - dequal "^2.0.0" - -dezalgo@^1.0.0, dezalgo@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -diff@~8.0.2: - version "8.0.3" - resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.3.tgz#c7da3d9e0e8c283bb548681f8d7174653720c2d5" - integrity sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-accessibility-api@^0.5.9: - version "0.5.16" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" - integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== - -dom-accessibility-api@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" - integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@^3.3.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.3.3.tgz#680cae8af3e61320ddf3666a3bc843f7b291b2b6" - integrity sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA== - optionalDependencies: - "@types/trusted-types" "^2.0.7" - -domutils@^3.0.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" - integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv-expand@~11.0.6: - version "11.0.7" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz#af695aea007d6fdc84c86cd8d0ad7beb40a0bd08" - integrity sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA== - dependencies: - dotenv "^16.4.5" - -dotenv@^16.0.3, dotenv@^16.4.5: - version "16.6.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" - integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== - -dotenv@~16.4.5: - version "16.4.7" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" - integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -easy-cancelable-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/easy-cancelable-promise/-/easy-cancelable-promise-2.0.1.tgz#38aa20d82613387bb04eafe2850f219c24488793" - integrity sha512-z9nWwEMh3oGkCO2KNlTRxJFyQRJDLvu7sdDr0dka8lR69a43z3l1zJMS8nGEgWThIethC9EScF0XIzYkDDWDEw== - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -ejs@^3.1.7: - version "3.1.10" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" - integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.5.263: - version "1.5.286" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz#142be1ab5e1cd5044954db0e5898f60a4960384e" - integrity sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex-xs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" - integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -empathic@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/empathic/-/empathic-2.0.0.tgz#71d3c2b94fad49532ef98a6c34be0386659f6131" - integrity sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA== - -encodeurl@^2.0.0, encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.4.1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.18.1, enhanced-resolve@^5.18.3, enhanced-resolve@^5.19.0: - version "5.19.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz#6687446a15e969eaa63c2fa2694510e17ae6d97c" - integrity sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.3.0" - -enquirer@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" - integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== - -entities@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b" - integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== - -env-paths@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-4.0.0.tgz#d0bb1f84a81d2542581bf7b7e8085d0683b39097" - integrity sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw== - dependencies: - is-safe-filename "^0.1.0" - -envinfo@^7.14.0: - version "7.21.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.21.0.tgz#04a251be79f92548541f37d13c8b6f22940c3bae" - integrity sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow== - -error-ex@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" - integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.1: - version "1.24.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" - integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.3.0" - get-proto "^1.0.1" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-negative-zero "^2.0.3" - is-regex "^1.2.1" - is-set "^2.0.3" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.1" - math-intrinsics "^1.1.0" - object-inspect "^1.13.4" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.4" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - stop-iteration-iterator "^1.1.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.19" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.1.0, es-iterator-helpers@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz#d979a9f686e2b0b72f88dbead7229924544720bc" - integrity sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.1" - es-errors "^1.3.0" - es-set-tostringtag "^2.1.0" - function-bind "^1.1.2" - get-intrinsic "^1.3.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - iterator.prototype "^1.1.5" - safe-array-concat "^1.1.3" - -es-module-lexer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz#f657cd7a9448dcdda9c070a3cb75e5dc1e85f5b1" - integrity sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" - integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", esbuild@~0.27.0: - version "0.27.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8" - integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.27.3" - "@esbuild/android-arm" "0.27.3" - "@esbuild/android-arm64" "0.27.3" - "@esbuild/android-x64" "0.27.3" - "@esbuild/darwin-arm64" "0.27.3" - "@esbuild/darwin-x64" "0.27.3" - "@esbuild/freebsd-arm64" "0.27.3" - "@esbuild/freebsd-x64" "0.27.3" - "@esbuild/linux-arm" "0.27.3" - "@esbuild/linux-arm64" "0.27.3" - "@esbuild/linux-ia32" "0.27.3" - "@esbuild/linux-loong64" "0.27.3" - "@esbuild/linux-mips64el" "0.27.3" - "@esbuild/linux-ppc64" "0.27.3" - "@esbuild/linux-riscv64" "0.27.3" - "@esbuild/linux-s390x" "0.27.3" - "@esbuild/linux-x64" "0.27.3" - "@esbuild/netbsd-arm64" "0.27.3" - "@esbuild/netbsd-x64" "0.27.3" - "@esbuild/openbsd-arm64" "0.27.3" - "@esbuild/openbsd-x64" "0.27.3" - "@esbuild/openharmony-arm64" "0.27.3" - "@esbuild/sunos-x64" "0.27.3" - "@esbuild/win32-arm64" "0.27.3" - "@esbuild/win32-ia32" "0.27.3" - "@esbuild/win32-x64" "0.27.3" - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^10.1.8: - version "10.1.8" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" - integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== - -eslint-import-context@^0.1.8: - version "0.1.9" - resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" - integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== - dependencies: - get-tsconfig "^4.10.1" - stable-hash-x "^0.2.0" - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.4.tgz#3e83a9c25f4a053fe20e1b07b47e04e8519a8720" - integrity sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw== - dependencies: - debug "^4.4.1" - eslint-import-context "^0.1.8" - get-tsconfig "^4.10.1" - is-bun-module "^2.0.0" - stable-hash-x "^0.2.0" - tinyglobby "^0.2.14" - unrs-resolver "^1.7.11" - -eslint-module-utils@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" - integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== - dependencies: - debug "^3.2.7" - -eslint-plugin-filename-rules@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-filename-rules/-/eslint-plugin-filename-rules-1.3.1.tgz#8fb769f2c19dc832b43c13d76c1442bca4a2f4a4" - integrity sha512-kBMxGFvK3QrRBHMurhFSNa+PFdszezVtBV6egg39TDzlj6D4jL3Xx6oyNjm5xE4C+TdQUBzWwymHJHBPyxOreA== - -eslint-plugin-import@^2.32.0: - version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@6.10.1: - version "6.10.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.1.tgz#87003835bad8875e023aa5db26f41a0c9e6a8fa9" - integrity sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g== - dependencies: - aria-query "^5.3.2" - array-includes "^3.1.8" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "^4.10.0" - axobject-query "^4.1.0" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.1.0" - hasown "^2.0.2" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.1" - -eslint-plugin-prettier@^5.5.4: - version "5.5.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz#9eae11593faa108859c26f9a9c367d619a0769c0" - integrity sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw== - dependencies: - prettier-linter-helpers "^1.0.1" - synckit "^0.11.12" - -eslint-plugin-react-hooks@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" - integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== - dependencies: - "@babel/core" "^7.24.4" - "@babel/parser" "^7.24.4" - hermes-parser "^0.25.1" - zod "^3.25.0 || ^4.0.0" - zod-validation-error "^3.5.0 || ^4.0.0" - -eslint-plugin-react-refresh@^0.4.6: - version "0.4.26" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz#2bcdd109ea9fb4e0b56bb1b5146cf8841b21b626" - integrity sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ== - -eslint-plugin-react@^7.37.5: - version "7.37.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" - integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.3" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.2.1" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.9" - object.fromentries "^2.0.8" - object.values "^1.2.1" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.12" - string.prototype.repeat "^1.0.0" - -eslint-plugin-tailwindcss@4.0.0-beta.0: - version "4.0.0-beta.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-tailwindcss/-/eslint-plugin-tailwindcss-4.0.0-beta.0.tgz#b46159c1db47b863a2e68d0cf95675b395e708b9" - integrity sha512-WWCajZgQu38Sd67ZCl2W6i3MRzqB0d+H8s4qV9iB6lBJbsDOIpIlj6R1Fj2FXkoWErbo05pZnZYbCGIU9o/DsA== - dependencies: - fast-glob "^3.2.5" - postcss "^8.4.4" - synckit "^0.11.4" - tailwind-api-utils "^1.0.3" - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" - integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== - -eslint@^8: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0, esquery@^1.4.2, esquery@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" - integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.1, estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0, events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - -exenv-es6@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exenv-es6/-/exenv-es6-1.1.1.tgz#80b7a8c5af24d53331f755bac07e84abb1f6de67" - integrity sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ== - -exit-x@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64" - integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -expect@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-30.2.0.tgz#d4013bed267013c14bc1199cec8aa57cee9b5869" - integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw== - dependencies: - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-util "30.2.0" - -expect@^29.0.0, expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -express@^4.17.2, express@^4.21.2: - version "4.22.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" - integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "~1.20.3" - content-disposition "~0.5.4" - content-type "~1.0.4" - cookie "~0.7.1" - cookie-signature "~1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.3.1" - fresh "~0.5.2" - http-errors "~2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "~2.4.1" - parseurl "~1.3.3" - path-to-regexp "~0.1.12" - proxy-addr "~2.0.7" - qs "~6.14.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "~0.19.0" - serve-static "~1.16.2" - setprototypeof "1.2.0" - statuses "~2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -exsolve@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.8.tgz#7f5e34da61cd1116deda5136e62292c096f50613" - integrity sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" - integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== - -fast-equals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-6.0.0.tgz#719dedd2e126668b857b5e9d24e112e4acb2649a" - integrity sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA== - -fast-glob@^3.2.5, fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-safe-stringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-uri@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" - integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" - integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0, fb-watchman@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fflate@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" - integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== - -figures@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -filelist@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" - integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "~2.4.1" - parseurl "~1.3.3" - statuses "~2.0.2" - unpipe "~1.0.0" - -find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-file-up@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-2.0.1.tgz#4932dd81551af643893f8cda7453f221e3e28261" - integrity sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ== - dependencies: - resolve-dir "^1.0.1" - -find-pkg@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-2.0.0.tgz#3a7c35c704e11a6e5722c56e45bd7e587507735e" - integrity sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ== - dependencies: - find-file-up "^2.0.1" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.7, flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -follow-redirects@^1.0.0: - version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== - -follow-redirects@^1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" - integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== - -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -form-data@^4.0.0, form-data@^4.0.4, form-data@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" - integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -formidable@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.5.4.tgz#ac9a593b951e829b3298f21aa9a2243932f32ed9" - integrity sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug== - dependencies: - "@paralleldrive/cuid2" "^2.2.2" - dezalgo "^1.0.4" - once "^1.4.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a" - integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== - -fresh@~0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -front-matter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" - integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== - dependencies: - js-yaml "^3.13.1" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@~11.3.0: - version "11.3.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.3.tgz#a27da23b72524e81ac6c3815cc0179b8c74c59ee" - integrity sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@^2.3.2, fsevents@^2.3.3, fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - functions-have-names "^1.2.3" - hasown "^2.0.2" - is-callable "^1.2.7" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -generator-function@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" - integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== - -generic-names@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-4.0.0.tgz#0bd8a2fd23fe8ea16cbd0a279acd69c06933d9a3" - integrity sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A== - dependencies: - loader-utils "^3.2.0" - -gensequence@^8.0.8: - version "8.0.8" - resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-8.0.8.tgz#381a46bef4b1c26f6aff2b291ce9cd417d363fb1" - integrity sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -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.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -get-them-args@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/get-them-args/-/get-them-args-1.3.2.tgz#74a20ba8a4abece5ae199ad03f2bcc68fdfc9ba5" - integrity sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw== - -get-tsconfig@^4.10.1, get-tsconfig@^4.7.5: - version "4.13.6" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.6.tgz#2fbfda558a98a691a798f123afd95915badce876" - integrity sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1, glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^10.3.10, glob@^10.3.3: - version "10.5.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" - integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^13.0.1: - version "13.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.3.tgz#e5c39b3e0eb8a2e2bc35e3b28e78fd0839ff9e68" - integrity sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA== - dependencies: - minimatch "^10.2.0" - minipass "^7.1.2" - path-scurry "^2.0.0" - -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -global-directory@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" - integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== - dependencies: - ini "4.1.1" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global@4.4.0, global@^4.3.1, global@^4.4.0, global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globals@^15.9.0: - version "15.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" - integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -handlebars@^4.7.8: - version "4.7.8" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" - integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.2" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -harmony-reflect@^1.4.6: - version "1.6.2" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" - integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" - integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== - dependencies: - function-bind "^1.1.2" - -hast-util-to-html@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" - integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== - dependencies: - "@types/hast" "^3.0.0" - "@types/unist" "^3.0.0" - ccount "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^3.0.0" - html-void-elements "^3.0.0" - mdast-util-to-hast "^13.0.0" - property-information "^7.0.0" - space-separated-tokens "^2.0.0" - stringify-entities "^4.0.0" - zwitch "^2.0.4" - -hast-util-whitespace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" - integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== - dependencies: - "@types/hast" "^3.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hermes-estree@0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" - integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== - -hermes-parser@^0.25.1: - version "0.25.1" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" - integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== - dependencies: - hermes-estree "0.25.1" - -hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - -html-void-elements@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" - integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== - -http-assert@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f" - integrity sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w== - dependencies: - deep-equal "~1.0.1" - http-errors "~1.8.0" - -http-errors@^2.0.0, http-errors@~2.0.0, http-errors@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" - integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== - dependencies: - depd "~2.0.0" - inherits "~2.0.4" - setprototypeof "~1.2.0" - statuses "~2.0.2" - toidentifier "~1.0.1" - -http-errors@~1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -http-proxy-middleware@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz#9dcde663edc44079bc5a9c63e03fe5e5d6037fab" - integrity sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg== - dependencies: - "@types/http-proxy" "^1.17.15" - debug "^4.3.6" - http-proxy "^1.18.1" - is-glob "^4.0.3" - is-plain-object "^5.0.0" - micromatch "^4.0.8" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-server@^14.1.0: - version "14.1.1" - resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" - integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== - dependencies: - basic-auth "^2.0.1" - chalk "^4.1.2" - corser "^2.0.1" - he "^1.2.0" - html-encoding-sniffer "^3.0.0" - http-proxy "^1.18.1" - mime "^1.6.0" - minimist "^1.2.6" - opener "^1.5.1" - portfinder "^1.0.28" - secure-compare "3.0.1" - union "~0.5.0" - url-join "^4.0.1" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -husky@^9.0.11: - version "9.1.7" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" - integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== - -i18next-browser-languagedetector@^8.2.0: - version "8.2.1" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz#f17a918d376a97aa12a5b63fd8ea559a6231935b" - integrity sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw== - dependencies: - "@babel/runtime" "^7.23.2" - -i18next@^25.3.2: - version "25.8.8" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-25.8.8.tgz#b5fdf59a90ffda5f2cfe41725b6eb04e86a2fac8" - integrity sha512-gNTWXMBe9JBr6LAl2tqRfa6fn2EjrQJ3JBeH2jR+yIckwaJYdI7UfMQrnxzFjuFBb2FHy9Yn4gJB2BwLuC8/ZQ== - dependencies: - "@babel/runtime" "^7.28.4" - -iconv-lite@0.6.3, iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -iconv-lite@~0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -identity-obj-proxy@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" - integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== - dependencies: - harmony-reflect "^1.4.6" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.0.4, ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" - integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== - -import-fresh@^3.2.1, import-fresh@^3.3.0, import-fresh@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -import-meta-resolve@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#08cb85b5bd37ecc8eb1e0f670dc2767002d43734" - integrity sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -ip-regex@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" - integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-bun-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-2.0.0.tgz#4d7859a87c0fcac950c95e666730e745eae8bddd" - integrity sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ== - dependencies: - semver "^7.7.1" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.13.0, is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-fn@^2.0.0, is-generator-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" - integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== - dependencies: - call-bound "^1.0.4" - generator-function "^2.0.0" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-safe-filename@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-safe-filename/-/is-safe-filename-0.1.1.tgz#fb22eead097c614c47aa674de5d79a1648a53e66" - integrity sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g== - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-url@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" - integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-wsl@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" - integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== - dependencies: - is-inside-container "^1.0.0" - -is2@^2.0.6: - version "2.0.9" - resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.9.tgz#ff63b441f90de343fa8fac2125ee170da8e8240d" - integrity sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g== - dependencies: - deep-is "^0.1.3" - ip-regex "^4.1.0" - is-url "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-ws@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" - integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" - istanbul-lib-coverage "^3.2.0" - semver "^7.5.4" - -istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-lib-source-maps@^5.0.0, istanbul-lib-source-maps@^5.0.4: - version "5.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" - integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== - dependencies: - "@jridgewell/trace-mapping" "^0.3.23" - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - -istanbul-reports@^3.1.3, istanbul-reports@^3.1.6: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" - integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterator.prototype@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" - integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== - dependencies: - define-data-property "^1.1.4" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - get-proto "^1.0.0" - has-symbols "^1.1.0" - set-function-name "^2.0.2" - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jake@^10.8.5: - version "10.9.4" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.4.tgz#d626da108c63d5cfb00ab5c25fadc7e0084af8e6" - integrity sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA== - dependencies: - async "^3.2.6" - filelist "^1.0.4" - picocolors "^1.1.1" - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.2.0.tgz#98b8198b958748a2f322354311023d1d02e7603f" - integrity sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg== - dependencies: - "@jest/environment" "30.2.0" - "@jest/expect" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - co "^4.6.0" - dedent "^1.6.0" - is-generator-fn "^2.1.0" - jest-each "30.2.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-runtime "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - p-limit "^3.1.0" - pretty-format "30.2.0" - pure-rand "^7.0.0" - slash "^3.0.0" - stack-utils "^2.0.6" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-config@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.2.0.tgz#29df8c50e2ad801cc59c406b50176c18c362a90b" - integrity sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA== - dependencies: - "@babel/core" "^7.27.4" - "@jest/get-type" "30.1.0" - "@jest/pattern" "30.0.1" - "@jest/test-sequencer" "30.2.0" - "@jest/types" "30.2.0" - babel-jest "30.2.0" - chalk "^4.1.2" - ci-info "^4.2.0" - deepmerge "^4.3.1" - glob "^10.3.10" - graceful-fs "^4.2.11" - jest-circus "30.2.0" - jest-docblock "30.2.0" - jest-environment-node "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-runner "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - micromatch "^4.0.8" - parse-json "^5.2.0" - pretty-format "30.2.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@30.2.0, jest-diff@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.2.0.tgz#e3ec3a6ea5c5747f605c9e874f83d756cba36825" - integrity sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A== - dependencies: - "@jest/diff-sequences" "30.0.1" - "@jest/get-type" "30.1.0" - chalk "^4.1.2" - pretty-format "30.2.0" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.2.0.tgz#42cd98d69f887e531c7352309542b1ce4ee10256" - integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA== - dependencies: - detect-newline "^3.1.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.2.0.tgz#39e623ae71641c2ac3ee69b3ba3d258fce8e768d" - integrity sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ== - dependencies: - "@jest/get-type" "30.1.0" - "@jest/types" "30.2.0" - chalk "^4.1.2" - jest-util "30.2.0" - pretty-format "30.2.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.2.0.tgz#3def7980ebd2fd86e74efd4d2e681f55ab38da0f" - integrity sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA== - dependencies: - "@jest/environment" "30.2.0" - "@jest/fake-timers" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - jest-mock "30.2.0" - jest-util "30.2.0" - jest-validate "30.2.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -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" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.2.0.tgz#808e3889f288603ac70ff0ac047598345a66022e" - integrity sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - anymatch "^3.1.3" - fb-watchman "^2.0.2" - graceful-fs "^4.2.11" - jest-regex-util "30.0.1" - jest-util "30.2.0" - jest-worker "30.2.0" - micromatch "^4.0.8" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.3" - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz#292fdca7b7c9cf594e1e570ace140b01d8beb736" - integrity sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ== - dependencies: - "@jest/get-type" "30.1.0" - pretty-format "30.2.0" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz#69a0d4c271066559ec8b0d8174829adc3f23a783" - integrity sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg== - dependencies: - "@jest/get-type" "30.1.0" - chalk "^4.1.2" - jest-diff "30.2.0" - pretty-format "30.2.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.2.0.tgz#fc97bf90d11f118b31e6131e2b67fc4f39f92152" - integrity sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@jest/types" "30.2.0" - "@types/stack-utils" "^2.0.3" - chalk "^4.1.2" - graceful-fs "^4.2.11" - micromatch "^4.0.8" - pretty-format "30.2.0" - slash "^3.0.0" - stack-utils "^2.0.6" - -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" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.2.0.tgz#69f991614eeb4060189459d3584f710845bff45e" - integrity sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - jest-util "30.2.0" - -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.7.0" - -jest-pnp-resolver@^1.2.2, jest-pnp-resolver@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@30.0.1: - version "30.0.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b" - integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@30.2.0, jest-resolve@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.2.0.tgz#2e2009cbd61e8f1f003355d5ec87225412cebcd7" - integrity sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A== - dependencies: - chalk "^4.1.2" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-pnp-resolver "^1.2.3" - jest-util "30.2.0" - jest-validate "30.2.0" - slash "^3.0.0" - unrs-resolver "^1.7.11" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.2.0.tgz#c62b4c3130afa661789705e13a07bdbcec26a114" - integrity sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ== - dependencies: - "@jest/console" "30.2.0" - "@jest/environment" "30.2.0" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - emittery "^0.13.1" - exit-x "^0.2.2" - graceful-fs "^4.2.11" - jest-docblock "30.2.0" - jest-environment-node "30.2.0" - jest-haste-map "30.2.0" - jest-leak-detector "30.2.0" - jest-message-util "30.2.0" - jest-resolve "30.2.0" - jest-runtime "30.2.0" - jest-util "30.2.0" - jest-watcher "30.2.0" - jest-worker "30.2.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.2.0.tgz#395ea792cde048db1b0cd1a92dc9cb9f1921bf8a" - integrity sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg== - dependencies: - "@jest/environment" "30.2.0" - "@jest/fake-timers" "30.2.0" - "@jest/globals" "30.2.0" - "@jest/source-map" "30.0.1" - "@jest/test-result" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - cjs-module-lexer "^2.1.0" - collect-v8-coverage "^1.0.2" - glob "^10.3.10" - graceful-fs "^4.2.11" - jest-haste-map "30.2.0" - jest-message-util "30.2.0" - jest-mock "30.2.0" - jest-regex-util "30.0.1" - jest-resolve "30.2.0" - jest-snapshot "30.2.0" - jest-util "30.2.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.2.0.tgz#266fbbb4b95fc4665ce6f32f1f38eeb39f4e26d0" - integrity sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA== - dependencies: - "@babel/core" "^7.27.4" - "@babel/generator" "^7.27.5" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" - "@babel/types" "^7.27.3" - "@jest/expect-utils" "30.2.0" - "@jest/get-type" "30.1.0" - "@jest/snapshot-utils" "30.2.0" - "@jest/transform" "30.2.0" - "@jest/types" "30.2.0" - babel-preset-current-node-syntax "^1.2.0" - chalk "^4.1.2" - expect "30.2.0" - graceful-fs "^4.2.11" - jest-diff "30.2.0" - jest-matcher-utils "30.2.0" - jest-message-util "30.2.0" - jest-util "30.2.0" - pretty-format "30.2.0" - semver "^7.7.2" - synckit "^0.11.8" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@30.2.0, jest-util@^30.0.2: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705" - integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA== - dependencies: - "@jest/types" "30.2.0" - "@types/node" "*" - chalk "^4.1.2" - ci-info "^4.2.0" - graceful-fs "^4.2.11" - picomatch "^4.0.2" - -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" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.2.0.tgz#273eaaed4c0963b934b5b31e96289edda6e0a2ef" - integrity sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw== - dependencies: - "@jest/get-type" "30.1.0" - "@jest/types" "30.2.0" - camelcase "^6.3.0" - chalk "^4.1.2" - leven "^3.1.0" - pretty-format "30.2.0" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.2.0.tgz#f9c055de48e18c979e7756a3917e596e2d69b07b" - integrity sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg== - dependencies: - "@jest/test-result" "30.2.0" - "@jest/types" "30.2.0" - "@types/node" "*" - ansi-escapes "^4.3.2" - chalk "^4.1.2" - emittery "^0.13.1" - jest-util "30.2.0" - string-length "^4.0.2" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26" - integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== - dependencies: - "@types/node" "*" - "@ungap/structured-clone" "^1.3.0" - jest-util "30.2.0" - merge-stream "^2.0.0" - supports-color "^8.1.1" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -jiti@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" - integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== - -jiti@^2.4.2, jiti@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" - integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.1.tgz#2ec43964658435296f6761b34e10671c2d9527f4" - integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== - -js-yaml@^3.10.0, js-yaml@^3.13.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" - integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" - integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== - dependencies: - argparse "^2.0.1" - -jsdom@~22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" - integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== - dependencies: - abab "^2.0.6" - cssstyle "^3.0.0" - data-urls "^4.0.0" - decimal.js "^10.4.3" - domexception "^4.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.4" - parse5 "^7.1.2" - rrweb-cssom "^0.6.0" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^12.0.1" - ws "^8.13.0" - xml-name-validator "^4.0.0" - -jsesc@^3.0.2, jsesc@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-storage-formatter@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/json-storage-formatter/-/json-storage-formatter-3.0.2.tgz#575d92d85b532c8ec91dbf6556f45df3f1e72fea" - integrity sha512-H5+2fRLur/hmHa6coYIGJX/j+8o4G0AjGQ+1mirKzdiBYw0V51T0Nyur6/WTQqNo1OsdqZxSjKYgcnnr+Z4SIw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonc-eslint-parser@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.2.tgz#f135454fd35784ecc1b848908f0d3e98a5be9433" - integrity sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA== - dependencies: - acorn "^8.5.0" - eslint-visitor-keys "^3.0.0" - espree "^9.0.0" - semver "^7.3.5" - -jsonc-parser@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" - integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonwebtoken@9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" - integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -jsonwebtoken@9.0.3, jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: - version "9.0.3" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" - integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== - dependencies: - jws "^4.0.1" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -jwa@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" - integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jwa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" - integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1" - integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g== - dependencies: - jwa "^1.4.2" - safe-buffer "^5.0.1" - -jws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" - integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== - dependencies: - jwa "^2.0.1" - safe-buffer "^5.0.1" - -keygrip@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" - integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== - dependencies: - tsscmp "1.0.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kill-port@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/kill-port/-/kill-port-1.6.1.tgz#560fe79484583bdf3a5e908557dae614447618aa" - integrity sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw== - dependencies: - get-them-args "1.3.2" - shell-exec "1.0.2" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -koa-compose@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" - integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== - -koa@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/koa/-/koa-3.0.3.tgz#40a97b6da0c0d49a704af82db2b3e5a618ed9042" - integrity sha512-MeuwbCoN1daWS32/Ni5qkzmrOtQO2qrnfdxDHjrm6s4b59yG4nexAJ0pTEFyzjLp0pBVO80CZp0vW8Ze30Ebow== - dependencies: - accepts "^1.3.8" - content-disposition "~0.5.4" - content-type "^1.0.5" - cookies "~0.9.1" - delegates "^1.0.0" - destroy "^1.2.0" - encodeurl "^2.0.0" - escape-html "^1.0.3" - fresh "~0.5.2" - http-assert "^1.5.0" - http-errors "^2.0.0" - koa-compose "^4.1.0" - mime-types "^3.0.1" - on-finished "^2.4.1" - parseurl "^1.3.3" - statuses "^2.0.1" - type-is "^2.0.1" - vary "^1.1.2" - -kolorist@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" - integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== - -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -license-checker@^25.0.1: - version "25.0.1" - resolved "https://registry.yarnpkg.com/license-checker/-/license-checker-25.0.1.tgz#4d14504478a5240a857bb3c21cd0491a00d761fa" - integrity sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g== - dependencies: - chalk "^2.4.1" - debug "^3.1.0" - mkdirp "^0.5.1" - nopt "^4.0.1" - read-installed "~4.0.3" - semver "^5.5.0" - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - spdx-satisfies "^4.0.0" - treeify "^1.1.0" - -lightningcss-android-arm64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz#6966b7024d39c94994008b548b71ab360eb3a307" - integrity sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A== - -lightningcss-darwin-arm64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz#a5fa946d27c029e48c7ff929e6e724a7de46eb2c" - integrity sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA== - -lightningcss-darwin-x64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz#5ce87e9cd7c4f2dcc1b713f5e8ee185c88d9b7cd" - integrity sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ== - -lightningcss-freebsd-x64@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz#6ae1d5e773c97961df5cff57b851807ef33692a5" - integrity sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA== - -lightningcss-linux-arm-gnueabihf@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz#62c489610c0424151a6121fa99d77731536cdaeb" - integrity sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA== - -lightningcss-linux-arm64-gnu@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz#2a3661b56fe95a0cafae90be026fe0590d089298" - integrity sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A== - -lightningcss-linux-arm64-musl@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz#d7ddd6b26959245e026bc1ad9eb6aa983aa90e6b" - integrity sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA== - -lightningcss-linux-x64-gnu@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz#5a89814c8e63213a5965c3d166dff83c36152b1a" - integrity sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w== - -lightningcss-linux-x64-musl@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz#808c2e91ce0bf5d0af0e867c6152e5378c049728" - integrity sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA== - -lightningcss-win32-arm64-msvc@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz#ab4a8a8a2e6a82a4531e8bbb6bf0ff161ee6625a" - integrity sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ== - -lightningcss-win32-x64-msvc@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz#f01f382c8e0a27e1c018b0bee316d210eac43b6e" - integrity sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw== - -lightningcss@1.30.2: - version "1.30.2" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.30.2.tgz#4ade295f25d140f487d37256f4cd40dc607696d0" - integrity sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ== - dependencies: - detect-libc "^2.0.3" - optionalDependencies: - lightningcss-android-arm64 "1.30.2" - lightningcss-darwin-arm64 "1.30.2" - lightningcss-darwin-x64 "1.30.2" - lightningcss-freebsd-x64 "1.30.2" - lightningcss-linux-arm-gnueabihf "1.30.2" - lightningcss-linux-arm64-gnu "1.30.2" - lightningcss-linux-arm64-musl "1.30.2" - lightningcss-linux-x64-gnu "1.30.2" - lightningcss-linux-x64-musl "1.30.2" - lightningcss-win32-arm64-msvc "1.30.2" - lightningcss-win32-x64-msvc "1.30.2" - -lines-and-columns@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" - integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== - dependencies: - uc.micro "^2.0.0" - -loader-runner@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" - integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== - -loader-utils@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" - integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== - -local-pkg@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.1.tgz#69658638d2a95287534d4c2fff757980100dbb6d" - integrity sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ== - dependencies: - mlly "^1.7.3" - pkg-types "^1.2.1" - -local-pkg@^1.0.0, local-pkg@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.1.2.tgz#c03d208787126445303f8161619dc701afa4abb5" - integrity sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A== - dependencies: - mlly "^1.7.4" - pkg-types "^2.3.0" - quansync "^0.2.11" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.camelcase@4.3.0, lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.clonedeepwith@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz#6ee30573a03a1a60d670a62ef33c10cf1afdbdd4" - integrity sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isobject@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.kebabcase@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.omit@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash.snakecase@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" - integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== - -lodash@4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lodash@^4.17.11, lodash@^4.17.21, lodash@~4.17.23: - version "4.17.23" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" - integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== - -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" - integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - flatted "^3.2.7" - rfdc "^1.3.0" - streamroller "^3.1.5" - -long-timeout@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" - integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.6, loupe@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - -loupe@^3.1.0, loupe@^3.1.4: - version "3.2.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" - integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^11.0.0: - version "11.2.6" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" - integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -luxon@^3.2.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.7.2.tgz#d697e48f478553cca187a0f8436aff468e3ba0ba" - integrity sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== - -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== - -m3u8-parser@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-7.2.0.tgz#9e2eb50abb8349d248cd58842367da4acabdf297" - integrity sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.1.1" - global "^4.4.0" - -magic-string@^0.30.0, magic-string@^0.30.17, magic-string@^0.30.21, magic-string@^0.30.3, magic-string@^0.30.5: - version "0.30.21" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" - integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.5" - -magicast@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" - integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== - dependencies: - "@babel/parser" "^7.25.4" - "@babel/types" "^7.25.4" - source-map-js "^1.2.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -markdown-it@^14.1.0: - version "14.1.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" - integrity sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA== - dependencies: - argparse "^2.0.1" - entities "^4.4.0" - linkify-it "^5.0.0" - mdurl "^2.0.0" - punycode.js "^2.3.1" - uc.micro "^2.1.0" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mdast-util-to-hast@^13.0.0: - version "13.2.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" - integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== - dependencies: - "@types/hast" "^3.0.0" - "@types/mdast" "^4.0.0" - "@ungap/structured-clone" "^1.0.0" - devlop "^1.0.0" - micromark-util-sanitize-uri "^2.0.0" - trim-lines "^3.0.0" - unist-util-position "^5.0.0" - unist-util-visit "^5.0.0" - vfile "^6.0.0" - -mdn-data@2.0.28: - version "2.0.28" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" - integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - -mdurl@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" - integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@^1.1.2, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromark-util-character@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" - integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== - dependencies: - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - -micromark-util-encode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" - integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== - -micromark-util-sanitize-uri@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" - integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== - dependencies: - micromark-util-character "^2.0.0" - micromark-util-encode "^2.0.0" - micromark-util-symbol "^2.0.0" - -micromark-util-symbol@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" - integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== - -micromark-util-types@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" - integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== - -micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@^3.0.0, mime-types@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" - integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== - dependencies: - mime-db "^1.54.0" - -mime@1.6.0, mime@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-document@^2.19.0: - version "2.19.2" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.2.tgz#f95db44639eaae3ac8ea85ae6809ae85ff7e3b81" - integrity sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A== - dependencies: - dom-walk "^0.1.0" - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-svg-data-uri@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" - integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== - -minimatch@10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" - integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== - dependencies: - "@isaacs/brace-expansion" "^5.0.0" - -minimatch@10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.2.tgz#6c3f289f9de66d628fa3feb1842804396a43d81c" - integrity sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw== - dependencies: - "@isaacs/brace-expansion" "^5.0.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^10.1.1, minimatch@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.0.tgz#e710473e66e3e1aaf376d0aa82438375cac86e9e" - integrity sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w== - dependencies: - brace-expansion "^5.0.2" - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.3, minimatch@^9.0.4, minimatch@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mlly@^1.7.3, mlly@^1.7.4: - version "1.8.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.0.tgz#e074612b938af8eba1eaf43299cbc89cb72d824e" - integrity sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g== - dependencies: - acorn "^8.15.0" - pathe "^2.0.3" - pkg-types "^1.3.1" - ufo "^1.6.1" - -mpd-parser@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-1.3.1.tgz#557b6ac27411c2c177bb01e46e14440703a414a3" - integrity sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw== - dependencies: - "@babel/runtime" "^7.12.5" - "@videojs/vhs-utils" "^4.0.0" - "@xmldom/xmldom" "^0.8.3" - global "^4.4.0" - -mrmime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" - integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -muggle-string@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" - integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== - -mux.js@7.1.0, mux.js@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-7.1.0.tgz#aba5ed55a39cb790ef4b30b2c3ea0d2630b0264e" - integrity sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA== - dependencies: - "@babel/runtime" "^7.11.2" - global "^4.4.0" - -nanoid@^3.3.11, nanoid@^3.3.8: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -napi-postinstall@^0.3.0: - version "0.3.4" - resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" - integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-machine-id@1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" - integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== - -node-releases@^2.0.27: - version "2.0.27" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" - integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== - -node-schedule@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" - integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ== - dependencies: - cron-parser "^4.2.0" - long-timeout "0.1.1" - sorted-array-functions "^1.3.0" - -nodemon@^3.1.10: - version "3.1.11" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.11.tgz#04a54d1e794fbec9d8f6ffd8bf1ba9ea93a756ed" - integrity sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nonce@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nonce/-/nonce-1.0.4.tgz#ee7302ade8c1bef476f301b8c91f5cc51a487612" - integrity sha512-FVPu+tMZPP91HDwiq1DNhn9WIhg4/uo6mXR0xXAn0IMOxDmjJOkgbH0tm7qtowvAFZofWZRX+9KWZpNURrgtSA== - -nopt@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" - integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.0.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-normalize-package-bin@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -npm-run-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-6.0.0.tgz#25cfdc4eae04976f3349c0b1afc089052c362537" - integrity sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA== - dependencies: - path-key "^4.0.0" - unicorn-magic "^0.3.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.4: - version "2.2.23" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.23.tgz#59712c3a88e6de2bb0b6ccc1070397267019cf6c" - integrity sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ== - -nx@22.0.1: - version "22.0.1" - resolved "https://registry.yarnpkg.com/nx/-/nx-22.0.1.tgz#16471039085911183916413e01a137844203c689" - integrity sha512-7/8RurvJpbYHIywR7/OVF3akVBRLlMq6DdEjddzR4KOHP5cYLf2mdwXx59Tf+z3dQtKDclk0mN7koZdTTv3JMQ== - dependencies: - "@napi-rs/wasm-runtime" "0.2.4" - "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "3.0.2" - "@zkochan/js-yaml" "0.0.7" - axios "^1.12.0" - chalk "^4.1.0" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - cliui "^8.0.1" - dotenv "~16.4.5" - dotenv-expand "~11.0.6" - enquirer "~2.3.6" - figures "3.2.0" - flat "^5.0.2" - front-matter "^4.0.2" - ignore "^7.0.5" - jest-diff "^30.0.2" - jsonc-parser "3.2.0" - lines-and-columns "2.0.3" - minimatch "9.0.3" - node-machine-id "1.1.12" - npm-run-path "^4.0.1" - open "^8.4.0" - ora "5.3.0" - resolve.exports "2.0.3" - semver "^7.5.3" - string-width "^4.2.3" - tar-stream "~2.2.0" - tmp "~0.2.1" - tree-kill "^1.2.2" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - yaml "^2.6.0" - yargs "^17.6.2" - yargs-parser "21.1.1" - optionalDependencies: - "@nx/nx-darwin-arm64" "22.0.1" - "@nx/nx-darwin-x64" "22.0.1" - "@nx/nx-freebsd-x64" "22.0.1" - "@nx/nx-linux-arm-gnueabihf" "22.0.1" - "@nx/nx-linux-arm64-gnu" "22.0.1" - "@nx/nx-linux-arm64-musl" "22.0.1" - "@nx/nx-linux-x64-gnu" "22.0.1" - "@nx/nx-linux-x64-musl" "22.0.1" - "@nx/nx-win32-arm64-msvc" "22.0.1" - "@nx/nx-win32-x64-msvc" "22.0.1" - -nx@22.5.1, nx@^22.0.3: - version "22.5.1" - resolved "https://registry.yarnpkg.com/nx/-/nx-22.5.1.tgz#29109d3434e974e0027822673770bef886efaec1" - integrity sha512-KIQqOSdoshkav9JuoH/+Vp42niA5MTRtACupe+q8CaB7bHiLsWr5nctQVC7ul3NauAmsoqNWH7t5CIi8KgrPIQ== - dependencies: - "@napi-rs/wasm-runtime" "0.2.4" - "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "3.0.2" - "@zkochan/js-yaml" "0.0.7" - axios "^1.12.0" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - cliui "^8.0.1" - dotenv "~16.4.5" - dotenv-expand "~11.0.6" - ejs "^3.1.7" - enquirer "~2.3.6" - figures "3.2.0" - flat "^5.0.2" - front-matter "^4.0.2" - ignore "^7.0.5" - jest-diff "^30.0.2" - jsonc-parser "3.2.0" - lines-and-columns "2.0.3" - minimatch "10.1.1" - node-machine-id "1.1.12" - npm-run-path "^4.0.1" - open "^8.4.0" - ora "5.3.0" - picocolors "^1.1.0" - resolve.exports "2.0.3" - semver "^7.6.3" - string-width "^4.2.3" - tar-stream "~2.2.0" - tmp "~0.2.1" - tree-kill "^1.2.2" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - yaml "^2.6.0" - yargs "^17.6.2" - yargs-parser "21.1.1" - optionalDependencies: - "@nx/nx-darwin-arm64" "22.5.1" - "@nx/nx-darwin-x64" "22.5.1" - "@nx/nx-freebsd-x64" "22.5.1" - "@nx/nx-linux-arm-gnueabihf" "22.5.1" - "@nx/nx-linux-arm64-gnu" "22.5.1" - "@nx/nx-linux-arm64-musl" "22.5.1" - "@nx/nx-linux-x64-gnu" "22.5.1" - "@nx/nx-linux-x64-musl" "22.5.1" - "@nx/nx-win32-arm64-msvc" "22.5.1" - "@nx/nx-win32-x64-msvc" "22.5.1" - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.3, object-inspect@^1.13.4: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.entries@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -on-finished@^2.4.1, on-finished@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -oniguruma-to-es@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz#35ea9104649b7c05f3963c6b3b474d964625028b" - integrity sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g== - dependencies: - emoji-regex-xs "^1.0.0" - regex "^5.1.1" - regex-recursion "^5.1.1" - -open@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" - integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== - dependencies: - default-browser "^5.2.1" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - wsl-utils "^0.1.0" - -open@^8.4.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -opentok-jwt@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/opentok-jwt/-/opentok-jwt-0.1.5.tgz#c7c84724fc4d287f3a08f4264f97935cbbdb624e" - integrity sha512-Ub3iQEYava3oHK9Xp+UePFw9mratzp98LuDx46qtfkAFzsIKePlwBbj6UZ4pGuJDXZ28BJWpnXZyRWMJK9IW6w== - dependencies: - jsonwebtoken "^9.0.0" - -opentok-layout-js@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opentok-layout-js/-/opentok-layout-js-5.5.0.tgz#20f6971fdd9a39c816b1c23182351836a61d25e2" - integrity sha512-ynUo+zRjp1iasLUT0UQXuWvFyPAQIxhrdLOjWdNrPkPtziTuZcxccgPhr2kGQm9TztdLLQVlFruJN48cmqQiYA== - -opentok-solutions-logging@^1.1.1, opentok-solutions-logging@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/opentok-solutions-logging/-/opentok-solutions-logging-1.1.5.tgz#d7e399b1a65f19676d21484bf104d3ab50580dd5" - integrity sha512-xnLz0iWmJCWYDMKD80ow5+TcQYOzr2B4l2QA/EQQXjQGIEaXRqEFMhbQr3WXq0ET0Yn5zdJ3unBe8ESGXxUqxw== - dependencies: - axios "^1.6.3" - -opentok-token@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/opentok-token/-/opentok-token-1.1.1.tgz#1ec2b0f29d84477060934c43a2ce4b08f7e8fcc2" - integrity sha512-/uMsmUMiGWT95zemuE9H3OWSb+1NcDmZSDzjum1oKk2KLLGkjqlPsEo8NWarH2q1rfd+cBWP8Pu+dwJS0uNHcg== - dependencies: - lodash "^4.17.11" - nonce "^1.0.3" - unix-timestamp "^0.1.2" - -opentok@2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/opentok/-/opentok-2.22.0.tgz#d29075211d7a6bc2125da7a5691308e2fa1ec1cb" - integrity sha512-mrEmZt9pUvNGpU0aTjsjb4a2KbLJ+PMWh3f4sm/Rt0CWe1dBTUnvHcqRPQiOiYPAA/SXqv+lktmPdXcVYCbtMQ== - dependencies: - "@vonage/jwt" "1.11.0" - debug "4.4.0" - jsonwebtoken "9.0.2" - lodash "4.17.21" - node-fetch "2.7.0" - opentok-token "1.1.1" - uuid "11.0.5" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" - integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== - dependencies: - bl "^4.0.3" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -orderedmap@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" - integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" - integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== - dependencies: - yocto-queue "^1.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parent-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" - integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== - dependencies: - callsites "^3.1.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse5@^7.1.2: - version "7.3.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" - integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== - dependencies: - entities "^6.0.0" - -parseurl@^1.3.3, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-scurry@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.1.tgz#4b6572376cfd8b811fca9cd1f5c24b3cbac0fe10" - integrity sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== - dependencies: - lru-cache "^11.0.0" - minipass "^7.1.2" - -path-to-regexp@^0.1.12, path-to-regexp@~0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" - integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== - -pathe@^2.0.1, pathe@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" - integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pathval@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" - integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== - -picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== - -pirates@^4.0.4, pirates@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -pkcs7@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb" - integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ== - dependencies: - "@babel/runtime" "^7.5.5" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-types@^1.2.1, pkg-types@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" - integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== - dependencies: - confbox "^0.1.8" - mlly "^1.7.4" - pathe "^2.0.1" - -pkg-types@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.0.tgz#037f2c19bd5402966ff6810e32706558cb5b5726" - integrity sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig== - dependencies: - confbox "^0.2.2" - exsolve "^1.0.7" - pathe "^2.0.3" - -playwright-core@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.46.0.tgz#2336ac453a943abf0dc95a76c117f9d3ebd390eb" - integrity sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A== - -playwright@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.46.0.tgz#c7ff490deae41fc1e814bf2cb62109dd9351164d" - integrity sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw== - dependencies: - playwright-core "1.46.0" - optionalDependencies: - fsevents "2.3.2" - -portfinder@^1.0.28: - version "1.0.38" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.38.tgz#e4fb3a2d888b20d2977da050e48ab5e1f57a185e" - integrity sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg== - dependencies: - async "^3.2.6" - debug "^4.3.6" - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postcss-modules-extract-imports@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" - integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== - -postcss-modules-local-by-default@^4.0.5: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" - integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^7.0.0" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" - integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== - dependencies: - postcss-selector-parser "^7.0.0" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-modules@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-6.0.1.tgz#e3e895918c060c14fa6a22f84ba14a4286f436a5" - integrity sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ== - dependencies: - generic-names "^4.0.0" - icss-utils "^5.1.0" - lodash.camelcase "^4.3.0" - postcss-modules-extract-imports "^3.1.0" - postcss-modules-local-by-default "^4.0.5" - postcss-modules-scope "^3.2.0" - postcss-modules-values "^4.0.0" - string-hash "^1.1.3" - -postcss-selector-parser@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz#e75d2e0d843f620e5df69076166f4e16f891cb9f" - integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.38, postcss@^8.4.4, postcss@^8.4.43: - version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#6a31f88a4bad6c7adda253de12ba4edaea80ebcd" - integrity sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== - dependencies: - fast-diff "^1.1.2" - -prettier@^3.6.2: - version "3.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" - integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== - -pretty-format@30.2.0: - version "30.2.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe" - integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== - dependencies: - "@jest/schemas" "30.0.5" - ansi-styles "^5.2.0" - react-is "^18.3.1" - -pretty-format@^27.0.2: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^29.0.0, 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" - react-is "^18.0.0" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -promise@^8.0.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.6.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" - integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== - -prosemirror-commands@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz#d101fef85618b1be53d5b99ea17bee5600781b38" - integrity sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w== - dependencies: - prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" - prosemirror-transform "^1.10.2" - -prosemirror-dropcursor@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz#2ed30c4796109ddeb1cf7282372b3850528b7228" - integrity sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw== - dependencies: - prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" - prosemirror-view "^1.1.0" - -prosemirror-gapcursor@^1.3.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.0.tgz#e1144a83b79db7ed0ec32cd0e915a0364220af43" - integrity sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ== - dependencies: - prosemirror-keymap "^1.0.0" - prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" - prosemirror-view "^1.0.0" - -prosemirror-history@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.5.0.tgz#ee21fc5de85a1473e3e3752015ffd6d649a06859" - integrity sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg== - dependencies: - prosemirror-state "^1.2.2" - prosemirror-transform "^1.0.0" - prosemirror-view "^1.31.0" - rope-sequence "^1.3.0" - -prosemirror-inputrules@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz#d2e935f6086e3801486b09222638f61dae89a570" - integrity sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw== - dependencies: - prosemirror-state "^1.0.0" - prosemirror-transform "^1.0.0" - -prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz#c0f6ab95f75c0b82c97e44eb6aaf29cbfc150472" - integrity sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw== - dependencies: - prosemirror-state "^1.0.0" - w3c-keyname "^2.2.0" - -prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.25.0, prosemirror-model@^1.25.4: - version "1.25.4" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.25.4.tgz#8ebfbe29ecbee9e5e2e4048c4fe8e363fcd56e7c" - integrity sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA== - dependencies: - orderedmap "^2.0.0" - -prosemirror-schema-basic@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz#389ce1ec09b8a30ea9bbb92c58569cb690c2d695" - integrity sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ== - dependencies: - prosemirror-model "^1.25.0" - -prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.4.tgz#72b5e926f9e92dcee12b62a05fcc8a2de3bf5b39" - integrity sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw== - dependencies: - prosemirror-model "^1.0.0" - prosemirror-transform "^1.0.0" - prosemirror-view "^1.27.0" - -prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.10.2, prosemirror-transform@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz#f5c5050354423dc83c6b083f6f1959ec86a3f9ba" - integrity sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw== - dependencies: - prosemirror-model "^1.21.0" - -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0: - version "1.41.6" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.6.tgz#949d0407a91e36f6024db2191b8d3058dfd18838" - integrity sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg== - dependencies: - prosemirror-model "^1.20.0" - prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" - -prosemirror-view@^1.41.6: - version "1.41.7" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.41.7.tgz#61e6f44ac160795c913ead92a282247df9d468f6" - integrity sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w== - dependencies: - prosemirror-model "^1.20.0" - prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" - integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== - -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode.js@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" - integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== - -punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -pure-rand@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566" - integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== - -qs@^6.14.1, qs@^6.4.0: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== - dependencies: - side-channel "^1.1.0" - -qs@~6.14.0: - version "6.14.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" - integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== - dependencies: - side-channel "^1.1.0" - -quansync@^0.2.11: - version "0.2.11" - resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.11.tgz#f9c3adda2e1272e4f8cf3f1457b04cbdb4ee692a" - integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rambda@^9.1.0: - version "9.4.2" - resolved "https://registry.yarnpkg.com/rambda/-/rambda-9.4.2.tgz#1a0da6171ca5830e88311f0083e5fd8b945a32ad" - integrity sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw== - -ramda@^0.32.0: - version "0.32.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.32.0.tgz#b2116807b59b6b177af7a2ad19b14a3653570e96" - integrity sha512-GQWAHhxhxWBWA8oIBr1XahFVjQ9Fic6MK9ikijfd4TZHfE2+urfk+irVlR5VOn48uwMgM+loRRBJd6Yjsbc0zQ== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@~2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" - integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== - dependencies: - bytes "~3.1.2" - http-errors "~2.0.1" - iconv-lite "~0.4.24" - unpipe "~1.0.0" - -react-docgen-typescript@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz#033428b4a6a639d050ac8baf2a5195c596521713" - integrity sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg== - -react-docgen@^8.0.0, react-docgen@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-8.0.2.tgz#450efcac75813e3d614d7bd15eb4066e2e7bcbf5" - integrity sha512-+NRMYs2DyTP4/tqWz371Oo50JqmWltR1h2gcdgUMAWZJIAvrd0/SqlCfx7tpzpl/s36rzw6qH2MjoNrxtRNYhA== - dependencies: - "@babel/core" "^7.28.0" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.2" - "@types/babel__core" "^7.20.5" - "@types/babel__traverse" "^7.20.7" - "@types/doctrine" "^0.0.9" - "@types/resolve" "^1.20.2" - doctrine "^3.0.0" - resolve "^1.22.1" - strip-indent "^4.0.0" - -react-dom@^19.2.1: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591" - integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== - dependencies: - scheduler "^0.27.0" - -react-global-state-hooks@^15.0.6: - version "15.0.15" - resolved "https://registry.yarnpkg.com/react-global-state-hooks/-/react-global-state-hooks-15.0.15.tgz#797cf3ca38b200471fee9a56494518f40e15ed4d" - integrity sha512-Xf548EVUyyMHTx+1zi07FQNXhOTPk8H0D6kHnDfcJMx3DKjnefT3LMsmS3Iy3pwA052AjVfPGW8YQhU9bHxIOQ== - dependencies: - json-storage-formatter "^3.0.2" - react-hooks-global-states "^15.0.16" - -react-hooks-global-states@^15.0.16: - version "15.0.16" - resolved "https://registry.yarnpkg.com/react-hooks-global-states/-/react-hooks-global-states-15.0.16.tgz#2ed71058f5d7b642ba37b4d6d125f2890068c747" - integrity sha512-3QbZWMemhy0fBvTaMMAX2/NLRbW86GGwGi75LBbAy7Dxe9glWvMGz31s1gOrDsB8GcNILryokMtbRp9H3Eexuw== - dependencies: - json-storage-formatter "^3.0.2" - -react-i18next@^15.6.1: - version "15.7.4" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.7.4.tgz#146e50f220d204b842e22c75d1a3d23c6c589a30" - integrity sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw== - dependencies: - "@babel/runtime" "^7.27.6" - html-parse-stringify "^3.0.1" - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0, react-is@^18.3.1: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react-is@^19.0.0: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.2.4.tgz#a080758243c572ccd4a63386537654298c99d135" - integrity sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA== - -react-refresh@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.18.0.tgz#2dce97f4fe932a4d8142fa1630e475c1729c8062" - integrity sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw== - -react-router-dom@6.30.2: - version "6.30.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.30.2.tgz#ee8c161bce4890d34484b552f8510f9af0e22b01" - integrity sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q== - dependencies: - "@remix-run/router" "1.23.1" - react-router "6.30.2" - -react-router@6.30.2: - version "6.30.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.30.2.tgz#c78a3b40f7011f49a373b1df89492e7d4ec12359" - integrity sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA== - dependencies: - "@remix-run/router" "1.23.1" - -react-transition-group@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@^19.2.1: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" - integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== - -read-installed@~4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" - integrity sha512-O03wg/IYuV/VtnK2h/KXEt9VIbMUFbk3ERG0Iu4FhLZw0EP0T9znqrYDGn6ncbEsXUFaUjiVAWXHzxwt3lhRPQ== - dependencies: - debuglog "^1.0.1" - read-package-json "^2.0.0" - readdir-scoped-modules "^1.0.0" - semver "2 || 3 || 4 || 5" - slide "~1.1.3" - util-extend "^1.0.1" - optionalDependencies: - graceful-fs "^4.1.2" - -read-package-json@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" - -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdir-scoped-modules@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== - dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" - -readdirp@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" - integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recast@^0.23.5: - version "0.23.11" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.23.11.tgz#8885570bb28cf773ba1dc600da7f502f7883f73f" - integrity sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== - dependencies: - ast-types "^0.16.1" - esprima "~4.0.0" - source-map "~0.6.1" - tiny-invariant "^1.3.3" - tslib "^2.0.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - 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.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regenerate-unicode-properties@^10.2.2: - version "10.2.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" - integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regex-recursion@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-5.1.1.tgz#5a73772d18adbf00f57ad097bf54171b39d78f8b" - integrity sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w== - dependencies: - regex "^5.1.1" - regex-utilities "^2.3.0" - -regex-utilities@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" - integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== - -regex@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/regex/-/regex-5.1.1.tgz#cf798903f24d6fe6e531050a36686e082b29bd03" - integrity sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw== - dependencies: - regex-utilities "^2.3.0" - -regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - -regexpu-core@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" - integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.2" - regjsgen "^0.8.0" - regjsparser "^0.13.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.2.1" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" - integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== - dependencies: - jsesc "~3.1.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve.exports@2.0.3, resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@1.22.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.10.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.11, resolve@^1.22.4, resolve@^1.22.8, resolve@~1.22.1, resolve@~1.22.2: - version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" - integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== - dependencies: - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup-plugin-typescript2@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz#309564eb70d710412f5901344ca92045e180ed53" - integrity sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw== - dependencies: - "@rollup/pluginutils" "^4.1.2" - find-cache-dir "^3.3.2" - fs-extra "^10.0.0" - semver "^7.5.4" - tslib "^2.6.2" - -rollup@^4.14.0, rollup@^4.20.0, rollup@^4.22.4: - version "4.57.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.57.1.tgz#947f70baca32db2b9c594267fe9150aa316e5a88" - integrity sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.57.1" - "@rollup/rollup-android-arm64" "4.57.1" - "@rollup/rollup-darwin-arm64" "4.57.1" - "@rollup/rollup-darwin-x64" "4.57.1" - "@rollup/rollup-freebsd-arm64" "4.57.1" - "@rollup/rollup-freebsd-x64" "4.57.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.57.1" - "@rollup/rollup-linux-arm-musleabihf" "4.57.1" - "@rollup/rollup-linux-arm64-gnu" "4.57.1" - "@rollup/rollup-linux-arm64-musl" "4.57.1" - "@rollup/rollup-linux-loong64-gnu" "4.57.1" - "@rollup/rollup-linux-loong64-musl" "4.57.1" - "@rollup/rollup-linux-ppc64-gnu" "4.57.1" - "@rollup/rollup-linux-ppc64-musl" "4.57.1" - "@rollup/rollup-linux-riscv64-gnu" "4.57.1" - "@rollup/rollup-linux-riscv64-musl" "4.57.1" - "@rollup/rollup-linux-s390x-gnu" "4.57.1" - "@rollup/rollup-linux-x64-gnu" "4.57.1" - "@rollup/rollup-linux-x64-musl" "4.57.1" - "@rollup/rollup-openbsd-x64" "4.57.1" - "@rollup/rollup-openharmony-arm64" "4.57.1" - "@rollup/rollup-win32-arm64-msvc" "4.57.1" - "@rollup/rollup-win32-ia32-msvc" "4.57.1" - "@rollup/rollup-win32-x64-gnu" "4.57.1" - "@rollup/rollup-win32-x64-msvc" "4.57.1" - fsevents "~2.3.2" - -rope-sequence@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" - integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== - -rrweb-cssom@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" - integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== - -run-applescript@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" - integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@7.8.2: - version "7.8.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" - integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - has-symbols "^1.1.0" - isarray "^2.0.5" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.0.3, safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" - integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== - -schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" - integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -secure-compare@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" - integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.1, semver@^7.7.2, semver@^7.7.3: - version "7.7.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" - integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== - -semver@~7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -send@~0.19.0, send@~0.19.1: - version "0.19.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" - integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "~0.5.2" - http-errors "~2.0.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.4.1" - range-parser "~1.2.1" - statuses "~2.0.2" - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-static@~1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" - integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "~0.19.1" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -setprototypeof@1.2.0, setprototypeof@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-exec@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shell-exec/-/shell-exec-1.0.2.tgz#2e9361b0fde1d73f476c4b6671fa17785f696756" - integrity sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg== - -shell-quote@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== - -shiki@^1.16.2: - version "1.29.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.29.2.tgz#5c93771f2d5305ce9c05975c33689116a27dc657" - integrity sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg== - dependencies: - "@shikijs/core" "1.29.2" - "@shikijs/engine-javascript" "1.29.2" - "@shikijs/engine-oniguruma" "1.29.2" - "@shikijs/langs" "1.29.2" - "@shikijs/themes" "1.29.2" - "@shikijs/types" "1.29.2" - "@shikijs/vscode-textmate" "^10.0.1" - "@types/hast" "^3.0.4" - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1, signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -sirv@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" - integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slide@~1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== - -smol-toml@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.6.0.tgz#7911830b47bb3e87be536f939453e10c9e1dfd36" - integrity sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw== - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -sorted-array-functions@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz#8605695563294dffb2c9796d602bd8459f7a0dd5" - integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== - -source-map-js@^1.0.1, source-map-js@^1.2.0, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.4: - version "0.7.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" - integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -spdx-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/spdx-compare/-/spdx-compare-1.0.0.tgz#2c55f117362078d7409e6d7b08ce70a857cd3ed7" - integrity sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A== - dependencies: - array-find-index "^1.0.2" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.22" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz#abf5a08a6f5d7279559b669f47f0a43e8f3464ef" - integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ== - -spdx-ranges@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/spdx-ranges/-/spdx-ranges-2.1.1.tgz#87573927ba51e92b3f4550ab60bfc83dd07bac20" - integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== - -spdx-satisfies@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz#9a09a68d80f5f1a31cfaebb384b0c6009e4969fe" - integrity sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA== - dependencies: - spdx-compare "^1.0.0" - spdx-expression-parse "^3.0.0" - spdx-ranges "^2.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable-hash-x@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" - integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== - -stack-utils@^2.0.3, stack-utils@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -status-code-enum@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/status-code-enum/-/status-code-enum-1.0.0.tgz#097b6d87e8402fa20f5fbf3c50a24eda20d4efed" - integrity sha512-aDTkL2wug8wYX8i0a2K1foqIDaJyGF/a3I0KTZ9gD4MJaxzd7/LKD1VQ2rXL5u7fWESVY+qY2LQLqj6LK/YXiA== - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -statuses@^2.0.1, statuses@~2.0.1, statuses@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" - integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== - -std-env@^3.5.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" - integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== - -stop-iteration-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" - integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== - dependencies: - es-errors "^1.3.0" - internal-slot "^1.1.0" - -storybook@^10.1.11: - version "10.2.8" - resolved "https://registry.yarnpkg.com/storybook/-/storybook-10.2.8.tgz#fa4d915a0d209028d52edfbc485aa62fd8ebdb69" - integrity sha512-885uSIn8NQw2ZG7vy84K45lHCOSyz1DVsDV8pHiHQj3J0riCuWLNeO50lK9z98zE8kjhgTtxAAkMTy5nkmNRKQ== - dependencies: - "@storybook/global" "^5.0.0" - "@storybook/icons" "^2.0.1" - "@testing-library/jest-dom" "^6.6.3" - "@testing-library/user-event" "^14.6.1" - "@vitest/expect" "3.2.4" - "@vitest/spy" "3.2.4" - esbuild "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" - open "^10.2.0" - recast "^0.23.5" - semver "^7.7.3" - use-sync-external-store "^1.5.0" - ws "^8.18.0" - -streamroller@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" - integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - fs-extra "^8.1.0" - -string-argv@~0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-hash@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== - -string-length@^4.0.1, string-length@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.includes@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92" - integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - -string.prototype.matchall@^4.0.12: - version "4.0.12" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" - integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - regexp.prototype.flags "^1.5.3" - set-function-name "^2.0.2" - side-channel "^1.1.0" - -string.prototype.repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" - integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trim@^1.2.10: - version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-object-atoms "^1.0.0" - has-property-descriptors "^1.0.2" - -string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -stringify-entities@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" - integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-indent@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.1.1.tgz#aba13de189d4ad9a17f6050e76554ac27585c7af" - integrity sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== - -strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.1.tgz#26906e65f606d49f748454a08084e94190c2e5ad" - integrity sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q== - dependencies: - js-tokens "^9.0.1" - -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -superagent@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-10.3.0.tgz#ff1e39e7976b63f8084291d65f5bfbbbbd156989" - integrity sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ== - dependencies: - component-emitter "^1.3.1" - cookiejar "^2.1.4" - debug "^4.3.7" - fast-safe-stringify "^2.1.1" - form-data "^4.0.5" - formidable "^3.5.4" - methods "^1.1.2" - mime "2.6.0" - qs "^6.14.1" - -supertest@^7.0.0: - version "7.2.2" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-7.2.2.tgz#dac3ee25a2aa59942a7f641e50c838a7c8819204" - integrity sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA== - dependencies: - cookie-signature "^1.2.2" - methods "^1.1.2" - superagent "^10.3.0" - -supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1, supports-color@~8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^3.0.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" - integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^5.1.0" - css-tree "^2.3.1" - css-what "^6.1.0" - csso "^5.0.5" - picocolors "^1.0.0" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -synckit@^0.11.12, synckit@^0.11.4, synckit@^0.11.8: - version "0.11.12" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.12.tgz#abe74124264fbc00a48011b0d98bdc1cffb64a7b" - integrity sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ== - dependencies: - "@pkgr/core" "^0.2.9" - -tailwind-api-utils@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tailwind-api-utils/-/tailwind-api-utils-1.0.3.tgz#8315b86addf55ac1e3624e971546dc680e4b3275" - integrity sha512-KpzUHkH1ug1sq4394SLJX38ZtpeTiqQ1RVyFTTSY2XuHsNSTWUkRo108KmyyrMWdDbQrLYkSHaNKj/a3bmA4sQ== - dependencies: - enhanced-resolve "^5.18.1" - jiti "^2.4.2" - local-pkg "^1.1.1" - -tailwind-merge@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-3.4.1.tgz#37e12eeb8bf49d15c116ff2018fa01fac10e2b9e" - integrity sha512-2OA0rFqWOkITEAOFWSBSApYkDeH9t2B3XSJuI4YztKBzK3mX0737A2qtxDZ7xkw9Zfh0bWl+r34sF3HXV+Ig7Q== - -tailwind-variants@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/tailwind-variants/-/tailwind-variants-3.2.2.tgz#3ac8ccc735cae8b6f416330070f5f7437a77a0f3" - integrity sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg== - -tailwindcss@4.1.18, tailwindcss@^4.1.18: - version "4.1.18" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.1.18.tgz#f488ba47853abdb5354daf9679d3e7791fc4f4e3" - integrity sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw== - -tapable@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" - integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== - -tar-stream@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tcp-port-used@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea" - integrity sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA== - dependencies: - debug "4.3.1" - is2 "^2.0.6" - -terser-webpack-plugin@^5.3.16: - version "5.3.16" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz#741e448cc3f93d8026ebe4f7ef9e4afacfd56330" - integrity sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.31.1, terser@^5.46.0: - version "5.46.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.0.tgz#1b81e560d584bbdd74a8ede87b4d9477b0ff9695" - integrity sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.15.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tiny-invariant@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" - integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== - -tinybench@^2.5.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" - integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== - -tinyglobby@^0.2.12, tinyglobby@^0.2.14, tinyglobby@^0.2.15: - version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -tinypool@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.4.tgz#e217fe1270d941b39e98c625dcecebb1408c9aa8" - integrity sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ== - -tinyrainbow@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" - integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== - -tinyspy@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" - integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== - -tinyspy@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" - integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== - -tmp@~0.2.1: - version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" - integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1, toidentifier@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -touch@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" - integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== - -tough-cookie@^4.1.2: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" - integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== - dependencies: - punycode "^2.3.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@1.2.2, tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -treeify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" - integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -ts-api-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" - integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== - -ts-dedent@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" - integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== - -ts-jest@^29.2.5: - version "29.4.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.6.tgz#51cb7c133f227396818b71297ad7409bb77106e9" - integrity sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA== - dependencies: - bs-logger "^0.2.6" - fast-json-stable-stringify "^2.1.0" - handlebars "^4.7.8" - json5 "^2.2.3" - lodash.memoize "^4.1.2" - make-error "^1.3.6" - semver "^7.7.3" - type-fest "^4.41.0" - yargs-parser "^21.1.1" - -ts-loader@^9.5.4: - version "9.5.4" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.4.tgz#44b571165c10fb5a90744aa5b7e119233c4f4585" - integrity sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - source-map "^0.7.4" - -ts-xor@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-xor/-/ts-xor-1.3.0.tgz#3e59f24f0321f9f10f350e0cee3b534b89a2c70b" - integrity sha512-RLXVjliCzc1gfKQFLRpfeD0rrWmjnSTgj7+RFhoq3KRkUYa8LE/TIidYOzM5h+IdFBDSjjSgk9Lto9sdMfDFEA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tsscmp@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" - integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== - -tsx@^4.10.5: - version "4.21.0" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.21.0.tgz#32aa6cf17481e336f756195e6fe04dae3e6308b1" - integrity sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw== - dependencies: - esbuild "~0.27.0" - get-tsconfig "^4.7.5" - optionalDependencies: - fsevents "~2.3.3" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-detect@^4.0.0, type-detect@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" - integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^4.41.0: - version "4.41.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" - integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== - -type-is@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" - integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== - dependencies: - content-type "^1.0.5" - media-typer "^1.1.0" - mime-types "^3.0.0" - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.9" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - reflect.getprototypeof "^1.0.6" - -typedoc@^0.26.10: - version "0.26.11" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.26.11.tgz#124b43a5637b7f3237b8c721691b44738c5c9dc9" - integrity sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw== - dependencies: - lunr "^2.3.9" - markdown-it "^14.1.0" - minimatch "^9.0.5" - shiki "^1.16.2" - yaml "^2.5.1" - -typescript-eslint@^8.46.4: - version "8.55.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.55.0.tgz#abae8295c5f0f82f816218113a46e89bc30c3de2" - integrity sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw== - dependencies: - "@typescript-eslint/eslint-plugin" "8.55.0" - "@typescript-eslint/parser" "8.55.0" - "@typescript-eslint/typescript-estree" "8.55.0" - "@typescript-eslint/utils" "8.55.0" - -typescript@5.8.2: - version "5.8.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" - integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== - -typescript@^5.8.3, typescript@~5.9.2: - version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" - integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== - -ua-parser-js@^1.0.41: - version "1.0.41" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.41.tgz#bd04dc9ec830fcf9e4fad35cf22dcedd2e3b4e9c" - integrity sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug== - -uc.micro@^2.0.0, uc.micro@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" - integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== - -ufo@^1.6.1: - version "1.6.3" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.3.tgz#799666e4e88c122a9659805e30b9dc071c3aed4f" - integrity sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q== - -uglify-js@^3.1.4: - version "3.19.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" - integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -undici-types@~6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" - integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== - -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" - integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" - integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== - -unicorn-magic@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104" - integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== - -union@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" - integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== - dependencies: - qs "^6.4.0" - -unist-util-is@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" - integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-position@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" - integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-stringify-position@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" - integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== - dependencies: - "@types/unist" "^3.0.0" - -unist-util-visit-parents@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" - integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - -unist-util-visit@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz#9a2a28b0aa76a15e0da70a08a5863a2f060e2468" - integrity sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg== - dependencies: - "@types/unist" "^3.0.0" - unist-util-is "^6.0.0" - unist-util-visit-parents "^6.0.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unix-timestamp@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unix-timestamp/-/unix-timestamp-0.1.2.tgz#c371de092ab1491a25c5ce3c0758d2c25e7be3c3" - integrity sha512-nSpkcoMTJWN8sup4/pAt04Rj8Psf9hV6ymtn6XWWBtGBCyKhxvkhi/MOfLn8GLfITIaRt4XFnrg9Mb3SSkT+sg== - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unplugin@^2.3.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/unplugin/-/unplugin-2.3.11.tgz#411e020dd2ba90e2fbe1e7bd63a5a399e6ee3b54" - integrity sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww== - dependencies: - "@jridgewell/remapping" "^2.3.5" - acorn "^8.15.0" - picomatch "^4.0.3" - webpack-virtual-modules "^0.6.2" - -unrs-resolver@^1.7.11: - version "1.11.1" - resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9" - integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== - dependencies: - napi-postinstall "^0.3.0" - optionalDependencies: - "@unrs/resolver-binding-android-arm-eabi" "1.11.1" - "@unrs/resolver-binding-android-arm64" "1.11.1" - "@unrs/resolver-binding-darwin-arm64" "1.11.1" - "@unrs/resolver-binding-darwin-x64" "1.11.1" - "@unrs/resolver-binding-freebsd-x64" "1.11.1" - "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" - "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" - "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" - "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" - "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" - "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-x64-musl" "1.11.1" - "@unrs/resolver-binding-wasm32-wasi" "1.11.1" - "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" - "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" - "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" - -upath@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - -update-browserslist-db@^1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2, uri-js@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-join@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" - integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url-toolkit@^2.2.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.5.tgz#58406b18e12c58803e14624df5e374f638b0f607" - integrity sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg== - -use-sync-external-store@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" - integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util-extend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" - integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@11.0.5: - version "11.0.5" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62" - integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA== - -uuid@13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-13.0.0.tgz#263dc341b19b4d755eb8fe36b78d95a6b65707e8" - integrity sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w== - -uuid@9.0.1, uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -uuid@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" - integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validator@13.15.15: - version "13.15.15" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.15.tgz#246594be5671dc09daa35caec5689fcd18c6e7e4" - integrity sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A== - -vanilla-colorful@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz#3fb1f4b9f15b797e20fd1ce8e0364f33b073f4a2" - integrity sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg== - -vary@^1, vary@^1.1.2, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-message@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" - integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== - dependencies: - "@types/unist" "^3.0.0" - unist-util-stringify-position "^4.0.0" - -vfile@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" - integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== - dependencies: - "@types/unist" "^3.0.0" - vfile-message "^4.0.0" - -"video.js@^7 || ^8", video.js@^8.23.7: - version "8.23.7" - resolved "https://registry.yarnpkg.com/video.js/-/video.js-8.23.7.tgz#f32be0689b0184e4d8b8b03fd150bac21e6db2ab" - integrity sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA== - dependencies: - "@babel/runtime" "^7.28.4" - "@videojs/http-streaming" "^3.17.3" - "@videojs/vhs-utils" "^4.1.1" - "@videojs/xhr" "2.7.0" - aes-decrypter "^4.0.2" - global "4.4.0" - m3u8-parser "^7.2.0" - mpd-parser "^1.3.1" - mux.js "^7.0.1" - videojs-contrib-quality-levels "4.1.0" - videojs-font "4.2.0" - videojs-vtt.js "0.15.5" - -videojs-contrib-quality-levels@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.1.0.tgz#44c2d2167114a5c8418548b10a25cb409d6cba51" - integrity sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA== - dependencies: - global "^4.4.0" - -videojs-font@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-4.2.0.tgz#fbce803d347c565816e296f527e208dc65c9f235" - integrity sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ== - -videojs-vtt.js@0.15.5: - version "0.15.5" - resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz#567776eaf2a7a928d88b148a8b401ade2406f2ca" - integrity sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ== - dependencies: - global "^4.3.1" - -vite-node@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.1.tgz#fff3ef309296ea03ceaa6ca4bb660922f5416c57" - integrity sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" - -vite-plugin-checker@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/vite-plugin-checker/-/vite-plugin-checker-0.11.0.tgz#063ce180c3751b790a6472e19c5d1a352b215070" - integrity sha512-iUdO9Pl9UIBRPAragwi3as/BXXTtRu4G12L3CMrjx+WVTd9g/MsqNakreib9M/2YRVkhZYiTEwdH2j4Dm0w7lw== - dependencies: - "@babel/code-frame" "^7.27.1" - chokidar "^4.0.3" - npm-run-path "^6.0.0" - picocolors "^1.1.1" - picomatch "^4.0.3" - tiny-invariant "^1.3.3" - tinyglobby "^0.2.14" - vscode-uri "^3.1.0" - -vite-plugin-dts@~4.5.0: - version "4.5.4" - resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz#51b60aaaa760d9cf5c2bb3676c69d81910d6b08c" - integrity sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg== - dependencies: - "@microsoft/api-extractor" "^7.50.1" - "@rollup/pluginutils" "^5.1.4" - "@volar/typescript" "^2.4.11" - "@vue/language-core" "2.2.0" - compare-versions "^6.1.1" - debug "^4.4.0" - kolorist "^1.8.0" - local-pkg "^1.0.0" - magic-string "^0.30.17" - -vite@^5.0.0, vite@^5.4.19: - version "5.4.21" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" - integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitest@^1.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.6.1.tgz#b4a3097adf8f79ac18bc2e2e0024c534a7a78d2f" - integrity sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag== - dependencies: - "@vitest/expect" "1.6.1" - "@vitest/runner" "1.6.1" - "@vitest/snapshot" "1.6.1" - "@vitest/spy" "1.6.1" - "@vitest/utils" "1.6.1" - acorn-walk "^8.3.2" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^2.0.0" - tinybench "^2.5.1" - tinypool "^0.8.3" - vite "^5.0.0" - vite-node "1.6.1" - why-is-node-running "^2.2.2" - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== - -vscode-languageserver-textdocument@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" - integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== - -vscode-uri@^3.0.8, vscode-uri@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" - integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== - -w3c-keyname@^2.2.0: - version "2.2.8" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" - integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== - -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -watchpack@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102" - integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.0, wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -webpack-cli@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" - integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== - dependencies: - "@discoveryjs/json-ext" "^0.6.1" - "@webpack-cli/configtest" "^3.0.1" - "@webpack-cli/info" "^3.0.1" - "@webpack-cli/serve" "^3.0.1" - colorette "^2.0.14" - commander "^12.1.0" - cross-spawn "^7.0.3" - envinfo "^7.14.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^6.0.1" - -webpack-merge@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" - integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.1" - -webpack-sources@^3.3.3: - version "3.3.4" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.4.tgz#a338b95eb484ecc75fbb196cbe8a2890618b4891" - integrity sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q== - -webpack-virtual-modules@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz#057faa9065c8acf48f24cb57ac0e77739ab9a7e8" - integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== - -webpack@^5.101.3, webpack@^5.104.0: - version "5.105.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.105.2.tgz#f3b76f9fc36f1152e156e63ffda3bbb82e6739ea" - integrity sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.28.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.19.0" - es-module-lexer "^2.0.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.3.1" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.3" - tapable "^2.3.0" - terser-webpack-plugin "^5.3.16" - watchpack "^2.5.1" - webpack-sources "^3.3.3" - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^12.0.0, whatwg-url@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" - integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== - dependencies: - tr46 "^4.1.1" - webidl-conversions "^7.0.0" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.20" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" - integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^1.2.14: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" - integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -wildcard@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@7.0.0, wrap-ansi@^7.0.0, wrap-ansi@^8.1.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -write-file-atomic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -ws@^8.13.0, ws@^8.18.0: - version "8.19.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" - integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== - -wsl-utils@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" - integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== - dependencies: - is-wsl "^3.1.0" - -xdg-basedir@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" - integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.5.1, yaml@^2.6.0, yaml@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" - integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== - -yargs-parser@21.1.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@17.7.2, yargs@^17.3.1, yargs@^17.6.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" - integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== - -"zod-validation-error@^3.5.0 || ^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" - integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== - -"zod@^3.25.0 || ^4.0.0", zod@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a" - integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg== - -zwitch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html b/tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html new file mode 100644 index 00000000..1f4a231a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/01-backend-setup/index.html @@ -0,0 +1,68 @@ + Backend Credentials | Vonage Coding Exercise + Skip to content

Backend Credentials

Before configuring any features, the backend needs to know your Vonage application credentials. These are stored in a .env file inside the backend/ folder that you must create manually — they cannot be generated for you.

The repo includes a backend/.env.example with all the required variables already listed. Copy it to create your own .env:

Terminal window
cp backend/.env.example backend/.env

Then open backend/.env and replace the placeholder values with your own:

backend/.env
VONAGE_APP_ID=your-vonage-application-id
VONAGE_PRIVATE_KEY=./private.key
VariableWhere to find it
VONAGE_APP_IDVonage Dashboard → Your Applications → the app you created for this project
VONAGE_PRIVATE_KEYThe private.key file downloaded when you created the Vonage Application. Place it in the backend/ folder and set the path to ./private.key

Once the file is saved, confirm its contents look correct:

Terminal window
cat backend/.env

You should see your App ID and the key path. With credentials in place, let's look at the frontend configuration file.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html b/tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html new file mode 100644 index 00000000..3af42978 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/01-config-file-overview/index.html @@ -0,0 +1,68 @@ + The Config File | Vonage Coding Exercise + Skip to content

The Config File

All frontend settings for the Vonage Video React App live in a single file at the project root: vcrBuild.env.sh. This is the one place you need to go to control features, display defaults, and other frontend behaviour.

  • vcrBuild.env.sh ← All frontend configuration goes here
  • Directorybackend/
    • .env ← Backend credentials (separate)
  • Directoryfrontend/
  • Directorylibs/

vcrBuild.env.sh is a shell script that exports environment variables. It is loaded automatically every time you run the app or trigger a build — you never need to source it manually.

vcrBuild.env.sh
export ALLOW_CHAT=true
export ALLOW_ARCHIVING=true
export DEFAULT_LAYOUT_MODE='active-speaker'

Open vcrBuild.env.sh in your editor:

Terminal window
code vcrBuild.env.sh

The defaults work out of the box — all major features are enabled and the resolution is set to 1280×720. You only need to edit the file when you want to change a specific behaviour.

Now let's look at the feature flags you can control.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html b/tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html new file mode 100644 index 00000000..4ea29b01 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/02-feature-flags/index.html @@ -0,0 +1,68 @@ + Feature Flags | Vonage Coding Exercise + Skip to content

Feature Flags

Feature flags let you enable or disable specific capabilities of the app without changing any source code. Each flag is a boolean true / false value in vcrBuild.env.sh.

VariableDefaultDescription
ALLOW_CAMERA_CONTROLtrueShow the camera on/off toggle
ALLOW_VIDEO_ON_JOINtrueStart with camera enabled when joining
ALLOW_MICROPHONE_CONTROLtrueShow the microphone on/off toggle
ALLOW_AUDIO_ON_JOINtrueStart with microphone enabled when joining
ALLOW_ADVANCED_NOISE_SUPPRESSIONtrueEnable the advanced noise-suppression toggle
ALLOW_BACKGROUND_EFFECTStrueEnable virtual background and blur effects
VariableDefaultDescription
WAITING_ROOM_ALLOW_DEVICE_SELECTIONtrueShow device selectors in the waiting room
MEETING_ROOM_ALLOW_DEVICE_SELECTIONtrueShow device selectors inside the meeting room
VariableDefaultDescription
ALLOW_ARCHIVINGtrueEnable meeting recording
ALLOW_CAPTIONStrueEnable live captions
ALLOW_CHATtrueEnable the in-call group chat
ALLOW_EMOJIStrueEnable emoji reactions
ALLOW_SCREEN_SHAREtrueEnable screen sharing
SHOW_PARTICIPANT_LISTtrueShow the participant list panel
VariableDefaultDescription
ENABLE_REPORT_ISSUEfalseShow the in-call issue reporting tool
BYPASS_WAITING_ROOMfalseSkip the waiting room and join directly
AVOID_FETCHING_APP_CONFIGtrueSkip fetching remote app configuration on startup

To create a stripped-down experience with no interactive tools, you might disable several flags at once:

vcrBuild.env.sh
export ALLOW_CHAT=false
export ALLOW_EMOJIS=false
export ALLOW_SCREEN_SHARE=false
export ALLOW_ARCHIVING=false
export ALLOW_CAPTIONS=false
export ENABLE_REPORT_ISSUE=false
export SHOW_PARTICIPANT_LIST=false

You have reviewed all the feature flags. Next, you will look at display defaults like resolution and room layout.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html b/tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html new file mode 100644 index 00000000..17af5f0f --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/03-display-defaults/index.html @@ -0,0 +1,68 @@ + Display Defaults | Vonage Coding Exercise + Skip to content

Display Defaults

Beyond feature flags, vcrBuild.env.sh also controls the default visual and performance settings of the video room — the starting resolution, room layout, bitrate limits, and available frame rates.

DEFAULT_RESOLUTION sets the outgoing video resolution when a participant joins.

ValueDescription
1920x1080Full HD
1280x960HD (4:3)
1280x720HD 720p (default)
640x480SD (4:3)
640x360SD 360p
320x240Low (4:3)
320x180Low 180p
Terminal window
export DEFAULT_RESOLUTION='1280x720'

DEFAULT_LAYOUT_MODE controls which layout is shown when a participant first enters the room.

ValueDescription
active-speakerHighlights the current speaker (default)
gridShows all participants in an equal grid
Terminal window
export DEFAULT_LAYOUT_MODE='active-speaker'

These settings control the minimum and maximum selectable bitrate in the Advanced Settings dialog.

VariableDefaultDescription
MIN_CUSTOM_VIDEO_BITRATE_BPS5000Minimum selectable bitrate in bps
MAX_CUSTOM_VIDEO_BITRATE_BPS10000000Maximum selectable bitrate in bps
Terminal window
export MIN_CUSTOM_VIDEO_BITRATE_BPS=5000
export MAX_CUSTOM_VIDEO_BITRATE_BPS=10000000

SUPPORTED_FRAME_RATES defines the frame rate options shown in the Advanced Settings video tab. Values are positive integers separated by |.

Terminal window
export SUPPORTED_FRAME_RATES='30|15|7|1'

You have configured the display defaults. In the next step, you will apply all your changes and verify them.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html b/tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html new file mode 100644 index 00000000..f224d649 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/04-apply-changes/index.html @@ -0,0 +1,68 @@ + Apply Your Changes | Vonage Coding Exercise + Skip to content

Apply Your Changes

With your feature flags and display defaults configured, this step shows you how to apply the changes and confirm they are working in the running app.

After editing vcrBuild.env.sh, save the file and restart the development server:

Terminal window
yarn dev

This reloads both the backend server (port 3345) and the frontend Vite dev server (port 5173) with the updated configuration.

Open http://localhost:5173 and check that your changes are reflected:

  1. Navigate to the waiting room — confirm device selectors appear or are hidden based on WAITING_ROOM_ALLOW_DEVICE_SELECTION.

  2. Join a meeting room — confirm the initial layout matches DEFAULT_LAYOUT_MODE.

  3. Check the toolbar — verify that toggles for chat, screen share, emojis, and archiving match your flag settings.

  4. Open Advanced Settings — confirm the resolution options and bitrate range reflect your DEFAULT_RESOLUTION and bitrate values.

Some settings only take effect when a participant rejoins the room (not on live reload):

  • DEFAULT_LAYOUT_MODE
  • ALLOW_AUDIO_ON_JOIN
  • ALLOW_VIDEO_ON_JOIN

If you changed any of these, leave the room and re-enter to see the updated behaviour.

A typical configure-test cycle:

  1. Edit vcrBuild.env.sh.

  2. Stop the server with Ctrl+C.

  3. Run yarn dev to restart.

  4. Open the app and verify.

Your configuration is live. Head to the final step for further resources.

\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html b/tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html new file mode 100644 index 00000000..e5e8b23d --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/05-whats-next/index.html @@ -0,0 +1,68 @@ + What's Next | Vonage Coding Exercise + Skip to content

What's Next

Congratulations! You have successfully configured the Vonage Video React App's features and display defaults using vcrBuild.env.sh. The app is now tailored to your specific use case.

  • Understood how all frontend configuration flows through vcrBuild.env.sh
  • Enabled and disabled feature flags for media controls, in-call tools, and room behaviour
  • Configured display defaults including resolution, layout mode, bitrate, and frame rates
  • Applied your changes by restarting the dev server and verified them in the browser
\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/404.html b/tutorials/vonage_video_react_app-feature-config/steps/404.html new file mode 100644 index 00000000..71f8eb98 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/404.html @@ -0,0 +1,36 @@ + 404 | Vonage Coding Exercise + Skip to content

404

Page not found. Check the URL or try using the search bar.
\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js new file mode 100644 index 00000000..b2fd2978 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js @@ -0,0 +1 @@ +import{S as r}from"./TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js";class c extends r{set current(e){super.current=e;const t=this.querySelector(".display-current");t&&(t.textContent=e.textContent)}constructor(){super();const e=this.querySelector("details");if(!e)return;const t=()=>{e.open=!1};e.querySelectorAll("a").forEach(s=>{s.addEventListener("click",t)}),window.addEventListener("click",s=>{e.contains(s.target)||t()}),window.addEventListener("keydown",s=>{if(s.key==="Escape"&&e.open){const o=e.contains(document.activeElement);if(t(),o){const n=e.querySelector("summary");n&&n.focus()}}})}}customElements.define("mobile-starlight-toc",c); diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js new file mode 100644 index 00000000..3e69e3a3 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/Search.astro_astro_type_script_index_0_lang.EjmW2doR.js @@ -0,0 +1 @@ +const w="modulepreload",y=function(f){return"/"+f},g={},E=function(m,l,c){let h=Promise.resolve();if(l&&l.length>0){let o=function(n){return Promise.all(n.map(a=>Promise.resolve(a).then(r=>({status:"fulfilled",value:r}),r=>({status:"rejected",reason:r}))))};document.getElementsByTagName("link");const t=document.querySelector("meta[property=csp-nonce]"),u=t?.nonce||t?.getAttribute("nonce");h=o(l.map(n=>{if(n=y(n),n in g)return;g[n]=!0;const a=n.endsWith(".css"),r=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${n}"]${r}`))return;const e=document.createElement("link");if(e.rel=a?"stylesheet":w,a||(e.as="script"),e.crossOrigin="",e.href=n,u&&e.setAttribute("nonce",u),document.head.appendChild(e),a)return new Promise((i,s)=>{e.addEventListener("load",i),e.addEventListener("error",()=>s(new Error(`Unable to preload CSS for ${n}`)))})}))}function d(o){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=o,window.dispatchEvent(t),!t.defaultPrevented)throw o}return h.then(o=>{for(const t of o||[])t.status==="rejected"&&d(t.reason);return m().catch(d)})},S={};class v extends HTMLElement{constructor(){super();const m=this.querySelector("button[data-open-modal]"),l=this.querySelector("button[data-close-modal]"),c=this.querySelector("dialog"),h=this.querySelector(".dialog-frame"),d=e=>{("href"in(e.target||{})||document.body.contains(e.target)&&!h.contains(e.target))&&t()},o=e=>{c.showModal(),document.body.toggleAttribute("data-search-modal-open",!0),this.querySelector("input")?.focus(),e?.stopPropagation(),window.addEventListener("click",d)},t=()=>c.close();m.addEventListener("click",o),m.disabled=!1,l.addEventListener("click",t),c.addEventListener("close",()=>{document.body.toggleAttribute("data-search-modal-open",!1),window.removeEventListener("click",d)}),window.addEventListener("keydown",e=>{(e.metaKey===!0||e.ctrlKey===!0)&&e.key==="k"&&(c.open?t():o(),e.preventDefault())});let u={};try{u=JSON.parse(this.dataset.translations||"{}")}catch{}const r=this.dataset.stripTrailingSlash!==void 0?e=>e.replace(/(.)\/(#.*)?$/,"$1$2"):e=>e;window.addEventListener("DOMContentLoaded",()=>{(window.requestIdleCallback||(i=>setTimeout(i,1)))(async()=>{const{PagefindUI:i}=await E(async()=>{const{PagefindUI:s}=await import("./ui-core.CJyTyO9Y.js");return{PagefindUI:s}},[]);new i({...S,element:"#starlight__search",baseUrl:"/",bundlePath:"/".replace(/\/$/,"")+"/pagefind/",showImages:!1,translations:u,showSubResults:!0,processResult:s=>{s.url=r(s.url),s.sub_results=s.sub_results.map(p=>(p.url=r(p.url),p))}})})})}}customElements.define("site-search",v);export{E as _}; diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js new file mode 100644 index 00000000..53de038b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js @@ -0,0 +1 @@ +const m="_top";class H extends HTMLElement{constructor(){super(),this._current=this.querySelector('a[aria-current="true"]'),this.minH=parseInt(this.dataset.minH||"2",10),this.maxH=parseInt(this.dataset.maxH||"3",10),this.tocHeadingSelector=`h1#${m},:where(${[...Array.from({length:1+this.maxH-this.minH}).map((e,n)=>`h${this.minH+n}`)].join()})[id]`,this.onIdle=e=>(window.requestIdleCallback||(n=>setTimeout(n,1)))(e),this.init=()=>{const e=[...this.querySelectorAll("a")],n=t=>t.matches(this.tocHeadingSelector),i=t=>{if(!t)return null;const h=t;for(;t;){if(t.matches(".sl-markdown-content, main > *"))return document.getElementById(m);if(n(t))return t;const s=t.querySelector(this.tocHeadingSelector);if(s)return s;for(t=t.previousElementSibling;t?.lastElementChild;)t=t.lastElementChild;const o=i(t);if(o)return o}return i(h.parentElement)},c=t=>{for(const{isIntersecting:h,target:s}of t){if(!h)continue;const o=i(s);if(!o)continue;const l=e.find(g=>g.hash==="#"+encodeURIComponent(o.id));if(l){this.current=l;break}}},a=document.querySelectorAll([`main :where(${this.tocHeadingSelector})`,`main :where(${this.tocHeadingSelector}, .sl-heading-wrapper) ~ *:not(:has(${this.tocHeadingSelector}))`,`main .sl-markdown-content > *:not(:has(${this.tocHeadingSelector}))`,`main > *:not(:has(${this.tocHeadingSelector}))`].join());let r;const u=()=>{r||(r=new IntersectionObserver(c,{rootMargin:this.getRootMargin()}),a.forEach(t=>r.observe(t)))};u();let d;window.addEventListener("resize",()=>{r&&(r.disconnect(),r=void 0),clearTimeout(d),d=setTimeout(()=>this.onIdle(u),200)})},this.onIdle(()=>this.init())}set current(e){e!==this._current&&(this._current&&this._current.removeAttribute("aria-current"),e.setAttribute("aria-current","true"),this._current=e)}getRootMargin(){const e=document.querySelector("header")?.getBoundingClientRect().height||0,n=this.querySelector("summary")?.getBoundingClientRect().height||0,i=e+n+32,c=i+53,a=document.documentElement.clientHeight;return`-${i}px 0% ${c-a}px`}}customElements.define("starlight-toc",H);export{H as S}; diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js new file mode 100644 index 00000000..2350adcd --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.0vx5m.js @@ -0,0 +1,3 @@ +try{(()=>{function a(e){if(!e)return;let t=e.getAttribute("tabindex")!==null,r=e.scrollWidth>e.clientWidth;r&&!t?(e.setAttribute("tabindex","0"),e.setAttribute("role","region")):!r&&t&&(e.removeAttribute("tabindex"),e.removeAttribute("role"))}var u=window.requestIdleCallback||(e=>setTimeout(e,1)),s=window.cancelIdleCallback||clearTimeout;function l(e){let t=new Set,r,n;return new ResizeObserver(c=>{c.forEach(o=>t.add(o.target)),r&&clearTimeout(r),n&&s(n),r=setTimeout(()=>{n&&s(n),n=u(()=>{t.forEach(o=>e(o)),t.clear()})},250)})}function i(e,t){e.querySelectorAll?.(".expressive-code pre > code").forEach(r=>{let n=r.parentElement;n&&t.observe(n)})}var d=l(a);i(document,d);var b=new MutationObserver(e=>e.forEach(t=>t.addedNodes.forEach(r=>{i(r,d)})));b.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{i(document,d)});})();}catch(e){console.error("[EC] tabindex-js-module failed:",e)} +try{(()=>{function l(o){let e=document.createElement("pre");Object.assign(e.style,{opacity:"0",pointerEvents:"none",position:"absolute",overflow:"hidden",left:"0",top:"0",width:"20px",height:"20px",webkitUserSelect:"auto",userSelect:"all"}),e.ariaHidden="true",e.textContent=o,document.body.appendChild(e);let a=document.createRange();a.selectNode(e);let n=getSelection();if(!n)return!1;n.removeAllRanges(),n.addRange(a);let r=!1;try{r=document.execCommand("copy")}finally{n.removeAllRanges(),document.body.removeChild(e)}return r}async function u(o){let e=o.currentTarget,a=e.dataset,n=!1,r=a.code.replace(/\u007f/g,` +`);try{await navigator.clipboard.writeText(r),n=!0}catch{n=l(r)}if(!n||e.parentNode?.querySelector(".feedback"))return;let c=e.parentNode?.querySelector("[aria-live]"),t=document.createElement("div");t.classList.add("feedback"),t.append(a.copied),c.append(t),t.offsetWidth,requestAnimationFrame(()=>t?.classList.add("show"));let s=()=>!t||t.classList.remove("show"),d=()=>{!t||parseFloat(getComputedStyle(t).opacity)>0||(t.remove(),t=void 0)};setTimeout(s,1500),setTimeout(d,2500),e.addEventListener("blur",s),t.addEventListener("transitioncancel",d),t.addEventListener("transitionend",d)}function i(o){o.querySelectorAll?.(".expressive-code .copy button").forEach(e=>e.addEventListener("click",u))}i(document);var m=new MutationObserver(o=>o.forEach(e=>e.addedNodes.forEach(a=>{i(a)})));m.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{i(document)});})();}catch(e){console.error("[EC] copy-js-module failed:",e)} \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css new file mode 100644 index 00000000..06a90681 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ec.v4551.css @@ -0,0 +1 @@ +@layer starlight.components{.expressive-code{font-family:var(--ec-uiFontFml);font-size:var(--ec-uiFontSize);font-weight:var(--ec-uiFontWg);line-height:var(--ec-uiLineHt);text-size-adjust:none;-webkit-text-size-adjust:none}.expressive-code *:not(:is(svg, svg *)){all:revert;box-sizing:border-box}.expressive-code pre{display:flex;margin:0;padding:0;border:var(--ec-brdWd) solid var(--ec-brdCol);border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));background:var(--ec-codeBg)}.expressive-code pre:focus-visible{outline:3px solid var(--ec-focusBrd);outline-offset:-3px}.expressive-code pre > code{all:unset;display:block;flex:1 0 100%;padding:var(--ec-codePadBlk) 0;color:var(--ec-codeFg);font-family:var(--ec-codeFontFml);font-size:var(--ec-codeFontSize);font-weight:var(--ec-codeFontWg);line-height:var(--ec-codeLineHt)}.expressive-code pre{overflow-x:auto}.expressive-code pre.wrap .ec-line .code{white-space:pre-wrap;overflow-wrap:break-word;min-width:min(20ch, var(--ecMaxLine, 20ch))}.expressive-code pre.wrap .ec-line .code span.indent{white-space:pre}.expressive-code pre::-webkit-scrollbar,.expressive-code pre::-webkit-scrollbar-track{background-color:inherit;border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));border-top-left-radius:0;border-top-right-radius:0}.expressive-code pre::-webkit-scrollbar-thumb{background-color:var(--ec-sbThumbCol);border:4px solid transparent;background-clip:content-box;border-radius:10px}.expressive-code pre::-webkit-scrollbar-thumb:hover{background-color:var(--ec-sbThumbHoverCol)}.expressive-code .ec-line{direction:ltr;unicode-bidi:isolate;display:grid;grid-template-areas:'gutter code';grid-template-columns:auto 1fr;position:relative}.expressive-code .ec-line .gutter{grid-area:gutter;color:var(--ec-gtrFg)}.expressive-code .ec-line .gutter > *{pointer-events:none;user-select:none;-webkit-user-select:none}.expressive-code .ec-line .gutter ~ .code{--ecLineBrdCol:var(--ec-gtrBrdCol)}.expressive-code .ec-line.highlight .gutter{color:var(--ec-gtrHlFg)}.expressive-code .ec-line .code{grid-area:code;position:relative;box-sizing:content-box;padding-inline-start:calc(var(--ecIndent, 0ch) + var(--ec-codePadInl) - var(--ecGtrBrdWd));padding-inline-end:var(--ec-codePadInl);text-indent:calc(var(--ecIndent, 0ch) * -1)}.expressive-code .ec-line .code::before,.expressive-code .ec-line .code::after,.expressive-code .ec-line .code :where(*){text-indent:0}.expressive-code .ec-line .code{--ecGtrBrdWd:var(--ec-gtrBrdWd);border-inline-start:var(--ecGtrBrdWd) solid var(--ecLineBrdCol, transparent)}.expressive-code .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}.expressive-code .ec-line.mark{--tmLineBgCol:var(--ec-tm-markBg)}.expressive-code .ec-line.mark .code{--ecLineBrdCol:var(--ec-tm-markBrdCol)}.expressive-code .ec-line.ins{--tmLineBgCol:var(--ec-tm-insBg);--tmLabel:var(--ec-tm-insDiffIndContent)}.expressive-code .ec-line.ins .code{--ecLineBrdCol:var(--ec-tm-insBrdCol)}.expressive-code .ec-line.ins .code::before{color:var(--ec-tm-insDiffIndCol)}.expressive-code .ec-line.del{--tmLineBgCol:var(--ec-tm-delBg);--tmLabel:var(--ec-tm-delDiffIndContent)}.expressive-code .ec-line.del .code{--ecLineBrdCol:var(--ec-tm-delBrdCol)}.expressive-code .ec-line.del .code::before{color:var(--ec-tm-delDiffIndCol)}.expressive-code .ec-line.mark,.expressive-code .ec-line.ins,.expressive-code .ec-line.del{background:var(--tmLineBgCol)}.expressive-code .ec-line.mark .code,.expressive-code .ec-line.ins .code,.expressive-code .ec-line.del .code{--ecGtrBrdWd:var(--ec-tm-lineMarkerAccentWd)}.expressive-code .ec-line.mark .code::before,.expressive-code .ec-line.ins .code::before,.expressive-code .ec-line.del .code::before{display:block;position:absolute;left:0;box-sizing:border-box;content:var(--tmLabel, ' ');padding-inline-start:var(--ec-tm-lineDiffIndMargLeft);text-align:center;white-space:pre}.expressive-code .ec-line.mark.tm-label .code::before,.expressive-code .ec-line.ins.tm-label .code::before,.expressive-code .ec-line.del.tm-label .code::before{background:var(--ecLineBrdCol);padding:0 calc(var(--ec-tm-lineMarkerLabelPadInl) + var(--ec-tm-lineMarkerAccentWd)) 0 var(--ec-tm-lineMarkerLabelPadInl);color:var(--ec-tm-lineMarkerLabelCol)}.expressive-code .ec-line mark{--tmInlineBgCol:var(--ec-tm-markBg);--tmInlineBrdCol:var(--ec-tm-markBrdCol)}.expressive-code .ec-line ins{--tmInlineBgCol:var(--ec-tm-insBg);--tmInlineBrdCol:var(--ec-tm-insBrdCol)}.expressive-code .ec-line del{--tmInlineBgCol:var(--ec-tm-delBg);--tmInlineBrdCol:var(--ec-tm-delBrdCol)}.expressive-code .ec-line mark,.expressive-code .ec-line ins,.expressive-code .ec-line del{all:unset;display:inline-block;position:relative;--tmBrdL:var(--ec-tm-inlMarkerBrdWd);--tmBrdR:var(--ec-tm-inlMarkerBrdWd);--tmRadL:var(--ec-tm-inlMarkerBrdRad);--tmRadR:var(--ec-tm-inlMarkerBrdRad);margin-inline:0.025rem;padding-inline:var(--ec-tm-inlMarkerPad);border-radius:var(--tmRadL) var(--tmRadR) var(--tmRadR) var(--tmRadL);background:var(--tmInlineBgCol);background-clip:padding-box}.expressive-code .ec-line mark.open-start,.expressive-code .ec-line ins.open-start,.expressive-code .ec-line del.open-start{margin-inline-start:0;padding-inline-start:0;--tmBrdL:0px;--tmRadL:0}.expressive-code .ec-line mark.open-end,.expressive-code .ec-line ins.open-end,.expressive-code .ec-line del.open-end{margin-inline-end:0;padding-inline-end:0;--tmBrdR:0px;--tmRadR:0}.expressive-code .ec-line mark::before,.expressive-code .ec-line ins::before,.expressive-code .ec-line del::before{content:'';position:absolute;pointer-events:none;display:inline-block;inset:0;border-radius:var(--tmRadL) var(--tmRadR) var(--tmRadR) var(--tmRadL);border:var(--ec-tm-inlMarkerBrdWd) solid var(--tmInlineBrdCol);border-inline-width:var(--tmBrdL) var(--tmBrdR)}.expressive-code .frame{all:unset;position:relative;display:block;--header-border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));--tab-border-radius:calc(var(--ec-frm-edTabBrdRad) + var(--ec-brdWd));--button-spacing:0.4rem;--code-background:var(--ec-frm-edBg);border-radius:var(--header-border-radius);box-shadow:var(--ec-frm-frameBoxShdCssVal)}.expressive-code .frame .header{display:none;z-index:1;position:relative;border-radius:var(--header-border-radius) var(--header-border-radius) 0 0}.expressive-code .frame.has-title pre,.expressive-code .frame.has-title code,.expressive-code .frame.is-terminal pre,.expressive-code .frame.is-terminal code{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.expressive-code .frame .title:empty:before{content:'\a0'}.expressive-code .frame.has-title:not(.is-terminal){--button-spacing:calc(1.9rem + 2 * (var(--ec-uiPadBlk) + var(--ec-frm-edActTabIndHt)))}.expressive-code .frame.has-title:not(.is-terminal) .title{position:relative;color:var(--ec-frm-edActTabFg);background:var(--ec-frm-edActTabBg);background-clip:padding-box;margin-block-start:var(--ec-frm-edTabsMargBlkStart);padding:calc(var(--ec-uiPadBlk) + var(--ec-frm-edActTabIndHt)) var(--ec-uiPadInl);border:var(--ec-brdWd) solid var(--ec-frm-edActTabBrdCol);border-radius:var(--tab-border-radius) var(--tab-border-radius) 0 0;border-bottom:none;overflow:hidden}.expressive-code .frame.has-title:not(.is-terminal) .title::after{content:'';position:absolute;pointer-events:none;inset:0;border-top:var(--ec-frm-edActTabIndHt) solid var(--ec-frm-edActTabIndTopCol);border-bottom:var(--ec-frm-edActTabIndHt) solid var(--ec-frm-edActTabIndBtmCol)}.expressive-code .frame.has-title:not(.is-terminal) .header{display:flex;background:linear-gradient(to top, var(--ec-frm-edTabBarBrdBtmCol) var(--ec-brdWd), transparent var(--ec-brdWd)),linear-gradient(var(--ec-frm-edTabBarBg), var(--ec-frm-edTabBarBg));background-repeat:no-repeat;padding-inline-start:var(--ec-frm-edTabsMargInlStart)}.expressive-code .frame.has-title:not(.is-terminal) .header::before{content:'';position:absolute;pointer-events:none;inset:0;border:var(--ec-brdWd) solid var(--ec-frm-edTabBarBrdCol);border-radius:inherit;border-bottom:none}.expressive-code .frame.is-terminal{--button-spacing:calc(1.9rem + var(--ec-brdWd) + 2 * var(--ec-uiPadBlk));--code-background:var(--ec-frm-trmBg)}.expressive-code .frame.is-terminal .header{display:flex;align-items:center;justify-content:center;padding-block:var(--ec-uiPadBlk);padding-block-end:calc(var(--ec-uiPadBlk) + var(--ec-brdWd));position:relative;font-weight:500;letter-spacing:0.025ch;color:var(--ec-frm-trmTtbFg);background:var(--ec-frm-trmTtbBg);border:var(--ec-brdWd) solid var(--ec-brdCol);border-bottom:none}.expressive-code .frame.is-terminal .header::before{content:'';position:absolute;pointer-events:none;left:var(--ec-uiPadInl);width:2.1rem;height:0.56rem;line-height:0;background-color:var(--ec-frm-trmTtbDotsFg);opacity:var(--ec-frm-trmTtbDotsOpa);-webkit-mask-image:var(--ec-frm-trmIcon);-webkit-mask-repeat:no-repeat;mask-image:var(--ec-frm-trmIcon);mask-repeat:no-repeat}.expressive-code .frame.is-terminal .header::after{content:'';position:absolute;pointer-events:none;inset:0;border-bottom:var(--ec-brdWd) solid var(--ec-frm-trmTtbBrdBtmCol)}.expressive-code .frame pre{background:var(--code-background)}.expressive-code .copy{display:flex;gap:0.25rem;flex-direction:row;position:absolute;inset-block-start:calc(var(--ec-brdWd) + var(--button-spacing));inset-inline-end:calc(var(--ec-brdWd) + var(--ec-uiPadInl) / 2)}@media (scripting: none){.expressive-code .copy{display:none}}.expressive-code .copy{direction:ltr;unicode-bidi:isolate}.expressive-code .copy button{position:relative;align-self:flex-end;margin:0;padding:0;border:none;border-radius:0.2rem;z-index:1;cursor:pointer;transition-property:opacity, background, border-color;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.25, 0.46, 0.45, 0.94);width:2.5rem;height:2.5rem;background:var(--code-background);opacity:0.75}.expressive-code .copy button div{position:absolute;inset:0;border-radius:inherit;background:var(--ec-frm-inlBtnBg);opacity:var(--ec-frm-inlBtnBgIdleOpa);transition-property:inherit;transition-duration:inherit;transition-timing-function:inherit}.expressive-code .copy button::before{content:'';position:absolute;pointer-events:none;inset:0;border-radius:inherit;border:var(--ec-brdWd) solid var(--ec-frm-inlBtnBrd);opacity:var(--ec-frm-inlBtnBrdOpa)}.expressive-code .copy button::after{content:'';position:absolute;pointer-events:none;inset:0;background-color:var(--ec-frm-inlBtnFg);-webkit-mask-image:var(--ec-frm-copyIcon);-webkit-mask-repeat:no-repeat;mask-image:var(--ec-frm-copyIcon);mask-repeat:no-repeat;margin:0.475rem;line-height:0}.expressive-code .copy button:hover,.expressive-code .copy button:focus:focus-visible{opacity:1}.expressive-code .copy button:hover div,.expressive-code .copy button:focus:focus-visible div{opacity:var(--ec-frm-inlBtnBgHoverOrFocusOpa)}.expressive-code .copy button:active{opacity:1}.expressive-code .copy button:active div{opacity:var(--ec-frm-inlBtnBgActOpa)}.expressive-code .copy .feedback{--tooltip-arrow-size:0.35rem;--tooltip-bg:var(--ec-frm-tooltipSuccessBg);color:var(--ec-frm-tooltipSuccessFg);pointer-events:none;user-select:none;-webkit-user-select:none;position:relative;align-self:center;background-color:var(--tooltip-bg);z-index:99;padding:0.125rem 0.75rem;border-radius:0.2rem;margin-inline-end:var(--tooltip-arrow-size);opacity:0;transition-property:opacity, transform;transition-duration:0.2s;transition-timing-function:ease-in-out;transform:translate3d(0, 0.25rem, 0)}.expressive-code .copy .feedback::after{content:'';position:absolute;pointer-events:none;top:calc(50% - var(--tooltip-arrow-size));inset-inline-end:calc(-2 * (var(--tooltip-arrow-size) - 0.5px));border:var(--tooltip-arrow-size) solid transparent;border-inline-start-color:var(--tooltip-bg)}.expressive-code .copy .feedback.show{opacity:1;transform:translate3d(0, 0, 0)}@media (hover: hover){.expressive-code{}.expressive-code .copy button{opacity:0;width:2rem;height:2rem}.expressive-code .frame:hover .copy button:not(:hover),.expressive-code .frame:focus-within :focus-visible ~ .copy button:not(:hover),.expressive-code .frame .copy .feedback.show ~ button:not(:hover){opacity:0.75}}.expressive-code :nth-child(1 of .ec-line) .code{padding-inline-end:calc(2rem + var(--ec-codePadInl))}}@layer starlight.components{:root,:root:not([data-theme='dark']) .expressive-code[data-theme='dark']{--ec-brdRad:0px;--ec-brdWd:1px;--ec-brdCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-codeFontFml:var(--__sl-font-mono);--ec-codeFontSize:var(--sl-text-code);--ec-codeFontWg:400;--ec-codeLineHt:var(--sl-line-height);--ec-codePadBlk:0.75rem;--ec-codePadInl:1rem;--ec-codeBg:#23262f;--ec-codeFg:#d6deeb;--ec-codeSelBg:#1d3b53;--ec-gtrFg:#63798b;--ec-gtrBrdCol:#63798b33;--ec-gtrBrdWd:1.5px;--ec-gtrHlFg:#c5e4fd97;--ec-uiFontFml:var(--__sl-font);--ec-uiFontSize:0.9rem;--ec-uiFontWg:400;--ec-uiLineHt:1.65;--ec-uiPadBlk:0.25rem;--ec-uiPadInl:1rem;--ec-uiSelBg:#234d708c;--ec-uiSelFg:#ffffff;--ec-focusBrd:#122d42;--ec-sbThumbCol:#ffffff17;--ec-sbThumbHoverCol:#ffffff47;--ec-tm-lineMarkerAccentMarg:0rem;--ec-tm-lineMarkerAccentWd:0.15rem;--ec-tm-lineMarkerLabelPadInl:0.2rem;--ec-tm-lineMarkerLabelCol:white;--ec-tm-lineDiffIndMargLeft:0.25rem;--ec-tm-inlMarkerBrdWd:1.5px;--ec-tm-inlMarkerBrdRad:0.2rem;--ec-tm-inlMarkerPad:0.15rem;--ec-tm-insDiffIndContent:'+';--ec-tm-delDiffIndContent:'-';--ec-tm-markBg:#ffffff17;--ec-tm-markBrdCol:#ffffff40;--ec-tm-insBg:#1e571599;--ec-tm-insBrdCol:#487f3bd0;--ec-tm-insDiffIndCol:#79b169d0;--ec-tm-delBg:#862d2799;--ec-tm-delBrdCol:#b4554bd0;--ec-tm-delDiffIndCol:#ed8779d0;--ec-frm-shdCol:#011627;--ec-frm-frameBoxShdCssVal:none;--ec-frm-edActTabBg:var(--sl-color-gray-6);--ec-frm-edActTabFg:var(--sl-color-text);--ec-frm-edActTabBrdCol:transparent;--ec-frm-edActTabIndHt:1px;--ec-frm-edActTabIndTopCol:var(--sl-color-accent-high);--ec-frm-edActTabIndBtmCol:transparent;--ec-frm-edTabsMargInlStart:0;--ec-frm-edTabsMargBlkStart:0;--ec-frm-edTabBrdRad:0px;--ec-frm-edTabBarBg:var(--sl-color-black);--ec-frm-edTabBarBrdCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-edTabBarBrdBtmCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-edBg:var(--sl-color-gray-6);--ec-frm-trmTtbDotsFg:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-trmTtbDotsOpa:0.75;--ec-frm-trmTtbBg:var(--sl-color-black);--ec-frm-trmTtbFg:var(--sl-color-text);--ec-frm-trmTtbBrdBtmCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-trmBg:var(--sl-color-gray-6);--ec-frm-inlBtnFg:var(--sl-color-text);--ec-frm-inlBtnBg:var(--sl-color-text);--ec-frm-inlBtnBgIdleOpa:0;--ec-frm-inlBtnBgHoverOrFocusOpa:0.2;--ec-frm-inlBtnBgActOpa:0.3;--ec-frm-inlBtnBrd:var(--sl-color-text);--ec-frm-inlBtnBrdOpa:0.4;--ec-frm-tooltipSuccessBg:#158744;--ec-frm-tooltipSuccessFg:white;--ec-frm-copyIcon:url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2024%2024'%20fill%3D'none'%20stroke%3D'black'%20stroke-width%3D'1.75'%3E%3Cpath%20d%3D'M3%2019a2%202%200%200%201-1-2V2a2%202%200%200%201%201-1h13a2%202%200%200%201%202%201'%2F%3E%3Crect%20x%3D'6'%20y%3D'5'%20width%3D'16'%20height%3D'18'%20rx%3D'1.5'%20ry%3D'1.5'%2F%3E%3C%2Fsvg%3E");--ec-frm-trmIcon:url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2060%2016'%20preserveAspectRatio%3D'xMidYMid%20meet'%3E%3Ccircle%20cx%3D'8'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'30'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'52'%20cy%3D'8'%20r%3D'8'%2F%3E%3C%2Fsvg%3E")}.expressive-code .ec-line :where(span[style^='--']:not([class])),:root:not([data-theme='dark']) .expressive-code[data-theme='dark'] .ec-line :where(span[style^='--']:not([class])){color:var(--0, inherit);background-color:var(--0bg, transparent);font-style:var(--0fs, inherit);font-weight:var(--0fw, inherit);text-decoration:var(--0td, inherit)}@media (prefers-color-scheme: light){:root:not([data-theme='dark']){--ec-codeBg:#f6f7f9;--ec-codeFg:#403f53;--ec-codeSelBg:#e0e0e0;--ec-gtrFg:#788b94;--ec-gtrBrdCol:#788b9433;--ec-gtrHlFg:#403f53c4;--ec-uiSelBg:#d3e8f8;--ec-uiSelFg:#403f53;--ec-focusBrd:#93a1a1;--ec-sbThumbCol:#0000001a;--ec-sbThumbHoverCol:#0000005c;--ec-tm-markBg:#0000001a;--ec-tm-markBrdCol:#00000055;--ec-tm-insBg:#8ec77d99;--ec-tm-insDiffIndCol:#336a28d0;--ec-tm-delBg:#ff9c8e99;--ec-tm-delDiffIndCol:#9d4138d0;--ec-frm-shdCol:#d9d9d9;--ec-frm-edActTabBg:var(--sl-color-gray-7);--ec-frm-edActTabIndTopCol:var(--sl-color-accent);--ec-frm-edTabBarBg:var(--sl-color-gray-6);--ec-frm-edBg:var(--sl-color-gray-7);--ec-frm-trmTtbBg:var(--sl-color-gray-6);--ec-frm-trmBg:var(--sl-color-gray-7);--ec-frm-tooltipSuccessBg:#078662}:root:not([data-theme='dark']) .expressive-code .ec-line :where(span[style^='--']:not([class])){color:var(--1, inherit);background-color:var(--1bg, transparent);font-style:var(--1fs, inherit);font-weight:var(--1fw, inherit);text-decoration:var(--1td, inherit)}}:root[data-theme='light'] .expressive-code:not([data-theme='dark']),.expressive-code[data-theme='light']{--ec-codeBg:#f6f7f9;--ec-codeFg:#403f53;--ec-codeSelBg:#e0e0e0;--ec-gtrFg:#788b94;--ec-gtrBrdCol:#788b9433;--ec-gtrHlFg:#403f53c4;--ec-uiSelBg:#d3e8f8;--ec-uiSelFg:#403f53;--ec-focusBrd:#93a1a1;--ec-sbThumbCol:#0000001a;--ec-sbThumbHoverCol:#0000005c;--ec-tm-markBg:#0000001a;--ec-tm-markBrdCol:#00000055;--ec-tm-insBg:#8ec77d99;--ec-tm-insDiffIndCol:#336a28d0;--ec-tm-delBg:#ff9c8e99;--ec-tm-delDiffIndCol:#9d4138d0;--ec-frm-shdCol:#d9d9d9;--ec-frm-edActTabBg:var(--sl-color-gray-7);--ec-frm-edActTabIndTopCol:var(--sl-color-accent);--ec-frm-edTabBarBg:var(--sl-color-gray-6);--ec-frm-edBg:var(--sl-color-gray-7);--ec-frm-trmTtbBg:var(--sl-color-gray-6);--ec-frm-trmBg:var(--sl-color-gray-7);--ec-frm-tooltipSuccessBg:#078662}:root[data-theme='light'] .expressive-code:not([data-theme='dark']) .ec-line :where(span[style^='--']:not([class])),.expressive-code[data-theme='light'] .ec-line :where(span[style^='--']:not([class])){color:var(--1, inherit);background-color:var(--1bg, transparent);font-style:var(--1fs, inherit);font-weight:var(--1fw, inherit);text-decoration:var(--1td, inherit)}} \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css b/tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css new file mode 100644 index 00000000..332596bc --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/index.BsKNCfOq.css @@ -0,0 +1 @@ +@layer starlight.base,starlight.reset,starlight.core,starlight.content,starlight.components,starlight.utils;@layer starlight.base{:root,::backdrop{--sl-color-white: hsl(0, 0%, 100%);--sl-color-gray-1: hsl(224, 20%, 94%);--sl-color-gray-2: hsl(224, 6%, 77%);--sl-color-gray-3: hsl(224, 6%, 56%);--sl-color-gray-4: hsl(224, 7%, 36%);--sl-color-gray-5: hsl(224, 10%, 23%);--sl-color-gray-6: hsl(224, 14%, 16%);--sl-color-black: hsl(224, 10%, 10%);--sl-hue-orange: 41;--sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);--sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);--sl-hue-green: 101;--sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);--sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);--sl-hue-blue: 234;--sl-color-blue-low: hsl(var(--sl-hue-blue), 54%, 20%);--sl-color-blue: hsl(var(--sl-hue-blue), 100%, 60%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 100%, 87%);--sl-hue-purple: 281;--sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);--sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);--sl-hue-red: 339;--sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);--sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);--sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);--sl-color-accent-low: hsl(224, 54%, 20%);--sl-color-accent: hsl(224, 100%, 60%);--sl-color-accent-high: hsl(224, 100%, 85%);--sl-color-text: var(--sl-color-gray-2);--sl-color-text-accent: var(--sl-color-accent-high);--sl-color-text-invert: var(--sl-color-accent-low);--sl-color-bg: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-6);--sl-color-bg-sidebar: var(--sl-color-gray-6);--sl-color-bg-inline-code: var(--sl-color-gray-5);--sl-color-bg-accent: var(--sl-color-accent-high);--sl-color-hairline-light: var(--sl-color-gray-5);--sl-color-hairline: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-black);--sl-color-backdrop-overlay: hsla(223, 13%, 10%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .12), 0px 2px 1px hsla(0, 0%, 0%, .24);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .08), 0px 5px 2px hsla(0, 0%, 0%, .08), 0px 3px 2px hsla(0, 0%, 0%, .12), 0px 1px 1px hsla(0, 0%, 0%, .15);--sl-shadow-lg: 0px 25px 7px hsla(0, 0%, 0%, .03), 0px 16px 6px hsla(0, 0%, 0%, .1), 0px 9px 5px hsla(223, 13%, 10%, .33), 0px 4px 4px hsla(0, 0%, 0%, .75), 0px 4px 2px hsla(0, 0%, 0%, .25);--sl-text-2xs: .75rem;--sl-text-xs: .8125rem;--sl-text-sm: .875rem;--sl-text-base: 1rem;--sl-text-lg: 1.125rem;--sl-text-xl: 1.25rem;--sl-text-2xl: 1.5rem;--sl-text-3xl: 1.8125rem;--sl-text-4xl: 2.1875rem;--sl-text-5xl: 2.625rem;--sl-text-6xl: 4rem;--sl-text-body: var(--sl-text-base);--sl-text-body-sm: var(--sl-text-xs);--sl-text-code: var(--sl-text-sm);--sl-text-code-sm: var(--sl-text-xs);--sl-text-h1: var(--sl-text-4xl);--sl-text-h2: var(--sl-text-3xl);--sl-text-h3: var(--sl-text-2xl);--sl-text-h4: var(--sl-text-xl);--sl-text-h5: var(--sl-text-lg);--sl-line-height: 1.75;--sl-line-height-headings: 1.2;--sl-font-system: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--sl-font-system-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--__sl-font: var(--sl-font, var(--sl-font-system)), var(--sl-font-system);--__sl-font-mono: var(--sl-font-mono, var(--sl-font-system-mono)), var(--sl-font-system-mono);--sl-nav-height: 3.5rem;--sl-nav-pad-x: 1rem;--sl-nav-pad-y: .75rem;--sl-mobile-toc-height: 3rem;--sl-sidebar-width: 18.75rem;--sl-sidebar-pad-x: 1rem;--sl-content-width: 45rem;--sl-content-pad-x: 1rem;--sl-content-gap-y: 1rem;--sl-main-pad: 0 0 3vh 0;--sl-menu-button-size: 2rem;--sl-nav-gap: var(--sl-content-pad-x);--sl-outline-offset-inside: -.1875rem;--sl-z-index-toc: 4;--sl-z-index-menu: 5;--sl-z-index-navbar: 10;--sl-z-index-skiplink: 20}:root[data-theme=light],[data-theme=light] ::backdrop{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .06), 0px 2px 1px hsla(0, 0%, 0%, .06);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .03), 0px 5px 2px hsla(0, 0%, 0%, .03), 0px 3px 2px hsla(0, 0%, 0%, .06), 0px 1px 1px hsla(0, 0%, 0%, .06);--sl-shadow-lg: 0px 25px 7px rgba(0, 0, 0, .01), 0px 16px 6px hsla(0, 0%, 0%, .03), 0px 9px 5px hsla(223, 13%, 10%, .08), 0px 4px 4px hsla(0, 0%, 0%, .16), 0px 4px 2px hsla(0, 0%, 0%, .04)}@media(min-width:50em){:root{--sl-nav-height: 4rem;--sl-nav-pad-x: 1.5rem;--sl-text-h1: var(--sl-text-5xl);--sl-text-h2: var(--sl-text-4xl);--sl-text-h3: var(--sl-text-3xl);--sl-text-h4: var(--sl-text-2xl)}}@media(min-width:72rem){:root{--sl-content-pad-x: 1.5rem;--sl-mobile-toc-height: 0rem}}}@layer starlight.reset{*,*:before,*:after{box-sizing:border-box}*{margin:0}html{color-scheme:dark;accent-color:var(--sl-color-accent);-webkit-text-size-adjust:100%;text-size-adjust:100%}html[data-theme=light]{color-scheme:light}body{font-family:var(--__sl-font);line-height:var(--sl-line-height);-webkit-font-smoothing:antialiased;color:var(--sl-color-text);background-color:var(--sl-color-bg)}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6,code{overflow-wrap:break-word}code{font-family:var(--__sl-font-mono)}}@layer starlight.components{.starlight-aside{padding:1rem;border-inline-start:.25rem solid var(--sl-color-asides-border);color:var(--sl-color-white)}.starlight-aside--note{--sl-color-asides-text-accent: var(--sl-color-blue-high);--sl-color-asides-border: var(--sl-color-blue);background-color:var(--sl-color-blue-low)}.starlight-aside--tip{--sl-color-asides-text-accent: var(--sl-color-purple-high);--sl-color-asides-border: var(--sl-color-purple);background-color:var(--sl-color-purple-low)}.starlight-aside--caution{--sl-color-asides-text-accent: var(--sl-color-orange-high);--sl-color-asides-border: var(--sl-color-orange);background-color:var(--sl-color-orange-low)}.starlight-aside--danger{--sl-color-asides-text-accent: var(--sl-color-red-high);--sl-color-asides-border: var(--sl-color-red);background-color:var(--sl-color-red-low)}.starlight-aside__title{display:flex;gap:.5rem;align-items:center;font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);color:var(--sl-color-asides-text-accent)}.starlight-aside__icon{font-size:1.333em;width:1em;height:1em}.starlight-aside__title+.starlight-aside__content{margin-top:.5rem}.starlight-aside__content a{color:var(--sl-color-asides-text-accent)}}@layer starlight.utils{.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sl-hidden{display:none}.sl-flex{display:flex}.sl-block{display:block}@media(min-width:50rem){.md\:sl-hidden{display:none}.md\:sl-flex{display:flex}.md\:sl-block{display:block}}@media(min-width:72rem){.lg\:sl-hidden{display:none}.lg\:sl-flex{display:flex}.lg\:sl-block{display:block}}[data-theme=light] .light\:sl-hidden,[data-theme=dark] .dark\:sl-hidden{display:none}[dir=rtl] .rtl\:flip:not(:where([dir=rtl] [dir=ltr] *)){transform:scaleX(-1)}}@layer starlight.core{.sl-banner:where(.astro-laz2plt2){--__sl-banner-text: var(--sl-color-banner-text, var(--sl-color-text-invert));padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);background-color:var(--sl-color-banner-bg, var(--sl-color-bg-accent));color:var(--__sl-banner-text);line-height:var(--sl-line-height-headings);text-align:center;text-wrap:balance;box-shadow:var(--sl-shadow-sm)}.sl-banner:where(.astro-laz2plt2) a{color:var(--__sl-banner-text)}}@layer starlight.core{.content-panel:where(.astro-7nkwcw3z){padding:1.5rem var(--sl-content-pad-x)}.content-panel:where(.astro-7nkwcw3z)+.content-panel:where(.astro-7nkwcw3z){border-top:1px solid var(--sl-color-hairline)}.sl-container:where(.astro-7nkwcw3z){max-width:var(--sl-content-width)}.sl-container:where(.astro-7nkwcw3z)>*+*{margin-top:1.5rem}@media(min-width:72rem){.sl-container:where(.astro-7nkwcw3z){margin-inline:var(--sl-content-margin-inline, auto)}}}@layer starlight.core{p:where(.astro-opzsrvew){border:1px solid var(--sl-color-orange);padding:.75em 1em;background-color:var(--sl-color-orange-low);color:var(--sl-color-orange-high);width:max-content;max-width:100%;align-items:center;gap:.75em;font-size:var(--sl-text-body-sm);line-height:var(--sl-line-height-headings)}}@layer starlight.core{a:where(.astro-eez2twj6){gap:.5rem;align-items:center;text-decoration:none;color:var(--sl-color-gray-3)}a:where(.astro-eez2twj6):hover{color:var(--sl-color-white)}}@layer starlight.core{.pagination-links:where(.astro-u2l5gyhi){display:grid;grid-template-columns:repeat(auto-fit,minmax(min(18rem,100%),1fr));gap:1rem}a:where(.astro-u2l5gyhi){display:flex;align-items:center;justify-content:flex-start;gap:.5rem;width:100%;flex-basis:calc(50% - .5rem);flex-grow:1;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding:1rem;text-decoration:none;color:var(--sl-color-gray-2);box-shadow:var(--sl-shadow-md);overflow-wrap:anywhere}:where(.astro-u2l5gyhi)[rel=next]{justify-content:end;text-align:end;flex-direction:row-reverse}a:where(.astro-u2l5gyhi):hover{border-color:var(--sl-color-gray-2)}.link-title:where(.astro-u2l5gyhi){color:var(--sl-color-white);font-size:var(--sl-text-2xl);line-height:var(--sl-line-height-headings)}svg:where(.astro-u2l5gyhi){flex-shrink:0}}@layer starlight.core{footer:where(.astro-3yyafb3n){flex-direction:column;gap:1.5rem}.meta:where(.astro-3yyafb3n){gap:.75rem 3rem;justify-content:space-between;flex-wrap:wrap;margin-top:3rem;font-size:var(--sl-text-sm);color:var(--sl-color-gray-3)}.meta:where(.astro-3yyafb3n)>p:only-child{margin-inline-start:auto}.kudos:where(.astro-3yyafb3n){align-items:center;gap:.5em;margin:1.5rem auto;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3)}.kudos:where(.astro-3yyafb3n):hover{color:var(--sl-color-white)}}@layer starlight.components{.kudos:where(.astro-3yyafb3n) svg{color:var(--sl-color-orange)}}@layer starlight.core{label:where(.astro-4yphtoen){--sl-label-icon-size: .875rem;--sl-caret-size: 1.25rem;--sl-inline-padding: .5rem;position:relative;display:flex;align-items:center;gap:.25rem;color:var(--sl-color-gray-1)}label:where(.astro-4yphtoen):hover{color:var(--sl-color-gray-2)}.icon:where(.astro-4yphtoen){position:absolute;top:50%;transform:translateY(-50%);pointer-events:none}select:where(.astro-4yphtoen){border:0;padding-block:.625rem;padding-inline:calc(var(--sl-label-icon-size) + var(--sl-inline-padding) + .25rem) calc(var(--sl-caret-size) + var(--sl-inline-padding) + .25rem);margin-inline:calc(var(--sl-inline-padding) * -1);width:calc(var(--sl-select-width) + var(--sl-inline-padding) * 2);background-color:transparent;text-overflow:ellipsis;color:inherit;cursor:pointer;appearance:none}option:where(.astro-4yphtoen){background-color:var(--sl-color-bg-nav);color:var(--sl-color-gray-1)}@media(min-width:50rem){select:where(.astro-4yphtoen){font-size:var(--sl-text-sm)}}}@layer starlight.components{.label-icon:where(.astro-4yphtoen){font-size:var(--sl-label-icon-size);inset-inline-start:0}.caret:where(.astro-4yphtoen){font-size:var(--sl-caret-size);inset-inline-end:0}}@layer starlight.core{site-search:where(.astro-v37mnknz){display:contents}button:where(.astro-v37mnknz)[data-open-modal]{display:flex;align-items:center;gap:.5rem;border:0;background-color:transparent;color:var(--sl-color-gray-1);cursor:pointer;height:2.5rem;font-size:var(--sl-text-xl)}@media(min-width:50rem){button:where(.astro-v37mnknz)[data-open-modal]{border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;background-color:var(--sl-color-black);color:var(--sl-color-gray-2);font-size:var(--sl-text-sm);width:100%;max-width:22rem}button:where(.astro-v37mnknz)[data-open-modal]:hover{border-color:var(--sl-color-gray-2);color:var(--sl-color-white)}button:where(.astro-v37mnknz)[data-open-modal]>:where(.astro-v37mnknz):last-child{margin-inline-start:auto}}button:where(.astro-v37mnknz)>kbd:where(.astro-v37mnknz){border-radius:.25rem;font-size:var(--sl-text-2xs);gap:.25em;padding-inline:.375rem;background-color:var(--sl-color-gray-6)}kbd:where(.astro-v37mnknz){font-family:var(--__sl-font)}dialog:where(.astro-v37mnknz){margin:0;background-color:var(--sl-color-gray-6);border:1px solid var(--sl-color-gray-5);width:100%;max-width:100%;height:100%;max-height:100%;box-shadow:var(--sl-shadow-lg)}dialog:where(.astro-v37mnknz)[open]{display:flex}dialog:where(.astro-v37mnknz)::backdrop{background-color:var(--sl-color-backdrop-overlay);-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.dialog-frame:where(.astro-v37mnknz){position:relative;overflow:auto;flex-direction:column;flex-grow:1;gap:1rem;padding:1rem}button:where(.astro-v37mnknz)[data-close-modal]{position:absolute;z-index:1;align-items:center;align-self:flex-end;height:calc(64px * var(--pagefind-ui-scale));padding:.25rem;border:0;background:transparent;cursor:pointer;color:var(--sl-color-text-accent)}#starlight__search:where(.astro-v37mnknz){--pagefind-ui-primary: var(--sl-color-text);--pagefind-ui-text: var(--sl-color-gray-2);--pagefind-ui-font: var(--__sl-font);--pagefind-ui-background: var(--sl-color-black);--pagefind-ui-border: var(--sl-color-gray-5);--pagefind-ui-border-width: 1px;--pagefind-ui-tag: var(--sl-color-gray-5);--sl-search-cancel-space: 5rem}:root[data-theme=light] #starlight__search:where(.astro-v37mnknz){--pagefind-ui-tag: var(--sl-color-gray-6)}@media(min-width:50rem){#starlight__search:where(.astro-v37mnknz){--sl-search-cancel-space: 0px}dialog:where(.astro-v37mnknz){margin:4rem auto auto;border-radius:.5rem;width:90%;max-width:40rem;height:max-content;min-height:15rem;max-height:calc(100% - 8rem)}.dialog-frame:where(.astro-v37mnknz){padding:1.5rem}}}@layer starlight.core{.site-title:where(.astro-m46x6ez3){align-items:center;gap:var(--sl-nav-gap);font-size:var(--sl-text-h4);font-weight:600;color:var(--sl-color-text-accent);text-decoration:none;white-space:nowrap;min-width:0}span:where(.astro-m46x6ez3){overflow:hidden}img:where(.astro-m46x6ez3){height:calc(var(--sl-nav-height) - 2 * var(--sl-nav-pad-y));width:auto;max-width:100%;object-fit:contain;object-position:0 50%}}@layer starlight.core{a:where(.astro-wy4te6ga){color:var(--sl-color-text-accent);padding:.5em;margin:-.5em}a:where(.astro-wy4te6ga):hover{opacity:.66}}@layer starlight.core{.header:where(.astro-kmkmnagf){display:flex;gap:var(--sl-nav-gap);justify-content:space-between;align-items:center;height:100%}.title-wrapper:where(.astro-kmkmnagf){overflow:clip;padding:.25rem;margin:-.25rem;min-width:0}.right-group:where(.astro-kmkmnagf),.social-icons:where(.astro-kmkmnagf){gap:1rem;align-items:center}.social-icons:where(.astro-kmkmnagf):after{content:"";height:2rem;border-inline-end:1px solid var(--sl-color-gray-5)}@media(min-width:50rem){:root[data-has-sidebar]{--__sidebar-pad: calc(2 * var(--sl-nav-pad-x))}:root:not([data-has-toc]){--__toc-width: 0rem}.header:where(.astro-kmkmnagf){--__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));--__main-column-fr: calc( ( 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) - (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) - var(--sl-content-width) ) / 2 );display:grid;grid-template-columns:minmax(calc(var(--__sidebar-width) + max(0rem,var(--__main-column-fr) - var(--sl-nav-gap))),auto) 1fr auto;align-content:center}}}@layer starlight.core{.hero:where(.astro-jbfsktt5){display:grid;align-items:center;gap:1rem;padding-bottom:1rem}.hero:where(.astro-jbfsktt5)>img:where(.astro-jbfsktt5),.hero:where(.astro-jbfsktt5)>.hero-html:where(.astro-jbfsktt5){object-fit:contain;width:min(70%,20rem);height:auto;margin-inline:auto}.stack:where(.astro-jbfsktt5){flex-direction:column;gap:clamp(1.5rem,calc(1.5rem + 1vw),2rem);text-align:center}.copy:where(.astro-jbfsktt5){flex-direction:column;gap:1rem;align-items:center}.copy:where(.astro-jbfsktt5)>:where(.astro-jbfsktt5){max-width:50ch}h1:where(.astro-jbfsktt5){font-size:clamp(var(--sl-text-3xl),calc(.25rem + 5vw),var(--sl-text-6xl));line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}.tagline:where(.astro-jbfsktt5){font-size:clamp(var(--sl-text-base),calc(.0625rem + 2vw),var(--sl-text-xl));color:var(--sl-color-gray-2)}.actions:where(.astro-jbfsktt5){gap:1rem 2rem;flex-wrap:wrap;justify-content:center}@media(min-width:50rem){.hero:where(.astro-jbfsktt5){grid-template-columns:7fr 4fr;gap:3%;padding-block:clamp(2.5rem,calc(1rem + 10vmin),10rem)}.hero:where(.astro-jbfsktt5)>img:where(.astro-jbfsktt5),.hero:where(.astro-jbfsktt5)>.hero-html:where(.astro-jbfsktt5){order:2;width:min(100%,25rem)}.stack:where(.astro-jbfsktt5){text-align:start}.copy:where(.astro-jbfsktt5){align-items:flex-start}.actions:where(.astro-jbfsktt5){justify-content:flex-start}}}@layer starlight.content{.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:not(a,strong,em,del,span,input,code,br,:where(.not-content *)){margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:is(astro-island,astro-slot)>:not(a,strong,em,del,span,input,code,br,:where(.not-content *)):first-child{margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6)+:is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){margin-top:1.5em}.sl-markdown-content li+li:not(:where(.not-content *)),.sl-markdown-content dt+dt:not(:where(.not-content *)),.sl-markdown-content dt+dd:not(:where(.not-content *)),.sl-markdown-content dd+dd:not(:where(.not-content *)){margin-top:.25rem}.sl-markdown-content li:not(:where(.not-content *)){overflow-wrap:anywhere}.sl-markdown-content li>:is(:last-child:not(li,ul,ol,a,strong,em,del,span,input,code,br,script,:where(.not-content *)),:not(script):has(~script:last-child):not(:has(~:not(script)))){margin-bottom:1.25rem}.sl-markdown-content dt:not(:where(.not-content *)){font-weight:700}.sl-markdown-content dd:not(:where(.not-content *)){padding-inline-start:1rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){color:var(--sl-color-white);line-height:var(--sl-line-height-headings);font-weight:600}.sl-markdown-content :is(img,picture,video,canvas,svg,iframe):not(:where(.not-content *)){display:block;max-width:100%;height:auto}.sl-markdown-content h1:not(:where(.not-content *)){font-size:var(--sl-text-h1)}.sl-markdown-content h2:not(:where(.not-content *)){font-size:var(--sl-text-h2)}.sl-markdown-content h3:not(:where(.not-content *)){font-size:var(--sl-text-h3)}.sl-markdown-content h4:not(:where(.not-content *)){font-size:var(--sl-text-h4)}.sl-markdown-content h5:not(:where(.not-content *)){font-size:var(--sl-text-h5)}.sl-markdown-content h6:not(:where(.not-content *)){font-size:var(--sl-text-h6)}.sl-markdown-content a:not(:where(.not-content *)){color:var(--sl-color-text-accent)}.sl-markdown-content a:hover:not(:where(.not-content *)){color:var(--sl-color-white)}.sl-markdown-content code:not(:where(.not-content *)){background-color:var(--sl-color-bg-inline-code);margin-block:-.125rem;padding:.125rem .375rem;font-size:var(--sl-text-code-sm)}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) code{font-size:inherit}.sl-markdown-content pre:not(:where(.not-content *)){border:1px solid var(--sl-color-gray-5);padding:.75rem 1rem;font-size:var(--sl-text-code);tab-size:2}.sl-markdown-content pre code:not(:where(.not-content *)){all:unset;font-family:var(--__sl-font-mono)}.sl-markdown-content blockquote:not(:where(.not-content *)){border-inline-start:1px solid var(--sl-color-gray-5);padding-inline-start:1rem}.sl-markdown-content table:not(:where(.not-content *)){display:block;overflow:auto;border-spacing:0}.sl-markdown-content :is(th,td):not(:where(.not-content *)){border-bottom:1px solid var(--sl-color-gray-5);padding:.5rem 1rem;vertical-align:baseline}.sl-markdown-content :is(th:first-child,td:first-child):not(:where(.not-content *)){padding-inline-start:0}.sl-markdown-content :is(th:last-child,td:last-child):not(:where(.not-content *)){padding-inline-end:0}.sl-markdown-content th:not(:where(.not-content *)){color:var(--sl-color-white);font-weight:600}.sl-markdown-content th:not([align]):not(:where(.not-content *)){text-align:start}.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:var(--sl-color-gray-4)}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)){.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)}}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)){.sl-markdown-content .starlight-aside code:not(:where(.not-content *)){background-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)}}.sl-markdown-content hr:not(:where(.not-content *)){border:0;border-bottom:1px solid var(--sl-color-hairline)}.sl-markdown-content details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-gray-5);--sl-details-border-color--hover: var(--sl-color-text-accent);border-inline-start:2px solid var(--sl-details-border-color);padding-inline-start:1rem}.sl-markdown-content details:not([open]):hover:not(:where(.not-content *)),.sl-markdown-content details:has(>summary:hover):not(:where(.not-content *)){border-color:var(--sl-details-border-color--hover)}.sl-markdown-content summary:not(:where(.not-content *)){color:var(--sl-color-white);cursor:pointer;display:block;font-weight:600;margin-inline-start:-.5rem;padding-inline-start:.5rem}.sl-markdown-content details[open]>summary:not(:where(.not-content *)){margin-bottom:1rem}.sl-markdown-content summary:not(:where(.not-content *))::marker,.sl-markdown-content summary:not(:where(.not-content *))::-webkit-details-marker{display:none}.sl-markdown-content summary:not(:where(.not-content *)):before{--sl-details-marker-size: 1.25rem;background-color:currentColor;content:"";display:inline-block;height:var(--sl-details-marker-size);width:var(--sl-details-marker-size);margin-inline:calc((var(--sl-details-marker-size) / 4) * -1) .25rem;vertical-align:middle;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media(prefers-reduced-motion:no-preference){.sl-markdown-content summary:not(:where(.not-content *)):before{transition:transform .2s ease-in-out}}.sl-markdown-content details[open]>summary:not(:where(.not-content *)):before{transform:rotate(90deg)}[dir=rtl] .sl-markdown-content summary:not(:where(.not-content *)):before,.sl-markdown-content [dir=rtl] summary:not(:where(.not-content *)):before{transform:rotate(180deg)}.sl-markdown-content summary:not(:where(.not-content *)) p:only-child{display:inline}.sl-markdown-content .starlight-aside details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-asides-border);--sl-details-border-color--hover: var(--sl-color-asides-text-accent)}}@layer starlight.core{[data-mobile-menu-expanded]{overflow:hidden}@media(min-width:50rem){[data-mobile-menu-expanded]{overflow:auto}}}@layer starlight.core{button:where(.astro-jif73yzw){position:fixed;top:calc((var(--sl-nav-height) - var(--sl-menu-button-size)) / 2);inset-inline-end:var(--sl-nav-pad-x);z-index:var(--sl-z-index-navbar);border:0;border-radius:50%;width:var(--sl-menu-button-size);height:var(--sl-menu-button-size);padding:.5rem;background-color:var(--sl-color-white);color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);cursor:pointer}:where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw){background-color:var(--sl-color-gray-2);box-shadow:none}:where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw) .open-menu:where(.astro-jif73yzw){display:none}:where(.astro-jif73yzw):not([aria-expanded=true]) button:where(.astro-jif73yzw) .close-menu:where(.astro-jif73yzw){display:none}[data-theme=light] button:where(.astro-jif73yzw){background-color:var(--sl-color-black);color:var(--sl-color-white)}[data-theme=light] :where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw){background-color:var(--sl-color-gray-5)}}@layer starlight.core{.page:where(.astro-vrdttmbt){flex-direction:column;min-height:100vh}.header:where(.astro-vrdttmbt){z-index:var(--sl-z-index-navbar);position:fixed;inset-inline-start:0;inset-block-start:0;width:100%;height:var(--sl-nav-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);padding-inline-end:var(--sl-nav-pad-x);background-color:var(--sl-color-bg-nav)}[data-has-sidebar] .header:where(.astro-vrdttmbt){padding-inline-end:calc(var(--sl-nav-gap) + var(--sl-nav-pad-x) + var(--sl-menu-button-size))}.sidebar-pane:where(.astro-vrdttmbt){visibility:var(--sl-sidebar-visibility, hidden);position:fixed;z-index:var(--sl-z-index-menu);inset-block:var(--sl-nav-height) 0;inset-inline-start:0;width:100%;background-color:var(--sl-color-black);overflow-y:auto}[aria-expanded=true]~.sidebar-pane:where(.astro-vrdttmbt){--sl-sidebar-visibility: visible}.sidebar-content:where(.astro-vrdttmbt){height:100%;min-height:max-content;padding:1rem var(--sl-sidebar-pad-x) 0;flex-direction:column;gap:1rem}@media(min-width:50rem){.sidebar-content:where(.astro-vrdttmbt):after{content:"";padding-bottom:1px}}.main-frame:where(.astro-vrdttmbt){padding-top:calc(var(--sl-nav-height) + var(--sl-mobile-toc-height));padding-inline-start:var(--sl-content-inline-start)}@media(min-width:50rem){[data-has-sidebar] .header:where(.astro-vrdttmbt){padding-inline-end:var(--sl-nav-pad-x)}.sidebar-pane:where(.astro-vrdttmbt){--sl-sidebar-visibility: visible;width:var(--sl-sidebar-width);background-color:var(--sl-color-bg-sidebar);border-inline-end:1px solid var(--sl-color-hairline-shade)}}}@layer starlight.core{ul:where(.astro-g2bywc46){padding:0;list-style:none}a:where(.astro-g2bywc46){--pad-inline: .5rem;display:block;border-radius:.25rem;padding-block:.25rem;padding-inline:calc(1rem * var(--depth) + var(--pad-inline)) var(--pad-inline);line-height:1.25}a:where(.astro-g2bywc46)[aria-current=true]{color:var(--sl-color-text-accent)}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46){--pad-inline: 1rem;display:flex;justify-content:space-between;gap:var(--pad-inline);border-top:1px solid var(--sl-color-gray-6);border-radius:0;padding-block:.5rem;color:var(--sl-color-text);font-size:var(--sl-text-sm);text-decoration:none;outline-offset:var(--sl-outline-offset-inside)}.isMobile:where(.astro-g2bywc46):first-child>li:where(.astro-g2bywc46):first-child>a:where(.astro-g2bywc46){border-top:0}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true],.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:hover,.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:focus{color:var(--sl-color-white);background-color:unset}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:after{content:"";width:1rem;background-color:var(--sl-color-text-accent);-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;flex-shrink:0}}@layer starlight.core{nav:where(.astro-doynk5tl){position:fixed;z-index:var(--sl-z-index-toc);top:calc(var(--sl-nav-height) - 1px);inset-inline:0;border-top:1px solid var(--sl-color-gray-5);background-color:var(--sl-color-bg-nav)}@media(min-width:50rem){nav:where(.astro-doynk5tl){inset-inline-start:var(--sl-content-inline-start, 0)}}summary:where(.astro-doynk5tl){gap:.5rem;align-items:center;height:var(--sl-mobile-toc-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:.5rem 1rem;font-size:var(--sl-text-xs);outline-offset:var(--sl-outline-offset-inside)}summary:where(.astro-doynk5tl)::marker,summary:where(.astro-doynk5tl)::-webkit-details-marker{display:none}.toggle:where(.astro-doynk5tl){flex-shrink:0;gap:1rem;align-items:center;justify-content:space-between;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-block:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;line-height:1;background-color:var(--sl-color-black);user-select:none;cursor:pointer}details:where(.astro-doynk5tl)[open] .toggle:where(.astro-doynk5tl){color:var(--sl-color-white);border-color:var(--sl-color-accent)}details:where(.astro-doynk5tl) .toggle:where(.astro-doynk5tl):hover{color:var(--sl-color-white);border-color:var(--sl-color-gray-2)}[dir=rtl] .caret:where(.astro-doynk5tl){transform:rotate(180deg)}details:where(.astro-doynk5tl)[open] .caret:where(.astro-doynk5tl){transform:rotate(90deg)}.display-current:where(.astro-doynk5tl){white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--sl-color-white)}.dropdown:where(.astro-doynk5tl){--border-top: 1px;margin-top:calc(-1 * var(--border-top));border:var(--border-top) solid var(--sl-color-gray-6);border-top-color:var(--sl-color-hairline-shade);max-height:calc(85vh - var(--sl-nav-height) - var(--sl-mobile-toc-height));overflow-y:auto;background-color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);overscroll-behavior:contain}}@layer starlight.core{.right-sidebar-panel:where(.astro-pb3aqygn){padding:1rem var(--sl-sidebar-pad-x)}.sl-container:where(.astro-pb3aqygn){width:calc(var(--sl-sidebar-width) - 2 * var(--sl-sidebar-pad-x))}.right-sidebar-panel:where(.astro-pb3aqygn) h2{color:var(--sl-color-white);font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);margin-bottom:.5rem}.right-sidebar-panel:where(.astro-pb3aqygn) :where(a){display:block;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3);overflow-wrap:anywhere}.right-sidebar-panel:where(.astro-pb3aqygn) :where(a):hover{color:var(--sl-color-white)}@media(min-width:72rem){.sl-container:where(.astro-pb3aqygn){max-width:calc(((100vw - var(--sl-sidebar-width) - 2 * var(--sl-content-pad-x) - 2 * var(--sl-sidebar-pad-x)) * .25))}}}@layer starlight.core{h1:where(.astro-j6tvhyss){margin-top:1rem;font-size:var(--sl-text-h1);line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}}@layer starlight.core{.social-icons:where(.astro-wu23bvmt){display:flex;margin-inline-end:auto;gap:1rem;align-items:center;padding-block:1rem}.social-icons:where(.astro-wu23bvmt):empty{display:none}.mobile-preferences:where(.astro-wu23bvmt){justify-content:space-between;flex-wrap:wrap;border-top:1px solid var(--sl-color-gray-6);column-gap:1rem;padding:.5rem 0}}@layer starlight.core{sl-sidebar-state-persist:where(.astro-kku4brbg){display:contents}}@layer starlight.core{ul:where(.astro-3ii7xxms){--sl-sidebar-item-padding-inline: .5rem;list-style:none;padding:0}li:where(.astro-3ii7xxms){overflow-wrap:anywhere}ul:where(.astro-3ii7xxms) ul:where(.astro-3ii7xxms) li:where(.astro-3ii7xxms){margin-inline-start:var(--sl-sidebar-item-padding-inline);border-inline-start:1px solid var(--sl-color-hairline-light);padding-inline-start:var(--sl-sidebar-item-padding-inline)}.large:where(.astro-3ii7xxms){font-size:var(--sl-text-lg);font-weight:600;color:var(--sl-color-white)}.top-level:where(.astro-3ii7xxms)>li:where(.astro-3ii7xxms)+li:where(.astro-3ii7xxms){margin-top:.75rem}summary:where(.astro-3ii7xxms){display:flex;align-items:center;justify-content:space-between;padding:.2em var(--sl-sidebar-item-padding-inline);line-height:1.4;cursor:pointer;user-select:none}summary:where(.astro-3ii7xxms)::marker,summary:where(.astro-3ii7xxms)::-webkit-details-marker{display:none}.caret:where(.astro-3ii7xxms){transition:transform .2s ease-in-out;flex-shrink:0}[dir=rtl] .caret:where(.astro-3ii7xxms){transform:rotate(180deg)}:where(.astro-3ii7xxms)[open]>summary:where(.astro-3ii7xxms) .caret:where(.astro-3ii7xxms){transform:rotate(90deg)}a:where(.astro-3ii7xxms){display:block;border-radius:.25rem;text-decoration:none;color:var(--sl-color-gray-2);padding:.3em var(--sl-sidebar-item-padding-inline);line-height:1.4}a:where(.astro-3ii7xxms):hover,a:where(.astro-3ii7xxms):focus{color:var(--sl-color-white)}:where(.astro-3ii7xxms)[aria-current=page],:where(.astro-3ii7xxms)[aria-current=page]:hover,:where(.astro-3ii7xxms)[aria-current=page]:focus{font-weight:600;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}a:where(.astro-3ii7xxms)>:where(.astro-3ii7xxms):not(:last-child),.group-label:where(.astro-3ii7xxms)>:where(.astro-3ii7xxms):not(:last-child){margin-inline-end:.25em}@media(min-width:50rem){.top-level:where(.astro-3ii7xxms)>li:where(.astro-3ii7xxms)+li:where(.astro-3ii7xxms){margin-top:.5rem}.large:where(.astro-3ii7xxms){font-size:var(--sl-text-base)}a:where(.astro-3ii7xxms){font-size:var(--sl-text-sm)}}}@layer starlight.core{a:where(.astro-7q3lir66){clip:rect(0,0,0,0);position:fixed;top:.75rem;inset-inline-start:.75rem}a:where(.astro-7q3lir66):focus{clip:unset;z-index:var(--sl-z-index-skiplink);display:block;padding:.5rem 1rem;text-decoration:none;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent);box-shadow:var(--sl-shadow-lg)}}@layer starlight.core{.main-pane:where(.astro-67yu43on){isolation:isolate}@media(min-width:72rem){.right-sidebar-container:where(.astro-67yu43on){order:2;position:relative;width:calc(var(--sl-sidebar-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}.right-sidebar:where(.astro-67yu43on){position:fixed;top:0;border-inline-start:1px solid var(--sl-color-hairline);padding-top:var(--sl-nav-height);width:100%;height:100vh;overflow-y:auto;scrollbar-width:none}.main-pane:where(.astro-67yu43on){width:100%}[data-has-sidebar][data-has-toc] .main-pane:where(.astro-67yu43on){--sl-content-margin-inline: auto 0;order:1;width:calc(var(--sl-content-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}}}html:not([data-has-toc]){--sl-mobile-toc-height: 0rem}html:not([data-has-sidebar]){--sl-content-width: 67.5rem}html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height) + var(--sl-mobile-toc-height))}main:where(.astro-bguv2lll){padding:var(--sl-main-pad)}@media(min-width:50em){:where(.astro-bguv2lll)[data-has-sidebar]{--sl-content-inline-start: var(--sl-sidebar-width)}}@media(min-width:72em){html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height))}} diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js new file mode 100644 index 00000000..bb3de36b --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/page.B1D-nYk3.js @@ -0,0 +1 @@ +const v={},d=new Set,s=new WeakSet;let f=!0,h,l=!1;function g(e){l||(l=!0,f??=!1,h??="hover",p(),w(),y(),S())}function p(){for(const e of["touchstart","mousedown"])document.addEventListener(e,t=>{a(t.target,"tap")&&c(t.target.href,{ignoreSlowConnection:!0})},{passive:!0})}function w(){let e;document.body.addEventListener("focusin",n=>{a(n.target,"hover")&&t(n)},{passive:!0}),document.body.addEventListener("focusout",o,{passive:!0}),u(()=>{for(const n of document.getElementsByTagName("a"))s.has(n)||a(n,"hover")&&(s.add(n),n.addEventListener("mouseenter",t,{passive:!0}),n.addEventListener("mouseleave",o,{passive:!0}))});function t(n){const r=n.target.href;e&&clearTimeout(e),e=setTimeout(()=>{c(r)},80)}function o(){e&&(clearTimeout(e),e=0)}}function y(){let e;u(()=>{for(const t of document.getElementsByTagName("a"))s.has(t)||a(t,"viewport")&&(s.add(t),e??=L(),e.observe(t))})}function L(){const e=new WeakMap;return new IntersectionObserver((t,o)=>{for(const n of t){const r=n.target,i=e.get(r);n.isIntersecting?(i&&clearTimeout(i),e.set(r,setTimeout(()=>{o.unobserve(r),e.delete(r),c(r.href)},300))):i&&(clearTimeout(i),e.delete(r))}})}function S(){u(()=>{for(const e of document.getElementsByTagName("a"))a(e,"load")&&c(e.href)})}function c(e,t){e=e.replace(/#.*/,"");const o=t?.ignoreSlowConnection??!1;if(E(e,o))if(d.add(e),document.createElement("link").relList?.supports?.("prefetch")&&t?.with!=="fetch"){const n=document.createElement("link");n.rel="prefetch",n.setAttribute("href",e),document.head.append(n)}else{const n=new Headers;for(const[r,i]of Object.entries(v))n.set(r,i);fetch(e,{priority:"low",headers:n})}}function E(e,t){if(!navigator.onLine||!t&&m())return!1;try{const o=new URL(e,location.href);return location.origin===o.origin&&(location.pathname!==o.pathname||location.search!==o.search)&&!d.has(e)}catch{}return!1}function a(e,t){if(e?.tagName!=="A")return!1;const o=e.dataset.astroPrefetch;return o==="false"?!1:t==="tap"&&(o!=null||f)&&m()?!0:o==null&&f||o===""?t===h:o===t}function m(){if("connection"in navigator){const e=navigator.connection;return e.saveData||/2g/.test(e.effectiveType)}return!1}function u(e){e();let t=!1;document.addEventListener("astro:page-load",()=>{if(!t){t=!0;return}e()})}g(); diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css b/tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css new file mode 100644 index 00000000..f721e686 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/print.DNXP8c50.css @@ -0,0 +1 @@ +@media print{:root{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: none;--sl-shadow-md: none;--sl-shadow-lg: none}.print\:hidden{display:none}.print\:flex{display:flex}.print\:block{display:block}main{padding-bottom:0}main>.content-panel{padding-block-start:0}.content-panel+.content-panel{border:0}.page>header{position:relative}.page>.main-frame{padding-top:0;padding-inline-start:0}.main-pane{--sl-sidebar-width: 0px;--sl-content-width: 100%}.sl-banner{--sl-color-banner-text: var(--sl-color-white);background-color:transparent}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6){break-after:avoid}.sl-markdown-content :is(p,li){orphans:2;widows:2}.sl-markdown-content pre{overflow-x:hidden;white-space:pre-wrap}.sl-markdown-content .expressive-code,.sl-markdown-content figure,.sl-markdown-content pre{break-inside:avoid}.expressive-code .frame.is-terminal .header:before{box-shadow:inset 99rem 99rem var(--sl-color-gray-5)}.expressive-code .frame.has-title:not(.is-terminal) .header{background:transparent;border-bottom:1px solid var(--sl-color-gray-6)}.expressive-code .frame.has-title:not(.is-terminal) .title{background:transparent}.expressive-code .frame.has-title:not(.is-terminal) .title:after{border-top:0}.expressive-code .copy{display:none}.sl-markdown-content code:not(:where(.not-content *)){background-color:transparent;padding:0;margin-block:unset;font-size:.9375em}.sl-badge{background:transparent;color:var(--sl-color-white)}starlight-file-tree{break-inside:avoid}starlight-file-tree .highlight{outline:3px solid var(--sl-color-accent-low);color:var(--sl-color-text);background-color:transparent}.starlight-aside{break-inside:avoid}.sl-link-button.primary{background:transparent;border-color:var(--sl-color-white);color:var(--sl-color-white)}starlight-tabs{break-inside:avoid}.sl-steps>li:after{box-shadow:inset 99rem 99rem var(--sl-color-hairline-light)}} diff --git a/tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js new file mode 100644 index 00000000..9be6715a --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/_astro/ui-core.CJyTyO9Y.js @@ -0,0 +1,2 @@ +import{_ as is}from"./Search.astro_astro_type_script_index_0_lang.EjmW2doR.js";var os=Object.defineProperty,F=(e,u)=>{for(var t in u)os(e,t,{get:u[t],enumerable:!0})};function P(){}function hu(e){return e()}function ye(){return Object.create(null)}function W(e){e.forEach(hu)}function Cu(e){return typeof e=="function"}function fe(e,u){return e!=e?u==u:e!==u||e&&typeof e=="object"||typeof e=="function"}var oe;function ce(e,u){return oe||(oe=document.createElement("a")),oe.href=u,e===oe.href}function _s(e){return Object.keys(e).length===0}function B(e,u){e.appendChild(u)}function T(e,u,t){e.insertBefore(u,t||null)}function p(e){e.parentNode&&e.parentNode.removeChild(e)}function ie(e,u){for(let t=0;te.removeEventListener(u,t,r)}function g(e,u,t){t==null?e.removeAttribute(u):e.getAttribute(u)!==t&&e.setAttribute(u,t)}function fs(e){return Array.from(e.childNodes)}function j(e,u){u=""+u,e.data!==u&&(e.data=u)}function ze(e,u){e.value=u??""}function K(e,u,t){e.classList[t?"add":"remove"](u)}var Es=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,u,t=null){this.e||(this.is_svg?this.e=cs(u.nodeName):this.e=v(u.nodeType===11?"TEMPLATE":u.nodeName),this.t=u.tagName!=="TEMPLATE"?u:u.content,this.c(e)),this.i(t)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let u=0;ue.indexOf(r)===-1?u.push(r):t.push(r)),t.forEach(r=>r()),$=u}var _e=new Set,J;function le(){J={r:0,c:[],p:J}}function ne(){J.r||W(J.c),J=J.p}function z(e,u){e&&e.i&&(_e.delete(e),e.i(u))}function U(e,u,t,r){if(e&&e.o){if(_e.has(e))return;_e.add(e),J.c.push(()=>{_e.delete(e),r&&(t&&e.d(1),r())}),e.o(u)}else r&&r()}function Bs(e,u){U(e,1,1,()=>{u.delete(e.key)})}function vs(e,u,t,r,s,a,l,n,i,f,o,h){let C=e.length,E=a.length,c=C;const _={};for(;c--;)_[e[c].key]=c;const d=[],R=new Map,A=new Map,k=[];for(c=E;c--;){const D=h(s,a,c),S=t(D);let w=l.get(S);w?k.push(()=>w.p(D,u)):(w=f(S,D),w.c()),R.set(S,d[c]=w),S in _&&A.set(S,Math.abs(c-_[S]))}const y=new Set,q=new Set;function L(D){z(D,1),D.m(n,o),l.set(D.key,D),o=D.first,E--}for(;C&&E;){const D=d[E-1],S=e[C-1],w=D.key,x=S.key;D===S?(o=D.first,C--,E--):R.has(x)?!l.has(w)||y.has(w)?L(D):q.has(x)?C--:A.get(w)>A.get(x)?(q.add(w),L(D)):(y.add(x),C--):(i(S,l),C--)}for(;C--;){const D=e[C];R.has(D.key)||i(D,l)}for(;E;)L(d[E-1]);return W(k),d}function ps(e,u,t){const r=e.$$.props[u];r!==void 0&&(e.$$.bound[r]=t,t(e.$$.ctx[r]))}function ke(e){e&&e.c()}function Ee(e,u,t,r){const{fragment:s,after_update:a}=e.$$;s&&s.m(u,t),r||Te(()=>{const l=e.$$.on_mount.map(hu).filter(Cu);e.$$.on_destroy?e.$$.on_destroy.push(...l):W(l),e.$$.on_mount=[]}),a.forEach(Te)}function de(e,u){const t=e.$$;t.fragment!==null&&(Rs(t.after_update),W(t.on_destroy),t.fragment&&t.fragment.d(u),t.on_destroy=t.fragment=null,t.ctx=[])}function Ts(e,u){e.$$.dirty[0]===-1&&(X.push(e),ms(),e.$$.dirty.fill(0)),e.$$.dirty[u/31|0]|=1<{const c=E.length?E[0]:C;return f.ctx&&s(f.ctx[h],f.ctx[h]=c)&&(!f.skip_bound&&f.bound[h]&&f.bound[h](c),o&&Ts(e,h)),C}):[],f.update(),o=!0,W(f.before_update),f.fragment=r?r(f.ctx):!1,u.target){if(u.hydrate){const h=fs(u.target);f.fragment&&f.fragment.l(h),h.forEach(p)}else f.fragment&&f.fragment.c();u.intro&&z(e.$$.fragment),Ee(e,u.target,u.anchor,u.customElement),gu()}re(i)}var Ce=class{$destroy(){de(this,1),this.$destroy=P}$on(e,u){if(!Cu(u))return P;const t=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return t.push(u),()=>{const r=t.indexOf(u);r!==-1&&t.splice(r,1)}}$set(e){this.$$set&&!_s(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function O(e){const u=typeof e=="string"?e.charCodeAt(0):e;return u>=97&&u<=122||u>=65&&u<=90}function Q(e){const u=typeof e=="string"?e.charCodeAt(0):e;return u>=48&&u<=57}function V(e){return O(e)||Q(e)}var Fs=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"],je={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"},ks={}.hasOwnProperty;function Au(e,u={}){const t=Oe(),r=String(e),s=r.toLowerCase();let a=0;if(e==null)throw new Error("Expected string, got `"+e+"`");if(ks.call(je,s)){const n=je[s];return(u.normalize===void 0||u.normalize===null||u.normalize)&&typeof n=="string"?Au(n):(t[Fs.includes(s)?"regular":"irregular"]=r,t)}for(;O(s.charCodeAt(a))&&a<9;)a++;if(a>1&&a<9){if(t.language=r.slice(0,a),a<4){let n=0;for(;s.charCodeAt(a)===45&&O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&O(s.charCodeAt(a+3))&&!O(s.charCodeAt(a+4));){if(n>2)return l(a,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(r.slice(a+1,a+4)),a+=4,n++}}for(s.charCodeAt(a)===45&&O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&O(s.charCodeAt(a+3))&&O(s.charCodeAt(a+4))&&!O(s.charCodeAt(a+5))&&(t.script=r.slice(a+1,a+5),a+=5),s.charCodeAt(a)===45&&(O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&!O(s.charCodeAt(a+3))?(t.region=r.slice(a+1,a+3),a+=3):Q(s.charCodeAt(a+1))&&Q(s.charCodeAt(a+2))&&Q(s.charCodeAt(a+3))&&!Q(s.charCodeAt(a+4))&&(t.region=r.slice(a+1,a+4),a+=4));s.charCodeAt(a)===45;){const n=a+1;let i=n;for(;V(s.charCodeAt(i));){if(i-n>7)return l(i,1,"Too long variant, expected at most 8 characters");i++}if(i-n>4||i-n>3&&Q(s.charCodeAt(n)))t.variants.push(r.slice(n,i)),a=i;else break}for(;s.charCodeAt(a)===45&&!(s.charCodeAt(a+1)===120||!V(s.charCodeAt(a+1))||s.charCodeAt(a+2)!==45||!V(s.charCodeAt(a+3)));){let n=a+2,i=0;for(;s.charCodeAt(n)===45&&V(s.charCodeAt(n+1))&&V(s.charCodeAt(n+2));){const f=n+1;for(n=f+2,i++;V(s.charCodeAt(n));){if(n-f>7)return l(n,2,"Too long extension, expected at most 8 characters");n++}}if(!i)return l(n,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:r.charAt(a+1),extensions:r.slice(a+3,n).split("-")}),a=n}}else a=0;if(a===0&&s.charCodeAt(a)===120||s.charCodeAt(a)===45&&s.charCodeAt(a+1)===120){a=a?a+2:1;let n=a;for(;s.charCodeAt(n)===45&&V(s.charCodeAt(n+1));){const i=a+1;for(n=i;V(s.charCodeAt(n));){if(n-i>7)return l(n,5,"Too long private-use area, expected at most 8 characters");n++}t.privateuse.push(r.slice(a+1,n)),a=n}}if(a!==r.length)return l(a,6,"Found superfluous content after tag");return t;function l(n,i,f){return u.warning&&u.warning(f,i,n),u.forgiving?t:Oe()}}function Oe(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function Ue(e,u,t){const r=e.slice();return r[8]=u[t][0],r[9]=u[t][1],r}function Ds(e){let u,t,r,s,a,l=e[0]&&Ie();return{c(){l&&l.c(),u=b(),t=v("div"),r=v("p"),r.textContent=`${e[3](30)}`,s=b(),a=v("p"),a.textContent=`${e[3](40)}`,g(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),g(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),g(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(n,i){l&&l.m(n,i),T(n,u,i),T(n,t,i),B(t,r),B(t,s),B(t,a)},p(n,i){n[0]?l||(l=Ie(),l.c(),l.m(u.parentNode,u)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&p(u),n&&p(t)}}}function bs(e){let u,t,r,s,a=e[1].meta?.title+"",l,n,i,f,o=e[1].excerpt+"",h,C=e[0]&&Pe(e),E=e[2].length&&xe(e);return{c(){C&&C.c(),u=b(),t=v("div"),r=v("p"),s=v("a"),l=M(a),i=b(),f=v("p"),h=b(),E&&E.c(),g(s,"class","pagefind-ui__result-link svelte-j9e30"),g(s,"href",n=e[1].meta?.url||e[1].url),g(r,"class","pagefind-ui__result-title svelte-j9e30"),g(f,"class","pagefind-ui__result-excerpt svelte-j9e30"),g(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(c,_){C&&C.m(c,_),T(c,u,_),T(c,t,_),B(t,r),B(r,s),B(s,l),B(t,i),B(t,f),f.innerHTML=o,B(t,h),E&&E.m(t,null)},p(c,_){c[0]?C?C.p(c,_):(C=Pe(c),C.c(),C.m(u.parentNode,u)):C&&(C.d(1),C=null),_&2&&a!==(a=c[1].meta?.title+"")&&j(l,a),_&2&&n!==(n=c[1].meta?.url||c[1].url)&&g(s,"href",n),_&2&&o!==(o=c[1].excerpt+"")&&(f.innerHTML=o),c[2].length?E?E.p(c,_):(E=xe(c),E.c(),E.m(t,null)):E&&(E.d(1),E=null)},d(c){C&&C.d(c),c&&p(u),c&&p(t),E&&E.d()}}}function Ie(e){let u;return{c(){u=v("div"),g(u,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,r){T(t,u,r)},d(t){t&&p(u)}}}function Pe(e){let u,t=e[1].meta.image&&Le(e);return{c(){u=v("div"),t&&t.c(),g(u,"class","pagefind-ui__result-thumb svelte-j9e30")},m(r,s){T(r,u,s),t&&t.m(u,null)},p(r,s){r[1].meta.image?t?t.p(r,s):(t=Le(r),t.c(),t.m(u,null)):t&&(t.d(1),t=null)},d(r){r&&p(u),t&&t.d()}}}function Le(e){let u,t,r;return{c(){u=v("img"),g(u,"class","pagefind-ui__result-image svelte-j9e30"),ce(u.src,t=e[1].meta?.image)||g(u,"src",t),g(u,"alt",r=e[1].meta?.image_alt||e[1].meta?.title)},m(s,a){T(s,u,a)},p(s,a){a&2&&!ce(u.src,t=s[1].meta?.image)&&g(u,"src",t),a&2&&r!==(r=s[1].meta?.image_alt||s[1].meta?.title)&&g(u,"alt",r)},d(s){s&&p(u)}}}function xe(e){let u,t=e[2],r=[];for(let s=0;se.toLocaleUpperCase();function Ss(e,u,t){let{show_images:r=!0}=u,{process_result:s=null}=u,{result:a={data:async()=>{}}}=u;const l=["title","image","image_alt","url"];let n,i=[];const f=async h=>{t(1,n=await h.data()),t(1,n=s?.(n)??n),t(2,i=Object.entries(n.meta).filter(([C])=>!l.includes(C)))},o=(h=30)=>". ".repeat(Math.floor(10+Math.random()*h));return e.$$set=h=>{"show_images"in h&&t(0,r=h.show_images),"process_result"in h&&t(4,s=h.process_result),"result"in h&&t(5,a=h.result)},e.$$.update=()=>{e.$$.dirty&32&&f(a)},[r,n,i,o,s,a]}var Hs=class extends Ce{constructor(e){super(),he(this,e,Ss,Ms,fe,{show_images:0,process_result:4,result:5})}},ws=Hs;function Ke(e,u,t){const r=e.slice();return r[11]=u[t][0],r[12]=u[t][1],r}function Ge(e,u,t){const r=e.slice();return r[15]=u[t],r}function Ns(e){let u,t,r,s,a,l=e[0]&&Je();return{c(){l&&l.c(),u=b(),t=v("div"),r=v("p"),r.textContent=`${e[5](30)}`,s=b(),a=v("p"),a.textContent=`${e[5](40)}`,g(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),g(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),g(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(n,i){l&&l.m(n,i),T(n,u,i),T(n,t,i),B(t,r),B(t,s),B(t,a)},p(n,i){n[0]?l||(l=Je(),l.c(),l.m(u.parentNode,u)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&p(u),n&&p(t)}}}function ys(e){let u,t,r,s,a=e[1].meta?.title+"",l,n,i,f,o,h=e[0]&&We(e),C=e[4]&&Ye(e),E=e[3],c=[];for(let d=0;de.toLocaleUpperCase();function js(e,u,t){let{show_images:r=!0}=u,{process_result:s=null}=u,{result:a={data:async()=>{}}}=u;const l=["title","image","image_alt","url"];let n,i=[],f=[],o=!1;const h=(c,_)=>{if(c.length<=_)return c;const d=[...c].sort((R,A)=>A.locations.length-R.locations.length).slice(0,3).map(R=>R.url);return c.filter(R=>d.includes(R.url))},C=async c=>{t(1,n=await c.data()),t(1,n=s?.(n)??n),t(2,i=Object.entries(n.meta).filter(([_])=>!l.includes(_))),Array.isArray(n.sub_results)&&(t(4,o=n.sub_results?.[0]?.url===(n.meta?.url||n.url)),o?t(3,f=h(n.sub_results.slice(1),3)):t(3,f=h([...n.sub_results],3)))},E=(c=30)=>". ".repeat(Math.floor(10+Math.random()*c));return e.$$set=c=>{"show_images"in c&&t(0,r=c.show_images),"process_result"in c&&t(6,s=c.process_result),"result"in c&&t(7,a=c.result)},e.$$.update=()=>{e.$$.dirty&128&&C(a)},[r,n,i,f,o,E,s,a]}var Os=class extends Ce{constructor(e){super(),he(this,e,js,zs,fe,{show_images:0,process_result:6,result:7})}},Us=Os;function uu(e,u,t){const r=e.slice();return r[10]=u[t][0],r[11]=u[t][1],r[12]=u,r[13]=t,r}function tu(e,u,t){const r=e.slice();return r[14]=u[t][0],r[15]=u[t][1],r[16]=u,r[17]=t,r}function ru(e){let u,t,r=e[4]("filters_label",e[5],e[6])+"",s,a,l=Object.entries(e[1]),n=[];for(let i=0;ie.toLocaleUpperCase(),iu=e=>e.toLowerCase();function Ps(e,u,t){let{available_filters:r=null}=u,{show_empty_filters:s=!0}=u,{open_filters:a=[]}=u,{translate:l=()=>""}=u,{automatic_translations:n={}}=u,{translations:i={}}=u,{selected_filters:f={}}=u,o=!1,h=!1;function C(E,c){f[`${E}:${c}`]=this.checked,t(0,f)}return e.$$set=E=>{"available_filters"in E&&t(1,r=E.available_filters),"show_empty_filters"in E&&t(2,s=E.show_empty_filters),"open_filters"in E&&t(3,a=E.open_filters),"translate"in E&&t(4,l=E.translate),"automatic_translations"in E&&t(5,n=E.automatic_translations),"translations"in E&&t(6,i=E.translations),"selected_filters"in E&&t(0,f=E.selected_filters)},e.$$.update=()=>{if(e.$$.dirty&258&&r&&!o){t(8,o=!0);let E=Object.entries(r||{});E.length===1&&Object.entries(E[0][1])?.length<=6&&t(7,h=!0)}},[f,r,s,a,l,n,i,h,o,C]}var Ls=class extends Ce{constructor(e){super(),he(this,e,Ps,Is,fe,{available_filters:1,show_empty_filters:2,open_filters:3,translate:4,automatic_translations:5,translations:6,selected_filters:0})}},xs=Ls,Ru={};F(Ru,{comments:()=>vu,default:()=>qs,direction:()=>pu,strings:()=>Tu,thanks_to:()=>Bu});var Bu="Jan Claasen ",vu="",pu="ltr",Tu={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},qs={thanks_to:Bu,comments:vu,direction:pu,strings:Tu},Fu={};F(Fu,{comments:()=>Du,default:()=>Vs,direction:()=>bu,strings:()=>Mu,thanks_to:()=>ku});var ku="Jermanuts",Du="",bu="rtl",Mu={placeholder:"بحث",clear_search:"امسح",load_more:"حمِّل المزيد من النتائج",search_label:"ابحث في هذا الموقع",filters_label:"تصفيات",zero_results:"لا توجد نتائج ل [SEARCH_TERM]",many_results:"[COUNT] نتائج ل [SEARCH_TERM]",one_result:"[COUNT] نتيجة ل [SEARCH_TERM]",alt_search:"لا توجد نتائج ل [SEARCH_TERM]. يعرض النتائج ل [DIFFERENT_TERM] بدلاً من ذلك",search_suggestion:"لا توجد نتائج ل [SEARCH_TERM]. جرب أحد عمليات البحث التالية:",searching:"يبحث عن [SEARCH_TERM]..."},Vs={thanks_to:ku,comments:Du,direction:bu,strings:Mu},Su={};F(Su,{comments:()=>wu,default:()=>Ks,direction:()=>Nu,strings:()=>yu,thanks_to:()=>Hu});var Hu="Maruf Alom ",wu="",Nu="ltr",yu={placeholder:"অনুসন্ধান করুন",clear_search:"মুছে ফেলুন",load_more:"আরো ফলাফল দেখুন",search_label:"এই ওয়েবসাইটে অনুসন্ধান করুন",filters_label:"ফিল্টার",zero_results:"[SEARCH_TERM] এর জন্য কিছু খুঁজে পাওয়া যায়নি",many_results:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",one_result:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",alt_search:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর জন্য. পরিবর্তে [DIFFERENT_TERM] এর জন্য দেখানো হচ্ছে",search_suggestion:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর বিষয়ে. নিন্মের বিষয়বস্তু খুঁজে দেখুন:",searching:"অনুসন্ধান চলছে [SEARCH_TERM]..."},Ks={thanks_to:Hu,comments:wu,direction:Nu,strings:yu},zu={};F(zu,{comments:()=>Ou,default:()=>Gs,direction:()=>Uu,strings:()=>Iu,thanks_to:()=>ju});var ju="Pablo Villaverde ",Ou="",Uu="ltr",Iu={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure més resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques següents:",searching:"Cercant [SEARCH_TERM]..."},Gs={thanks_to:ju,comments:Ou,direction:Uu,strings:Iu},Pu={};F(Pu,{comments:()=>xu,default:()=>Js,direction:()=>qu,strings:()=>Vu,thanks_to:()=>Lu});var Lu="Dalibor Hon ",xu="",qu="ltr",Vu={placeholder:"Hledat",clear_search:"Smazat",load_more:"Načíst další výsledky",search_label:"Prohledat tuto stránku",filters_label:"Filtry",zero_results:"Žádné výsledky pro [SEARCH_TERM]",many_results:"[COUNT] výsledků pro [SEARCH_TERM]",one_result:"[COUNT] výsledek pro [SEARCH_TERM]",alt_search:"Žádné výsledky pro [SEARCH_TERM]. Zobrazují se výsledky pro [DIFFERENT_TERM]",search_suggestion:"Žádné výsledky pro [SEARCH_TERM]. Související výsledky hledání:",searching:"Hledám [SEARCH_TERM]..."},Js={thanks_to:Lu,comments:xu,direction:qu,strings:Vu},Ku={};F(Ku,{comments:()=>Ju,default:()=>Ws,direction:()=>Wu,strings:()=>Zu,thanks_to:()=>Gu});var Gu="Jonas Smedegaard ",Ju="",Wu="ltr",Zu={placeholder:"Søg",clear_search:"Nulstil",load_more:"Indlæs flere resultater",search_label:"Søg på dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv et af disse søgeord i stedet:",searching:"Søger efter [SEARCH_TERM]..."},Ws={thanks_to:Gu,comments:Ju,direction:Wu,strings:Zu},Yu={};F(Yu,{comments:()=>Qu,default:()=>Zs,direction:()=>$u,strings:()=>et,thanks_to:()=>Xu});var Xu="Jan Claasen ",Qu="",$u="ltr",et={placeholder:"Suche",clear_search:"Löschen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse für [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse für [SEARCH_TERM]",one_result:"[COUNT] Ergebnis für [SEARCH_TERM]",alt_search:"Keine Ergebnisse für [SEARCH_TERM]. Stattdessen werden Ergebnisse für [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse für [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche für [SEARCH_TERM]"},Zs={thanks_to:Xu,comments:Qu,direction:$u,strings:et},ut={};F(ut,{comments:()=>rt,default:()=>Ys,direction:()=>st,strings:()=>at,thanks_to:()=>tt});var tt="Liam Bigelow ",rt="",st="ltr",at={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},Ys={thanks_to:tt,comments:rt,direction:st,strings:at},lt={};F(lt,{comments:()=>it,default:()=>Xs,direction:()=>ot,strings:()=>_t,thanks_to:()=>nt});var nt="Pablo Villaverde ",it="",ot="ltr",_t={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver más resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes búsquedas:",searching:"Buscando [SEARCH_TERM]..."},Xs={thanks_to:nt,comments:it,direction:ot,strings:_t},ct={};F(ct,{comments:()=>Et,default:()=>Qs,direction:()=>dt,strings:()=>ht,thanks_to:()=>ft});var ft="Ali Khaleqi Yekta ",Et="",dt="rtl",ht={placeholder:"جستجو",clear_search:"پاکسازی",load_more:"بارگذاری نتایج بیشتر",search_label:"جستجو در سایت",filters_label:"فیلترها",zero_results:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد",many_results:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",one_result:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",alt_search:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد. در عوض نتایج برای [DIFFERENT_TERM] نمایش داده می‌شود",search_suggestion:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد. یکی از جستجوهای زیر را امتحان کنید:",searching:"در حال جستجوی [SEARCH_TERM]..."},Qs={thanks_to:ft,comments:Et,direction:dt,strings:ht},Ct={};F(Ct,{comments:()=>gt,default:()=>$s,direction:()=>At,strings:()=>Rt,thanks_to:()=>mt});var mt="Valtteri Laitinen ",gt="",At="ltr",Rt={placeholder:"Haku",clear_search:"Tyhjennä",load_more:"Lataa lisää tuloksia",search_label:"Hae tältä sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. Näytetään tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},$s={thanks_to:mt,comments:gt,direction:At,strings:Rt},Bt={};F(Bt,{comments:()=>pt,default:()=>ea,direction:()=>Tt,strings:()=>Ft,thanks_to:()=>vt});var vt="Nicolas Friedli ",pt="",Tt="ltr",Ft={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de résultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de résultat pour [SEARCH_TERM]",many_results:"[COUNT] résultats pour [SEARCH_TERM]",one_result:"[COUNT] résultat pour [SEARCH_TERM]",alt_search:"Pas de résultat pour [SEARCH_TERM]. Montre les résultats pour [DIFFERENT_TERM] à la place",search_suggestion:"Pas de résultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},ea={thanks_to:vt,comments:pt,direction:Tt,strings:Ft},kt={};F(kt,{comments:()=>bt,default:()=>ua,direction:()=>Mt,strings:()=>St,thanks_to:()=>Dt});var Dt="Pablo Villaverde ",bt="",Mt="ltr",St={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver máis resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},ua={thanks_to:Dt,comments:bt,direction:Mt,strings:St},Ht={};F(Ht,{comments:()=>Nt,default:()=>ta,direction:()=>yt,strings:()=>zt,thanks_to:()=>wt});var wt="Nir Tamir ",Nt="",yt="rtl",zt={placeholder:"חיפוש",clear_search:"ניקוי",load_more:"עוד תוצאות",search_label:"חיפוש באתר זה",filters_label:"מסננים",zero_results:"לא נמצאו תוצאות עבור [SEARCH_TERM]",many_results:"נמצאו [COUNT] תוצאות עבור [SEARCH_TERM]",one_result:"נמצאה תוצאה אחת עבור [SEARCH_TERM]",alt_search:"לא נמצאו תוצאות עבור [SEARCH_TERM]. מוצגות תוצאות עבור [DIFFERENT_TERM]",search_suggestion:"לא נמצאו תוצאות עבור [SEARCH_TERM]. נסו אחד מהחיפושים הבאים:",searching:"מחפש את [SEARCH_TERM]..."},ta={thanks_to:wt,comments:Nt,direction:yt,strings:zt},jt={};F(jt,{comments:()=>Ut,default:()=>ra,direction:()=>It,strings:()=>Pt,thanks_to:()=>Ot});var Ot="Amit Yadav ",Ut="",It="ltr",Pt={placeholder:"खोजें",clear_search:"साफ करें",load_more:"और अधिक परिणाम लोड करें",search_label:"इस साइट में खोजें",filters_label:"फ़िल्टर",zero_results:"कोई परिणाम [SEARCH_TERM] के लिए नहीं मिला",many_results:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिले",one_result:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिला",alt_search:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। इसके बजाय [DIFFERENT_TERM] के लिए परिणाम दिखा रहा है",search_suggestion:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। निम्नलिखित खोजों में से कोई एक आज़माएं:",searching:"[SEARCH_TERM] की खोज की जा रही है..."},ra={thanks_to:Ot,comments:Ut,direction:It,strings:Pt},Lt={};F(Lt,{comments:()=>qt,default:()=>sa,direction:()=>Vt,strings:()=>Kt,thanks_to:()=>xt});var xt="Diomed ",qt="",Vt="ltr",Kt={placeholder:"Traži",clear_search:"Očisti",load_more:"Učitaj više rezultata",search_label:"Pretraži ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Pokušaj s jednom od ovih pretraga:",searching:"Pretražujem [SEARCH_TERM]..."},sa={thanks_to:xt,comments:qt,direction:Vt,strings:Kt},Gt={};F(Gt,{comments:()=>Wt,default:()=>aa,direction:()=>Zt,strings:()=>Yt,thanks_to:()=>Jt});var Jt="Adam Laki ",Wt="",Zt="ltr",Yt={placeholder:"Keresés",clear_search:"Törlés",load_more:"További találatok betöltése",search_label:"Keresés az oldalon",filters_label:"Szűrés",zero_results:"Nincs találat a(z) [SEARCH_TERM] kifejezésre",many_results:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",one_result:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",alt_search:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Találatok mutatása inkább a(z) [DIFFERENT_TERM] kifejezésre",search_suggestion:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Próbáld meg a következő keresések egyikét:",searching:"Keresés a(z) [SEARCH_TERM] kifejezésre..."},aa={thanks_to:Jt,comments:Wt,direction:Zt,strings:Yt},Xt={};F(Xt,{comments:()=>$t,default:()=>la,direction:()=>er,strings:()=>ur,thanks_to:()=>Qt});var Qt="Nixentric",$t="",er="ltr",ur={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},la={thanks_to:Qt,comments:$t,direction:er,strings:ur},tr={};F(tr,{comments:()=>sr,default:()=>na,direction:()=>ar,strings:()=>lr,thanks_to:()=>rr});var rr="Cosette Bruhns Alonso, Andrew Janco ",sr="",ar="ltr",lr={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra più risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},na={thanks_to:rr,comments:sr,direction:ar,strings:lr},nr={};F(nr,{comments:()=>or,default:()=>ia,direction:()=>_r,strings:()=>cr,thanks_to:()=>ir});var ir="Tate",or="",_r="ltr",cr={placeholder:"検索",clear_search:"クリア",load_more:"次を読み込む",search_label:"このサイトを検索",filters_label:"フィルタ",zero_results:"[SEARCH_TERM]の検索に一致する情報はありませんでした",many_results:"[SEARCH_TERM]の[COUNT]件の検索結果",one_result:"[SEARCH_TERM]の[COUNT]件の検索結果",alt_search:"[SEARCH_TERM]の検索に一致する情報はありませんでした。[DIFFERENT_TERM]の検索結果を表示しています",search_suggestion:"[SEARCH_TERM]の検索に一致する情報はありませんでした。次のいずれかの検索を試してください",searching:"[SEARCH_TERM]を検索しています"},ia={thanks_to:ir,comments:or,direction:_r,strings:cr},fr={};F(fr,{comments:()=>dr,default:()=>oa,direction:()=>hr,strings:()=>Cr,thanks_to:()=>Er});var Er="Seokho Son ",dr="",hr="ltr",Cr={placeholder:"검색어",clear_search:"비우기",load_more:"검색 결과 더 보기",search_label:"사이트 검색",filters_label:"필터",zero_results:"[SEARCH_TERM]에 대한 결과 없음",many_results:"[SEARCH_TERM]에 대한 결과 [COUNT]건",one_result:"[SEARCH_TERM]에 대한 결과 [COUNT]건",alt_search:"[SEARCH_TERM]에 대한 결과 없음. [DIFFERENT_TERM]에 대한 결과",search_suggestion:"[SEARCH_TERM]에 대한 결과 없음. 추천 검색어: ",searching:"[SEARCH_TERM] 검색 중..."},oa={thanks_to:Er,comments:dr,direction:hr,strings:Cr},mr={};F(mr,{comments:()=>Ar,default:()=>_a,direction:()=>Rr,strings:()=>Br,thanks_to:()=>gr});var gr="",Ar="",Rr="ltr",Br={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta ētahi otinga kē",search_label:"Rapu",filters_label:"Tātari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga kē ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakamātau ki ngā mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},_a={thanks_to:gr,comments:Ar,direction:Rr,strings:Br},vr={};F(vr,{comments:()=>Tr,default:()=>ca,direction:()=>Fr,strings:()=>kr,thanks_to:()=>pr});var pr="Paul van Brouwershaven",Tr="",Fr="ltr",kr={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},ca={thanks_to:pr,comments:Tr,direction:Fr,strings:kr},Dr={};F(Dr,{comments:()=>Mr,default:()=>fa,direction:()=>Sr,strings:()=>Hr,thanks_to:()=>br});var br="Christopher Wingate",Mr="",Sr="ltr",Hr={placeholder:"Søk",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"Søk på denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv en av disse søkeordene i stedet:",searching:"Søker etter [SEARCH_TERM]"},fa={thanks_to:br,comments:Mr,direction:Sr,strings:Hr},wr={};F(wr,{comments:()=>yr,default:()=>Ea,direction:()=>zr,strings:()=>jr,thanks_to:()=>Nr});var Nr="",yr="",zr="ltr",jr={placeholder:"Szukaj",clear_search:"Wyczyść",load_more:"Załaduj więcej",search_label:"Przeszukaj tę stronę",filters_label:"Filtry",zero_results:"Brak wyników dla [SEARCH_TERM]",many_results:"[COUNT] wyników dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wyników dla [SEARCH_TERM]. Wyświetlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wyników dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},Ea={thanks_to:Nr,comments:yr,direction:zr,strings:jr},Or={};F(Or,{comments:()=>Ir,default:()=>da,direction:()=>Pr,strings:()=>Lr,thanks_to:()=>Ur});var Ur="Jonatah",Ir="",Pr="ltr",Lr={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},da={thanks_to:Ur,comments:Ir,direction:Pr,strings:Lr},xr={};F(xr,{comments:()=>Vr,default:()=>ha,direction:()=>Kr,strings:()=>Gr,thanks_to:()=>qr});var qr="Bogdan Mateescu ",Vr="",Kr="ltr",Gr={placeholder:"Căutare",clear_search:"Ştergeţi",load_more:"Încărcați mai multe rezultate",search_label:"Căutați în acest site",filters_label:"Filtre",zero_results:"Niciun rezultat pentru [SEARCH_TERM]",many_results:"[COUNT] rezultate pentru [SEARCH_TERM]",one_result:"[COUNT] rezultat pentru [SEARCH_TERM]",alt_search:"Niciun rezultat pentru [SEARCH_TERM]. Se afișează în schimb rezultatele pentru [DIFFERENT_TERM]",search_suggestion:"Niciun rezultat pentru [SEARCH_TERM]. Încercați una dintre următoarele căutări:",searching:"Se caută după: [SEARCH_TERM]..."},ha={thanks_to:qr,comments:Vr,direction:Kr,strings:Gr},Jr={};F(Jr,{comments:()=>Zr,default:()=>Ca,direction:()=>Yr,strings:()=>Xr,thanks_to:()=>Wr});var Wr="Aleksandr Gordeev",Zr="",Yr="ltr",Xr={placeholder:"Поиск",clear_search:"Очистить поле",load_more:"Загрузить еще",search_label:"Поиск по сайту",filters_label:"Фильтры",zero_results:"Ничего не найдено по запросу: [SEARCH_TERM]",many_results:"[COUNT] результатов по запросу: [SEARCH_TERM]",one_result:"[COUNT] результат по запросу: [SEARCH_TERM]",alt_search:"Ничего не найдено по запросу: [SEARCH_TERM]. Показаны результаты по запросу: [DIFFERENT_TERM]",search_suggestion:"Ничего не найдено по запросу: [SEARCH_TERM]. Попробуйте один из следующих вариантов",searching:"Поиск по запросу: [SEARCH_TERM]"},Ca={thanks_to:Wr,comments:Zr,direction:Yr,strings:Xr},Qr={};F(Qr,{comments:()=>e0,default:()=>ma,direction:()=>u0,strings:()=>t0,thanks_to:()=>$r});var $r="Andrija Sagicc",e0="",u0="ltr",t0={placeholder:"Претрага",clear_search:"Брисање",load_more:"Приказ више резултата",search_label:"Претрага сајта",filters_label:"Филтери",zero_results:"Нема резултата за [SEARCH_TERM]",many_results:"[COUNT] резултата за [SEARCH_TERM]",one_result:"[COUNT] резултата за [SEARCH_TERM]",alt_search:"Нема резултата за [SEARCH_TERM]. Приказ додатник резултата за [DIFFERENT_TERM]",search_suggestion:"Нема резултата за [SEARCH_TERM]. Покушајте са неком од следећих претрага:",searching:"Претрага термина [SEARCH_TERM]..."},ma={thanks_to:$r,comments:e0,direction:u0,strings:t0},r0={};F(r0,{comments:()=>a0,default:()=>ga,direction:()=>l0,strings:()=>n0,thanks_to:()=>s0});var s0="Montazar Al-Jaber ",a0="",l0="ltr",n0={placeholder:"Sök",clear_search:"Rensa",load_more:"Visa fler träffar",search_label:"Sök på denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga träffar",many_results:"[SEARCH_TERM] gav [COUNT] träffar",one_result:"[SEARCH_TERM] gav [COUNT] träff",alt_search:"[SEARCH_TERM] gav inga träffar. Visar resultat för [DIFFERENT_TERM] istället",search_suggestion:"[SEARCH_TERM] gav inga träffar. Försök igen med en av följande sökord:",searching:"Söker efter [SEARCH_TERM]..."},ga={thanks_to:s0,comments:a0,direction:l0,strings:n0},i0={};F(i0,{comments:()=>_0,default:()=>Aa,direction:()=>c0,strings:()=>f0,thanks_to:()=>o0});var o0="Anonymous",_0="",c0="ltr",f0={placeholder:"Tafuta",clear_search:"Futa",load_more:"Pakia matokeo zaidi",search_label:"Tafuta tovuti hii",filters_label:"Vichujio",zero_results:"Hakuna matokeo ya [SEARCH_TERM]",many_results:"Matokeo [COUNT] ya [SEARCH_TERM]",one_result:"Tokeo [COUNT] la [SEARCH_TERM]",alt_search:"Hakuna mayokeo ya [SEARCH_TERM]. Badala yake, inaonyesha matokeo ya [DIFFERENT_TERM]",search_suggestion:"Hakuna matokeo ya [SEARCH_TERM]. Jaribu mojawapo ya utafutaji ufuatao:",searching:"Kutafuta [SEARCH_TERM]..."},Aa={thanks_to:o0,comments:_0,direction:c0,strings:f0},E0={};F(E0,{comments:()=>h0,default:()=>Ra,direction:()=>C0,strings:()=>m0,thanks_to:()=>d0});var d0="",h0="",C0="ltr",m0={placeholder:"தேடுக",clear_search:"அழிக்குக",load_more:"மேலும் முடிவுகளைக் காட்டுக",search_label:"இந்த தளத்தில் தேடுக",filters_label:"வடிகட்டல்கள்",zero_results:"[SEARCH_TERM] க்கான முடிவுகள் இல்லை",many_results:"[SEARCH_TERM] க்கான [COUNT] முடிவுகள்",one_result:"[SEARCH_TERM] க்கான முடிவு",alt_search:"[SEARCH_TERM] இத்தேடலுக்கான முடிவுகள் இல்லை, இந்த தேடல்களுக்கான ஒத்த முடிவுகள் [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] இத் தேடலுக்கான முடிவுகள் இல்லை.இதற்கு பதிலீடான தேடல்களை தேடுக:",searching:"[SEARCH_TERM] தேடப்படுகின்றது"},Ra={thanks_to:d0,comments:h0,direction:C0,strings:m0},g0={};F(g0,{comments:()=>R0,default:()=>Ba,direction:()=>B0,strings:()=>v0,thanks_to:()=>A0});var A0="Taylan Özgür Bildik",R0="",B0="ltr",v0={placeholder:"Araştır",clear_search:"Temizle",load_more:"Daha fazla sonuç",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] için sonuç yok",many_results:"[SEARCH_TERM] için [COUNT] sonuç bulundu",one_result:"[SEARCH_TERM] için [COUNT] sonuç bulundu",alt_search:"[SEARCH_TERM] için sonuç yok. Bunun yerine [DIFFERENT_TERM] için sonuçlar gösteriliyor",search_suggestion:"[SEARCH_TERM] için sonuç yok. Alternatif olarak aşağıdaki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] araştırılıyor..."},Ba={thanks_to:A0,comments:R0,direction:B0,strings:v0},p0={};F(p0,{comments:()=>F0,default:()=>va,direction:()=>k0,strings:()=>D0,thanks_to:()=>T0});var T0="Vladyslav Lyshenko ",F0="",k0="ltr",D0={placeholder:"Пошук",clear_search:"Очистити поле",load_more:"Завантажити ще",search_label:"Пошук по сайту",filters_label:"Фільтри",zero_results:"Нічого не знайдено за запитом: [SEARCH_TERM]",many_results:"[COUNT] результатів на запит: [SEARCH_TERM]",one_result:"[COUNT] результат за запитом: [SEARCH_TERM]",alt_search:"Нічого не знайдено на запит: [SEARCH_TERM]. Показано результати на запит: [DIFFERENT_TERM]",search_suggestion:"Нічого не знайдено на запит: [SEARCH_TERM]. Спробуйте один із таких варіантів",searching:"Пошук за запитом: [SEARCH_TERM]"},va={thanks_to:T0,comments:F0,direction:k0,strings:D0},b0={};F(b0,{comments:()=>S0,default:()=>pa,direction:()=>H0,strings:()=>w0,thanks_to:()=>M0});var M0="Long Nhat Nguyen",S0="",H0="ltr",w0={placeholder:"Tìm kiếm",clear_search:"Xóa",load_more:"Nhiều kết quả hơn",search_label:"Tìm kiếm trong trang này",filters_label:"Bộ lọc",zero_results:"Không tìm thấy kết quả cho [SEARCH_TERM]",many_results:"[COUNT] kết quả cho [SEARCH_TERM]",one_result:"[COUNT] kết quả cho [SEARCH_TERM]",alt_search:"Không tìm thấy kết quả cho [SEARCH_TERM]. Kiểm thị kết quả thay thế với [DIFFERENT_TERM]",search_suggestion:"Không tìm thấy kết quả cho [SEARCH_TERM]. Thử một trong các tìm kiếm:",searching:"Đang tìm kiếm cho [SEARCH_TERM]..."},pa={thanks_to:M0,comments:S0,direction:H0,strings:w0},N0={};F(N0,{comments:()=>z0,default:()=>Ta,direction:()=>j0,strings:()=>O0,thanks_to:()=>y0});var y0="Amber Song",z0="",j0="ltr",O0={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Ta={thanks_to:y0,comments:z0,direction:j0,strings:O0},U0={};F(U0,{comments:()=>P0,default:()=>Fa,direction:()=>L0,strings:()=>x0,thanks_to:()=>I0});var I0="Amber Song",P0="",L0="ltr",x0={placeholder:"搜索",clear_search:"清除",load_more:"加載更多結果",search_label:"站內搜索",filters_label:"篩選",zero_results:"未找到 [SEARCH_TERM] 的相關結果",many_results:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",one_result:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",alt_search:"未找到 [SEARCH_TERM] 的相關結果。改為顯示 [DIFFERENT_TERM] 的相關結果",search_suggestion:"未找到 [SEARCH_TERM] 的相關結果。請嘗試以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Fa={thanks_to:I0,comments:P0,direction:L0,strings:x0},q0={};F(q0,{comments:()=>K0,default:()=>ka,direction:()=>G0,strings:()=>J0,thanks_to:()=>V0});var V0="Amber Song",K0="",G0="ltr",J0={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},ka={thanks_to:V0,comments:K0,direction:G0,strings:J0},Da=[Ru,Fu,Su,zu,Pu,Ku,Yu,ut,lt,ct,Ct,Bt,kt,Ht,jt,Lt,Gt,Xt,tr,nr,fr,mr,vr,Dr,wr,Or,xr,Jr,Qr,r0,i0,E0,g0,p0,b0,N0,U0,q0],ba=Da,Ma=["../../translations/af.json","../../translations/ar.json","../../translations/bn.json","../../translations/ca.json","../../translations/cs.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fa.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/he.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/ko.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ro.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/sw.json","../../translations/ta.json","../../translations/tr.json","../../translations/uk.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function ou(e,u,t){const r=e.slice();return r[51]=u[t],r}function _u(e){let u,t,r;function s(l){e[37](l)}let a={show_empty_filters:e[5],open_filters:e[6],available_filters:e[18],translate:e[20],automatic_translations:e[19],translations:e[7]};return e[0]!==void 0&&(a.selected_filters=e[0]),u=new xs({props:a}),ae.push(()=>ps(u,"selected_filters",s)),{c(){ke(u.$$.fragment)},m(l,n){Ee(u,l,n),r=!0},p(l,n){const i={};n[0]&32&&(i.show_empty_filters=l[5]),n[0]&64&&(i.open_filters=l[6]),n[0]&262144&&(i.available_filters=l[18]),n[0]&524288&&(i.automatic_translations=l[19]),n[0]&128&&(i.translations=l[7]),!t&&n[0]&1&&(t=!0,i.selected_filters=l[0],gs(()=>t=!1)),u.$set(i)},i(l){r||(z(u.$$.fragment,l),r=!0)},o(l){U(u.$$.fragment,l),r=!1},d(l){de(u,l)}}}function cu(e){let u,t,r,s;const a=[Ha,Sa],l=[];function n(i,f){return i[14]?0:1}return t=n(e),r=l[t]=a[t](e),{c(){u=v("div"),r.c(),g(u,"class","pagefind-ui__results-area svelte-e9gkc3")},m(i,f){T(i,u,f),l[t].m(u,null),s=!0},p(i,f){let o=t;t=n(i),t===o?l[t].p(i,f):(le(),U(l[o],1,1,()=>{l[o]=null}),ne(),r=l[t],r?r.p(i,f):(r=l[t]=a[t](i),r.c()),z(r,1),r.m(u,null))},i(i){s||(z(r),s=!0)},o(i){U(r),s=!1},d(i){i&&p(u),l[t].d()}}}function Sa(e){let u,t,r,s=[],a=new Map,l,n,i;function f(_,d){return _[13].results.length===0?ya:_[13].results.length===1?Na:wa}let o=f(e),h=o(e),C=e[13].results.slice(0,e[17]);const E=_=>_[51].id;for(let _=0;_e[17]&&Eu(e);return{c(){u=v("p"),h.c(),t=b(),r=v("ol");for(let _=0;__[17]?c?c.p(_,d):(c=Eu(_),c.c(),c.m(n.parentNode,n)):c&&(c.d(1),c=null)},i(_){if(!i){for(let d=0;d{i[C]=null}),ne(),s=i[r],s?s.p(u,h):(s=i[r]=n[r](u),s.c()),z(s,1),s.m(a.parentNode,a))},i(o){l||(z(s),l=!0)},o(o){U(s),l=!1},d(o){o&&p(t),i[r].d(o),o&&p(a)}}}function Eu(e){let u,t=e[20]("load_more",e[19],e[7])+"",r,s,a;return{c(){u=v("button"),r=M(t),g(u,"type","button"),g(u,"class","pagefind-ui__button svelte-e9gkc3")},m(l,n){T(l,u,n),B(u,r),s||(a=G(u,"click",e[22]),s=!0)},p(l,n){n[0]&524416&&t!==(t=l[20]("load_more",l[19],l[7])+"")&&j(r,t)},d(l){l&&p(u),s=!1,a()}}}function du(e){let u,t=e[20]("searching",e[19],e[7]).replace(/\[SEARCH_TERM\]/,e[16])+"",r;return{c(){u=v("p"),r=M(t),g(u,"class","pagefind-ui__message svelte-e9gkc3")},m(s,a){T(s,u,a),B(u,r)},p(s,a){a[0]&589952&&t!==(t=s[20]("searching",s[19],s[7]).replace(/\[SEARCH_TERM\]/,s[16])+"")&&j(r,t)},d(s){s&&p(u)}}}function Oa(e){let u,t,r,s,a,l,n=e[20]("clear_search",e[19],e[7])+"",i,f,o,h,C,E,c,_,d=e[12]&&_u(e),R=e[15]&&cu(e);return{c(){u=v("div"),t=v("form"),r=v("input"),a=b(),l=v("button"),i=M(n),f=b(),o=v("div"),d&&d.c(),h=b(),R&&R.c(),g(r,"class","pagefind-ui__search-input svelte-e9gkc3"),g(r,"type","text"),g(r,"placeholder",s=e[20]("placeholder",e[19],e[7])),g(r,"autocapitalize","none"),g(r,"enterkeyhint","search"),r.autofocus=e[8],g(l,"class","pagefind-ui__search-clear svelte-e9gkc3"),K(l,"pagefind-ui__suppressed",!e[9]),g(o,"class","pagefind-ui__drawer svelte-e9gkc3"),K(o,"pagefind-ui__hidden",!e[15]),g(t,"class","pagefind-ui__form svelte-e9gkc3"),g(t,"role","search"),g(t,"aria-label",C=e[20]("search_label",e[19],e[7])),g(t,"action","javascript:void(0);"),g(u,"class","pagefind-ui svelte-e9gkc3"),K(u,"pagefind-ui--reset",e[1])},m(A,k){T(A,u,k),B(u,t),B(t,r),ze(r,e[9]),e[34](r),B(t,a),B(t,l),B(l,i),e[35](l),B(t,f),B(t,o),d&&d.m(o,null),B(o,h),R&&R.m(o,null),E=!0,e[8]&&r.focus(),c||(_=[G(r,"focus",e[21]),G(r,"keydown",e[32]),G(r,"input",e[33]),G(l,"click",e[36]),G(t,"submit",Ua)],c=!0)},p(A,k){(!E||k[0]&524416&&s!==(s=A[20]("placeholder",A[19],A[7])))&&g(r,"placeholder",s),(!E||k[0]&256)&&(r.autofocus=A[8]),k[0]&512&&r.value!==A[9]&&ze(r,A[9]),(!E||k[0]&524416)&&n!==(n=A[20]("clear_search",A[19],A[7])+"")&&j(i,n),(!E||k[0]&512)&&K(l,"pagefind-ui__suppressed",!A[9]),A[12]?d?(d.p(A,k),k[0]&4096&&z(d,1)):(d=_u(A),d.c(),z(d,1),d.m(o,h)):d&&(le(),U(d,1,1,()=>{d=null}),ne()),A[15]?R?(R.p(A,k),k[0]&32768&&z(R,1)):(R=cu(A),R.c(),z(R,1),R.m(o,null)):R&&(le(),U(R,1,1,()=>{R=null}),ne()),(!E||k[0]&32768)&&K(o,"pagefind-ui__hidden",!A[15]),(!E||k[0]&524416&&C!==(C=A[20]("search_label",A[19],A[7])))&&g(t,"aria-label",C),(!E||k[0]&2)&&K(u,"pagefind-ui--reset",A[1])},i(A){E||(z(d),z(R),E=!0)},o(A){U(d),U(R),E=!1},d(A){A&&p(u),e[34](null),e[35](null),d&&d.d(),R&&R.d(),c=!1,W(_)}}}var Ua=e=>e.preventDefault();function Ia(e,u,t){const r={},s=Ma.map(m=>m.match(/([^\/]+)\.json$/)[1]);for(let m=0;mN[m]??H[m]??"";ds(()=>{let m=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",H=Au(m.toLocaleLowerCase());t(19,He=r[`${H.language}-${H.script}-${H.region}`]||r[`${H.language}-${H.region}`]||r[`${H.language}`]||r.en)}),hs(()=>{S?.destroy?.(),S=null});const we=async()=>{if(!me&&(t(12,me=!0),!S)){let m;try{m=await is(()=>import(`${a}pagefind.js`),[])}catch(N){console.error(N),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI"].join(` +`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}o||t(24,o=f?12:30);let H={...d||{},excerptLength:o};await m.options(H);for(const N of R){if(!N.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");const I=N.bundlePath;delete N.bundlePath,await m.mergeIndex(I,N)}S=m,Y0()}},Y0=async()=>{S&&(Se=await S.filters(),(!ue||!Object.keys(ue).length)&&t(18,ue=Se))},X0=m=>{let H={};return Object.entries(m).filter(([,N])=>N).forEach(([N])=>{let[I,Z]=N.split(/:(.*)$/);H[I]=H[I]||[],H[I].push(Z)}),H};let te;const Q0=async(m,H)=>{if(!m){t(15,Ae=!1),te&&clearTimeout(te);return}const N=X0(H),I=()=>$0(m,N);_>0&&m?(te&&clearTimeout(te),te=setTimeout(I,_),await Ne(),S.preload(m,{filters:N})):I(),es()},Ne=async()=>{for(;!S;)we(),await new Promise(m=>setTimeout(m,50))},$0=async(m,H)=>{t(16,Me=m||""),typeof C=="function"&&(m=C(m)),t(14,ge=!0),t(15,Ae=!0),await Ne();const N=++be,I={filters:H};q&&typeof q=="object"&&(I.sort=q);const Z=await S.search(m,I);be===N&&(Z.filters&&Object.keys(Z.filters)?.length&&t(18,ue=Z.filters),t(13,De=Z),t(14,ge=!1),t(17,Re=l))},es=()=>{const m=x.offsetWidth;m!=W0&&t(10,w.style.paddingRight=`${m+2}px`,w)},us=m=>{m?.preventDefault(),t(17,Re+=l)},ts=m=>{m.key==="Escape"&&(t(9,D=""),w.blur()),m.key==="Enter"&&m.preventDefault()};function rs(){D=this.value,t(9,D),t(23,A)}function ss(m){ae[m?"unshift":"push"](()=>{w=m,t(10,w)})}function as(m){ae[m?"unshift":"push"](()=>{x=m,t(11,x)})}const ls=()=>{t(9,D=""),w.blur()};function ns(m){L=m,t(0,L)}return e.$$set=m=>{"base_path"in m&&t(25,a=m.base_path),"page_size"in m&&t(26,l=m.page_size),"reset_styles"in m&&t(1,n=m.reset_styles),"show_images"in m&&t(2,i=m.show_images),"show_sub_results"in m&&t(3,f=m.show_sub_results),"excerpt_length"in m&&t(24,o=m.excerpt_length),"process_result"in m&&t(4,h=m.process_result),"process_term"in m&&t(27,C=m.process_term),"show_empty_filters"in m&&t(5,E=m.show_empty_filters),"open_filters"in m&&t(6,c=m.open_filters),"debounce_timeout_ms"in m&&t(28,_=m.debounce_timeout_ms),"pagefind_options"in m&&t(29,d=m.pagefind_options),"merge_index"in m&&t(30,R=m.merge_index),"trigger_search_term"in m&&t(23,A=m.trigger_search_term),"translations"in m&&t(7,k=m.translations),"autofocus"in m&&t(8,y=m.autofocus),"sort"in m&&t(31,q=m.sort),"selected_filters"in m&&t(0,L=m.selected_filters)},e.$$.update=()=>{e.$$.dirty[0]&8388608&&A&&(t(9,D=A),t(23,A="")),e.$$.dirty[0]&513&&Q0(D,L)},[L,n,i,f,h,E,c,k,y,D,w,x,me,De,ge,Ae,Me,Re,ue,He,Z0,we,us,A,o,a,l,C,_,d,R,q,ts,rs,ss,as,ls,ns]}var Pa=class extends Ce{constructor(e){super(),he(this,e,Ia,Oa,fe,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},La=Pa,Fe;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(Fe=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{Fe="/pagefind/"}var qa=class{constructor(e){this._pfs=null;let u=e.element??"[data-pagefind-ui]",t=e.bundlePath??Fe,r=e.pageSize??5,s=e.resetStyles??!0,a=e.showImages??!0,l=e.showSubResults??!1,n=e.excerptLength??0,i=e.processResult??null,f=e.processTerm??null,o=e.showEmptyFilters??!0,h=e.openFilters??[],C=e.debounceTimeoutMs??300,E=e.mergeIndex??[],c=e.translations??[],_=e.autofocus??!1,d=e.sort??null;delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.openFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,delete e.autofocus,delete e.sort;const R=u instanceof HTMLElement?u:document.querySelector(u);R?this._pfs=new La({target:R,props:{base_path:t,page_size:r,reset_styles:s,show_images:a,show_sub_results:l,excerpt_length:n,process_result:i,process_term:f,show_empty_filters:o,open_filters:h,debounce_timeout_ms:C,merge_index:E,translations:c,autofocus:_,sort:d,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${u}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}triggerFilters(e){let u={};for(let[t,r]of Object.entries(e))if(Array.isArray(r))for(let s of r)u[`${t}:${s}`]=!0;else u[`${t}:${r}`]=!0;this._pfs.$$set({selected_filters:u})}destroy(){this._pfs.$destroy()}};export{qa as PagefindUI}; diff --git a/tutorials/vonage_video_react_app-feature-config/steps/favicon.svg b/tutorials/vonage_video_react_app-feature-config/steps/favicon.svg new file mode 100644 index 00000000..cba5ac14 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/steps/index.html b/tutorials/vonage_video_react_app-feature-config/steps/index.html new file mode 100644 index 00000000..8122de81 --- /dev/null +++ b/tutorials/vonage_video_react_app-feature-config/steps/index.html @@ -0,0 +1,81 @@ + Vonage Video React App | Vonage Coding Exercise + Skip to content

Vonage Video React App

Feature Config

The Vonage Video React App ships with a broad set of features — archiving, chat, screen sharing, emoji reactions, captions, and more. Every one of them can be turned on or off without touching any source code, using a single shell configuration file: vcrBuild.env.sh.

+

In this tutorial you will:

+
    +
  • Understand how frontend configuration works in the app
  • +
  • Enable and disable feature flags to tailor the experience for your use case
  • +
  • Adjust display defaults such as video resolution and room layout
  • +
  • Apply your changes and verify them in the running app
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#PageWhat you’ll do
01Backend credentialsCreate backend/.env with your Vonage App ID and private key
02Configuration file overviewExplore vcrBuild.env.sh and understand its structure
03Feature flagsEnable and disable individual features
04Display settingsAdjust video resolution and default room layout
05Apply and verifyRebuild the app and confirm your changes in the browser
\ No newline at end of file diff --git a/tutorials/vonage_video_react_app-feature-config/tutorial-config.json b/tutorials/vonage_video_react_app-feature-config/tutorial-config.json index abe45ac4..515af57d 100644 --- a/tutorials/vonage_video_react_app-feature-config/tutorial-config.json +++ b/tutorials/vonage_video_react_app-feature-config/tutorial-config.json @@ -5,7 +5,7 @@ "terminal", "browser" ], - "repository": "https://github.com/Vonage/vonage-video-react-app", + "repository": "https://github.com/VZaphod/vonage-video-react-app", "starterFiles": [], "capabilities": [], "version": "1.0.0", diff --git a/uploads/vonage_video_react_app-feature-config.zip b/uploads/vonage_video_react_app-feature-config.zip deleted file mode 100644 index 8eea7797b01b13e9a0d6798be624695e35bb26f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1251173 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ⅅxTVa0j3rCQ%K=s(? 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�p)Ct87SHrt$lAGPG=q9Y5kECN#ct5s%JMqBc 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

j(QHKy+%D=7U$6V{onr;03Lnx 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�nYi@*=x9qprsOG4PmKa(aV=9W6OoKi1yR^N@Be0&;36lJ!Y{ z6d$+k5QtXbX7b%z*C6SKMf&PG))Q+WOG^(65Wni+=vUQXLC?tyIeCV(teGGCF8(y_1m) zUCbQ-=zgTy{>qs_3-yY_5@46CA*V2V1ba**`1I0{k9U96gPsR}(R104S-I=w15yGm z@&nx?mL%d*b9-<=cb7w9(h_Mj$hr~osziUGX9-T#LW&Qc^}KPUqLfEvUuma~L~_t& zl8F(P2ZYEIr;E9|A?MKqMV?(|??PcL$!!NL2A$y6wM$W4MNlpzz_x}XEB!_)kzfyQ zHNXDhUf`A~XA%Z$_&JDgLcuSO{Fi?CE+$>8x7auiNu9{A8$yTXiQnjlwkh-fY1?BBR{498 zDmLl9{YytV^VjbnLL`94IVRM5Z>-}<>B##5ig?_n-2FBb_^)cPL}`>Ft1?zS1n+!r z{1S4Ons2(!_^A(^dN+~)v4xHA^Z?1Ykv^@2IXDx$DSMfarw2<>e5Lzd8{cQCJTPN3 z(@&AF3G0n?*Zb^^3IvGkb=)FGPw!@7ZoQMl({|7Cb`QCb2gvGWizq-q`5bu_(E@p_ zf!Hj09$T>^GAZETS%XLX+H%_JGh+85sDlG=&J?3oFh}-Nfwjq_`qC9GI{%MHn;;yr z)(u5F_l`^G^%?m2D?Dt5Tk(d2)$HA8i3!a2-xD>Cie#|W?az}W{g%R-<6!Ja1?5@^ zxG+y*`S4oQRRM~EOYTic8T|v7XK-JT3-bmhZl`NT-Mo4Ezqk8z@BT=0+6E$xC44qC z1)-t-+8Q0etifBfOCiIC3i90VaB-XesNd1rTf5>+HOS7?z@B-=PO|49+}9>)pD{;s z`33dYbf%t_5;>zCvwbQoZPEbXQvGAeInT5Oh&a9RY#1&0a{Tv9sXJYZIMOwScIrF_ z@JXz=haz#V>t8K2FDwPmlG$VKRdq|?E9YaIN!KaH>BK;KkM}q>JV2Zrwac6vh_ud~ z#kLh3%T2^Ql#0~odX@fDrdQx)F10_Tf`{&!I6^LxVF-LD;_r<@IH3mhm`}Widkm_jU-a^|XipdlqtEU9d5iYR zDG>m;0V|H=)P0hGIK7q=eb zuVMh&p8seft$!wh-0gkw<&ANFzUGU4Bi_233ULYe**@Z>WcwO)3}82iEw#^K5CZ@P zI*4q4l2hV%nOF8fPVO@pBXy(gR5Ojt)3gHne8-7cZ;z4tEaEbp98`4Ud$uxIVz2G( z_nvBS9xZF0YwMml-oaW?y-pTp#>;#zMOA`$QugtA#P#^Cj0E;2{!fn#j?;bpq>d_voqHqV)6%g%Mivx($H zzrPVBU>gI|?7IHMDsuO1i)Ai$v6B zfWl)RlWfPfj&umaCJWUVaL9!mdfwW(_tW7Tun{rkZaWNYtd%*R?T+-XV0DbRjhAfu z@;bKNTbu)eTd*sbXjRsy`7tbBEj5Oaw~$LH2HW-5aVnJ|?OZFG3pc+O!bO>3`eI%| zTw|4LRdV1W*^_)D@D`W##vvMb)_ARhNB+i%c5bRmCpYD0!bIt^)wa&IxDep4uh@w^ zz3%R9lT){k&CAT&Fdn6&n`~V!Kk7<3a;V@rwSM3(%=orbb3f^aa_fW7TIWIC*m%R3 z2A7~6iL`maK3j^Y6%e$$JmGv4pWc=YlPO-VZ z8ymuM6W_F~(J9raTXs28FTdBP6mZ^1bV?O(l1qJeNuc;Cc#y#CWROk7pROjpIdW~>EH`&qTrl& zY{4^8O>Lk#6)PDOq3Z#N-p0jKE_0^l$8|yw(0(>$cQBFkZcU#2EPVCs8VcWswzgDV z&eXLWzX-0ke9LYi0DKAd+-U{zydNFCQRG{WCRjRcz2)G9JSWedalgxzy~`&m11(&YtC$>QR+e{oigtg& zR%p|@4VA^89dxY&nTChVJ!}=kJ@W7VXtuS^XZye}({CPq&sU zEl?5Tj1F?X?d+Od4uh9`(T6v+Ap^cdrmucD8(F===3Di;95T4!${I7U!@$2x{iMqs zyxQ+V>k*xmu1pXr;(m135%9&}{$L35w9US>ups9_O!_I!#$$Q-YJJhPpR1oI5RZR{ z_ESsaZ-99^Z}8pk6yJIdGxJLGsKT2)vL)P!IQ!|OZ&gqH;+D1K4*H=NBYIi$9{tmY zW2=&e3Tu9(!t__1)luxz+F#U&h4>^wfdk~B$)9k)rrxsZ_zO_jCW9F#hqF?~EQ|U? z58Ip%GgVgQ!p%x)TZ)6`QX4m|A|DG5hpg$Ju%vEcn+8JjydNIN%*|&{Qbwk6OEu0m zk;`ARE?YJNaL2M=dm|T6@Uq-swX)gGy-Ihpo#MY8J3B+OYx$SlK{GZX07*c$zg2=E zx+hsG;pw?S23b>xiSfq(PLo8;#^*hg%4Nov6S%Exg56FyuF(0GwZXqK-VoO4dBKEH zN&N{Co^P(Z-^dgni-e zg+&87J@nejArkz*QNc|s{S4Ma@!Fqi_%n~Lq(x#<6OQP_Xfs1$BZM9e`ea`-kSNk> zOl|eNRzrPnYs%pV!M06E+u@)nyma-c#_lOEfn3-F771}(R^;>k zse8W`RQ>{$M^6C%kBx2^{E0of^9%8NyoErv9`PMmLsMrOFvYnKg$duy3q|v5Iwj|f z1Q#a-fvd#Ur+r@SII?%)iT4>*h>7^M`=wo>$I*QyyBos*+@Yw8_qV*#0VSJ-_oOAYd*oIDJNyi2vMNFQB`P zykn|8+rLkK8FTT0gA?K2A5;@8Q`=)KQO*z?g4cHUBl41e)#tH7*REyS=VcyRPnA|Z z4omwY$S$`z)%xzj?OW2X@pMG~unb#l89WONjS5#KKu)*XS8r zHfvStB@H@`6I~^a&Gh9Gf2OCp9$s$^D^zFXR`5VQ8(6+BnbQYJf5sCBg^Ss#>GB>V z25G0Pq&7O1Rn27ATKS!~Z&^~_)FqurG6^9*{>!^@YJF&*{1v3k*+OqtQm^S_@(cn~( z`}nA21^(p}&^^fz0os?X2dyfC&P7r3<}0gI;aRDvEHH+|v6f#U=;(O^as-Ot)+<@# z^r_igFnj_7Jx_K)VwMnZ6Fp{4Qc7wPrP~g>D})2>C)2F+ce$rU&|c>ajPLDb{IB@!0Sp91tUrr+Y!4YfYbftG1KkQ9%c{pZhnucHZz%gQp3*ySzSO zxP1BJo%1Vkei20v%X$@IRCqwX?cke^9J)9=ZsPEC1`shtzdYB_R9%nIdM!P5a-b&p z1q@_PLGcDb=tX$=XTs1|&QqX6VPZD7ifJXu!w(=50GG86C zAga{Uv8KU_)Z;IhcO!$iKsz9Jz~~1UrP7St;H)`c@^FJ}%IL1(Yw)@mpA43q;8|2a ztRZx0DAfGA^Bbov_=qn!c;;~U@;b*Qp>(I!)}puk`N2-;po;wRXt!mpsJN_X;J&F1 z@n|M;=nlQtj=V2j^=J@ohV>8;C7Ps}J)78QE_Re88GySTrVlJyZoo=uA~*m$M7C>* zi^e1^gHO;Hz3LC}Pp;eV9{%mSSRccpxggj`WqoaEwe(}?`IhmWPK6PjoA#%hrfXq8 zx(s<8OG%Q0l-0hjlJdEDqV8bbEm_t1Ov}$n3@&WhmzuU<6~$|E$?xwU_bPav{o4_n zWE46)mUrgQ{`cF;&lJ=s*0^posZn1E8eFha}D1J060ruE-%iWA-JWooL@f_ z#j&4dYCPu=&#n~RggL+enR&q-UK){6UkF*qDI;{XFHz*ZQE1#bm}3ziD9{=3{ECY* zK9%IZ%mbauTYl2+Dx9C5TsJWHSCvdod-*o|0$LlK#T^;e0D@+fDG;JPWg$ z78!X33;$pyR(pRYR#ge@%X+Pxz(hiej_(9)go!yqat)}|P)BS%dRD^v_8w{~>O9oE zAd#!g1pS9CdWu)G30?!B6VLOWL_$o3;6J3))Lr0ES{re>&_GqwivI6gmz5!y%p$*2 zX0AWtgV+dYfrYT;=bwv;5xAIoIXy;VLqt9uyS|89pId0_AsBwk{@fV~dD=i_Te+C2 zTYU%t(*`i5D*Tj`(`KvxDB`J8Z>#h2UhU&$umonz;wD2OMYgC!@y`Cwah}`+T4JDDK+PTv;|+^z*?`pXt-)-YdLVhTr)y7OE}I4a4rv4c_HJbY6krd97RPBt>-giIh=-!v7K9|vPNe%44aHOYqkn@{nXR`@ z3nR2Xdz|9jQRI<}-F*z%GV#>?bQS*mDANA1A)#FBBkD@rxje0iYUO&2UX{)qbb?L8-2kwC)SbXb7f8#rFKTJqin^b7oK&gNJ zx1P+maT%9)gp0KUDuH`%X&jOEB5c8Xu9UW@B4f7@&iU8 z^bY^{#!r~)&Sldy#Bwgz6a8alee-jwlJE59r%c8;e1ufb?X#1B8O$*rl%T^ zOui}jQki6h{d%~W7YUaxa{`tel#ZLJ0C;D49b9zH8{9iJF_aZA5!0ThZS(aXeS604 z7$;ujH`puKnZVGCFeW`VN&8T(mmjow{}yZbQQViyo)4Mn)nSpYzv{F{jYPJh zU^&%o8U0*4c0sc&mjpKzS{D<~J=jXp^vZ9Q3ej($0HSl0X9!~phPU>l{a zvZ~PX>IrRo>O(Ao2ggl?STNe5g`e;L90#@w7QNjK5yJ5cCh_xgExF*Znou8fq7wTZ z*~$OGeElbq=wv8Bi~@cZgnfzYb0!I}AE3jDvh+M|6o^A!|18Pec7l*|22u;Oze@&Y3spT8~l0RlztP);KkvvN>C4BCIf41g;=wZ6c$)Ug zqSO8Buh$Xo8I=-W|1jKJ*YAIVw&yvZRb}TaC0Y}7-Ge4LZ<|)1OLDEsT7PdlAKg_X z_&oD@4}hR&zaVF*=w~-|i1o!4cu-);uKjV%tX3Q*dov$JXz!Iut@g0Z01H6$zjvr4 z|94&GmNY;VnYcqOH1P|l6zJljbh_xeCVcvw63W(SZ)L?&za4cNZXE7Aadj|KAW*iV zAd|elh`_>##O=#83Kn-h!ePC!x2^1to--Y*dvEO%WwY~EQ6U-i74GxpLmpv)nX%zf zYFL(%L~@PC68SB=#C6o$DO!|aE7SteX7Z&Xt#Cpzo+V{KV5zJFC0Bc)@2leXTTjAF zQwIWQE#kVuGt;=4jmfyMjT-mr{UzrU0oSx9I1oYzcp+*J;o~D~3Q?bpeE1`*1&*zm z%J1_S64Q4T_MKK35ZWZdjZZ%X^7cP14WMo+ylyBiw%Zb8mFU!Lx!@Bm7V31}xqi{J zw+%1^=P2T>>3ri2hktw8s(d>2V-Uv|r0fX#=z+#S?(+@RvJh*?oI1$8-fY!K9eu<^bO`YTE*6KH2{4m#684!yVx42YkS7^y}g)ifnVG4 z*R+g0);C}p-SH0#rMzZR?&7z^UUiZg3jRr!jtfkm!MIK6qc# z=e+O48Rm%+Qm#>4{_x=Ivv}P1#tmQu&M_N}B!6LO#4Ysh*16MZq=w>o$M+)bw@Y2* zH-W$7y-Uw*jt`{eO|Jm9jpxRHp%_2GfP8)BeHfqbC7;k;2d>9|`)5}lS6;$V)9Fh# zfOY&uP{a4{Bnc?)dm*p8=4`O{U<`bq&U-Rb67BYQu}zQdZp?1d-*L9#@Wt28I33 zS$*N|!4nYuuX}gM*_^oR154|L6{xfPX^@?7RpdY=(re31WTVCRnNNtK49%G-0_PHg z>c`%lnktq2->OT`7=?#5x8(-P6k_KCHaZ zA`QiT65#CLOYn~l64~?C)W3$pha%zqzRwkCqI=>n?~^LFrmKlBLK~CF{%E-5%}15; z>`g}#n|+aO+pKmiPqzk$UOt10ma2e-?eWY0w|ur_KM0tA;mZEtf@|Hzc)o};>22I zo>RORF$mh0;oW&Pgj!q`>#iH%~eD_t~dl6@*K znNIcXS%rzQTWYRj;~O`|16O@8f@UJ;m(SgQ8-kQ~@fAGHPn63N^b;K-AgX zaa|h%nZj*PlDzXR?tA{TD0w#be!7G+e6ttF>=C`AfM;v*4Uv7{Sbk(Afc*{@pk??P zj3z(&M^i8#xCTRPuxl2lU3*ZBOU2F{@|;GPM?3xxNsQ`4v1Z9?A|L)gX@DE_+LC7u zuV3Wdf88t3z7+b`o3%qiWSh4@7ywnI*v%w#kY6mVLNGwqib^b+L989B)w%UezC#y?M7;LaKokg6p46A@`}h{Ic8o68okHCH*Dnmuf`POF zW{pz+dypqen#vI+?Y-KJOLXp=MCXCQv0t~XXFco@k{DjgUY8??BPfC;re{3+)@_F? z{h>19d5gv8aMt&H*LTMg-geq}H6j1`CqV2DjM#6h-;UQ!&iJpxg2SojvRcUm_sssg zM~(_4CxH()NWbEZB>b*DlJl;wXII@e!}-oNEE&=qt;k{eyJe2E45!XzU%dYZ6C#D| zt7-JfFQH_5)(gdN<}l8Beb`%JBfIE|h9{8#Kur&r@}zCuO#;hY5P~GzEBRtof9?uB z&I>QCJk-|x&^@ic7&J&?_uc?~hlhEZ0MNtCdRff|qg9Nf!#k6&Y zPDX&By_)hiPNo;vDNLfiui7t6-JJd1_NG*)W6sZ@;1JQTw2iLEe4qqH1}2{j9(qWUss|no#O>vp>H`aKW2(YmG&?L(?Vu4Nj=}))T@YWEqY|? zkl^D*LivC6P&Bs?p07&=rJqkR5c(Yler(+>D&E{YK&K=QQhT_udo*q9T`YS^DxM+tJnSt8 z-kLv_PoGy#;Z>r~F^C(G=zr~2e6F%ZA2GmgPx6ol9>nJN|Cy5UI`2b1heKc2>BrUw zt5*0k#hn=Tal1eA>ILg+j)P`oU>>Vwj~4v{XTCS0st9NCj&r!EuU9Z2POp?)inqAq*bRdxIA{apy$S-4>ZD824|f_h;7dm za342_*8aywoK9nXPcOJ6&UU!kxH|0U^a)!!UZfH== zhO!?3c`xE`PaEd(paylA|F3o;eBpbt>w6yLdnfw6(GW?&TooB5*@UN(OkWyg#L1+5 zpD+|q62N*nf)2|gl?qu#nx!oa)m zd|RGZ_J{463kbaGHGfK}uQMD}Y_Yd1J=CHcQ48 zvUsQ;{3^}Y>uOKM_8b>+7HM$%dlj*UCUVt!3vu4WuKO7H^6WDr-*vN>tOI~+U!&2H-pwclu&2sR6lwjv`W9&DDnD=lJx_^ZwhZ(GtxLzhGyelz8(Yw^UYyA2Uj{ zHB5$e2Axu*`_-#(h;Q5DD%9_NOSP#x@FNuC8#QHznn@qjG+pLq z9HbaCSkW6K>cc7&$h4XryXAQg;Al^#r`DU?GRN|uerT_ZaUPceMV;&2iTznQp-+4i`wdjF8%v-}^*{}Wnw8=>iU-3(7{tLNpui0ignb;xs^v~xVqJAHoOwr4W^ z3`pWAtUd*su<+ne|9InJt;hSTF2k83 z-Hj8?F`8g+e2nt1t-&a8A0uHs(0Sh&L&gxBcct@-o_T~X)-`Y$4%fdnCg zgt|ktC3RzlDtx$`aK*Ed0m9pzjjMFl&u#g7wsf}m+QUX|ayQRx^nXL*rSpkN<^R#1 z=MPgDDN@ZBVSV4_aDddLWrfU-+F!ea(as;EqLnf%+QeI>Vx3y$>$+bT{7N5GaDqM> zIL&`gxUu)V)Ln@O*i(7Ov6OqwI;LNim=3VtNB6NW@fuKX)b#K^<}IVF_%T7|fKpO9 zs5HoaewZv_(&1NGR}J_^o?NmI%qOg%2#cBp4qBqnZ6p73&t=lq?Uc3B= zOGJ6wNKQU=T1NkmhqsPv^8fz-M}r_?5YiweF#!dU4naXcKH~kMY8)^@RNKv7sxulW}KQQUohR}4~N;G{&6Kj@;?`d8$s^a zpXT=4^6}pXT})TTh^#g7(n6}PvFSCT7`o6**S;p z|BehnZ^aaarH_)tb>eIaC+JB6Y^74k)Wn31=8{uBr8pmi_p~_}aa`u9gf%yLpbsG$ z`BMF?4aAeeH$4bkL2Q`gkp|rTcOv*C7kot*cH)YEd9E3B2@5%dnR-t~-|XR0`FEp2 z5PrCku&WyXgz$^A%ae6T60@YIk}?C!S(Xa;LeOpc1KeQy6Di#jb35409g4GPqa&~! zM^5QOfQcU_@n`zw*hQd1T3t%o_}Fw_`@iJU9N0JhAA^Uam^Me{*!}cBL^(FK?PeGO zlEI>*Huu&DQv%K^jCYG>=ZxmBR)b{9GIjnwE)*r^xc4H*TK3RkiOdmjiGkxn0DM$& zZh_OeLDG96Xrwfb2pV+TVz^u^Od))i_U&K!WdviJm#Lo=tQr z|Ly9rMFcJ%hinI*Fq#IQ?@YovkbX6RaCF=b5RTSk#mqvE{NQN(?(N|5B7{#*r)%r3 zt;q8CHFLH2r9cDa3oTIKMk+9*9-%?d{TF6RZqB-waz7NdC>+8kpTS&fW1^Q1m!9p98$$Ljkk*S?W zjV91A>{&HtP$l#RjClqvsbCq-@n95UKRh~}_s*3ocrBhf@>=Dny)D$|Wa<4Nv-7Jz z#Eg}NOESWYfR)=H;D-pp#j+qLNJtc94p*seE5-lP3^(@Sj#jQ0k9o-Iw(M3Hs`ZC$ zZ_x6YI4pF-O6=w10Yi=NDZwjrui=}5)Bric>R;=TA4sO;AC~cmK@&|Or_#N*z0Zs> z`D|SBR7dt={q|d{jY5O3Ib{y7pkW0M{c$8R$4x-YzwV;5J2 zr~u=YY^eWr7`i;O6A^-#Zr&*iyXL8sybB0J!NSOGb<y-)oNYuvM3l zk-BzW(Ju2@jq3_cA7O8hp(&^jEfsz2OrT2 zX&bWbVJyEqEoqe72)i$Ik99ISE~_wVsjLrre+~b>W#A-vAzTpw#I7yfcK5%0f{jwx z<^5&%o6Aq8S2e*y@u{n&mpgaAuQl^}tOteWQ?#UYFLC~ULq?-xD4=~$WI6>w$H%3@ z`GN_1dJCl6xEoyPt{V7c6O6gj*Z4Y~s8rnKgd_&pP1atLaYK^T!H`1Zp>xk^KEXuajQELM+9wdgy9``ge-+FEWFAAsH=~+9 zoQc^K@bsN8Zc7E(`aJ?9u}ELvy05WgyKwlax*5&@G;C(jjzL<59dEVVoC0wO7#MpO z7Z&8k;%1<=6d$JdS7saOV!xG5OyVwQ%l;&lm+kW>W%nd#Kp=1+Gpl1G^Q0VVmv=9= z5WzJ*No^;W$MAtkjv-GAk7kloA?nW3#1g7NXCDQ5RDpEY5dU%238^Y6+&>C&)T=UV za%=}*m^AHe<-*cI;LBG)<93*-`~%iTMV6wk%_%0e53JenwRi_;GS-;@0%mj+^r)km?w_|x`AO}0aD^0_rYatj(ZwpeY!N12=J;gd zhqpbT)#nLGDxJrpfVr{28k0NGA)}fK6B1MTXeAk-Owf41c0o|r&%nVR67UfMXGbc( zHSR!^hus8*UEOShFEesso2_rWxASvN&(~x-E@q56XZb)fa|?mL_p#WOD9Y198T6dj zxHPW!MuT*Y^|PPWjNl*>6jmki!$uBpOSHaq@zj47CHLD^)1Q3MO?$6oQlgrk&WlW} z{`Iniur_?}uHPaavDGly+sEzkJ+H$LUJxxL*)NgA_cgmQn2)0ly%tB@r<`PVz7nt; zhm(wIBMv}e99)CTYQ!7Y^&`N-57-GsDw?Wp1wPK9Wry(TaMz)83vRLAvFc9?7}a^d zIj^6_d1htb!EOAr&YLd}+D58LSiM*9NTiZ`whJ;>`#$j$#C`8TSj;dly;bP zy#a+DNJM{tte@xu7qkhw^Z?3yy5766HX3>T2&5XsdgN)=N9T%kTgHSF;=ZR)r=xT~l*vUv24GS`v1ktqZn&gi+!ZHrH3`N7yUkONTClY1BS1D@X>i1&5 z|NPAm6d|&ai-PdF&p|4A1Bzzwl$$M@8M78$L(OiK4AlTx*d34=GSMw~`eEqWeNE|` zp4c~6ic}JPh{AvYNT~06Vm^u@3ejOTtpa^95-)vutk~ZIda>5S1rE8|)Vnz;ylMG^ z{Lt*DATiSnFN|<-mK?`1o^Qrafog$|XBV57H|qIWU}>k#RBn z%{+sG*%nM+injCi_eyd%;jyOV@E}0ypa%@z&(U4c1jJ{zL{a9v|W@GxI?+%=9cq% z#Yyk1|8G3&b@whB0XCbPs(mz8EI&}rACCl?>=gqEo*G+Z8vMzMu{x$N`3j%B9@5* ze9htjfMds7B+p=-MCc@#w@doGO#uq)qq1A2LKt1PGACPCLbD&r}>K2dJVX?O3Oe}sqK zj7uU8p67Xux4H$P+q-a4ta2BlUlaA48)+f7WC>Q%*w{w8nCuihJlS5geKK1T3l4eq zxR5*TG?6sfhN2@ehRq$YBU!dQKWsD!tM7)eigYEz^V;9FQi+)XkL7+@{m#z}!|ayDdJltJ}$O||ci(C`4R5#K^LG*s-z z9tXS%TVy5F&NZWnJc4g`OtSJ>DS zqMj00uz^`;q0FVzrXo_X41>*uR}@@Zrk3D~!Cwa~>P-3Bs`7o@LGl0iml>+5pMU(k z%@l>`xKbU=kLNjDC27j*wr5+Lukn??!Q0XlUp=hmd#V^iZVeWB?XT7?65t?xdKh|I zq+#3{=#gP*mw#~rAjrTvs1hFc)0wTsj`>;_hRht*VvsFMp_2776aaZ20!DfcDwhxR z0`B-3dHOXWc-?GlJ@xeE$`#-C%Daam_>4*mMWNs2w$0olIQLZY{d*bg@=8|T z=~!P~KFv~7beV75HPZ~kQB}8nu6!IF$(}A;Kb?7|(wUS7U_X?u1TssK-dD*(+eEz{ zl<1s;KFD03@}7(IV%e)_afqkSG(P=n>3t{8fdfZL`Hf9lLG)2T_JW(4o4P$h32KHB zA<=MaS$bsm=M~O0phdyM3^KoH`i*ntIq$zeK)^Id`7kFQH1$9I3W%mOWw$>}l0-=1 zdV$zwzN$Z{LYeK}UGEC_aSI8+KsiWKVj!*{&kIYp5&ZmBfAeDWy|?`K-eb>(^!bB3 zvu1`rXU6&1cWpe1DtI=KJV+jfcln)W83}b0jH0aWL>d~9qOYKChV8ypi@`gJVcTAX z=nmaS!J3RZ~ZnE9oKe9${g8Q|Z zdZJG&K>)8fyl(%+;>X)ZHq$eW*0-u)P^S$K`SMbC|ZEh5EP zbTf_6QB*&RHKWMD!1p`1vg)Vw9pZ(MC5<KF!c6rVE+Cf$T~i#MaBr zYfe^ar|~FY;N+Rky|FtXr_Vh+mw5O2NcNG}B_VavKeUw(0i;#=^yNQdxrpCuca(Ua zz=YBtsLHml+SLRcGA6yeUMx7g!7zCWXBh3d9@*0G@bTrFTE=z`R; zrHYv=U)wU0B_Kah{-rOU4Lo`Orn1?FC3Qiy9xPkpBMx6vp0xrkNn%p$m_OnDIvFUW z3*E6w{DXx4scTJqPWOGGPmoH?9Pdx<{+fb^b42dl;JqG*7#?1UN9WU9rH5vWcQiHz zBYB`L_!1|QS#-1mWm4B)LU4s|x$O!Sx_pH@O1uWZgAluX}7KH$IV3 zFT1mtw*Nlid0$w{xET<9jtR2 zI8$k$bClV&whuQazHj2bx(&UaoeRYca)SKVWxJNozgfQKvnd?K0%Z*L3b)gcG^05n z^W47+{tyc_TEif94c&iO$n#K3uUy-vpKKc#6nj^}_Qd<;k}LWUkd)Iz_rU7$9pM4F z2UY;y0czep`cJ$A^t^q%t+ia@zG-j&rrc$!WtwBZr$y>C;~cc;0m-;t4BW3W!_1d# z7l!pP*o7X1Af!XirnKX9HU9)JM8sK2p*qg67w4$Li@FA=H0~xI*i}60M!2%88DtnI z+_$nhVy6gr^_N|B%M1z^4Ed7qoBi3m5L@|p6&R0{{h6@b6cJ>0upuWqmv?}haEL%d zcsT&V43gROfCe0qYXtw{D=WmhfjbVx>J$N8mnFdX@uJBcEuO-S>$rTX7suhUnAFU! z<7nuDU11Z<1UC)qI=Z_IdG6F40+WP?cH^O9t(mE=Wna=x`AwVcr*SLBDUr$_kqByj zqv!m*Y$nI@#FR?#A40QxBA4 z!Ik08Ni6xRSTFNqnGBR;%z_S^jy=xnl3ofWg7hrTGT;OB#USB#GTn;`5>lr|AA^Iu z@Lu!bNIVOZ-mQi#Q(Gx8g@0F$T;#j!J!Nua!$5TX}VMhD@6D9?~6M> zP2~N#=Lk?P-XD%|;(73*0eHuMqRnFgIh@RDgdhx}n!Vg=Wqsz?+{J476(WNa2FYA$ zRiCwVT^xe15H;_`OOAJ;dHb@0LPFT-h2=I3rKD0Jn4KwbB7*hmn8bI{f&_>>0fnV} zzutpm4@ba3o9WnTE7qW4KAys28Mk%DqH&uOsJYj-i=%sfJdxw%yG7$P_%2|KZ)8{h zLuo!`Ldo~;vkQ~3 zaZ$?q9S=jSEGdf@xX`dSr^=i(-8biDvL7CGoKKB(os7AKT#cBu9(=AbGH+I%-a4JC zK8n~NyurZ1lo84I6y(TO%`&bFg;@oKe*CD!_Lrd|>fnar zV_GRd_+G^0Gg02FYQ0VZ3HMf*pN3Ljy;+tH=^>VbMltDyMjk2SObu?YB$J(;DDh5u zS6cA1Gj&@u33lst~j5WO^2Z!tR4ho?-UE*J`b; zzmW^Lk)Y+PQ9Ef|tZbX^^{Y?l=Cx+mG;7)CJhKJbe`8-frLV^s?vq6XA9zD5VSH#i zuIkKEZJkwu0M-_K@_QoE`<#c|w)i72hV@6j%*z}_@P4^8!oNkN$Z3tBNc|NA7FmN@ z@+$;|-K4_NJs;5U?JkJ)&1~k)YP=d8J3Gh9Gw}ZWkBn*<+1sg%L?9>n({+{&;XBXf zhxye#y?LKZ%J?qCghg%MtFn+I`kJLS85=fbM8~mxtt!&zqE)>B1l{!p^5;CyxWUxsAQXp3@m$wx()G$=_iLo{--zI4eIJm&ASM@2Xo*l4QCK zTz>yA&5%9OTW4ikd;kqQR{^3oc*YGIltIOzw}$uys)PIm^*x>w=xIJ1di(i8%ecYQ z-#61+@n}tZOY5zC-+8UxVAc35#`J^7RoJH=%5QN;TKmcOf7mmeB9qBMIO1IaAw2Au z)&N-AYiFqzSlha%1$R<#B(-hpMYhFb+LQns!lDpf82<0b6#o_a!t*{I_+_cMnfD}J z4R#gu_$@Dhv`s4|Q7JV)RU7o|OSt)13H>Jq;hWP;u+(~G15|4N0KJTo0ZDHP1O0ov z{ylsvNy2^S%_Kz}Z$CX?QtF}PJ1&EJbK}~l$^N$ZyeW+jZ$gy-)OhxmKtc|VBpT19 zu0rdU`YlSzp3_f-L0F<(F&D!o$A{tTNzwx?W+KO*GjT2wrePO)VdGNL7z``^dJWD{ z{vt{8=n{wsfHV}IE$&z297c32qAvLFjSRfARl@K7$V&~o3Fi=wA|R4g9djnP?RyO% zAtqY7f7l#tsBU3KA>u0!QA1M>Ryz@fTe0XUO;1DOcpt340`yDGApEx_nY9S~kqre` z2X@k48L2>^x;2iio4*U0vk3rCHM`sgMUh zuV^=|j){BsO%=lQ;7;6&VwN4;9C!m=TUllR_GxNql>3h#5Td69^rdMNIkB9kesB@vB9v#O@Khd)@om*f8#EKgA8FFV&4omPzAnB|Fg@Ng#a(i|6Pw>5L+grmw5cXP?1vi z`^Yp)-7a9_77pTTOaiZ9LY>}cTQ=lVO@#2?Fwuzn?FG72YDN#fo>w%#dNBLL%ePcW z_Gfs%{Q#lJfw@D2AS#Vb|JA-OaV(4HV91e|8({t9a_?tN7cv$Wxhnw;9QdR>(aPkv zShw%mwj0Izay`RnMtY3~GBW1UY!K2*#*^o_e8niX*fVOgKlPbwE8|4F!chK80w11C zS6(q#rqoe5Ky{LdF-hpUq-oR1lR4oi9o_seosDxuReOZKTtz}akW`^H41L%lUNred zMathv>Zb2L>s2Qr1b4k3hQA+er=e4rwx2-TP`K^;DokVj!%w`*W!oT4muTH*P1vTU zuL*LUrBS}vSRQ@SmZvL9#^4BcHih%;1C7J6|P8;d=So6@I4Rf}A z_Ro^WcD_+boGzmb+a3Q_ocK#UO0?FCh^zej&SK)Wd%kals4c1do98`z%tf*Z4_3lw zPt%+8$;@YKxBnE$GBV;h*2@(u_qc32@)Iw0oC4cy=+rwFq^jp7mD~eTIC$?#{Ud<= z7$HaCIhLf$3kS(R4p(F^#P|Xlx$e%)Hyd?g_E|7{I#d#4Ylc-=YTk($$)orAJy>x< z%kanyEomPDVF!j`X`+a?xOX=t-wUW;Yh19i-_|Mip~3| z-%}v{uIXx0(*zvA(pe3QTq`{&-XC12KW);NA;gz=CS^Y9<)+55*E27@RF1|>x-L<& zQOS#?Ujj)?#UL9)6vSrX}<R?QOFZb;-hx^0CiT6tiVj~*tx;F7$o?I>z z0BX)MHVp**11us{^&$O#h|jf{vFrUZ`z=rEW+J1w>*BAI<^|XGlYv}QYz0j8EPp?Y zeYA?{q|!RG!F||k3;p_Di<5JeGJ#HyxaxUJUd^kVQiGQK(y$l1d{k`*Nly(MP9~(? zm;^EA81+oJ`$a!2B$pQuTxfy{IlyQJ{y~BkuZB$=*4Ol?z~|6$40%6q`45Ba0VVdv zOZ~^?kP8RVR72AvQX{9bbL8+(brDb%@iQiy2*`$OB|b&6j;?gDXpZZcQpP^qg=WnF6zaZ7HdL5HA% z^RzM-Q^V3`>>T!u%DaODUpCICm@W``Lbl&%9K}Fm$Be^fiAlVTxqetb{yzf61^?w| zJx%7Mqq8f>naLahg4dqc1YuC%u=F~xQXgu`4QwZ~z6)XYJ17V`(xR0?+>j@QU3!p{ zlZS41M^XBPENUL)l^w)BmGXxeGZ1CT^?QBep;pwwQyZK~#J>IF9t02n;! zD4KEc`5#R6>2EuOb^ce8kC!&U5bO|-Oo!VKzYa9UE@Vv#Rt6X}s1Mu}>~2f_F!Y-e z^`M5KW%)+uDcl26Lwp!R{f9M}c!-GtuhQrWwPbfFQHc4o68G;>GHAd!c@1W=i4nN0 zwl9#|zTvO_Z

4fNlf`SnYuxRBu-UgulcY(H!s856G}ufr=-l288rbzp_{^1%bW zD>(JXMnPWLZyxC-=_&ZO_{pRZ53;!?M7X;Nr%U?zU6+BC^M$Bj<5`gJOToTZYp;4a zFy;>@pA3jZZ;kKfpFWr~Ri9Spv+9XE<;U~d)$~EeUAQ zDjK_Kvfx&u)m0NR_LFCNS7rQ0-xAAO6WqGE=mtj1pd_H7Xvt-+psXdVBWrk+<2_O` zykn1uB+~K_CGo>d_T80hy3G;no$6t%oa6mfuFdP>RLz&z%k`s*c9wt*8qLr(hnm0( zr}E>}{m}Cwy^g)Vc)#ETN2p_~q)+N+(}mdcwHnjwpJv$8TVsE@jl?eQcq7N_#^(T?a#8auZtRn~^MLPpf{p6^0nZ#UCG{+^uQ5+8-cEUY zu7ZGR*UwI;@Qu!FE&Z81TH~MbE4y%QHW=|qF5DcxWws&DVy+a7C$mL-fsG!P-HCkb zgk9X00meP*R>SRZkuZCIHOB4ffdg?QvV<$Ku$$v-Xz)?c@>!CJ@7$}<>sT1rx4t8I zE1OmFU_wzt^6-6Y02qVf{3-gNYQg8IQ{`!DEIwVHgMo4;CohQR;W|-++)uw~%w7Jy zi>@F;f0Nq#r~&NUV)UJ2?1l8QQ+ zE55VwGFw!YDLuk30Xiu)3d(s;mVcYm2p8XeyhbS5(u%1RBp#gq*nd|FQx0;=i2!9Z z$asvGs^^Z?Bml<;B^q{00xdOWOlkM7BzulUQK#7sa*cDt;wRgF(e=nH7xN1;lLS~N zmesZEYAfW{XCBHpp%$$`(x}DXQRK)4H*o)lpJJ}_AC18|0uN+pfWW{_arkIj2+A zzW1X}u##RujAh>4PUE`j_%ECAPX=$JR(x&zUlh3J!v$W|g=VKFZc#+nf)G!ke=uC8 z1>S|N1QkXx>3n@LZz1vHwW(`6q>SKEZ_h_JW9;7(e*qsv6KWZT-BB?;HGtkkE%`2`lkK~jqH1tRJOd$s zRUy8{ZQr|!;{+*(=Lbf2OjsgFl-NAJ@l0qWmND;+ncaPC-dBpZx{R8OJwI>+ow(jr z?f?5P8631}eEywkXQZv>yW1PT6B_$5=LC|*yW>IFB^nmUqm1n%2K3*{n}fYoz{{KE zGn155E0pJs?eYD1_*Z<%eVa4MAmmCglj#lOYTybgbI`Y5W4y9y^D(AX-kvQicQ-fe zL{pjClep8|?bYS8`meegEXbUNXo9yR$bFPnno7HrVMtxpig9j^!WV(xNOL=C7L9qlK2-y_iI=20O>JQ1z|>O zhbRNe>@rW=Iw}sj_5Ro98vQJ%GtMHpXKg*PrA`PcJG2cu4!mDnEI0m1LH2rBZow;_xw7ezG_{mHf*+awy>P zx!KG0xcjEfhc>wpeA8+6cM3k5>=x>U?M%a^%#v!yE?%bypr7h?SklaRnq~104MziP zDf3ThS=H~*GtAIgd@WHzI<=MAA^qZZ~NP*V8xCjSdBnVLWrr-KtKdUlRk2{Y$4 zj_C)w#S0IwsuL=GXLS8_k_`>O-eNzpb76HFW`;|}oyG#w?+2y0k1HtED?>gPd=Fz= z>+_s&ZO%RCCxh@?J+2!t>}muhHHEkI#t5uao(2X7ha^a05QbXL!lGsL|-s_lP4y;_>< z>I;`S`KV%gldgtb4nnkaU8tiGEoO6@R!I`q7(^I646~kzK|@`GH#k{WQLw6Zu8+!F zRsiiOqGq{`*mfc#^|hpNF~4(W%i8%Hb&S+AD~^{3wNbRR$`J|)T6!fZc|$5hsn9NE zgOYz}D*u1;zdI@8%?|O`+(YH}EdkW{&()=Nx=BLUbKzv{TZ!odUQbwR6@xy#Cgb1X zY5P)?o$=7$;<%?;P(&BOgWUzXVt$j$d~d^RiIHr!;1=+5r1#iO?g!tj?t{Jlejsvu zs-HgWgYP!t+c12%K_AJtiMF|lG~1{LKIS!|HYWCdw3pu~6+tekf9=+ZtX)WJHMh;f zoM;yK&X>oshGs1qw74!YE*~rJP@32*ZO$>e{aT%a2K2NqUo{88(Wcs$|K#On8|=O$ z*wQ;Fwj1A^``$<2Jk*J4Z0q=VgOHuSWWn|Q@VwDPgnj0s?(jO_WGM zErUL$ZCq=-o?0iH+z6s-#n{kw+>;~Kl1;`7r#|R2MRpr;ScovQ5lOIrvIcpWOQ?~N zCiFFPrbS15aNn}dz~g;POG^&OqJCH;m-TkH-TjU`Y@pd+{dhJQjDg5=C{5Z0W*)aaV`t zLoyn)Z7zY1?Y0Z_@1e96qPgg->z4#yO53)2DZhgv^ah3DD>njsRQ#KK=&0BnCkDVC z4@Y$V5GvfssD$#R>75yJ%o`Uct4C2sM;b$Z#i_8=!}azCd0G#)ENDoU9M_`vdik2d z@?K6N(W?hp&7?Qn{z9&4L1oP0K9}y)lfDa80T=wZ;4)^vozXQ(ao1}!3{%4x78;)o zgq0cwxQddD)>0Y>JJD@YItCRJ5gjJEP7zaE3f#zJ@-}|(p^WOhDDK&q&a#Rq*X|H- zw_Wc!v0`=>*K(dasS>$@L!@b{42sCMuV170oI+m%EQ_rlH;wu+B+Ip_EnB$m5^SPX zmmdo6odOO_=q%$nIp+Ni3xo$s9TW!TFDpqX-#_@zVmzq=4E{G*vx^tjqhKpZ)6RKY zI_e;jEg&f9vfR<=us(3XDCRut4moUrBRAuL?JHhpSsEGKYPo=-I#qA^Lr}nX4uNN! z0`v(8_Ee-S-sQFoLAM&{dI=J2r*h|~TfiU^+O~3cNn}DXFuCQ^%h$a3tZjHFs$}`! z#SHrvmsuy}0mY`9U6EL~lD`;{;ubS!xt6JwVFp(%=;E6Bm2 z5O-?PAB-f=S4opIfLru?GBTg|ZW^-?xh=4g@68dieLq?A1^6zzxb&RZ-f4+z95f%k zaE=WqI{U@BTpwkfJ(LtM8};wc0uikcS7ynZ~2kK%=KNnf`A!D_<6>ut)Gl`U1$5RIZx~i|M&gSqUe5l2v33gO`QsE zJm>kszmvjSw_s{)%mh-2kB?_3{7!A<&bL(mZ-w#br z;=m;j2=i@t^ueK+f17tXqucy#JH@e3bSKoKc=jZ0MXwc~R(M zV7gcD@g;bfwza^AzdnQ$)YLo@3h;1+UXam}6bc$7D41?bYl%jAO@qp+(bgo)3gk1XHSM*X;@oA1?6jS#&bad(a{qDM6{FJVCknu~$cnt=HZ zhmfFwljJdjBGCy3h!n&~G`{xNuj^gSpwoY|qWLDLS1_vJ~EY6ksyv#^3^SOsw2u-#(bEVn85hpHdHy|K$6ad9%HJ z*tC7L;M#t8TeQt{wimtsUH(!@!ZFl}UqvW8dUyW`GSmMA`Snerc)o^?>gYjSph)(= z<-N15P4!%{YO~w;USHh$lhyAv#y9CT#yQ+-Blo4V44df#W$Y|01`&*iGy%lZFEJM1 zAF>K;`b6!nH2uNtsYqdxN7kKuueP{gX4(6EzqLQz^OBL9?S1`9JgV&#hS+)a<%3c( zmU}>mtC4iZ)6a(Cdfw(sl&S*>bUfT-AMbU(x9>+6{rnD1EX|o{LX}^QAl>QSqFv@Fej8D?3nSg7&h(gm zy(f{ev_?HTWMlUNFG`+~E-l_L3(l0S+jw=U87=C!kZs4QI(sRbN6sB*OPiT@5^(XG z|0QH>Dv1n36|J3mi4*UBGIgjNb_4vT$jW2rFE@cs9)r^+{?OyT#*8M+SC%@%=bOl) z1f$YUS0zi~5gl!7hT`GwHX9z3VKQ-&A8hg36@?|xT9f?&d0_CnMJ0aDX#BqQVFFu? z(>*a-?><%FMK>JRQ^`Cw;BO=c4Tm00_Cpyk$eUjXn|kx(m3}T&igIDC%{ZUzo`~#&JsVkfoK-NFyCo@vJ3JHx=8OGX=@ zO4hVj@r_JuvoL(2%^fX(VJx#FFiGjfaVGC_^N^43E*0% z67<{^)_@H+p~=x)<(&?I)Zc+>JZjoJd27aak9lh?>GfXuJ>^B`K5V)D-4zcd0Ma-c zJ&~cMVJXV4E+FcslUC6*OvnD{p!;v7+C^j|!d`nP!g(#tm<3s(JG)y{0?G!hk4vfN zZ5{mAsYb>H$Xs;Kuj7u^Zn@FHdx7>W0t(dfnLpFNLjb#F6$${`EG=bf`fF~ENO|OY z_sbZoXo%>|uJF8=5`(L;zp$e>7D!&{_ikzIN1p2o)g8uk?^zss8ROpvqc*yTRJ{;} zrHjl!%MCXKJZlsaQ#RGK=^`4i!(}x8mvLgbjX)$S7miz?;CwO5dRI{x#C_gPN=ozQNej7F3ai$n%9;GAwUZ&P}ZL zn~s-odS>zfbr{M^H`A>4LW7i&rfWuVrRQ^U-Q^CAN>_BWF@<4CqMD9Q&eLGKO1iIv zEWyda+6C*wkt?G>mioCszcEtfjnm~F=xZG$%mQ{n{FcGpQYM|}kG|18;cRU2`tVDS zDpWbR0@>yAigY(a#oRvXv75KyK+fQ#q=_Oo8qujWj|Qj4GxDe02@|HC@cFe8e`(_5 zJ0dv?1xhX}m1FM1WZ@i#P&;M{H~xn}$9VE;R{BXsg}EmYnJ#U^LW_@#Q zSeZ2xju8wSbY`=}${i6<{lZauZ+(G{`kOzV;6vK{HHo>3bGRSuz#w5xRzzqvJz%2737`CTOD3E23%M!oub!GIFj*Umk1INrmuH zT5m%g#S9M14ZYsc@&rucqcy_gjvN9y^K(j|tYg^W8R~)3Isc=CaG3=v zo&>$x?=EBahrDXg%9Q4*N|`Y3qZCTK^d1t@PY#s`ljZSytXM@Mxv^gzHb!)Z+;NW9 zXE+l@WUV-b$AZP{>p`%3LI|MjlBu=1jB!w~&&x@r3~2E~V_Rm`x@OX+FO2706xYET z^o*J+Q6w=2?5QCc9N8Z5N;CVm|&3r<1*sJ-V3iPGJl&d*XKe$}Myo`(%- zs?8D*mh)g&cG$bqGhO_=y-@>@7cQT1c_6R##oR#SG)Xn3Mlzj{o_Z(*if^YkC1MLM zbWE}vO5ov3@ZzvkJv`mnacenr6(<^f5>Q|-1Aa$AV~3+s#TYq5Rou%n+n@`I>(phKl$b zkOO3wm~pH;d!GrSlXxWiIq2Sdhbo+L)Ws`HtEj-_YTxRVMipz1O*5HE8Pg8!biR~; z9Yt#16s%Z#2*tv_sZ&2`QkV#yf~s9j=PAZFfsBX6;Q2-hu6L-3gZHMsm6=o6T9_e8 z{d89*cb>g`D}IfSzg z+Ft;u();CbgGmsy%(Bn#vNxy~cqg}kzWnZzRDJy{%PV>zrXk;v;yx19@yWm1jeV_Q ze(gNw^Qjjv?Jp-)8WY7%-vYe{u6odxA`hRM(=cm2C+$jjMu_@`72+LZx7D*~>>z9c zC5OW8ocN(!V=dCkE==#^KA!W9Td#_kjQ^d6Vd2^$;hB*>!zXOXL^5@vjLM2@Ff0zT7m5ZAWFs|NG^hgll8hO1E%6O`*G%& zStV#Be)&pSA+`+J!Yjjd<8lw>sGi#r6Dk2ch!Sz z(WZCyl=8&1JXxRG+)xClslTWS4rtrFj_nZS+MR^7Bju-x06%2Lq`d}kYf~nmRZUqs2 zyrD^$V?T%0m$o`L%re|Jr>riA5aK4q*SuFUmLY}M%wzL?R=`=$Gq0=v3@`puiyiVD zC5CeUXfESTx5mf*M;37i4Xqce6q(?+msa9rcb^T2d#4@QS6Qv&auF!tQporng9z#w zpDui5udPinkCYoV!&?AltxSf8Z1q)N5IW_o972D*aXClN$gONCQ0mXeTug#7r+e-p zg!Z5MjH4i0Wo+6wfqm5#-~Bz*Pc1`H--f1O{eu-JkG}`=o*+DHQ1-)6WESj^Wm(Y& zrOAEmwwNMMCOu-G$K|3#WFj)2h>PO&ocWqVDk^bm>=~n*{rE(-@#6-01IV}M4g~WR zqL)r3yNd;XIac=4@iUat3HhYaDQ|IMbZo^5v2q6 zeH?1g8s4ZUt~*mPk?+Y7#di z{bE@f3rd)5WsjXXPvr^I4^@)|o>rH6$Vcp7aPD7en{w(9MLobV9;qgb%{cmp*)9cQ) z;xx7*-rvIh;XDP8=&fJhF%)S0K%l)OSz?qX`2>DKI?l_BUW5dgopatMMfb%C_WwG4 z>Tb#4C08O;7T~z-{<3ahLzk%7^T4hER_$aCXGS$U1ij?3hj%XyeK%1!VRP3-hMgtc#+>i*bad9Sx0nJsX0<`;9LneDErT`PLMVgrq=>S-fM zN*wnkFol!Ah@4^ba6NU>8Ebj^%dS1Emcm+eiox54a^yqp22GCOHuYWfAtQ8EMFtE_ z91)g5+M@)31pPX1}HLWc0brz=LQ1n?nj0<$E#y-3~ax=eH3a;E!3Q4b(% zH)T$K(0(c6o2@y*28KTo3Tl3eQf+88LnTpPv-VZoj_atr(*JAQ%Fg-|s3#M$NP_hF z$SrM&&+hQj7eS5W#+?H!$h2Xi?(5Tbw({@6i#0avR7`3+!Rmy43u<`paisK8FPLeDb9MmpLf^Zw0}fq672NlbHCsAm!hAs{(MiuKKf`+ z!~M7q!eu7%MysV5iLDynZhXtS(IOMs44*x>-pE>(uZdO_AD7eZdgk%sZ}CJfcG=Nf zd46(Zbd+S|KD4utb|+m9vs)A{Ov**^*VpV-UTiSXL03(s#lc2yae(yeaYRi(wv6$Gl~y3mdCE&|HlWdXWu=A~o;Q z6Y@B&50o!7v@#A0yPK-&Z3M4aPqj;-IjtC`Fv&yr+eF6cm^bjuzE|mw%Bw0 zFMN7pW~8JAvAOM>L2>8j#(aF(5Tu2B%vqaGZ<{wy@3vE(_si~;c;Uces=8K(a@2bM zyml%-lNe~MzQ)8()i71lGJ+V((deg%xjNly4p(KlUl3RFd-Y;rw>Vf(o`-bl4tiGf z8;{$&iN^Ki|2{cUB685Mz7gR(xIT?(CbMG~8;&eo8OvjC7(VJ1erimjiaU6@1RJYo zH!*r5R4LAcNzxf$etmMwESE@WkUeczVgc&krR}MiHiiIyDL{}7VpC)>p4(?$(|OYZP>UsKjNkAe+V7+z7pq

;W zz`utIrx?p)UEN~Zb>@7~)pQ_5T3LA%b_#J=4vQS)zikMN)hW^i83M`fupMG)-{4H* zu7(};@llnFgS|oE038dNPPg;9T9{2c3(C~j2)j8r6Z^7#U|)y(t|D+~uHO~Txxp)5 zsNi~xfup~i#_fbZjj%T{NXg!e6H++37T}MZ@=MCzCt2-PNit-m)gqx}y}nlp_?|y1 zw+2`rN<0cTF0|nT0qf8jQ#k6i==;`OTlmW72n3!AO!-9DAq)Lj^RHx(=D{5gu_XC5 zYS*4&ht)vFrwXZ2pD>emf4Tw=6YU5L&~KRCHrmJ;5yQf0e}w$Y@EqR$q3a<(#q4 z6|J>j5AgK%AG6i##+f;Y+l#I15IZj&ZfNtc7&h7;#qV%qyGKK$KZ|)XcNLE3frk{p ziW%(ZILN;&r1Wp{yYy(=={IvJH4qPRGVlUj;XTfDxGpF)+1L>?Gr>Ym*8Y`K){xLG zEB-`qDq$=YwjM7~%;_UFmUWw^AySVPSA@y$)vxz1CFAT2W}nxdW?O5_;2YU~Vo0p- zhn6LEU`I>}C~%PwQbrOPFVudYE0okSiD_c0Z0_4OM!C0O+P?5xAt{jn$4x|HNVFkf z#?H7PrFYcQMwQMBYp1)?=$>Cu-xuviAnA49DATZvRlG?py{@KR)Os*Zw!sj&sU+w#GKLQyi$q{D!5vponTzgm|2;zoh;Dl7;~ z@1h&Hd?i5B<9Xb0*>tJjY*_A9RZxJ$sy1y~H7*+t>D zjjTIeX~n-l0dyUtcAPllXSofkRl?2qs{PL931<`N6kaVoWRiY2c53rIf9YbS=h-F< z`}jxPVRDEW|9vzNZfPz}#Nk^(65)7+DasBphES~(bBHa`j=aN;KAeA%%PgpBA93BnQOC|b~Z{ITWvc$TCX-_ zbH!y#0mNSHAA%!Z$xpkhrf%1XQ-&SO=#Dr}<f+Y@b+n2qtGjzP@P9Ib_DUX zlhGP!mS@T`fbG zoQHA|9C0Bf!?l2$vKdoz*K)!uxB^Cchv6BVL^PYi;A++2Np`3P z$Rs4IN~JSPfGDiuPiVDp_mg{%8~G9Rk-BvPC)?%?SPV@@AumA(PIbNQ*oLgr+9zAi zxm<@U)|zs%%;bz}kGpa-=DHX$AM0Q*`rj${r>jKcHhaxH@Q4TS3{1QK4qSN=c^G9;$#e zE!dV*;(NJ6T&#&Xn4@_A4(;8*(n%VhTM$YuG!WsbcG|fyXwvd0b9$4D_H(?~)7DG0M#EE6e`RYO-_+^oSewK8 zQvGQGH6A#|3*XH{C!zBQytq~=g{*CS2D9LON4U&!Sd(8&Qt+cg0xE4-6IHfg_l^5G zLY44Y;BQf>7iEsU)SCrR`mMxM+i&J&Pj&J>(!x9Xtsqc>8ub@*!IK_#zt}k zF|Cp~LAx;s8>Vbd$EW5)LXsaHLdIh=2=S1$o-N=XQB-c=K3Z-JBPTX!Aa171VlWvzp%e zDQF%j<8^_C?!J0{DPcl~=e&FU14gFkGMmsJ2{s_UHHNM6%Vpv=Dit&!(NPGX79pqi za{}cA?Y(L9ZtVW+U3QIIsE%Pt+Fc4?9ccg`Y~A;_(j}Mno9YG)DBlPMI~i@3>llmp zhT=Cm^tSbbJh-4W_}*7Bu0BqG=BKEzLtPpvL*4YtJ%`1nP{%AJ4jSBOS`*C;@u0Ou z@*K`f9$=$wiuk~9O86H_^(TR4>-e~<$@^LeJo_!4G)_+F(WvhnELSZ6|& z5uD zmbj7LDwwI+zVA@3pt_i-EN~@#%lDc)rYF*OEv+ezmA1IAH2cUwl8P9v1e%Vp9)AKg zoRKt-yvMRJ##5Ry6xp)UiD`$K*9n;%7be|ym9EYbzUG~jIkifp4{D6%`shZ z0av$Ux#kLt(~My!Kk64K%bH7QYTS@!96kf|f@>2(=8z?pn|U++^ON~|;3dNcp@$(c zEi}+FF%}U*mVrBG(yQ*IU!4XRjlNz3It_|E8m90)*35VBfK8?KGZy9XIG(u;eY
    0s-|NItEsnqj{3T zBBB)Sus#^#(nRdjQ1bjipM(otxNe~~Lp|JuB}n{mA4o~hU16t6+`GM0P*g;U_8^DC z{*7FQVXg&5fU$7Q{hi!x*_U)yugtl=Aevk396(TYA@MyZ%i;t=SAZSOdSI2~jXgoH z6|T-<^z>04Ee6E=r19VgfWtaRiJ0{X%Hz`dl{6#PR{fAD6WIRu;Xzd}H6K8Gb~ECT z1QJKVeF{+@=t%%tWdNj7+cAC`Kj;|`n#N#gA*nhgu)Ca5W^X(12j#r7AD;F1kySOv zSyaU1p*FA5iP6kK*}H!3if!$mo8$H0p57VSvy#V~e|v@-th7*!OgoD zuf$fhRAI1y{W8 zd^ax`)eFqO3dxP0-XRXk0TP1PjyfRqTl;V?eSXGvl3hOB5)A`sZq^KPGu4EqUzULt z+BmW_k78_!MV0$B-nk`)Cm4li(tG(YAtC>CamX`RD{ICg4`RH{S3<uUrM~^#uhsY5|>*r%2oZF62?C=TG_O@#%o85>zAnZIeT~O>BUNl)u-03a2cShb<}X<7LQgEJO%!w0 z5~|N^t}Ou|zf;de&?<~IxqWM+xc6DC1x+W@ECqku;_B))H}eWz8%<&^jY9aH*mQQ=_cM8S zcoI;bbBlo&KF334pC41g!oSVV&A~~*!h5FMjLYJaz{eFSD=j7Z{o1bzN$xPXjen9| z4msAzXy|o0Kl5%2Gv;R2?GIzLT$w#tLc7UtBD##tFI^~ORnPAM8UOE#kR52|s`*=mWb zRikKPJpjePzQjRvo4TRSA`fk_&k>-i;eo%%{%IiOz9n&coA@10SNPgLSK;R`S1**O z;Mr*L8{sJ}#MPGEqL<&?Q?tT@S^eC87QByh)1}L}7_v=C!O zyE+2eB9-0tfK*yA@i+qtRa)viHDn;BAwiOudG0{4d9kEPJBK*zE z1K_>unhGP&okIhuA(Qg8mnmMAlIOzbk#Fx%EzH_u?ow7LE1JX~hX}@y)+mFED zjoFgEfnMxXP6&qeITNe=25!@$az+HPloAp|@RasHAk`%(v7K_jp4+QLEDtQkM?Hqc zq(ZX>WNs+Reh=q3(pR6N<9zSQQ;5d>z=&)a1GXgyQtGSRXQJc$rs3 zprM~wX%I&xHa!U7=I45^I`{Z2K!LtYc3OCJ^7=2t+I>`2Me(mT@XjYAyN#_0zov2> z0!^$i#C=EGtIom845=n0vQ++NDXois_1aoaiIksWlQ8OJA_h%~U^0=K5@vq4*D_IT$DO?x7*`jO zObRB%+ug(G8*%N*r7u$$amKDzREbVR(yvW33|6VZE(AG7Pm2uVmVo!Yh)_)nL~k_Z zz(+-M*0mey%Iq*w(mi`voys{X40XOOp(toQVV%Q1PUXE0M6cRA@gVBO_e?;TE!y(f+`;gRQ_=`Rwf?t(ti~BV#+{ zRvUzuFd?0g)vVFz$<^=4T|bjxZB-5`Rw8UdJs8sWs2166907qtS1TuaE~Is@T}cp* z-jv;DTDHfKVE#eJgZZwz!k~p(!z%6tr>AthH_C^NmKq1S*+%wBx~O4!#Y@Ocr{r|1 zVWAHV|AqqblIW)IXNH=%0D<=tsK3uzv=nItI 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ⅅxTVa0j3rCQ%K=s(?+n9r= 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

    0$Lz)-x*|u*g%-0 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

    _!M)%I3kcfNxbvw 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≷> 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

    L#n0gZ3y9MG%_Aq`Z*LaW+auAYnD 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

    T2gwNCYX6rnn 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 A-2eap

    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