From a46f62079ab06285db7163938cd8448e2684d849 Mon Sep 17 00:00:00 2001 From: wilson Date: Fri, 10 Jan 2025 21:14:09 +0100 Subject: [PATCH] lint fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lint fix lint fix lint fix refactor lint fix modified elide logic changed words lint fix lint fix lint fix fix(polls) improve resilience to bogus data feat(tests): Adds self view, display name and end conference tests. (#15432) * feat(tests): Use shorter display names for screenshots. * feat(tests): Adds self view tests. * feat(tests): Adds display name test. * feat(tests): Adds end conference test. fix(configWhitelist): Remove some props. chore(deps) lib-jitsi-meet@latest https://github.com/jitsi/lib-jitsi-meet/compare/v1890.0.0+144b0cab...v1893.0.0+496b64a7 fix(connection): Adds default tenant value on error. Avoids undefined error. feat(customParticipantButton): metrics fix(lang) fix typo in unsecure room name warning (#15468) fix(video-menu): Hide "Mute all" option when all participants are moderators (#15461) * Fixed exception for visibility state of mute all button * Updated changes as per review: shifted conditional to the toggle * chore: fix eslint warnings and errors --------- Co-authored-by: Bhavik Arora fix(readme): Fixes badge icon and f-droid link. Fixes #15464 Fixes #15465 chore(deps) lib-jitsi-meet@latest https://github.com/jitsi/lib-jitsi-meet/compare/v1893.0.0+496b64a7...v1895.0.0+7de7d9aa fix(readme): Fixes badge icon. Fixes #15464 lang: Update main-zhCN.json (#15426) main-zhCN.json line 413 missing: "sessTerminatedReason": "会议已经结束", feat(tests): Adds desktop sharing test. feat(tests): Adds dial-in test. (#15470) * feat(tests): Adds dial-in test. * feat(tests): Adds fake dial-in test. * squash: switch to performance.now(). fix(polls) limit maximum amount of answers chore(helpers) drop custom createDeferred() for Promise.withResolvers() chore(deps) update eslint Required for compatibility with new TypeScript plugins. fix(lint) tame linter feat(tests): Adds follow-me and invite dialog test. (#15476) * feat(tests): Adds follow-me test. * feat(tests): Adds invite dialog test. * squash: fix lint. fix(configWhitelist): Add p2p.mobileScreenshareCodec refined logic remove tooltip cleaup Update Notification.tsx lint fix --- README.md | 2 +- images/google-play-badge.png | Bin 4254 -> 2729 bytes interface_config.js | 2 +- lang/main-zhCN.json | 1 + lang/main.json | 2 +- package-lock.json | 3981 +++++++++++------ package.json | 26 +- react/.eslintrc.js | 20 +- react/features/always-on-top/index.tsx | 2 + react/features/analytics/AnalyticsEvents.ts | 2 +- react/features/analytics/functions.ts | 44 +- react/features/app/actions.any.ts | 1 - react/features/app/components/AbstractApp.ts | 6 +- react/features/app/getRouteToRender.web.ts | 5 +- react/features/app/middleware.ts | 3 +- .../features/base/app/components/BaseApp.tsx | 7 +- .../base/conference/middleware.any.ts | 7 +- react/features/base/conference/reducer.ts | 2 +- react/features/base/config/configWhitelist.ts | 16 +- react/features/base/config/functions.web.ts | 2 +- react/features/base/i18n/middleware.ts | 2 +- react/features/base/jwt/middleware.ts | 2 +- .../base/media/components/web/AudioTrack.tsx | 2 +- .../base/media/components/web/Video.tsx | 2 +- react/features/base/media/constants.ts | 10 +- react/features/base/media/reducer.ts | 8 +- react/features/base/participants/actions.ts | 20 +- react/features/base/participants/functions.ts | 3 +- .../features/base/participants/middleware.ts | 492 +- .../base/popover/components/Popover.web.tsx | 4 +- .../base/redux/StateListenerRegistry.ts | 4 +- .../toolbox/components/AbstractButton.tsx | 2 +- .../base/ui/components/web/ContextMenu.tsx | 6 +- .../base/ui/components/web/DialogWithTabs.tsx | 2 +- .../ui/components/web/TextWithOverflow.tsx | 6 +- react/features/base/util/helpers.ts | 21 - .../calendar-sync/web/microsoftCalendar.ts | 7 +- .../chat/components/web/DisplayNameForm.tsx | 2 +- react/features/chat/middleware.ts | 8 +- react/features/conference/constants.ts | 2 +- .../components/native/DisplayNameLabel.tsx | 2 +- .../components/web/ThumbnailWrapper.tsx | 2 +- react/features/filmstrip/functions.native.ts | 1 - .../AbstractAddPeopleDialog.tsx | 20 +- .../dial-in-info-page/DialInInfoApp.web.tsx | 6 +- react/features/invite/functions.ts | 2 +- react/features/keyboard-shortcuts/types.ts | 26 +- react/features/large-video/actions.web.ts | 4 +- .../components/LargeVideoBackground.web.tsx | 3 +- .../mobile/call-integration/middleware.ts | 2 +- react/features/mobile/polyfills/browser.js | 1 + react/features/notifications/actions.ts | 50 +- .../components/web/Notification.tsx | 51 +- react/features/notifications/types.ts | 1 - .../components/web/RoomList.tsx | 8 +- react/features/polls/middleware.ts | 23 +- .../components/AbstractRecordingLabel.ts | 6 +- react/features/room-lock/actions.ts | 1 - react/features/subtitles/reducer.ts | 2 +- .../components/AbstractAudioMuteButton.tsx | 6 +- .../components/native/OverflowMenu.tsx | 6 +- .../components/web/AudioMuteButton.tsx | 8 +- .../components/AbstractMuteEveryoneDialog.ts | 9 +- .../components/native/RemoteVideoMenu.tsx | 2 +- .../components/native/VolumeSlider.tsx | 2 +- .../components/web/CustomOptionButton.tsx | 2 +- .../components/web/MuteEveryoneDialog.tsx | 33 +- react/features/web-hid/webhid-manager.ts | 9 +- .../welcome/components/WelcomePage.web.tsx | 15 +- react/index.web.js | 1 + resources/img/google-play-badge.png | Bin 17842 -> 9377 bytes tests/.eslintrc.js | 3 + tests/env.example | 3 + tests/helpers/Participant.ts | 97 +- tests/helpers/participants.ts | 76 +- tests/helpers/types.ts | 7 + tests/pageobjects/BreakoutRooms.ts | 1 - tests/pageobjects/Filmstrip.ts | 89 + tests/pageobjects/InviteDialog.ts | 102 + tests/pageobjects/Notifications.ts | 21 + tests/pageobjects/ParticipantsPane.ts | 16 + tests/pageobjects/SettingsDialog.ts | 70 + tests/pageobjects/Toolbar.ts | 54 +- tests/specs/2way/displayName.spec.ts | 45 + tests/specs/2way/endConference.spec.ts | 22 + tests/specs/2way/fakeDialInAudio.spec.ts | 52 + tests/specs/2way/selfView.spec.ts | 70 + tests/specs/3way/followMe.spec.ts | 93 + tests/specs/4way/desktopSharing.spec.ts | 353 ++ tests/specs/alone/dialInAudio.spec.ts | 82 + tests/specs/alone/invite.spec.ts | 87 + tests/specs/helpers/DialIn.ts | 48 + tests/wdio.conf.ts | 11 +- tests/wdio.firefox.conf.ts | 5 +- tests/wdio.grid.conf.ts | 2 +- tsconfig.native.json | 2 +- tsconfig.web.json | 2 +- 97 files changed, 4624 insertions(+), 1829 deletions(-) create mode 100644 tests/pageobjects/InviteDialog.ts create mode 100644 tests/specs/2way/displayName.spec.ts create mode 100644 tests/specs/2way/endConference.spec.ts create mode 100644 tests/specs/2way/fakeDialInAudio.spec.ts create mode 100644 tests/specs/2way/selfView.spec.ts create mode 100644 tests/specs/3way/followMe.spec.ts create mode 100644 tests/specs/4way/desktopSharing.spec.ts create mode 100644 tests/specs/alone/dialInAudio.spec.ts create mode 100644 tests/specs/alone/invite.spec.ts create mode 100644 tests/specs/helpers/DialIn.ts diff --git a/README.md b/README.md index 7a81a71e478a..d181cc507fc3 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ mobile apps: | Android | Android (F-Droid) | iOS | |:-:|:-:|:-:| -| [](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [](https://f-droid.org/en/packages/org.jitsi.meet/) | [](https://itunes.apple.com/us/app/jitsi-meet/id1165103905) | +| [](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [](https://f-droid.org/packages/org.jitsi.meet/) | [](https://itunes.apple.com/us/app/jitsi-meet/id1165103905) | If you are feeling adventurous and want to get an early scoop of the features as they are being developed you can also sign up for our open beta testing here: diff --git a/images/google-play-badge.png b/images/google-play-badge.png index d34533767940737ef6f22fdda543461196924f34..c778da6828bbe8bc1b40682ddb5f8fe7c9514be8 100644 GIT binary patch delta 2706 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 M07*qoM6N<$f(AEV*8l(j delta 4243 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 diff --git a/interface_config.js b/interface_config.js index ae1ea304e1ce..fff18fa6d462 100644 --- a/interface_config.js +++ b/interface_config.js @@ -227,7 +227,7 @@ var interfaceConfig = { /** * Specify custom URL for downloading f droid app. */ - // MOBILE_DOWNLOAD_LINK_F_DROID: 'https://f-droid.org/en/packages/org.jitsi.meet/', + // MOBILE_DOWNLOAD_LINK_F_DROID: 'https://f-droid.org/packages/org.jitsi.meet/', // Connection indicators ( // CONNECTION_INDICATOR_AUTO_HIDE_ENABLED, diff --git a/lang/main-zhCN.json b/lang/main-zhCN.json index a73df11ddd5e..16a35f6a87ce 100644 --- a/lang/main-zhCN.json +++ b/lang/main-zhCN.json @@ -410,6 +410,7 @@ "sendPrivateMessageTitle": "私信回复?", "serviceUnavailable": "服务不可用", "sessTerminated": "通话已结束", + "sessTerminatedReason": "会议已经结束", "sessionRestarted": "由于连接问题,呼叫重新启动。", "shareAudio": "继续", "shareAudioTitle": "如何分享音频", diff --git a/lang/main.json b/lang/main.json index b98bd979518f..598e0f225e08 100644 --- a/lang/main.json +++ b/lang/main.json @@ -1083,7 +1083,7 @@ "about": "You can add a $t(lockRoomPassword) to your meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.", "aboutReadOnly": "Moderator participants can add a $t(lockRoomPassword) to the meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.", "insecureRoomNameWarningNative": "The room name is unsafe. Unwanted participants may join your meeting. {{recommendAction}} Learn more about securing your meeting ", - "insecureRoomNameWarningWeb": "The room name is unsafe. Unwanted participants may join your meeting. {{recommendAction}} Learn more about securing you meeting here.", + "insecureRoomNameWarningWeb": "The room name is unsafe. Unwanted participants may join your meeting. {{recommendAction}} Learn more about securing your meeting here.", "title": "Security Options", "unsafeRoomActions": { "meeting": "Consider securing your meeting using the security button.", diff --git a/package-lock.json b/package-lock.json index 6ac347af4233..209eba62c1f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,7 @@ "js-md5": "0.6.1", "js-sha512": "0.8.0", "jwt-decode": "2.2.0", - "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1890.0.0+144b0cab/lib-jitsi-meet.tgz", + "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1895.0.0+7de7d9aa/lib-jitsi-meet.tgz", "lodash-es": "4.17.21", "moment": "2.29.4", "moment-duration-format": "2.2.2", @@ -70,6 +70,7 @@ "optional-require": "1.0.3", "pixelmatch": "5.3.0", "promise.allsettled": "1.0.4", + "promise.withresolvers": "1.0.3", "punycode": "2.3.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -128,8 +129,9 @@ "@babel/plugin-transform-private-methods": "7.25.9", "@babel/preset-env": "7.25.9", "@babel/preset-react": "7.25.9", - "@jitsi/eslint-config": "4.1.10", + "@jitsi/eslint-config": "5.0.9", "@react-native/metro-config": "0.75.4", + "@stylistic/eslint-plugin": "2.12.1", "@types/amplitude-js": "8.16.5", "@types/audioworklet": "0.0.29", "@types/dom-screen-wake-lock": "1.0.1", @@ -155,8 +157,8 @@ "@types/w3c-image-capture": "1.0.6", "@types/w3c-web-hid": "1.0.3", "@types/zxcvbn": "4.4.1", - "@typescript-eslint/eslint-plugin": "5.59.5", - "@typescript-eslint/parser": "5.59.5", + "@typescript-eslint/eslint-plugin": "8.19.1", + "@typescript-eslint/parser": "8.19.1", "@wdio/allure-reporter": "9.4.3", "@wdio/cli": "9.4.3", "@wdio/globals": "9.4.3", @@ -168,12 +170,12 @@ "circular-dependency-plugin": "5.2.0", "clean-css-cli": "4.3.0", "css-loader": "6.8.1", - "eslint": "8.40.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsdoc": "46.2.6", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-native": "4.0.0", - "eslint-plugin-typescript-sort-keys": "2.3.0", + "eslint": "8.57.0", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jsdoc": "50.6.1", + "eslint-plugin-react": "7.37.3", + "eslint-plugin-react-native": "5.0.0", + "eslint-plugin-typescript-sort-keys": "3.3.0", "jetifier": "1.6.4", "jsonwebtoken": "9.0.2", "metro-react-native-babel-preset": "0.77.0", @@ -2858,14 +2860,15 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", "dev": true, + "license": "MIT", "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { "node": ">=16" @@ -3283,23 +3286,25 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -3318,13 +3323,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3340,6 +3347,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3356,6 +3364,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3368,6 +3377,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3376,10 +3386,11 @@ } }, "node_modules/@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -3581,13 +3592,15 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -3608,10 +3621,12 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/checkbox": { "version": "3.0.1", @@ -4138,10 +4153,11 @@ } }, "node_modules/@jitsi/eslint-config": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@jitsi/eslint-config/-/eslint-config-4.1.10.tgz", - "integrity": "sha512-xUfuhYmmvNrwWvk3QfgKlNY/O3l19ffVTofj1dDbI6kLXfC9B1FZ++09q1d8hm47m7rgIylNCQ1eV5XF6SohbA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@jitsi/eslint-config/-/eslint-config-5.0.9.tgz", + "integrity": "sha512-Xs44+Q8dU3dYvHuDYbcYWUwEwsGIWFD8tAX2WdtTihtaTkmzYBt74Piiyqe3qQSp1CYIfr85wl30BFf5oTZtXg==", "dev": true, + "license": "Apache-2.0", "peerDependencies": { "@babel/eslint-parser": ">= 7", "eslint": ">= 8" @@ -4680,6 +4696,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -6489,6 +6518,13 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -6554,6 +6590,70 @@ "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==" }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.12.1.tgz", + "integrity": "sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "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/@stylistic/eslint-plugin/node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz", @@ -7139,7 +7239,8 @@ "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/jsonwebtoken": { "version": "9.0.7", @@ -7390,12 +7491,6 @@ "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -7538,37 +7633,33 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz", + "integrity": "sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/type-utils": "8.19.1", + "@typescript-eslint/utils": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/experimental-utils": { @@ -7698,43 +7789,42 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz", - "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz", + "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", + "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -7742,39 +7832,37 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.1.tgz", + "integrity": "sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/typescript-estree": "8.19.1", + "@typescript-eslint/utils": "8.19.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", + "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -7782,69 +7870,107 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", + "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "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/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.1.tgz", + "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", + "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.5", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.19.1", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -7852,17 +7978,25 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true, + "license": "ISC" + }, "node_modules/@vitest/pretty-format": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", @@ -8723,9 +8857,10 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -9270,27 +9405,32 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "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-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -9309,16 +9449,59 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "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.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "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.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "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" @@ -9328,15 +9511,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "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" @@ -9364,16 +9548,40 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "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", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asap": { @@ -9437,9 +9645,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10025,15 +10236,41 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "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.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -10589,10 +10826,11 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.0.0" } @@ -11150,6 +11388,54 @@ "node": ">= 14" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "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", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "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", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "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/dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", @@ -11199,7 +11485,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "3.3.0", @@ -11288,10 +11575,11 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -11524,6 +11812,19 @@ "@types/node-fetch": "^2.5.7" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -11880,44 +12181,61 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "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.3", + "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.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "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-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.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.18" }, "engines": { "node": ">= 0.4" @@ -11932,12 +12250,9 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -11968,42 +12283,83 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "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-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "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.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "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.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -12110,27 +12466,30 @@ } }, "node_modules/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@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.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "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", @@ -12138,22 +12497,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "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.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -12167,14 +12523,15 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -12182,32 +12539,38 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.16.0", "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/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -12225,37 +12588,43 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -12279,23 +12648,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.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-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -12306,95 +12658,155 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz", - "integrity": "sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA==", + "version": "50.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.1.tgz", + "integrity": "sha512-UWyaYi6iURdSfdVVqvfOs2vdCVz0J40O/z/HTsv2sFjdjmdlUI/qlKLOTmwbPQ2tAfQnE5F9vqx+B+poF71DBQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.39.4", + "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", - "debug": "^4.3.4", + "comment-parser": "1.4.1", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.1", - "spdx-expression-parse": "^3.0.1" + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/eslint-plugin-jsdoc/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "builtin-modules": "^3.3.0" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "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.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "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" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz", - "integrity": "sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-5.0.0.tgz", + "integrity": "sha512-VyWlyCC/7FC/aONibOwLkzmyKg4j9oI8fzrk9WYNs4I8/m436JuOTAFwLvEn1CVvc7La4cPfbCyspP4OYpP52Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.7.4", "eslint-plugin-react-native-globals": "^0.1.1" }, "peerDependencies": { - "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "node_modules/eslint-plugin-react-native-globals": { @@ -12416,12 +12828,13 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12442,21 +12855,22 @@ } }, "node_modules/eslint-plugin-typescript-sort-keys": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-2.3.0.tgz", - "integrity": "sha512-3LAcYulo5gNYiPWee+TksITfvWeBuBjGgcSLTacPESFVKEoy8laOQuZvJlSCwTBHT2SCGIxr3bJ56zuux+3MCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-3.3.0.tgz", + "integrity": "sha512-bRW3Rc/VNdrSP9OoY5wgjjaXCOOkZKpzvl/Mk6l8Sg8CMehVIcg9K4y33l+ZcZiknpl0aR6rKusxuCJNGZWmVw==", "dev": true, + "license": "ISC", "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0", "json-schema": "^0.4.0", "natural-compare-lite": "^1.4.0" }, "engines": { - "node": "12 || >= 13.9" + "node": ">= 16" }, "peerDependencies": { - "@typescript-eslint/parser": "^1 || ^2 || ^3 || ^4 || ^5", - "eslint": "^5 || ^6 || ^7 || ^8", + "@typescript-eslint/parser": ">=6", + "eslint": "^7 || ^8", "typescript": "^3 || ^4 || ^5" } }, @@ -12565,10 +12979,11 @@ "dev": true }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -12581,10 +12996,11 @@ } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -12632,22 +13048,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -12739,12 +13139,13 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -12756,10 +13157,11 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -12781,10 +13183,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -13180,8 +13583,9 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, "node_modules/fast-loops": { "version": "1.1.4", @@ -13648,14 +14052,16 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "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" @@ -13782,15 +14188,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -13820,6 +14231,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -13832,12 +14255,13 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -13919,11 +14343,12 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -13962,11 +14387,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13982,6 +14407,13 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -14003,21 +14435,13 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14043,9 +14467,12 @@ } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -14054,9 +14481,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -14065,11 +14492,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -14502,10 +14929,11 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -14653,13 +15081,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -14733,13 +15161,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "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" @@ -14750,12 +15181,32 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "node_modules/is-async-function": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", + "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", + "dependencies": { + "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.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14773,12 +15224,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14828,22 +15279,43 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "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.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14892,6 +15364,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -14969,17 +15455,9 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "engines": { "node": ">= 0.4" }, @@ -15008,11 +15486,12 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15050,12 +15529,14 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -15065,19 +15546,25 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15095,11 +15582,12 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15109,11 +15597,13 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -15123,15 +15613,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -15152,12 +15638,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15221,6 +15736,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "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", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -15960,12 +16493,6 @@ "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.6.1.tgz", "integrity": "sha512-lyUTXOqMEaA9mm38mHxbTo83WsYAvMJm850kxJcRno3T2qL+e40B2G89E0/4r9TdAeB3jN0TdSVp/VHNI6/WyQ==" }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "node_modules/js-sha512": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", @@ -16111,10 +16638,11 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0.0" } @@ -16415,6 +16943,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -16425,8 +16954,8 @@ }, "node_modules/lib-jitsi-meet": { "version": "0.0.0", - "resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1890.0.0+144b0cab/lib-jitsi-meet.tgz", - "integrity": "sha512-/NoS/uUJvMXdbi5gQoihcQ9ovXlQtFKgdmtiLqLJxz91T9JwdVZNsjo3G6RUVIJ07myb/vjQp91kpm45U7CgIw==", + "resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1895.0.0+7de7d9aa/lib-jitsi-meet.tgz", + "integrity": "sha512-0drO9rkh7W4bOUaQAEO5AWj0VYgYekIt2U9rj9kn5XX9aEUimClVuUtefcSP4dlw7+9Cucg+2lRoGKW9FX8ysw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -17228,6 +17757,14 @@ "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "license": "Apache-2.0" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -18533,9 +19070,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "engines": { "node": ">= 0.4" }, @@ -18552,13 +19089,15 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "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" }, "engines": { @@ -18569,27 +19108,30 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "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" @@ -18598,28 +19140,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "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" @@ -18709,17 +19255,18 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "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.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -18826,6 +19373,22 @@ "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "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": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -18942,6 +19505,20 @@ "node": ">=6" } }, + "node_modules/parse-imports": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "dev": true, + "license": "Apache-2.0 AND MIT", + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -19287,6 +19864,14 @@ "node": ">=12.13.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -19398,6 +19983,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -19511,6 +20097,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/promise.withresolvers": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/promise.withresolvers/-/promise.withresolvers-1.0.3.tgz", + "integrity": "sha512-trMhLkMcpAUOsTEFqkfj+QGjiOOWkqbCGx2xAxhIPRrm1QpKcd/UHC+TNjlRXYQLlAZRrjvewc8qGQn3f6DroQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -21396,6 +21999,27 @@ "redux": "^4" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -21429,13 +22053,16 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "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" @@ -21707,19 +22334,55 @@ "node": ">=18.0.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "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" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safe-regex-test": { + "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "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", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "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" @@ -22074,6 +22737,20 @@ "node": ">= 0.4" } }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-harmonic-interval": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", @@ -22082,6 +22759,19 @@ "node": ">=6.9" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -22133,14 +22823,65 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "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", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "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", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "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" }, "engines": { "node": ">= 0.4" @@ -22200,6 +22941,13 @@ "node": ">=6" } }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true, + "license": "ISC" + }, "node_modules/slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -22619,32 +23367,56 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "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", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "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" @@ -22654,26 +23426,33 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "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.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "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" @@ -22708,6 +23487,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -22880,6 +23660,23 @@ "node": ">=0.10.0" } }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -23205,6 +24002,19 @@ "tslib": "2" } }, + "node_modules/ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-easing": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", @@ -23300,10 +24110,11 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -23316,6 +24127,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -23324,9 +24136,10 @@ } }, "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tss-react": { "version": "4.9.4", @@ -23397,6 +24210,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -23433,14 +24247,71 @@ "node": ">= 0.6" } }, - "node_modules/typed-array-length": { + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "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", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dependencies": { - "call-bind": "^1.0.2", + "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", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dependencies": { + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "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" @@ -23484,14 +24355,17 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^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" @@ -24726,15 +25600,61 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "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" @@ -24747,16 +25667,16 @@ "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -24777,10 +25697,11 @@ "integrity": "sha512-rCPf3AakAAgvapnbYVvG2bQyI3g6EDbPpjDJ72fdAu+XTzB1qvX4ZC6OnZ0I2+thaspjTb+8KwdyhdBl8Lt/QA==" }, "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -26888,14 +27809,14 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", "dev": true, "requires": { - "comment-parser": "1.3.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" } }, "@esbuild/aix-ppc64": { @@ -27084,20 +28005,20 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -27113,9 +28034,9 @@ "dev": true }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -27149,9 +28070,9 @@ } }, "@eslint/js": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", - "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@giphy/js-analytics": { @@ -27315,13 +28236,13 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -27332,9 +28253,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "@inquirer/checkbox": { @@ -27732,9 +28653,9 @@ } }, "@jitsi/eslint-config": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@jitsi/eslint-config/-/eslint-config-4.1.10.tgz", - "integrity": "sha512-xUfuhYmmvNrwWvk3QfgKlNY/O3l19ffVTofj1dDbI6kLXfC9B1FZ++09q1d8hm47m7rgIylNCQ1eV5XF6SohbA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@jitsi/eslint-config/-/eslint-config-5.0.9.tgz", + "integrity": "sha512-Xs44+Q8dU3dYvHuDYbcYWUwEwsGIWFD8tAX2WdtTihtaTkmzYBt74Piiyqe3qQSp1CYIfr85wl30BFf5oTZtXg==", "dev": true }, "@jitsi/excalidraw": { @@ -28064,6 +28985,12 @@ "dev": true, "optional": true }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, "@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -29287,6 +30214,12 @@ } } }, + "@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true + }, "@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -29343,6 +30276,44 @@ "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.0.0.tgz", "integrity": "sha512-fGdq4wPDnSV/KyOsjq4P+zLc8MFWC3lMmP5FBgLWKPJTYcuCbAIrnRGjB7q2jHZdYCOD5vxLuFoKIYLy5/u8Pw==" }, + "@stylistic/eslint-plugin": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.12.1.tgz", + "integrity": "sha512-fubZKIHSPuo07FgRTn6S4Nl0uXPRPYVNpyZzIDGfp7Fny6JjNus6kReLD7NI380JXi4HtUTSOZ34LBuNPO1XLQ==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true + }, + "espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "requires": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + } + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } + } + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz", @@ -30002,12 +30973,6 @@ "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, "@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -30147,21 +31112,20 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", - "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/type-utils": "5.59.5", - "@typescript-eslint/utils": "5.59.5", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.19.1.tgz", + "integrity": "sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/type-utils": "8.19.1", + "@typescript-eslint/utils": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.0" } }, "@typescript-eslint/experimental-utils": { @@ -30237,94 +31201,124 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.5.tgz", - "integrity": "sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz", + "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", - "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", + "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5" + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1" } }, "@typescript-eslint/type-utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", - "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.19.1.tgz", + "integrity": "sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.5", - "@typescript-eslint/utils": "5.59.5", + "@typescript-eslint/typescript-estree": "8.19.1", + "@typescript-eslint/utils": "8.19.1", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^2.0.0" } }, "@typescript-eslint/types": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", - "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", + "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", - "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", + "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/visitor-keys": "5.59.5", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/visitor-keys": "8.19.1", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + } } }, "@typescript-eslint/utils": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", - "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.19.1.tgz", + "integrity": "sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.5", - "@typescript-eslint/types": "5.59.5", - "@typescript-eslint/typescript-estree": "5.59.5", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.19.1", + "@typescript-eslint/types": "8.19.1", + "@typescript-eslint/typescript-estree": "8.19.1" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.5", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", - "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", + "version": "8.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", + "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.5", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.19.1", + "eslint-visitor-keys": "^4.2.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true } } }, + "@ungap/structured-clone": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", + "dev": true + }, "@vitest/pretty-format": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", @@ -30965,9 +31959,9 @@ } }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-import-attributes": { "version": "1.9.5", @@ -31346,24 +32340,25 @@ "dev": true }, "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" } }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, @@ -31373,28 +32368,56 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "requires": { + "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": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "requires": { + "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.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" } }, "array.prototype.map": { @@ -31410,16 +32433,30 @@ } }, "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "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": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "requires": { + "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": { @@ -31468,9 +32505,12 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } }, "b4a": { "version": "1.6.7", @@ -31911,15 +32951,32 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "requires": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" } }, "caller-callsite": { @@ -32303,9 +33360,9 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true }, "commondir": { @@ -32726,6 +33783,36 @@ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true }, + "data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + } + }, + "data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + } + }, + "data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", @@ -32812,10 +33899,11 @@ "dev": true }, "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -32981,6 +34069,16 @@ "node-fetch": "^2.6.1" } }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -33236,44 +34334,61 @@ } }, "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "requires": { + "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.3", + "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.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "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-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.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.18" } }, "es-array-method-boxes-properly": { @@ -33282,12 +34397,9 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", @@ -33309,39 +34421,72 @@ "isarray": "^2.0.5" } }, + "es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "requires": { + "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-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "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.4", + "safe-array-concat": "^1.1.3" + } + }, "es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "requires": { + "es-errors": "^1.3.0" + } + }, "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" } }, "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" } }, "esbuild": { @@ -33413,27 +34558,28 @@ } }, "eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.40.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@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.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "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", @@ -33441,22 +34587,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "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.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "dependencies": { @@ -33501,9 +34644,9 @@ "dev": true }, "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -33511,9 +34654,9 @@ } }, "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "find-up": { @@ -33541,16 +34684,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -33611,14 +34744,14 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { @@ -33631,12 +34764,12 @@ } }, "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -33644,9 +34777,9 @@ } }, "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "requires": { "debug": "^3.2.7" @@ -33664,26 +34797,30 @@ } }, "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { @@ -33704,17 +34841,6 @@ "esutils": "^2.0.2" } }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -33724,60 +34850,98 @@ } }, "eslint-plugin-jsdoc": { - "version": "46.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz", - "integrity": "sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA==", + "version": "50.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.1.tgz", + "integrity": "sha512-UWyaYi6iURdSfdVVqvfOs2vdCVz0J40O/z/HTsv2sFjdjmdlUI/qlKLOTmwbPQ2tAfQnE5F9vqx+B+poF71DBQ==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.39.4", + "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", - "debug": "^4.3.4", + "comment-parser": "1.4.1", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.1", - "spdx-expression-parse": "^3.0.1" + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "dependencies": { - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true + }, + "espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "requires": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, - "is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "requires": { - "builtin-modules": "^3.3.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } } } }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", "dev": true, "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "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.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "dependencies": { "doctrine": { @@ -33790,12 +34954,12 @@ } }, "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -33809,12 +34973,11 @@ } }, "eslint-plugin-react-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz", - "integrity": "sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-5.0.0.tgz", + "integrity": "sha512-VyWlyCC/7FC/aONibOwLkzmyKg4j9oI8fzrk9WYNs4I8/m436JuOTAFwLvEn1CVvc7La4cPfbCyspP4OYpP52Q==", "dev": true, "requires": { - "@babel/traverse": "^7.7.4", "eslint-plugin-react-native-globals": "^0.1.1" } }, @@ -33825,9 +34988,9 @@ "dev": true }, "eslint-plugin-typescript-sort-keys": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-2.3.0.tgz", - "integrity": "sha512-3LAcYulo5gNYiPWee+TksITfvWeBuBjGgcSLTacPESFVKEoy8laOQuZvJlSCwTBHT2SCGIxr3bJ56zuux+3MCQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-3.3.0.tgz", + "integrity": "sha512-bRW3Rc/VNdrSP9OoY5wgjjaXCOOkZKpzvl/Mk6l8Sg8CMehVIcg9K4y33l+ZcZiknpl0aR6rKusxuCJNGZWmVw==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^5.0.0", @@ -33869,20 +35032,20 @@ "dev": true }, "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, "dependencies": { "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } @@ -33893,9 +35056,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -34187,7 +35350,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fast-loops": { @@ -34525,14 +35688,16 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "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": { @@ -34607,15 +35772,20 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" } }, "get-nonce": { @@ -34629,18 +35799,28 @@ "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "dev": true }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" } }, "get-tsconfig": { @@ -34697,11 +35877,12 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "requires": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" } }, "globby": { @@ -34727,12 +35908,9 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "graceful-fs": { "version": "4.2.11", @@ -34744,6 +35922,12 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "gzip-size": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", @@ -34759,18 +35943,10 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==" }, "has-flag": { "version": "3.0.0", @@ -34787,21 +35963,24 @@ } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "requires": { + "dunder-proto": "^1.0.0" + } }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" } }, "hasown": { @@ -35126,9 +36305,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "image-capture": { @@ -35238,13 +36417,13 @@ "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==" }, "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" } }, "interpret": { @@ -35300,13 +36479,13 @@ } }, "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" } }, "is-arrayish": { @@ -35314,12 +36493,23 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-async-function": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", + "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", + "requires": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "requires": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" } }, "is-binary-path": { @@ -35331,12 +36521,12 @@ } }, "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" } }, "is-buffer": { @@ -35368,19 +36558,30 @@ } }, "is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "requires": { - "has": "^1.0.3" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" } }, "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "requires": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" } }, "is-directory": { @@ -35404,6 +36605,14 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, + "is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "requires": { + "call-bound": "^1.0.3" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -35448,14 +36657,9 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" }, "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==" - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" }, "is-network-error": { "version": "1.1.0", @@ -35469,11 +36673,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "requires": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" } }, "is-path-inside": { @@ -35496,25 +36701,27 @@ } }, "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" } }, "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" }, "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "requires": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" } }, "is-stream": { @@ -35523,31 +36730,30 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "requires": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" } }, "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "requires": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.16" } }, "is-unicode-supported": { @@ -35555,12 +36761,26 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "requires": { + "call-bound": "^1.0.2" + } + }, + "is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "requires": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" } }, "is-whitespace": { @@ -35606,6 +36826,20 @@ "iterate-iterator": "^1.0.1" } }, + "iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "requires": { + "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": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -36139,12 +37373,6 @@ "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.6.1.tgz", "integrity": "sha512-lyUTXOqMEaA9mm38mHxbTo83WsYAvMJm850kxJcRno3T2qL+e40B2G89E0/4r9TdAeB3jN0TdSVp/VHNI6/WyQ==" }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "js-sha512": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz", @@ -36252,9 +37480,9 @@ } }, "jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true }, "jsesc": { @@ -36511,8 +37739,8 @@ } }, "lib-jitsi-meet": { - "version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1890.0.0+144b0cab/lib-jitsi-meet.tgz", - "integrity": "sha512-/NoS/uUJvMXdbi5gQoihcQ9ovXlQtFKgdmtiLqLJxz91T9JwdVZNsjo3G6RUVIJ07myb/vjQp91kpm45U7CgIw==", + "version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1895.0.0+7de7d9aa/lib-jitsi-meet.tgz", + "integrity": "sha512-0drO9rkh7W4bOUaQAEO5AWj0VYgYekIt2U9rj9kn5XX9aEUimClVuUtefcSP4dlw7+9Cucg+2lRoGKW9FX8ysw==", "requires": { "@jitsi/js-utils": "2.2.1", "@jitsi/logger": "2.0.2", @@ -37135,6 +38363,11 @@ "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -38057,9 +39290,9 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" }, "object-keys": { "version": "1.1.1", @@ -38067,56 +39300,61 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "requires": { + "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": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" } }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "obuf": { @@ -38175,9 +39413,9 @@ "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -38185,7 +39423,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" } }, "ora": { @@ -38254,6 +39492,16 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "requires": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -38339,6 +39587,16 @@ } } }, + "parse-imports": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "dev": true, + "requires": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -38587,6 +39845,11 @@ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==" }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -38735,6 +39998,17 @@ "iterate-value": "^1.0.2" } }, + "promise.withresolvers": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/promise.withresolvers/-/promise.withresolvers-1.0.3.tgz", + "integrity": "sha512-trMhLkMcpAUOsTEFqkfj+QGjiOOWkqbCGx2xAxhIPRrm1QpKcd/UHC+TNjlRXYQLlAZRrjvewc8qGQn3f6DroQ==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0" + } + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -39968,6 +41242,21 @@ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.1.tgz", "integrity": "sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==" }, + "reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "requires": { + "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": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -39995,13 +41284,16 @@ } }, "regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "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": { @@ -40189,19 +41481,40 @@ "integrity": "sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==", "dev": true }, + "safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "requires": { + "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": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex-test": { + "safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" } }, "safer-buffer": { @@ -40487,11 +41800,32 @@ "has-property-descriptors": "^1.0.2" } }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "set-harmonic-interval": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==" }, + "set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "requires": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + } + }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -40530,14 +41864,47 @@ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==" }, "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "requires": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "requires": { + "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" } }, "signal-exit": { @@ -40586,6 +41953,12 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, + "slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true + }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -40912,49 +42285,69 @@ } }, "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "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": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" } }, "strip-ansi": { @@ -41086,6 +42479,16 @@ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, + "synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -41321,6 +42724,12 @@ "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true }, + "ts-api-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", + "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "dev": true + }, "ts-easing": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", @@ -41390,9 +42799,9 @@ } }, "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -41413,9 +42822,9 @@ } }, "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tss-react": { "version": "4.9.4", @@ -41484,14 +42893,53 @@ "mime-types": "~2.1.24" } }, - "typed-array-length": { + "typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + } + }, + "typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "requires": { + "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": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "requires": { - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + } + }, + "typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "requires": { + "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" } }, "typescript": { @@ -41511,14 +42959,14 @@ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "requires": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" } }, "unbzip2-stream": { @@ -42325,15 +43773,46 @@ } }, "which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "requires": { + "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": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "requires": { + "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": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" } }, "which-module": { @@ -42342,16 +43821,16 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" } }, "wildcard": { @@ -42366,9 +43845,9 @@ "integrity": "sha512-rCPf3AakAAgvapnbYVvG2bQyI3g6EDbPpjDJ72fdAu+XTzB1qvX4ZC6OnZ0I2+thaspjTb+8KwdyhdBl8Lt/QA==" }, "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "workerpool": { diff --git a/package.json b/package.json index 10d329184ea7..795df383f019 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "js-md5": "0.6.1", "js-sha512": "0.8.0", "jwt-decode": "2.2.0", - "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1890.0.0+144b0cab/lib-jitsi-meet.tgz", + "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1895.0.0+7de7d9aa/lib-jitsi-meet.tgz", "lodash-es": "4.17.21", "moment": "2.29.4", "moment-duration-format": "2.2.2", @@ -76,6 +76,7 @@ "optional-require": "1.0.3", "pixelmatch": "5.3.0", "promise.allsettled": "1.0.4", + "promise.withresolvers": "1.0.3", "punycode": "2.3.0", "react": "18.2.0", "react-dom": "18.2.0", @@ -134,8 +135,9 @@ "@babel/plugin-transform-private-methods": "7.25.9", "@babel/preset-env": "7.25.9", "@babel/preset-react": "7.25.9", - "@jitsi/eslint-config": "4.1.10", + "@jitsi/eslint-config": "5.0.9", "@react-native/metro-config": "0.75.4", + "@stylistic/eslint-plugin": "2.12.1", "@types/amplitude-js": "8.16.5", "@types/audioworklet": "0.0.29", "@types/dom-screen-wake-lock": "1.0.1", @@ -161,8 +163,8 @@ "@types/w3c-image-capture": "1.0.6", "@types/w3c-web-hid": "1.0.3", "@types/zxcvbn": "4.4.1", - "@typescript-eslint/eslint-plugin": "5.59.5", - "@typescript-eslint/parser": "5.59.5", + "@typescript-eslint/eslint-plugin": "8.19.1", + "@typescript-eslint/parser": "8.19.1", "@wdio/allure-reporter": "9.4.3", "@wdio/cli": "9.4.3", "@wdio/globals": "9.4.3", @@ -174,12 +176,12 @@ "circular-dependency-plugin": "5.2.0", "clean-css-cli": "4.3.0", "css-loader": "6.8.1", - "eslint": "8.40.0", - "eslint-plugin-import": "2.27.5", - "eslint-plugin-jsdoc": "46.2.6", - "eslint-plugin-react": "7.32.2", - "eslint-plugin-react-native": "4.0.0", - "eslint-plugin-typescript-sort-keys": "2.3.0", + "eslint": "8.57.0", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jsdoc": "50.6.1", + "eslint-plugin-react": "7.37.3", + "eslint-plugin-react-native": "5.0.0", + "eslint-plugin-typescript-sort-keys": "3.3.0", "jetifier": "1.6.4", "jsonwebtoken": "9.0.2", "metro-react-native-babel-preset": "0.77.0", @@ -221,9 +223,11 @@ "tsc-test:native": "tsc --project tsconfig.native.json --listFilesOnly | grep -v node_modules | grep web", "start": "make dev", "test": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.conf.ts", + "test-single": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.conf.ts --spec", "test-ff": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.firefox.conf.ts", "test-dev": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.dev.conf.ts", - "test-grid": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.grid.conf.ts" + "test-grid": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.grid.conf.ts", + "test-grid-single": "DOTENV_CONFIG_PATH=tests/.env wdio run tests/wdio.grid.conf.ts --spec" }, "resolutions": { "@types/react": "17.0.14", diff --git a/react/.eslintrc.js b/react/.eslintrc.js index 625382ea4c2f..d37101f1ae85 100644 --- a/react/.eslintrc.js +++ b/react/.eslintrc.js @@ -14,24 +14,14 @@ module.exports = { project: [ './tsconfig.web.json', './tsconfig.native.json' ] }, rules: { - '@typescript-eslint/naming-convention': [ - 'error', - { - 'selector': 'interface', - 'format': [ 'PascalCase' ], - 'custom': { - 'regex': '^I[A-Z]', - 'match': true - } - } - ] + // TODO: Remove these and fix the warnings + '@typescript-eslint/no-unsafe-function-type': 0, + '@typescript-eslint/no-wrapper-object-types': 0, + + '@typescript-eslint/no-require-imports': 0 } } ], - 'rules': { - // XXX remove this eventually. - 'react/jsx-indent-props': 0 - }, 'settings': { 'react': { 'version': 'detect' diff --git a/react/features/always-on-top/index.tsx b/react/features/always-on-top/index.tsx index d493c4c306da..3450625e4551 100644 --- a/react/features/always-on-top/index.tsx +++ b/react/features/always-on-top/index.tsx @@ -4,8 +4,10 @@ import ReactDOM from 'react-dom'; import AlwaysOnTop from './AlwaysOnTop'; // Render the main/root Component. +/* eslint-disable-next-line react/no-deprecated */ ReactDOM.render(, document.getElementById('react')); window.addEventListener( 'beforeunload', + /* eslint-disable-next-line react/no-deprecated */ () => ReactDOM.unmountComponentAtNode(document.getElementById('react') ?? document.body)); diff --git a/react/features/analytics/AnalyticsEvents.ts b/react/features/analytics/AnalyticsEvents.ts index 7a61771e75c0..ec26717ac61e 100644 --- a/react/features/analytics/AnalyticsEvents.ts +++ b/react/features/analytics/AnalyticsEvents.ts @@ -311,7 +311,7 @@ export function createInviteDialogEvent( * @returns {Object} */ export function createNetworkInfoEvent({ isOnline, networkType, details }: - { details?: Object; isOnline: boolean; networkType?: string; }) { +{ details?: Object; isOnline: boolean; networkType?: string; }) { const attributes: { details?: Object; isOnline: boolean; diff --git a/react/features/analytics/functions.ts b/react/features/analytics/functions.ts index ad8ce3f008f6..1f7edb6d08f2 100644 --- a/react/features/analytics/functions.ts +++ b/react/features/analytics/functions.ts @@ -154,6 +154,30 @@ export async function createHandlers({ getState }: IStore) { return handlers; } +/** + * Checks whether a url is a data URL or not. + * + * @param {string} url - The URL to be checked. + * @returns {boolean} + */ +function isDataURL(url?: string): boolean { + if (typeof url !== 'string') { // The icon will be ignored + return false; + } + + try { + const urlObject = new URL(url); + + if (urlObject.protocol === 'data:') { + return false; + } + } catch { + return false; + } + + return true; +} + /** * Inits JitsiMeetJS.analytics by setting permanent properties and setting the handlers from the loaded scripts. * NOTE: Has to be used after JitsiMeetJS.init. Otherwise analytics will be null. @@ -186,6 +210,7 @@ export function initAnalytics(store: IStore, handlers: Array): boolean { isPromotedFromVisitor?: boolean; isVisitor?: boolean; overwritesCustomButtonsWithURL?: boolean; + overwritesCustomParticipantButtonsWithURL?: boolean; overwritesDefaultLogoUrl?: boolean; overwritesDeploymentUrls?: boolean; overwritesEtherpadBase?: boolean; @@ -287,23 +312,12 @@ export function initAnalytics(store: IStore, handlers: Array): boolean { const customToolbarButtons = params['config.customToolbarButtons'] ?? []; permanentProperties.overwritesCustomButtonsWithURL = Boolean( - customToolbarButtons.find(({ icon }: { icon: string; }) => { - if (typeof icon !== 'string') { // The icon will be ignored - return false; - } - - try { - const url = new URL(icon); + customToolbarButtons.find(({ icon }: { icon: string; }) => isDataURL(icon))); - if (url.protocol === 'data:') { - return false; - } - } catch { - return false; - } + const customParticipantMenuButtons = params['config.customParticipantMenuButtons'] ?? []; - return true; - })); + permanentProperties.overwritesCustomParticipantButtonsWithURL = Boolean( + customParticipantMenuButtons.find(({ icon }: { icon: string; }) => isDataURL(icon))); // Optionally, include local deployment information based on the // contents of window.config.deploymentInfo. diff --git a/react/features/app/actions.any.ts b/react/features/app/actions.any.ts index b72e08195c17..79be0088decc 100644 --- a/react/features/app/actions.any.ts +++ b/react/features/app/actions.any.ts @@ -158,4 +158,3 @@ export function maybeRedirectToTokenAuthUrl( return false; } - diff --git a/react/features/app/components/AbstractApp.ts b/react/features/app/components/AbstractApp.ts index a280b1a99048..10069d5284e9 100644 --- a/react/features/app/components/AbstractApp.ts +++ b/react/features/app/components/AbstractApp.ts @@ -27,11 +27,9 @@ export interface IProps { */ export class AbstractApp

extends BaseApp

{ /** - * The deferred for the initialisation {{promise, resolve, reject}}. + * The deferred for the initialization {{promise, resolve, reject}}. */ - _init: { - promise: Promise; - }; + _init: PromiseWithResolvers; /** * Initializes the app. diff --git a/react/features/app/getRouteToRender.web.ts b/react/features/app/getRouteToRender.web.ts index 4b354718e255..a757d2872b41 100644 --- a/react/features/app/getRouteToRender.web.ts +++ b/react/features/app/getRouteToRender.web.ts @@ -140,10 +140,7 @@ function _getWebWelcomePageRoute(state: IReduxState) { * * @returns {Object} */ -function _getEmptyRoute(): { - component: React.ReactNode; - href?: string; - } { +function _getEmptyRoute(): { component: React.ReactNode; href?: string; } { return { component: BlankPage, href: undefined diff --git a/react/features/app/middleware.ts b/react/features/app/middleware.ts index 4b7b0e970b50..8fcbdc7c0c69 100644 --- a/react/features/app/middleware.ts +++ b/react/features/app/middleware.ts @@ -113,8 +113,7 @@ function _isMaybeSplitBrainError(getState: IStore['getState'], action: AnyAction const { error } = action; const isShardChangedError = error && error.message === 'item-not-found' - && error.details - && error.details.shard_changed; + && error.details?.shard_changed; if (isShardChangedError) { const state = getState(); diff --git a/react/features/base/app/components/BaseApp.tsx b/react/features/base/app/components/BaseApp.tsx index 05fb44f69b73..2b6066e20a3e 100644 --- a/react/features/base/app/components/BaseApp.tsx +++ b/react/features/base/app/components/BaseApp.tsx @@ -14,7 +14,6 @@ import PersistenceRegistry from '../../redux/PersistenceRegistry'; import ReducerRegistry from '../../redux/ReducerRegistry'; import StateListenerRegistry from '../../redux/StateListenerRegistry'; import SoundCollection from '../../sounds/components/SoundCollection'; -import { createDeferred } from '../../util/helpers'; import { appWillMount, appWillUnmount } from '../actions'; import logger from '../logger'; @@ -46,9 +45,7 @@ export default class BaseApp

extends Component { /** * The deferred for the initialisation {{promise, resolve, reject}}. */ - _init: { - promise: Promise; - }; + _init: PromiseWithResolvers; /** * Initializes a new {@code BaseApp} instance. @@ -79,7 +76,7 @@ export default class BaseApp

extends Component { * @see {@link #_initStorage} * @type {Promise} */ - this._init = createDeferred(); + this._init = Promise.withResolvers(); try { await this._initStorage(); diff --git a/react/features/base/conference/middleware.any.ts b/react/features/base/conference/middleware.any.ts index 976c3e9f7e1d..191016f92d7d 100644 --- a/react/features/base/conference/middleware.any.ts +++ b/react/features/base/conference/middleware.any.ts @@ -248,8 +248,7 @@ function _conferenceFailed({ dispatch, getState }: IStore, next: Function, actio } !error.recoverable - && conference - && conference.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR).catch((reason: Error) => { + && conference?.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR).catch((reason: Error) => { // Even though we don't care too much about the failure, it may be // good to know that it happen, so log it (on the info level). logger.info('JitsiConference.leave() rejected with:', reason); @@ -430,7 +429,7 @@ function _connectionFailed({ dispatch, getState }: IStore, next: Function, actio } as INotificationProps; const { locationURL = { href: '' } as URL } = getState()['features/base/connection']; - const { tenant } = parseURIString(locationURL.href) || {}; + const { tenant = '' } = parseURIString(locationURL.href) || {}; if (tenant.startsWith('-') || tenant.endsWith('-')) { notificationProps.descriptionKey = 'notify.invalidTenantHyphenDescription'; @@ -551,7 +550,7 @@ function _pinParticipant({ getState }: IStore, next: Function, action: AnyAction const actionName = id ? ACTION_PINNED : ACTION_UNPINNED; const local = participantById?.local - || (!id && pinnedParticipant && pinnedParticipant.local); + || (!id && pinnedParticipant?.local); let participantIdForEvent; if (local) { diff --git a/react/features/base/conference/reducer.ts b/react/features/base/conference/reducer.ts index 24796d47a777..398a233c58d3 100644 --- a/react/features/base/conference/reducer.ts +++ b/react/features/base/conference/reducer.ts @@ -495,7 +495,7 @@ function _conferenceJoined(state: IConferenceState, { conference }: { conference * reduction of the specified action. */ function _conferenceLeftOrWillLeave(state: IConferenceState, { conference, type }: - { conference: IJitsiConference; type: string; }) { +{ conference: IJitsiConference; type: string; }) { const nextState = { ...state }; // The redux action CONFERENCE_LEFT is the last time that we should be diff --git a/react/features/base/config/configWhitelist.ts b/react/features/base/config/configWhitelist.ts index 7188b86e039f..d2e191e540fa 100644 --- a/react/features/base/config/configWhitelist.ts +++ b/react/features/base/config/configWhitelist.ts @@ -76,7 +76,6 @@ export default [ 'channelLastN', 'connectionIndicators', 'constraints', - 'customToolbarButtons', 'brandingRoomAlias', 'debug', 'debugAudioLevels', @@ -149,7 +148,6 @@ export default [ 'enableNoisyMicDetection', 'enableTcc', 'enableAutomaticUrlCopy', - 'etherpad_base', 'faceLandmarks', 'failICE', 'feedbackPercentage', @@ -172,7 +170,6 @@ export default [ 'hideAddRoomButton', 'hideEmailInSettings', 'hideLobbyButton', - 'hosts', 'iAmRecorder', 'iAmSipGateway', 'ignoreStartMuted', @@ -195,6 +192,7 @@ export default [ 'p2p.enabled', 'p2p.iceTransportPolicy', 'p2p.mobileCodecPreferenceOrder', + 'p2p.mobileScreenshareCodec', 'participantMenuButtonsWithNotifyClick', 'participantsPane', 'pcStatsInterval', @@ -236,7 +234,17 @@ export default [ 'useTurnUdp', 'videoQuality', 'visitors', - 'watchRTCConfigParams', + 'watchRTCConfigParams.console', + 'watchRTCConfigParams.allowBrowserLogCollection', + 'watchRTCConfigParams.collectionInterval', + 'watchRTCConfigParams.debug', + 'watchRTCConfigParams.keys', + 'watchRTCConfigParams.logGetStats', + 'watchRTCConfigParams.rtcApiKey', + 'watchRTCConfigParams.rtcPeerId', + 'watchRTCConfigParams.rtcRoomId', + 'watchRTCConfigParams.rtcTags', + 'watchRTCConfigParams.rtcToken', 'webrtcIceTcpDisable', 'webrtcIceUdpDisable', 'whiteboard.enabled' diff --git a/react/features/base/config/functions.web.ts b/react/features/base/config/functions.web.ts index 1a21fecbacb5..b9446c343b9e 100644 --- a/react/features/base/config/functions.web.ts +++ b/react/features/base/config/functions.web.ts @@ -89,7 +89,7 @@ export function _setDeeplinkingDefaults(deeplinking: IDeeplinkingConfig) { android.downloadLink = android.downloadLink || 'https://play.google.com/store/apps/details?id=org.jitsi.meet'; android.appPackage = android.appPackage || 'org.jitsi.meet'; - android.fDroidUrl = android.fDroidUrl || 'https://f-droid.org/en/packages/org.jitsi.meet/'; + android.fDroidUrl = android.fDroidUrl || 'https://f-droid.org/packages/org.jitsi.meet/'; if (android.dynamicLink) { android.dynamicLink.apn = android.dynamicLink.apn || 'org.jitsi.meet'; android.dynamicLink.appCode = android.dynamicLink.appCode || 'w2atb'; diff --git a/react/features/base/i18n/middleware.ts b/react/features/base/i18n/middleware.ts index 6060c48a81a1..181e967751b9 100644 --- a/react/features/base/i18n/middleware.ts +++ b/react/features/base/i18n/middleware.ts @@ -23,7 +23,7 @@ MiddlewareRegistry.register(store => next => action => { ? action.value : store.getState()['features/dynamic-branding']; - if (language && labels && labels[language]) { + if (language && labels?.[language]) { changeLanguageBundle(language, labels[language]) .catch(err => { logger.log('Error setting dynamic language bundle', err); diff --git a/react/features/base/jwt/middleware.ts b/react/features/base/jwt/middleware.ts index 4e52d8dd9d46..017c4ab17f61 100644 --- a/react/features/base/jwt/middleware.ts +++ b/react/features/base/jwt/middleware.ts @@ -237,7 +237,7 @@ function _undoOverwriteLocalParticipant( * }} */ function _user2participant({ avatar, avatarUrl, email, id, name, 'hidden-from-recorder': hiddenFromRecorder }: - { avatar?: string; avatarUrl?: string; email: string; 'hidden-from-recorder': string | boolean; +{ avatar?: string; avatarUrl?: string; email: string; 'hidden-from-recorder': string | boolean; id: string; name: string; }) { const participant: { avatarURL?: string; diff --git a/react/features/base/media/components/web/AudioTrack.tsx b/react/features/base/media/components/web/AudioTrack.tsx index 16badf48ecd2..ac0c2e2ce117 100644 --- a/react/features/base/media/components/web/AudioTrack.tsx +++ b/react/features/base/media/components/web/AudioTrack.tsx @@ -228,7 +228,7 @@ class AudioTrack extends Component { * @returns {void} */ _detachTrack(track?: ITrack) { - if (this._ref?.current && track && track.jitsiTrack) { + if (this._ref?.current && track?.jitsiTrack) { clearTimeout(this._playTimeout); this._playTimeout = undefined; track.jitsiTrack.detach(this._ref.current); diff --git a/react/features/base/media/components/web/Video.tsx b/react/features/base/media/components/web/Video.tsx index 0a1d5442d6ae..38b95a313d58 100644 --- a/react/features/base/media/components/web/Video.tsx +++ b/react/features/base/media/components/web/Video.tsx @@ -358,7 +358,7 @@ class Video extends Component { * @returns {void} */ _detachTrack(videoTrack?: Partial) { - if (this._videoElement && videoTrack && videoTrack.jitsiTrack) { + if (this._videoElement && videoTrack?.jitsiTrack) { videoTrack.jitsiTrack.detach(this._videoElement); } } diff --git a/react/features/base/media/constants.ts b/react/features/base/media/constants.ts index 82c1a33fb20d..679cf76b601e 100644 --- a/react/features/base/media/constants.ts +++ b/react/features/base/media/constants.ts @@ -19,11 +19,11 @@ export const MEDIA_TYPE: { AUDIO: MediaType; SCREENSHARE: MediaType; VIDEO: MediaType; - } = { - AUDIO: 'audio', - SCREENSHARE: 'screenshare', - VIDEO: 'video' - }; +} = { + AUDIO: 'audio', + SCREENSHARE: 'screenshare', + VIDEO: 'video' +}; /* eslint-disable no-bitwise */ diff --git a/react/features/base/media/reducer.ts b/react/features/base/media/reducer.ts index cbe52ba5308a..098d47c6cc4f 100644 --- a/react/features/base/media/reducer.ts +++ b/react/features/base/media/reducer.ts @@ -3,7 +3,6 @@ import { AnyAction, combineReducers } from 'redux'; import { CONFERENCE_FAILED, CONFERENCE_LEFT } from '../conference/actionTypes'; import ReducerRegistry from '../redux/ReducerRegistry'; import { TRACK_REMOVED } from '../tracks/actionTypes'; -import { DefferedPromise, createDeferred } from '../util/helpers'; import { GUM_PENDING, @@ -93,7 +92,7 @@ function _audio(state: IAudioState = _AUDIO_INITIAL_MEDIA_STATE, action: AnyActi // initial track creation haven't been started we would wait for it to finish before starting to join the room. // NOTE: The previous implementation was using the GUM promise from conference.init. But it turned out that connect // may finish even before conference.init is executed. -const DEFAULT_INITIAL_PROMISE_STATE = createDeferred(); +const DEFAULT_INITIAL_PROMISE_STATE = Promise.withResolvers(); /** * Reducer for the common properties in media state. @@ -103,7 +102,8 @@ const DEFAULT_INITIAL_PROMISE_STATE = createDeferred() * @param {string} action.type - Type of action. * @returns {ICommonState} */ -function _initialGUMPromise(state: DefferedPromise | null = DEFAULT_INITIAL_PROMISE_STATE, +function _initialGUMPromise( + state: PromiseWithResolvers | null = DEFAULT_INITIAL_PROMISE_STATE, action: AnyAction) { if (action.type === SET_INITIAL_GUM_PROMISE) { return action.promise ?? null; @@ -294,7 +294,7 @@ interface IVideoState { export interface IMediaState { audio: IAudioState; - initialGUMPromise: DefferedPromise | null; + initialGUMPromise: PromiseWithResolvers | null; screenshare: IScreenshareState; video: IVideoState; } diff --git a/react/features/base/participants/actions.ts b/react/features/base/participants/actions.ts index 2964b6ae3de8..6b3bcb588b5b 100644 --- a/react/features/base/participants/actions.ts +++ b/react/features/base/participants/actions.ts @@ -1,5 +1,5 @@ import { IStore } from '../../app/types'; -import { elideNotificationTitleParams, showNotification } from '../../notifications/actions'; +import { showNotification } from '../../notifications/actions'; import { NOTIFICATION_TIMEOUT_TYPE } from '../../notifications/constants'; import { IJitsiConference } from '../conference/reducer'; import { set } from '../redux/functions'; @@ -61,7 +61,7 @@ import { FakeParticipant, IJitsiParticipant, IParticipant } from './types'; * }} */ export function dominantSpeakerChanged( - dominantSpeaker: string, previousSpeakers: string[], silence: boolean, conference: IJitsiConference) { + dominantSpeaker: string, previousSpeakers: string[], silence: boolean, conference: IJitsiConference) { return { type: DOMINANT_SPEAKER_CHANGED, participant: { @@ -246,7 +246,7 @@ export function participantJoined(participant: IParticipant) { = getState()['features/base/conference']; if (conference === stateFeaturesBaseConference.conference - || conference === stateFeaturesBaseConference.joining) { + || conference === stateFeaturesBaseConference.joining) { return dispatch({ type: PARTICIPANT_JOINED, participant @@ -477,9 +477,8 @@ export function participantMutedUs(participant: any, track: any) { dispatch(showNotification({ titleKey: isAudio ? 'notify.mutedRemotelyTitle' : 'notify.videoMutedRemotelyTitle', titleArguments: { - participantDisplayName: elideNotificationTitleParams(getParticipantDisplayName(getState, participant.getId())) - }, - toolTipContent: getParticipantDisplayName(getState, participant.getId()) + participantDisplayName: getParticipantDisplayName(getState, participant.getId()) + } }, NOTIFICATION_TIMEOUT_TYPE.MEDIUM)); }; } @@ -533,11 +532,12 @@ export function participantKicked(kicker: any, kicked: any) { dispatch(showNotification({ titleArguments: { - kicked: elideNotificationTitleParams(getParticipantDisplayName(state, kickedId)), - kicker: elideNotificationTitleParams(getParticipantDisplayName(state, kickerId)) + kicked: + getParticipantDisplayName(state, kickedId), + kicker: + getParticipantDisplayName(state, kickerId) }, - titleKey: 'notify.kickParticipant', - toolTipContent: getParticipantDisplayName(state, kickedId) + 'was kicked by' + getParticipantDisplayName(state, kickerId), + titleKey: 'notify.kickParticipant' }, NOTIFICATION_TIMEOUT_TYPE.MEDIUM)); }; } diff --git a/react/features/base/participants/functions.ts b/react/features/base/participants/functions.ts index ddebf4a31226..a7807010a33f 100644 --- a/react/features/base/participants/functions.ts +++ b/react/features/base/participants/functions.ts @@ -15,7 +15,6 @@ import i18next from '../i18n/i18next'; import { MEDIA_TYPE, MediaType, VIDEO_TYPE } from '../media/constants'; import { toState } from '../redux/functions'; import { getScreenShareTrack, isLocalTrackMuted } from '../tracks/functions.any'; -import { createDeferred } from '../util/helpers'; import { JIGASI_PARTICIPANT_ICON, @@ -127,7 +126,7 @@ export function getActiveSpeakersToBeDisplayed(stateful: IStateful) { * @returns {Promise} */ export function getFirstLoadableAvatarUrl(participant: IParticipant, store: IStore) { - const deferred: any = createDeferred(); + const deferred: any = Promise.withResolvers(); const fullPromise = deferred.promise .then(() => _getFirstLoadableAvatarUrl(participant, store)) .then((result: any) => { diff --git a/react/features/base/participants/middleware.ts b/react/features/base/participants/middleware.ts index c30f6393b4e2..5e312e3767bb 100644 --- a/react/features/base/participants/middleware.ts +++ b/react/features/base/participants/middleware.ts @@ -8,7 +8,7 @@ import { UPDATE_BREAKOUT_ROOMS } from '../../breakout-rooms/actionTypes'; import { getBreakoutRooms } from '../../breakout-rooms/functions'; import { toggleE2EE } from '../../e2ee/actions'; import { MAX_MODE } from '../../e2ee/constants'; -import { elideNotificationTitleParams, showNotification } from '../../notifications/actions'; +import { showNotification } from '../../notifications/actions'; import { LOCAL_RECORDING_NOTIFICATION_ID, NOTIFICATION_TIMEOUT_TYPE, @@ -92,278 +92,276 @@ import './subscriber'; */ MiddlewareRegistry.register(store => next => action => { switch (action.type) { - case APP_WILL_MOUNT: - _registerSounds(store); + case APP_WILL_MOUNT: + _registerSounds(store); - return _localParticipantJoined(store, next, action); + return _localParticipantJoined(store, next, action); - case APP_WILL_UNMOUNT: - _unregisterSounds(store); + case APP_WILL_UNMOUNT: + _unregisterSounds(store); - return _localParticipantLeft(store, next, action); + return _localParticipantLeft(store, next, action); - case CONFERENCE_WILL_JOIN: - store.dispatch(localParticipantIdChanged(action.conference.myUserId())); - break; + case CONFERENCE_WILL_JOIN: + store.dispatch(localParticipantIdChanged(action.conference.myUserId())); + break; - case DOMINANT_SPEAKER_CHANGED: { - // Lower hand through xmpp when local participant becomes dominant speaker. - const { id } = action.participant; - const state = store.getState(); - const participant = getLocalParticipant(state); - const dominantSpeaker = getDominantSpeakerParticipant(state); - const isLocal = participant && participant.id === id; + case DOMINANT_SPEAKER_CHANGED: { + // Lower hand through xmpp when local participant becomes dominant speaker. + const { id } = action.participant; + const state = store.getState(); + const participant = getLocalParticipant(state); + const dominantSpeaker = getDominantSpeakerParticipant(state); + const isLocal = participant && participant.id === id; - if (isLocal && dominantSpeaker?.id !== id + if (isLocal && dominantSpeaker?.id !== id && hasRaisedHand(participant) && !getDisableRemoveRaisedHandOnFocus(state)) { - store.dispatch(raiseHand(false)); - } - - break; + store.dispatch(raiseHand(false)); } - case LOCAL_PARTICIPANT_AUDIO_LEVEL_CHANGED: { - const state = store.getState(); - const participant = getDominantSpeakerParticipant(state); + break; + } - if ( - participant?.local - && hasRaisedHand(participant) - && action.level > LOWER_HAND_AUDIO_LEVEL - && !getDisableRemoveRaisedHandOnFocus(state) - ) { - store.dispatch(raiseHand(false)); - } - break; + case LOCAL_PARTICIPANT_AUDIO_LEVEL_CHANGED: { + const state = store.getState(); + const participant = getDominantSpeakerParticipant(state); + + if ( + participant?.local + && hasRaisedHand(participant) + && action.level > LOWER_HAND_AUDIO_LEVEL + && !getDisableRemoveRaisedHandOnFocus(state) + ) { + store.dispatch(raiseHand(false)); } + break; + } - case GRANT_MODERATOR: { - const { conference } = store.getState()['features/base/conference']; + case GRANT_MODERATOR: { + const { conference } = store.getState()['features/base/conference']; - conference?.grantOwner(action.id); - break; - } + conference?.grantOwner(action.id); + break; + } + + case KICK_PARTICIPANT: { + const { conference } = store.getState()['features/base/conference']; - case KICK_PARTICIPANT: { - const { conference } = store.getState()['features/base/conference']; + conference?.kickParticipant(action.id); + break; + } - conference?.kickParticipant(action.id); - break; + case LOCAL_PARTICIPANT_RAISE_HAND: { + const { raisedHandTimestamp } = action; + const localId = getLocalParticipant(store.getState())?.id; + + store.dispatch(participantUpdated({ + // XXX Only the local participant is allowed to update without + // stating the JitsiConference instance (i.e. participant property + // `conference` for a remote participant) because the local + // participant is uniquely identified by the very fact that there is + // only one local participant. + + id: localId ?? '', + local: true, + raisedHandTimestamp + })); + + store.dispatch(raiseHandUpdateQueue({ + id: localId ?? '', + raisedHandTimestamp + })); + + if (typeof APP !== 'undefined') { + APP.API.notifyRaiseHandUpdated(localId, raisedHandTimestamp); } - case LOCAL_PARTICIPANT_RAISE_HAND: { - const { raisedHandTimestamp } = action; - const localId = getLocalParticipant(store.getState())?.id; + break; + } - store.dispatch(participantUpdated({ - // XXX Only the local participant is allowed to update without - // stating the JitsiConference instance (i.e. participant property - // `conference` for a remote participant) because the local - // participant is uniquely identified by the very fact that there is - // only one local participant. + case SET_CONFIG: { + const result = next(action); - id: localId ?? '', - local: true, - raisedHandTimestamp - })); + const state = store.getState(); + const { deploymentInfo } = state['features/base/config']; - store.dispatch(raiseHandUpdateQueue({ - id: localId ?? '', - raisedHandTimestamp - })); + // if there userRegion set let's use it for the local participant + if (deploymentInfo?.userRegion) { + const localId = getLocalParticipant(state)?.id; - if (typeof APP !== 'undefined') { - APP.API.notifyRaiseHandUpdated(localId, raisedHandTimestamp); + if (localId) { + store.dispatch(participantUpdated({ + id: localId, + local: true, + region: deploymentInfo.userRegion + })); } - - break; } - case SET_CONFIG: { - const result = next(action); + return result; + } - const state = store.getState(); - const { deploymentInfo } = state['features/base/config']; + case CONFERENCE_JOINED: { + const result = next(action); - // if there userRegion set let's use it for the local participant - if (deploymentInfo?.userRegion) { - const localId = getLocalParticipant(state)?.id; + const state = store.getState(); + const { startSilent } = state['features/base/config']; - if (localId) { - store.dispatch(participantUpdated({ - id: localId, - local: true, - region: deploymentInfo.userRegion - })); - } - } + if (startSilent) { + const localId = getLocalParticipant(store.getState())?.id; - return result; + if (localId) { + store.dispatch(participantUpdated({ + id: localId, + local: true, + isSilent: startSilent + })); + } } - case CONFERENCE_JOINED: { - const result = next(action); + return result; + } - const state = store.getState(); - const { startSilent } = state['features/base/config']; - if (startSilent) { - const localId = getLocalParticipant(store.getState())?.id; + case SET_LOCAL_PARTICIPANT_RECORDING_STATUS: { + const state = store.getState(); + const { recording, onlySelf } = action; + const localId = getLocalParticipant(state)?.id; + const { localRecording } = state['features/base/config']; - if (localId) { - store.dispatch(participantUpdated({ - id: localId, - local: true, - isSilent: startSilent - })); - } - } + if (localRecording?.notifyAllParticipants && !onlySelf && localId) { + store.dispatch(participantUpdated({ + // XXX Only the local participant is allowed to update without + // stating the JitsiConference instance (i.e. participant property + // `conference` for a remote participant) because the local + // participant is uniquely identified by the very fact that there is + // only one local participant. - return result; + id: localId, + local: true, + localRecording: recording + })); } + break; + } - case SET_LOCAL_PARTICIPANT_RECORDING_STATUS: { - const state = store.getState(); - const { recording, onlySelf } = action; - const localId = getLocalParticipant(state)?.id; - const { localRecording } = state['features/base/config']; - - if (localRecording?.notifyAllParticipants && !onlySelf && localId) { - store.dispatch(participantUpdated({ - // XXX Only the local participant is allowed to update without - // stating the JitsiConference instance (i.e. participant property - // `conference` for a remote participant) because the local - // participant is uniquely identified by the very fact that there is - // only one local participant. + case MUTE_REMOTE_PARTICIPANT: { + const { conference } = store.getState()['features/base/conference']; - id: localId, - local: true, - localRecording: recording - })); - } + conference?.muteParticipant(action.id, action.mediaType); + break; + } - break; - } + case RAISE_HAND_UPDATED: { + const { participant } = action; + let queue = getRaiseHandsQueue(store.getState()); - case MUTE_REMOTE_PARTICIPANT: { - const { conference } = store.getState()['features/base/conference']; + if (participant.raisedHandTimestamp) { + queue = [ ...queue, { id: participant.id, + raisedHandTimestamp: participant.raisedHandTimestamp } ]; - conference?.muteParticipant(action.id, action.mediaType); - break; + // sort the queue before adding to store. + queue = queue.sort(({ raisedHandTimestamp: a }, { raisedHandTimestamp: b }) => a - b); + } else { + // no need to sort on remove value. + queue = queue.filter(({ id }) => id !== participant.id); } - case RAISE_HAND_UPDATED: { - const { participant } = action; - let queue = getRaiseHandsQueue(store.getState()); - - if (participant.raisedHandTimestamp) { - queue = [...queue, { - id: participant.id, - raisedHandTimestamp: participant.raisedHandTimestamp - }]; - - // sort the queue before adding to store. - queue = queue.sort(({ raisedHandTimestamp: a }, { raisedHandTimestamp: b }) => a - b); - } else { - // no need to sort on remove value. - queue = queue.filter(({ id }) => id !== participant.id); - } - - action.queue = queue; - break; - } + action.queue = queue; + break; + } - case PARTICIPANT_JOINED: { - // Do not play sounds when a screenshare or whiteboard participant tile is created for screenshare. - (!isScreenShareParticipant(action.participant) - && !isWhiteboardParticipant(action.participant) - ) && _maybePlaySounds(store, action); + case PARTICIPANT_JOINED: { + // Do not play sounds when a screenshare or whiteboard participant tile is created for screenshare. + (!isScreenShareParticipant(action.participant) + && !isWhiteboardParticipant(action.participant) + ) && _maybePlaySounds(store, action); - return _participantJoinedOrUpdated(store, next, action); - } + return _participantJoinedOrUpdated(store, next, action); + } - case PARTICIPANT_LEFT: { - // Do not play sounds when a tile for screenshare or whiteboard is removed. - (!isScreenShareParticipant(action.participant) - && !isWhiteboardParticipant(action.participant) - ) && _maybePlaySounds(store, action); + case PARTICIPANT_LEFT: { + // Do not play sounds when a tile for screenshare or whiteboard is removed. + (!isScreenShareParticipant(action.participant) + && !isWhiteboardParticipant(action.participant) + ) && _maybePlaySounds(store, action); - break; - } + break; + } - case PARTICIPANT_UPDATED: - return _participantJoinedOrUpdated(store, next, action); + case PARTICIPANT_UPDATED: + return _participantJoinedOrUpdated(store, next, action); - case OVERWRITE_PARTICIPANTS_NAMES: { - const { participantList } = action; + case OVERWRITE_PARTICIPANTS_NAMES: { + const { participantList } = action; - if (!Array.isArray(participantList)) { - logger.error('Overwrite names failed. Argument is not an array.'); + if (!Array.isArray(participantList)) { + logger.error('Overwrite names failed. Argument is not an array.'); - return; - } - batch(() => { - participantList.forEach(p => { - store.dispatch(overwriteParticipantName(p.id, p.name)); - }); - }); - break; + return; } + batch(() => { + participantList.forEach(p => { + store.dispatch(overwriteParticipantName(p.id, p.name)); + }); + }); + break; + } - case OVERWRITE_PARTICIPANT_NAME: { - const { dispatch, getState } = store; - const state = getState(); - const { id, name } = action; + case OVERWRITE_PARTICIPANT_NAME: { + const { dispatch, getState } = store; + const state = getState(); + const { id, name } = action; - let breakoutRoom = false, identifier = id; + let breakoutRoom = false, identifier = id; - if (id.indexOf('@') !== -1) { - identifier = id.slice(id.indexOf('/') + 1); - breakoutRoom = true; - action.id = identifier; - } + if (id.indexOf('@') !== -1) { + identifier = id.slice(id.indexOf('/') + 1); + breakoutRoom = true; + action.id = identifier; + } - if (breakoutRoom) { - const rooms = getBreakoutRooms(state); - const roomCounter = state['features/breakout-rooms'].roomCounter; - const newRooms: any = {}; - - Object.entries(rooms).forEach(([key, r]) => { - const participants = r?.participants || {}; - const jid = Object.keys(participants).find(p => - p.slice(p.indexOf('/') + 1) === identifier); - - if (jid) { - newRooms[key] = { - ...r, - participants: { - ...participants, - [jid]: { - ...participants[jid], - displayName: name - } + if (breakoutRoom) { + const rooms = getBreakoutRooms(state); + const roomCounter = state['features/breakout-rooms'].roomCounter; + const newRooms: any = {}; + + Object.entries(rooms).forEach(([ key, r ]) => { + const participants = r?.participants || {}; + const jid = Object.keys(participants).find(p => + p.slice(p.indexOf('/') + 1) === identifier); + + if (jid) { + newRooms[key] = { + ...r, + participants: { + ...participants, + [jid]: { + ...participants[jid], + displayName: name } - }; - } else { - newRooms[key] = r; - } - }); - dispatch({ - type: UPDATE_BREAKOUT_ROOMS, - rooms, - roomCounter, - updatedNames: true - }); - } else { - dispatch(participantUpdated({ - id: identifier, - name - })); - } - break; + } + }; + } else { + newRooms[key] = r; + } + }); + dispatch({ + type: UPDATE_BREAKOUT_ROOMS, + rooms, + roomCounter, + updatedNames: true + }); + } else { + dispatch(participantUpdated({ + id: identifier, + name + })); } + break; + } } return next(action); @@ -377,9 +375,9 @@ MiddlewareRegistry.register(store => next => action => { */ StateListenerRegistry.register( /* selector */ state => getCurrentConference(state), - /* listener */(conference, { dispatch, getState }) => { + /* listener */ (conference, { dispatch, getState }) => { batch(() => { - for (const [id, p] of getRemoteParticipants(getState())) { + for (const [ id, p ] of getRemoteParticipants(getState())) { (!conference || p.conference !== conference) && dispatch(participantLeft(id, p.conference, { isReplaced: p.isReplaced @@ -399,14 +397,14 @@ StateListenerRegistry.register( */ StateListenerRegistry.register( /* selector */ state => state['features/base/conference'], - /* listener */({ leaving }, { dispatch, getState }) => { + /* listener */ ({ leaving }, { dispatch, getState }) => { const state = getState(); const localParticipant = getLocalParticipant(state); let id: string; if (!localParticipant - || (id = localParticipant.id) - === LOCAL_PARTICIPANT_DEFAULT_ID) { + || (id = localParticipant.id) + === LOCAL_PARTICIPANT_DEFAULT_ID) { // The ID of the local participant has been reset already. return; } @@ -437,11 +435,11 @@ StateListenerRegistry.register( _e2eeUpdated(store, conference, participant.getId(), value), 'features_e2ee': (participant: IJitsiParticipant, value: boolean) => getParticipantById(store.getState(), participant.getId())?.e2eeSupported !== value - && store.dispatch(participantUpdated({ - conference, - id: participant.getId(), - e2eeSupported: value - })), + && store.dispatch(participantUpdated({ + conference, + id: participant.getId(), + e2eeSupported: value + })), 'features_jigasi': (participant: IJitsiParticipant, value: boolean) => store.dispatch(participantUpdated({ conference, @@ -512,7 +510,7 @@ StateListenerRegistry.register( * @returns {void} */ function _e2eeUpdated({ getState, dispatch }: IStore, conference: IJitsiConference, - participantId: string, newValue: string | boolean) { + participantId: string, newValue: string | boolean) { const e2eeEnabled = newValue === 'true'; const state = getState(); const { e2ee = {} } = state['features/base/config']; @@ -603,8 +601,8 @@ function _maybePlaySounds({ getState, dispatch }: IStore, action: AnyAction) { // The intention there was to not play user joined notification in big // conferences where 100th person is joining. if (!action.participant.local - && (!startAudioMuted - || getParticipantCount(state) < startAudioMuted)) { + && (!startAudioMuted + || getParticipantCount(state) < startAudioMuted)) { const { isReplacing, isReplaced } = action.participant; if (action.type === PARTICIPANT_JOINED) { @@ -716,7 +714,7 @@ function _participantJoinedOrUpdated(store: IStore, next: Function, action: AnyA * @returns {void} */ function _localRecordingUpdated({ dispatch, getState }: IStore, conference: IJitsiConference, - participantId: string, newValue: boolean) { + participantId: string, newValue: boolean) { const state = getState(); const participant = getParticipantById(state, participantId); @@ -733,10 +731,9 @@ function _localRecordingUpdated({ dispatch, getState }: IStore, conference: IJit dispatch(showNotification({ titleKey: 'notify.somebody', - title: elideNotificationTitleParams(participantName), + title: participantName, descriptionKey: newValue ? 'notify.localRecordingStarted' : 'notify.localRecordingStopped', - uid: LOCAL_RECORDING_NOTIFICATION_ID, - toolTipContent: participantName + uid: LOCAL_RECORDING_NOTIFICATION_ID }, NOTIFICATION_TIMEOUT_TYPE.MEDIUM)); dispatch(playSound(newValue ? RECORDING_ON_SOUND_ID : RECORDING_OFF_SOUND_ID)); } @@ -752,19 +749,19 @@ function _localRecordingUpdated({ dispatch, getState }: IStore, conference: IJit * @returns {void} */ function _raiseHandUpdated({ dispatch, getState }: IStore, conference: IJitsiConference, - participantId: string, newValue: string | number) { + participantId: string, newValue: string | number) { let raisedHandTimestamp; switch (newValue) { - case undefined: - case 'false': - raisedHandTimestamp = 0; - break; - case 'true': - raisedHandTimestamp = Date.now(); - break; - default: - raisedHandTimestamp = parseInt(`${newValue}`, 10); + case undefined: + case 'false': + raisedHandTimestamp = 0; + break; + case 'true': + raisedHandTimestamp = Date.now(); + break; + default: + raisedHandTimestamp = parseInt(`${newValue}`, 10); } const state = getState(); @@ -796,13 +793,13 @@ function _raiseHandUpdated({ dispatch, getState }: IStore, conference: IJitsiCon if (shouldDisplayAllowAction) { action = { - customActionNameKey: ['notify.allowAction'], - customActionHandler: [() => dispatch(approveParticipant(participantId))] + customActionNameKey: [ 'notify.allowAction' ], + customActionHandler: [ () => dispatch(approveParticipant(participantId)) ] }; } else { action = { - customActionNameKey: ['notify.viewParticipants'], - customActionHandler: [() => dispatch(openParticipantsPane())] + customActionNameKey: [ 'notify.viewParticipants' ], + customActionHandler: [ () => dispatch(openParticipantsPane()) ] }; } @@ -815,11 +812,11 @@ function _raiseHandUpdated({ dispatch, getState }: IStore, conference: IJitsiCon const raisedHands = raisedHandsQueue.length - 1; notificationTitle = i18n.t('notify.raisedHands', { - participantName: elideNotificationTitleParams(participantName), + participantName, raisedHands }); } else { - notificationTitle = elideNotificationTitleParams(participantName); + notificationTitle = participantName; } dispatch(showNotification({ titleKey: 'notify.somebody', @@ -827,7 +824,6 @@ function _raiseHandUpdated({ dispatch, getState }: IStore, conference: IJitsiCon descriptionKey: 'notify.raisedHand', concatText: true, uid: RAISE_HAND_NOTIFICATION_ID, - toolTipContent: participantName, ...action }, NOTIFICATION_TIMEOUT_TYPE.MEDIUM)); dispatch(playSound(RAISE_HAND_SOUND_ID)); diff --git a/react/features/base/popover/components/Popover.web.tsx b/react/features/base/popover/components/Popover.web.tsx index 03b660dcaa1f..c72cebfcd841 100644 --- a/react/features/base/popover/components/Popover.web.tsx +++ b/react/features/base/popover/components/Popover.web.tsx @@ -340,9 +340,7 @@ class Popover extends Component { _onTouchStart(event: TouchEvent) { if (this.props.visible && !this.props.overflowDrawer - && this._contextMenuRef - && this._contextMenuRef.contains - && !this._contextMenuRef.contains(event.target as Node) + && !this._contextMenuRef?.contains?.(event.target as Node) && !this._containerRef?.current?.contains(event.target as Node)) { this._onHideDialog(); } diff --git a/react/features/base/redux/StateListenerRegistry.ts b/react/features/base/redux/StateListenerRegistry.ts index 3dc09073208b..26ea882bbb9e 100644 --- a/react/features/base/redux/StateListenerRegistry.ts +++ b/react/features/base/redux/StateListenerRegistry.ts @@ -96,8 +96,8 @@ class StateListenerRegistry { * @returns {void} */ _listener({ prevSelections, store }: { - prevSelections: Map; - store: Store; + prevSelections: Map; + store: Store; }) { for (const selectorListener of this._selectorListeners) { const prevSelection = prevSelections.get(selectorListener); diff --git a/react/features/base/toolbox/components/AbstractButton.tsx b/react/features/base/toolbox/components/AbstractButton.tsx index eb43f236e3ae..e340a472d839 100644 --- a/react/features/base/toolbox/components/AbstractButton.tsx +++ b/react/features/base/toolbox/components/AbstractButton.tsx @@ -375,7 +375,7 @@ export default class AbstractButton

extends Component // blur after click to release focus from button to allow PTT. // @ts-ignore - e?.currentTarget?.blur && e.currentTarget.blur(); + e?.currentTarget?.blur?.(); } /** diff --git a/react/features/base/ui/components/web/ContextMenu.tsx b/react/features/base/ui/components/web/ContextMenu.tsx index a2fc6a4fc4f9..5f4c4ce81560 100644 --- a/react/features/base/ui/components/web/ContextMenu.tsx +++ b/react/features/base/ui/components/web/ContextMenu.tsx @@ -244,9 +244,9 @@ const ContextMenu = ({ list: Element | null, currentFocus: Element | null, traversalFunction: ( - list: Element | null, - currentFocus: Element | null - ) => Element | null + list: Element | null, + currentFocus: Element | null + ) => Element | null ) => { let wrappedOnce = false; let nextFocus = traversalFunction(list, currentFocus); diff --git a/react/features/base/ui/components/web/DialogWithTabs.tsx b/react/features/base/ui/components/web/DialogWithTabs.tsx index 5d5929e74f4d..3bde75d5c161 100644 --- a/react/features/base/ui/components/web/DialogWithTabs.tsx +++ b/react/features/base/ui/components/web/DialogWithTabs.tsx @@ -141,7 +141,7 @@ const useStyles = makeStyles()(theme => { }); interface IObject { - [key: string]: string | string[] | boolean | number | number[] | {} | undefined; + [key: string]: unknown; } export interface IDialogTab

{ diff --git a/react/features/base/ui/components/web/TextWithOverflow.tsx b/react/features/base/ui/components/web/TextWithOverflow.tsx index ac47cdb14246..84507c1299fe 100644 --- a/react/features/base/ui/components/web/TextWithOverflow.tsx +++ b/react/features/base/ui/components/web/TextWithOverflow.tsx @@ -5,9 +5,9 @@ import { makeStyles } from 'tss-react/mui'; import { TEXT_OVERFLOW_TYPES } from '../../constants.web'; interface ITextWithOverflowProps { - children: ReactNode; - className?: string; - overflowType?: TEXT_OVERFLOW_TYPES; + children: ReactNode; + className?: string; + overflowType?: TEXT_OVERFLOW_TYPES; } const useStyles = makeStyles<{ translateDiff: number; }>()((_, { translateDiff }) => { diff --git a/react/features/base/util/helpers.ts b/react/features/base/util/helpers.ts index cd19d010d7c9..97a111329411 100644 --- a/react/features/base/util/helpers.ts +++ b/react/features/base/util/helpers.ts @@ -22,27 +22,6 @@ export function assignIfDefined(target: Object, source: Object) { return to; } -export type DefferedPromise = { - promise: Promise; - reject: (reason?: any) => void; - resolve: (value: T) => void; -}; - -/** - * Creates a deferred object. - * - * @returns {{promise, resolve, reject}} - */ -export function createDeferred() { - const deferred = {} as DefferedPromise; - - deferred.promise = new Promise((resolve, reject) => { - deferred.resolve = resolve; - deferred.reject = reject; - }); - - return deferred; -} const MATCH_OPERATOR_REGEXP = /[|\\{}()[\]^$+*?.-]/g; diff --git a/react/features/calendar-sync/web/microsoftCalendar.ts b/react/features/calendar-sync/web/microsoftCalendar.ts index 769ae2288fc2..7633e50e8ac7 100644 --- a/react/features/calendar-sync/web/microsoftCalendar.ts +++ b/react/features/calendar-sync/web/microsoftCalendar.ts @@ -5,8 +5,6 @@ import { v4 as uuidV4 } from 'uuid'; import { findWindows } from 'windows-iana'; import { IanaName } from 'windows-iana/dist/enums'; -// @ts-expect-error -import { createDeferred } from '../../../../modules/util/helpers'; import { IStore } from '../../app/types'; import { parseURLParams } from '../../base/util/parseURLParams'; import { parseStandardURIString } from '../../base/util/uri'; @@ -153,8 +151,7 @@ export const microsoftCalendarApi = { return Promise.reject('Sign in already in progress.'); } - const signInDeferred = createDeferred(); - + const signInDeferred = Promise.withResolvers(); const guids = { authState: uuidV4(), authNonce: uuidV4() @@ -229,7 +226,7 @@ export const microsoftCalendarApi = { userSigninName: tokenParts.userSigninName })); - signInDeferred.resolve(); + signInDeferred.resolve(undefined); } window.addEventListener('message', handleAuth); diff --git a/react/features/chat/components/web/DisplayNameForm.tsx b/react/features/chat/components/web/DisplayNameForm.tsx index 6cee79c5ad03..5152bfea4ad2 100644 --- a/react/features/chat/components/web/DisplayNameForm.tsx +++ b/react/features/chat/components/web/DisplayNameForm.tsx @@ -117,7 +117,7 @@ class DisplayNameForm extends Component { * @returns {void} */ _onSubmit(event: any) { - event?.preventDefault && event.preventDefault(); + event?.preventDefault?.(); // Store display name in settings this.props.dispatch(updateSettings({ diff --git a/react/features/chat/middleware.ts b/react/features/chat/middleware.ts index 6d341598b126..eccbf0431e7d 100644 --- a/react/features/chat/middleware.ts +++ b/react/features/chat/middleware.ts @@ -349,8 +349,8 @@ function _addChatMsgListener(conference: IJitsiConference, store: IStore) { */ function _onConferenceMessageReceived(store: IStore, { displayName, isGuest, message, messageId, participantId, privateMessage, timestamp }: { - displayName?: string; isGuest?: boolean; message: string; messageId?: string; - participantId: string; privateMessage: boolean; timestamp: number; } + displayName?: string; isGuest?: boolean; message: string; messageId?: string; + participantId: string; privateMessage: boolean; timestamp: number; } ) { const isGif = isGifEnabled(store.getState()) && isGifMessage(message); @@ -479,8 +479,8 @@ function getLobbyChatDisplayName(state: IReduxState, participantId: string) { */ function _handleReceivedMessage({ dispatch, getState }: IStore, { displayName, isGuest, lobbyChat, message, messageId, participantId, privateMessage, timestamp }: { - displayName?: string; isGuest?: boolean; lobbyChat: boolean; message: string; - messageId?: string; participantId: string; privateMessage: boolean; timestamp: number; }, + displayName?: string; isGuest?: boolean; lobbyChat: boolean; message: string; + messageId?: string; participantId: string; privateMessage: boolean; timestamp: number; }, shouldPlaySound = true, isReaction = false ) { diff --git a/react/features/conference/constants.ts b/react/features/conference/constants.ts index befb829130a6..1187d99d4389 100644 --- a/react/features/conference/constants.ts +++ b/react/features/conference/constants.ts @@ -8,5 +8,5 @@ export const IFRAME_DISABLED_TIMEOUT_MINUTES = 5; /** * A list of allowed location to embed iframe. */ -/* eslint-disable-next-line no-extra-parens*/ +/* eslint-disable-next-line no-extra-parens */ export const IFRAME_EMBED_ALLOWED_LOCATIONS = ([] as string[]).concat(ADDITIONAL_LOCATIONS); diff --git a/react/features/display-name/components/native/DisplayNameLabel.tsx b/react/features/display-name/components/native/DisplayNameLabel.tsx index e59627801806..8c89a195fddd 100644 --- a/react/features/display-name/components/native/DisplayNameLabel.tsx +++ b/react/features/display-name/components/native/DisplayNameLabel.tsx @@ -51,7 +51,7 @@ class DisplayNameLabel extends React.Component { return ( + ) as ViewStyle }> diff --git a/react/features/filmstrip/components/web/ThumbnailWrapper.tsx b/react/features/filmstrip/components/web/ThumbnailWrapper.tsx index 45e10ebbd6a6..0fbc2c531604 100644 --- a/react/features/filmstrip/components/web/ThumbnailWrapper.tsx +++ b/react/features/filmstrip/components/web/ThumbnailWrapper.tsx @@ -150,7 +150,7 @@ class ThumbnailWrapper extends Component { * @returns {IProps} */ function _mapStateToProps(state: IReduxState, ownProps: { columnIndex: number; - data: { filmstripType: string; }; index?: number; rowIndex: number; }) { + data: { filmstripType: string; }; index?: number; rowIndex: number; }) { const _currentLayout = getCurrentLayout(state); const { remoteParticipants: remote } = state['features/filmstrip']; const activeParticipants = getActiveParticipantsIds(state); diff --git a/react/features/filmstrip/functions.native.ts b/react/features/filmstrip/functions.native.ts index 2e43876c6e06..d97950a52a11 100644 --- a/react/features/filmstrip/functions.native.ts +++ b/react/features/filmstrip/functions.native.ts @@ -287,4 +287,3 @@ export function getScreenshareFilmstripParticipantId(_state: any) { return undefined; } - diff --git a/react/features/invite/components/add-people-dialog/AbstractAddPeopleDialog.tsx b/react/features/invite/components/add-people-dialog/AbstractAddPeopleDialog.tsx index 2909fcc01c0d..98b0fd8f82b1 100644 --- a/react/features/invite/components/add-people-dialog/AbstractAddPeopleDialog.tsx +++ b/react/features/invite/components/add-people-dialog/AbstractAddPeopleDialog.tsx @@ -4,7 +4,7 @@ import { createInviteDialogEvent } from '../../../analytics/AnalyticsEvents'; import { sendAnalytics } from '../../../analytics/functions'; import { IReduxState, IStore } from '../../../app/types'; import { getMeetingRegion } from '../../../base/config/functions.any'; -import { elideNotificationTitleParams, showErrorNotification, showNotification } from '../../../notifications/actions'; +import { showErrorNotification, showNotification } from '../../../notifications/actions'; import { NOTIFICATION_TIMEOUT_TYPE } from '../../../notifications/constants'; import { INotificationProps } from '../../../notifications/types'; import { invite } from '../../actions.any'; @@ -198,29 +198,25 @@ export default class AbstractAddPeopleDialog

if (invitedCount >= 3) { notificationProps = { titleArguments: { - name: elideNotificationTitleParams(this._getDisplayName(invitees[0])), + name: this._getDisplayName(invitees[0]), count: `${invitedCount - 1}` }, - titleKey: 'notify.invitedThreePlusMembers', - toolTipContent: this._getDisplayName(invitees[0]) + titleKey: 'notify.invitedThreePlusMembers' }; } else if (invitedCount === 2) { notificationProps = { titleArguments: { - first: elideNotificationTitleParams(this._getDisplayName(invitees[0])), - second: elideNotificationTitleParams(this._getDisplayName(invitees[1])) + first: this._getDisplayName(invitees[0]), + second: this._getDisplayName(invitees[1]) }, - titleKey: 'notify.invitedTwoMembers', - toolTipContent: this._getDisplayName(invitees[0]) + 'and' + this._getDisplayName(invitees[1]) - + titleKey: 'notify.invitedTwoMembers' }; } else if (invitedCount) { notificationProps = { titleArguments: { - name: elideNotificationTitleParams(this._getDisplayName(invitees[0])) + name: this._getDisplayName(invitees[0]) }, - titleKey: 'notify.invitedOneMember', - toolTipContent: this._getDisplayName(invitees[0]) + titleKey: 'notify.invitedOneMember' }; } diff --git a/react/features/invite/components/dial-in-info-page/DialInInfoApp.web.tsx b/react/features/invite/components/dial-in-info-page/DialInInfoApp.web.tsx index 413a4a956c6b..e2149ab29ad0 100644 --- a/react/features/invite/components/dial-in-info-page/DialInInfoApp.web.tsx +++ b/react/features/invite/components/dial-in-info-page/DialInInfoApp.web.tsx @@ -20,6 +20,7 @@ document.addEventListener('DOMContentLoaded', () => { const ix = href.indexOf(DIAL_IN_INFO_PAGE_PATH_NAME); const url = (ix > 0 ? href.substring(0, ix) : href) + room; + /* eslint-disable-next-line react/no-deprecated */ ReactDOM.render( { room @@ -34,6 +35,7 @@ document.addEventListener('DOMContentLoaded', () => { ); }); -window.addEventListener('beforeunload', () => { // @ts-ignore - ReactDOM.unmountComponentAtNode(document.getElementById('react')); +window.addEventListener('beforeunload', () => { + /* eslint-disable-next-line react/no-deprecated */ + ReactDOM.unmountComponentAtNode(document.getElementById('react')!); }); diff --git a/react/features/invite/functions.ts b/react/features/invite/functions.ts index ce43974370fa..36612c98f6a2 100644 --- a/react/features/invite/functions.ts +++ b/react/features/invite/functions.ts @@ -494,7 +494,7 @@ export function isDialOutEnabled(state: IReduxState): boolean { const isModerator = isLocalParticipantModerator(state); return isJwtFeatureEnabled(state, 'outbound-call', isModerator, false) - && conference && conference.isSIPCallingSupported(); + && conference?.isSIPCallingSupported(); } /** diff --git a/react/features/keyboard-shortcuts/types.ts b/react/features/keyboard-shortcuts/types.ts index d48e7792b1b7..9807328fa9f5 100644 --- a/react/features/keyboard-shortcuts/types.ts +++ b/react/features/keyboard-shortcuts/types.ts @@ -1,23 +1,23 @@ export interface IKeyboardShortcut { - // whether or not the alt key must be pressed - alt?: boolean; + // whether or not the alt key must be pressed + alt?: boolean; - // the character to be pressed that triggers the action - character: string; + // the character to be pressed that triggers the action + character: string; - // the function to be executed when the shortcut is pressed - handler: Function; + // the function to be executed when the shortcut is pressed + handler: Function; - // character to be displayed in the help dialog shortcuts list - helpCharacter?: string; + // character to be displayed in the help dialog shortcuts list + helpCharacter?: string; - // help description of the shortcut, to be displayed in the help dialog - helpDescription?: string; + // help description of the shortcut, to be displayed in the help dialog + helpDescription?: string; } export interface IKeyboardShortcutsState { - enabled: boolean; - shortcuts: Map; - shortcutsHelp: Map; + enabled: boolean; + shortcuts: Map; + shortcutsHelp: Map; } diff --git a/react/features/large-video/actions.web.ts b/react/features/large-video/actions.web.ts index 8a36cc568c26..bffd720396c7 100644 --- a/react/features/large-video/actions.web.ts +++ b/react/features/large-video/actions.web.ts @@ -37,8 +37,8 @@ export function captureLargeVideoScreenshot() { } // Get the video element for the large video, cast HTMLElement to HTMLVideoElement to make flow happy. - /* eslint-disable-next-line no-extra-parens*/ - const videoElement = (document.getElementById('largeVideo') as any); + /* eslint-disable-next-line no-extra-parens */ + const videoElement = document.getElementById('largeVideo') as any; if (!videoElement) { return promise; diff --git a/react/features/large-video/components/LargeVideoBackground.web.tsx b/react/features/large-video/components/LargeVideoBackground.web.tsx index e8102fe1e4b5..86cca796cc6d 100644 --- a/react/features/large-video/components/LargeVideoBackground.web.tsx +++ b/react/features/large-video/components/LargeVideoBackground.web.tsx @@ -214,8 +214,7 @@ export class LargeVideoBackground extends Component { // because we don't have a good way to do it. // All other cases when the canvas is not visible are handled through the component props // (hidden, _shouldDisplayTileView). - if (!this._canvasEl || this._canvasEl.offsetParent === null - || window.innerHeight === 0 || window.innerWidth === 0) { + if (!this._canvasEl?.offsetParent || window.innerHeight === 0 || window.innerWidth === 0) { return; } diff --git a/react/features/mobile/call-integration/middleware.ts b/react/features/mobile/call-integration/middleware.ts index f275c2b477a8..6da05f4f6b93 100644 --- a/react/features/mobile/call-integration/middleware.ts +++ b/react/features/mobile/call-integration/middleware.ts @@ -486,7 +486,7 @@ function _syncTrackState({ getState }: IStore, next: Function, action: AnyAction const state = getState(); const conference = getCurrentConference(state); - if (jitsiTrack.isLocal() && conference && conference.callUUID) { + if (jitsiTrack.isLocal() && conference?.callUUID) { switch (jitsiTrack.getType()) { case 'audio': { _updateCallIntegrationMuted(conference, state); diff --git a/react/features/mobile/polyfills/browser.js b/react/features/mobile/polyfills/browser.js index 1ff573ab054e..13d222bd79dc 100644 --- a/react/features/mobile/polyfills/browser.js +++ b/react/features/mobile/polyfills/browser.js @@ -5,6 +5,7 @@ import BackgroundTimer from 'react-native-background-timer'; import { TextDecoder, TextEncoder } from 'text-encoding'; import 'promise.allsettled/auto'; // Promise.allSettled. +import 'promise.withresolvers/auto'; // Promise.withResolvers. import 'react-native-url-polyfill/auto'; // Complete URL polyfill. import Storage from './Storage'; diff --git a/react/features/notifications/actions.ts b/react/features/notifications/actions.ts index 24558d7225b8..a92752ec8372 100644 --- a/react/features/notifications/actions.ts +++ b/react/features/notifications/actions.ts @@ -126,7 +126,7 @@ export function showSuccessNotification(props: INotificationProps, type?: string * @returns {Function} */ export function showNotification(props: INotificationProps = {}, type?: string) { - return function (dispatch: IStore['dispatch'], getState: IStore['getState']) { + return function(dispatch: IStore['dispatch'], getState: IStore['getState']) { const { disabledNotifications = [], notifications, notificationTimeouts } = getState()['features/base/config']; const enabledFlag = getFeatureFlag(getState(), NOTIFICATIONS_ENABLED, true); @@ -154,20 +154,6 @@ export function showNotification(props: INotificationProps = {}, type?: string) }; } -/** - * Elides the notification title parameters which are passed to the notification component. - * - * @param {string} notificationTitle - - * @returns {string} - */ -export const elideNotificationTitleParams = (notificationTitle: string): string => { - if (notificationTitle.length > 30) { - return `${notificationTitle.slice(0, 30)}...`; - } - - return notificationTitle; -} - /** * Queues a warning notification for display. * @@ -234,27 +220,24 @@ const _throttledNotifyParticipantConnected = throttle((dispatch: IStore['dispatc if (joinedParticipantsCount >= 3) { notificationProps = { titleArguments: { - name: elideNotificationTitleParams(joinedParticipantsNames[0]), + name: joinedParticipantsNames[0] }, - titleKey: 'notify.connectedThreePlusMembers', - toolTipContent: joinedParticipantsNames[0], + titleKey: 'notify.connectedThreePlusMembers' }; } else if (joinedParticipantsCount === 2) { notificationProps = { titleArguments: { - first: elideNotificationTitleParams(joinedParticipantsNames[0]), - second: elideNotificationTitleParams(joinedParticipantsNames[1]) + first: joinedParticipantsNames[0], + second: joinedParticipantsNames[1] }, - titleKey: 'notify.connectedTwoMembers', - toolTipContent: joinedParticipantsNames[0] + 'and' + joinedParticipantsNames[1] + titleKey: 'notify.connectedTwoMembers' }; } else if (joinedParticipantsCount) { notificationProps = { titleArguments: { - name: elideNotificationTitleParams(joinedParticipantsNames[0]) + name: joinedParticipantsNames[0] }, - titleKey: 'notify.connectedOneMember', - toolTipContent: joinedParticipantsNames[0] + titleKey: 'notify.connectedOneMember' }; } @@ -301,27 +284,24 @@ const _throttledNotifyParticipantLeft = throttle((dispatch: IStore['dispatch'], if (leftParticipantsCount >= 3) { notificationProps = { titleArguments: { - name: elideNotificationTitleParams(leftParticipantsNames[0]) + name: leftParticipantsNames[0] }, - titleKey: 'notify.leftThreePlusMembers', - toolTipContent: leftParticipantsNames[0] + titleKey: 'notify.leftThreePlusMembers' }; } else if (leftParticipantsCount === 2) { notificationProps = { titleArguments: { - first: elideNotificationTitleParams(leftParticipantsNames[0]), - second: elideNotificationTitleParams(leftParticipantsNames[1]) + first: leftParticipantsNames[0], + second: leftParticipantsNames[1] }, - titleKey: 'notify.leftTwoMembers', - toolTipContent: leftParticipantsNames[0] + 'and' + leftParticipantsNames[1] + titleKey: 'notify.leftTwoMembers' }; } else if (leftParticipantsCount) { notificationProps = { titleArguments: { - name: elideNotificationTitleParams(leftParticipantsNames[0]) + name: leftParticipantsNames[0] }, - titleKey: 'notify.leftOneMember', - toolTipContent: leftParticipantsNames[0] + titleKey: 'notify.leftOneMember' }; } diff --git a/react/features/notifications/components/web/Notification.tsx b/react/features/notifications/components/web/Notification.tsx index 8de6be537075..909583f6df37 100644 --- a/react/features/notifications/components/web/Notification.tsx +++ b/react/features/notifications/components/web/Notification.tsx @@ -16,7 +16,6 @@ import { IconWarningCircle } from '../../../base/icons/svg'; import Message from '../../../base/react/components/web/Message'; -import Tooltip from '../../../base/tooltip/components/Tooltip'; import { getSupportUrl } from '../../../base/react/functions'; import { withPixelLineHeight } from '../../../base/styles/functions.web'; import { NOTIFICATION_ICON, NOTIFICATION_TYPE } from '../../constants'; @@ -126,6 +125,12 @@ const useStyles = makeStyles()((theme: Theme) => { title: { ...withPixelLineHeight(theme.typography.bodyShortBold), + display: 'inline-block', + maxWidth: '100%', + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + verticalAlign: 'middle', }, description: { @@ -168,8 +173,12 @@ const useStyles = makeStyles()((theme: Theme) => { }, closeIcon: { - cursor: 'pointer', - } + cursor: 'pointer' + }, + + inlineText: { + display: 'inline', + }, }; }); @@ -188,7 +197,6 @@ const Notification = ({ title, titleArguments, titleKey, - toolTipContent = '', uid }: IProps) => { const { classes, cx, theme } = useStyles(); @@ -315,26 +323,21 @@ const Notification = ({ }, [ icon, appearance ]); const renderNotificationTitle = useCallback(() => { - const notificationTitle = String(title || t(titleKey ?? '', titleArguments)) - let showToolTip = false - showToolTip = toolTipContent.split(" ").some((word) => { - return !notificationTitle.includes(word); - }); - - return showToolTip ? ( - - {title || t(titleKey ?? '', titleArguments)} - - - ) : ( - {title || t(titleKey ?? '', titleArguments)} - - ) - },[title, titleKey, titleArguments, toolTipContent]) - - console.log(title || t(titleKey ?? '', titleArguments), 'title args') + const notificationTitle = String(title || t(titleKey ?? '', titleArguments)); + + return ( + + {notificationTitle.split(' ').map((titleWord, index, titleArray) => ( + + + {t(titleWord)} + + { index < titleArray.length - 1 && ' ' } + + ))} + + ); + }, [ title, titleKey, titleArguments ]); return (

{ const [ lowerMenu, raiseMenu, toggleMenu, menuEnter, menuLeave, raiseContext ] = useContextMenu(); const [ lowerParticipantMenu, raiseParticipantMenu, toggleParticipantMenu, participantMenuEnter, participantMenuLeave, raiseParticipantContext ] = useContextMenu<{ - jid: string; - participantName: string; - room: IRoom; - }>(); + jid: string; + participantName: string; + room: IRoom; + }>(); const onRaiseMenu = useCallback(room => (target: HTMLElement) => raiseMenu(room, target), [ raiseMenu ]); // close the menu when the room vanishes diff --git a/react/features/polls/middleware.ts b/react/features/polls/middleware.ts index d988cf914cd8..7dc2fa3d87cd 100644 --- a/react/features/polls/middleware.ts +++ b/react/features/polls/middleware.ts @@ -18,6 +18,11 @@ import { } from './constants'; import { IAnswer, IPoll, IPollData } from './types'; +/** + * The maximum number of answers a poll can have. + */ +const MAX_ANSWERS = 32; + /** * Set up state change listener to perform maintenance tasks when the conference * is left or failed, e.g. Clear messages or close the chat modal if it's left @@ -31,7 +36,7 @@ StateListenerRegistry.register( } }); -const parsePollData = (pollData: IPollData): IPoll | null => { +const parsePollData = (pollData: Partial): IPoll | null => { if (typeof pollData !== 'object' || pollData === null) { return null; } @@ -122,6 +127,18 @@ function _handleReceivePollsMessage(data: any, dispatch: IStore['dispatch'], get case COMMAND_NEW_POLL: { const { pollId, answers, senderId, question } = data; + const tmp = { + id: pollId, + answers, + question + }; + + // Check integrity of the poll data. + // TODO(saghul): we should move this to the server side, likely by storing the + // poll data in the room metadata. + if (parsePollData(tmp) === null) { + return; + } const poll = { changingVote: false, @@ -134,7 +151,7 @@ function _handleReceivePollsMessage(data: any, dispatch: IStore['dispatch'], get name: answer, voters: [] }; - }), + }).slice(MAX_ANSWERS), saved: false, editing: false }; @@ -155,7 +172,7 @@ function _handleReceivePollsMessage(data: any, dispatch: IStore['dispatch'], get const receivedAnswer: IAnswer = { voterId, pollId, - answers + answers: answers.slice(MAX_ANSWERS) }; dispatch(receiveAnswer(pollId, receivedAnswer)); diff --git a/react/features/recording/components/AbstractRecordingLabel.ts b/react/features/recording/components/AbstractRecordingLabel.ts index 42a8b224581f..8e0b952ea18c 100644 --- a/react/features/recording/components/AbstractRecordingLabel.ts +++ b/react/features/recording/components/AbstractRecordingLabel.ts @@ -22,12 +22,12 @@ export interface IProps extends WithTranslation { /** * Whether this meeting is being transcribed. */ - _isTranscribing: boolean; + _isTranscribing: boolean; - /** + /** * Whether the recording/livestreaming/transcriber is currently running. */ - _isVisible: boolean; + _isVisible: boolean; /** * The status of the higher priority session. diff --git a/react/features/room-lock/actions.ts b/react/features/room-lock/actions.ts index 4bf62910e539..1998afa3aa06 100644 --- a/react/features/room-lock/actions.ts +++ b/react/features/room-lock/actions.ts @@ -110,4 +110,3 @@ export function unlockRoom() { }; } - diff --git a/react/features/subtitles/reducer.ts b/react/features/subtitles/reducer.ts index 762393f2a7b7..b2e55621ba21 100644 --- a/react/features/subtitles/reducer.ts +++ b/react/features/subtitles/reducer.ts @@ -124,7 +124,7 @@ function _removeCachedTranscriptMessage(state: ISubtitlesState, * reduction of the specified action. */ function _updateTranscriptMessage(state: ISubtitlesState, { transcriptMessageID, newTranscriptMessage }: - { newTranscriptMessage: ITranscriptMessage; transcriptMessageID: string; }) { +{ newTranscriptMessage: ITranscriptMessage; transcriptMessageID: string; }) { const newTranscriptMessages = new Map(state._transcriptMessages); const _cachedTranscriptMessages = new Map(state._cachedTranscriptMessages); diff --git a/react/features/toolbox/components/AbstractAudioMuteButton.tsx b/react/features/toolbox/components/AbstractAudioMuteButton.tsx index 529f914dc2a1..b66eabf38d96 100644 --- a/react/features/toolbox/components/AbstractAudioMuteButton.tsx +++ b/react/features/toolbox/components/AbstractAudioMuteButton.tsx @@ -18,12 +18,12 @@ export interface IProps extends AbstractButtonProps { /** * Whether audio is currently muted or not. */ - _audioMuted: boolean; + _audioMuted: boolean; - /** + /** * Whether the button is disabled. */ - _disabled: boolean; + _disabled: boolean; } /** diff --git a/react/features/toolbox/components/native/OverflowMenu.tsx b/react/features/toolbox/components/native/OverflowMenu.tsx index 0ddef724879d..8ef428f35117 100644 --- a/react/features/toolbox/components/native/OverflowMenu.tsx +++ b/react/features/toolbox/components/native/OverflowMenu.tsx @@ -69,12 +69,12 @@ interface IProps { /** * Whether the recoding button should be enabled or not. */ - _recordingEnabled: boolean; + _recordingEnabled: boolean; - /** + /** * Whether or not any reactions buttons should be displayed. */ - _shouldDisplayReactionsButtons: boolean; + _shouldDisplayReactionsButtons: boolean; /** * The width of the screen. diff --git a/react/features/toolbox/components/web/AudioMuteButton.tsx b/react/features/toolbox/components/web/AudioMuteButton.tsx index cc5e66e756b4..dd13f933932b 100644 --- a/react/features/toolbox/components/web/AudioMuteButton.tsx +++ b/react/features/toolbox/components/web/AudioMuteButton.tsx @@ -31,15 +31,15 @@ const styles = () => { */ interface IProps extends AbstractAudioMuteButtonProps { - /** + /** * The gumPending state from redux. */ - _gumPending: IGUMPendingState; + _gumPending: IGUMPendingState; - /** + /** * An object containing the CSS classes. */ - classes?: Partial, string>>; + classes?: Partial, string>>; } diff --git a/react/features/video-menu/components/AbstractMuteEveryoneDialog.ts b/react/features/video-menu/components/AbstractMuteEveryoneDialog.ts index 0d6136e6a128..613f38f2faa5 100644 --- a/react/features/video-menu/components/AbstractMuteEveryoneDialog.ts +++ b/react/features/video-menu/components/AbstractMuteEveryoneDialog.ts @@ -2,7 +2,7 @@ import { IReduxState } from '../../app/types'; import { requestDisableAudioModeration, requestEnableAudioModeration } from '../../av-moderation/actions'; import { isEnabledFromState, isSupported } from '../../av-moderation/functions'; import { MEDIA_TYPE } from '../../base/media/constants'; -import { getLocalParticipant, getParticipantDisplayName } from '../../base/participants/functions'; +import { getLocalParticipant, getParticipantDisplayName, isEveryoneModerator } from '../../base/participants/functions'; import { muteAllParticipants } from '../actions'; import AbstractMuteRemoteParticipantDialog, { @@ -17,6 +17,7 @@ export interface IProps extends AbstractProps { content?: string; exclude: Array; isAudioModerationEnabled?: boolean; + isEveryoneModerator: boolean; isModerationSupported?: boolean; showAdvancedModerationToggle: boolean; title: string; @@ -119,10 +120,12 @@ export function abstractMapStateToProps(state: IReduxState, ownProps: IProps) { return whom.length ? { content: t('dialog.muteEveryoneElseDialog'), - title: t('dialog.muteEveryoneElseTitle', { whom }) + title: t('dialog.muteEveryoneElseTitle', { whom }), + isEveryoneModerator: isEveryoneModerator(state) } : { title: t('dialog.muteEveryoneTitle'), isAudioModerationEnabled: isEnabledFromState(MEDIA_TYPE.AUDIO, state), - isModerationSupported: isSupported()(state) + isModerationSupported: isSupported()(state), + isEveryoneModerator: isEveryoneModerator(state) }; } diff --git a/react/features/video-menu/components/native/RemoteVideoMenu.tsx b/react/features/video-menu/components/native/RemoteVideoMenu.tsx index 677efe2b771f..8b99f8a6ba53 100644 --- a/react/features/video-menu/components/native/RemoteVideoMenu.tsx +++ b/react/features/video-menu/components/native/RemoteVideoMenu.tsx @@ -1,4 +1,4 @@ -/* eslint-disable lines-around-comment*/ +/* eslint-disable lines-around-comment */ import React, { PureComponent } from 'react'; import { Text, TextStyle, View, ViewStyle } from 'react-native'; diff --git a/react/features/video-menu/components/native/VolumeSlider.tsx b/react/features/video-menu/components/native/VolumeSlider.tsx index 84a3ac01f425..3940a5c0b6ba 100644 --- a/react/features/video-menu/components/native/VolumeSlider.tsx +++ b/react/features/video-menu/components/native/VolumeSlider.tsx @@ -1,4 +1,4 @@ -/* eslint-disable lines-around-comment*/ +/* eslint-disable lines-around-comment */ import Slider from '@react-native-community/slider'; import { throttle } from 'lodash-es'; diff --git a/react/features/video-menu/components/web/CustomOptionButton.tsx b/react/features/video-menu/components/web/CustomOptionButton.tsx index 39a935a232c5..d3fb046313db 100644 --- a/react/features/video-menu/components/web/CustomOptionButton.tsx +++ b/react/features/video-menu/components/web/CustomOptionButton.tsx @@ -8,7 +8,7 @@ const CustomOptionButton = ( icon: string; onClick: (e?: React.MouseEvent | undefined) => void; text: string; - } + } ) => { const icon = useCallback(props => ( { onSubmit = { this._onSubmit } title = { this.props.title }>
- { this.state.content } - { this.props.isModerationSupported && this.props.exclude.length === 0 && ( - <> -
-
- - -
- - )} + {this.state.content} + { + this.props.isModerationSupported + && this.props.exclude.length === 0 + && !this.props.isEveryoneModerator && ( + <> +
+
+ + +
+ + )}
); diff --git a/react/features/web-hid/webhid-manager.ts b/react/features/web-hid/webhid-manager.ts index 4dc14713307e..34746283e935 100644 --- a/react/features/web-hid/webhid-manager.ts +++ b/react/features/web-hid/webhid-manager.ts @@ -110,7 +110,7 @@ export default class WebHidManager extends EventTarget { return null; } - if (this.deviceInfo?.device && this.deviceInfo.device.opened) { + if (this.deviceInfo?.device?.opened) { await this.close(); } @@ -506,7 +506,7 @@ export default class WebHidManager extends EventTarget { * @returns {void} -. */ resetDeviceState() { - if (!this.deviceInfo?.device || !this.deviceInfo?.device?.opened) { + if (!this.deviceInfo?.device?.opened) { return; } @@ -695,8 +695,7 @@ export default class WebHidManager extends EventTarget { * @returns {void} -. */ async sendDeviceReport(data: { command: string; }) { - if (!data?.command || !this.deviceInfo - || !this.deviceInfo.device || !this.deviceInfo.device.opened || !this.isParseDescriptorsSuccess) { + if (!data?.command || !this.deviceInfo?.device?.opened || !this.isParseDescriptorsSuccess) { logger.warn('There are currently non-compliant conditions'); return; @@ -939,7 +938,7 @@ export default class WebHidManager extends EventTarget { const reportId = this.retriveInputReportId(inputReportId); - if (!this.deviceInfo?.device || !this.deviceInfo?.device?.opened) { + if (!this.deviceInfo?.device?.opened) { logger.warn('[sendReplyReport] device is not opened or does not exist'); return; diff --git a/react/features/welcome/components/WelcomePage.web.tsx b/react/features/welcome/components/WelcomePage.web.tsx index 4aab5dad4981..2f68552904d3 100644 --- a/react/features/welcome/components/WelcomePage.web.tsx +++ b/react/features/welcome/components/WelcomePage.web.tsx @@ -508,9 +508,8 @@ class WelcomePage extends AbstractWelcomePage { */ _shouldShowAdditionalCard() { return interfaceConfig.DISPLAY_WELCOME_PAGE_ADDITIONAL_CARD - && this._additionalCardTemplate - && this._additionalCardTemplate.content - && this._additionalCardTemplate.innerHTML.trim(); + && this._additionalCardTemplate?.content + && this._additionalCardTemplate?.innerHTML?.trim(); } /** @@ -522,9 +521,8 @@ class WelcomePage extends AbstractWelcomePage { */ _shouldShowAdditionalContent() { return interfaceConfig.DISPLAY_WELCOME_PAGE_CONTENT - && this._additionalContentTemplate - && this._additionalContentTemplate.content - && this._additionalContentTemplate.innerHTML.trim(); + && this._additionalContentTemplate?.content + && this._additionalContentTemplate?.innerHTML?.trim(); } /** @@ -536,9 +534,8 @@ class WelcomePage extends AbstractWelcomePage { */ _shouldShowAdditionalToolbarContent() { return interfaceConfig.DISPLAY_WELCOME_PAGE_TOOLBAR_ADDITIONAL_CONTENT - && this._additionalToolbarContentTemplate - && this._additionalToolbarContentTemplate.content - && this._additionalToolbarContentTemplate.innerHTML.trim(); + && this._additionalToolbarContentTemplate?.content + && this._additionalToolbarContentTemplate?.innerHTML.trim(); } } diff --git a/react/index.web.js b/react/index.web.js index 45b5817280ee..361e7ef98526 100644 --- a/react/index.web.js +++ b/react/index.web.js @@ -73,6 +73,7 @@ globalNS.renderEntryPoint = ({ props = {}, elementId = 'react' }) => { + /* eslint-disable-next-line react/no-deprecated */ ReactDOM.render( , document.getElementById(elementId) diff --git a/resources/img/google-play-badge.png b/resources/img/google-play-badge.png index 9499b2dca0354d482713de0bf7abd3f0c541d7c8..45bb3d4153d5598f9aceea3f995dd7ca6d83dd30 100644 GIT binary patch literal 9377 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 IiTAPp0g}sM;{X5v literal 17842 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 diff --git a/tests/.eslintrc.js b/tests/.eslintrc.js index 91fac3ca0032..abc9ef8813c2 100644 --- a/tests/.eslintrc.js +++ b/tests/.eslintrc.js @@ -9,6 +9,9 @@ module.exports = { parserOptions: { sourceType: 'module', project: [ './tests/tsconfig.json' ] + }, + rules: { + '@typescript-eslint/no-require-imports': 0 } } ] diff --git a/tests/env.example b/tests/env.example index 01eedff4d11a..34df04f71106 100644 --- a/tests/env.example +++ b/tests/env.example @@ -30,3 +30,6 @@ #WEBHOOKS_PROXY_URL= # A shared secret to authenticate the webhook proxy connection #WEBHOOKS_PROXY_SHARED_SECRET= + +# A rest URL to be used by dial-in tests to invite jigasi to the conference +#DIAL_IN_REST_URL= diff --git a/tests/helpers/Participant.ts b/tests/helpers/Participant.ts index 6ea306351048..a77714d0681e 100644 --- a/tests/helpers/Participant.ts +++ b/tests/helpers/Participant.ts @@ -1,6 +1,7 @@ /* global APP $ */ import { multiremotebrowser } from '@wdio/globals'; +import { Key } from 'webdriverio'; import { IConfig } from '../../react/features/base/config/configType'; import { urlObjectToString } from '../../react/features/base/util/uri'; @@ -8,6 +9,7 @@ import BreakoutRooms from '../pageobjects/BreakoutRooms'; import ChatPanel from '../pageobjects/ChatPanel'; import Filmstrip from '../pageobjects/Filmstrip'; import IframeAPI from '../pageobjects/IframeAPI'; +import InviteDialog from '../pageobjects/InviteDialog'; import Notifications from '../pageobjects/Notifications'; import ParticipantsPane from '../pageobjects/ParticipantsPane'; import SettingsDialog from '../pageobjects/SettingsDialog'; @@ -134,7 +136,7 @@ export class Participant { if (!options.skipDisplayName) { // @ts-ignore config.userInfo = { - displayName: this._name + displayName: options.displayName || this._name }; } @@ -236,11 +238,22 @@ export class Participant { async () => await this.driver.execute(() => document.readyState === 'complete'), { timeout: 30_000, // 30 seconds - timeoutMsg: 'Timeout waiting for Page Load Request to complete.' + timeoutMsg: `Timeout waiting for Page Load Request to complete for ${this.name}.` } ); } + /** + * Waits for the tile view to display. + */ + async waitForTileViewDisplay(reverse = false) { + await this.driver.$('//div[@id="videoconference_page" and contains(@class, "tile-view")]').waitForDisplayed({ + reverse, + timeout: 10_000, + timeoutMsg: `Tile view did not display in 10s for ${this.name}` + }); + } + /** * Checks if the participant is in the meeting. */ @@ -282,7 +295,7 @@ export class Participant { () => this.isInMuc(), { timeout: 10_000, // 10 seconds - timeoutMsg: 'Timeout waiting to join muc.' + timeoutMsg: `Timeout waiting to join muc for ${this.name}` } ); } @@ -298,7 +311,7 @@ export class Participant { return driver.waitUntil(async () => await driver.execute(() => APP.conference.getConnectionState() === 'connected'), { timeout: 15_000, - timeoutMsg: 'expected ICE to be connected for 15s' + timeoutMsg: `expected ICE to be connected for 15s for ${this.name}` }); } @@ -307,7 +320,8 @@ export class Participant { * * @returns {Promise} */ - async waitForSendReceiveData(): Promise { + async waitForSendReceiveData( + timeout = 15_000, msg = `expected to receive/send data in 15s for ${this.name}`): Promise { const driver = this.driver; return driver.waitUntil(async () => @@ -321,15 +335,15 @@ export class Participant { return rtpStats.uploadBitrate > 0 && rtpStats.downloadBitrate > 0; }), { - timeout: 15_000, - timeoutMsg: 'expected to receive/send data in 15s' + timeout, + timeoutMsg: msg }); } /** * Waits for remote streams. * - * @param {number} number - The number of remote streams o wait for. + * @param {number} number - The number of remote streams to wait for. * @returns {Promise} */ waitForRemoteStreams(number: number): Promise { @@ -338,7 +352,24 @@ export class Participant { return driver.waitUntil(async () => await driver.execute(count => APP.conference.getNumberOfParticipantsWithTracks() >= count, number), { timeout: 15_000, - timeoutMsg: 'expected remote streams in 15s' + timeoutMsg: `expected remote streams in 15s for ${this.name}` + }); + } + + /** + * Waits for number of participants. + * + * @param {number} number - The number of participant to wait for. + * @param {string} msg - A custom message to use. + * @returns {Promise} + */ + waitForParticipants(number: number, msg?: string): Promise { + const driver = this.driver; + + return driver.waitUntil(async () => + await driver.execute(count => APP.conference.listMembers().length === count, number), { + timeout: 15_000, + timeoutMsg: msg || `not the expected participants ${number} in 15s for ${this.name}` }); } @@ -376,6 +407,15 @@ export class Participant { return new Filmstrip(this); } + /** + * Returns the invite dialog for this participant. + * + * @returns {InviteDialog} + */ + getInviteDialog(): InviteDialog { + return new InviteDialog(this); + } + /** * Returns the notifications. */ @@ -441,16 +481,40 @@ export class Participant { } /** - * Returns the local display name. + * Returns the local display name element. + * @private */ - async getLocalDisplayName() { + private async getLocalDisplayNameElement() { const localVideoContainer = this.driver.$('span[id="localVideoContainer"]'); await localVideoContainer.moveTo(); - const localDisplayName = localVideoContainer.$('span[id="localDisplayName"]'); + return localVideoContainer.$('span[id="localDisplayName"]'); + } + + /** + * Returns the local display name. + */ + async getLocalDisplayName() { + return await (await this.getLocalDisplayNameElement()).getText(); + } + + /** + * Sets the display name of the local participant. + */ + async setLocalDisplayName(displayName: string) { + const localDisplayName = await this.getLocalDisplayNameElement(); + + await localDisplayName.click(); + + await this.driver.keys(displayName); + await this.driver.keys(Key.Return); + + // just click somewhere to lose focus, to make sure editing has ended + const localVideoContainer = this.driver.$('span[id="localVideoContainer"]'); - return await localDisplayName.getText(); + await localVideoContainer.moveTo(); + await localVideoContainer.click(); } /** @@ -479,6 +543,13 @@ export class Participant { return await this.driver.execute(() => APP.UI.getLargeVideoID()); } + /** + * Returns the source of the large video currently shown. + */ + async getLargeVideoId() { + return await this.driver.execute('return document.getElementById("largeVideo").srcObject.id'); + } + /** * Makes sure that the avatar is displayed in the local thumbnail and that the video is not displayed. * There are 3 options for avatar: diff --git a/tests/helpers/participants.ts b/tests/helpers/participants.ts index 3d30217bbe02..f4f84bf2f9b8 100644 --- a/tests/helpers/participants.ts +++ b/tests/helpers/participants.ts @@ -16,12 +16,7 @@ const SUBJECT_XPATH = '//div[starts-with(@class, "subject-text")]'; * @returns {Promise} */ export async function ensureOneParticipant(ctx: IContext, options?: IJoinOptions): Promise { - ctx.p1 = new Participant('participant1'); - - await ctx.p1.joinConference(ctx, { - ...options, - skipInMeetingChecks: true - }); + await joinTheModeratorAsP1(ctx, options); } /** @@ -31,22 +26,71 @@ export async function ensureOneParticipant(ctx: IContext, options?: IJoinOptions * @param {IJoinOptions} options - The options to use when joining the participant. * @returns {Promise} */ -export async function ensureThreeParticipants(ctx: IContext, options?: IJoinOptions): Promise { +export async function ensureThreeParticipants(ctx: IContext, options: IJoinOptions = {}): Promise { + await joinTheModeratorAsP1(ctx, options); + + // these need to be all, so we get the error when one fails + await Promise.all([ + _joinParticipant('participant2', ctx.p2, p => { + ctx.p2 = p; + }, { + displayName: 'p2', + ...options + }), + _joinParticipant('participant3', ctx.p3, p => { + ctx.p3 = p; + }, { + displayName: 'p3', + ...options + }) + ]); + + const { skipInMeetingChecks } = options; + + await Promise.all([ + skipInMeetingChecks ? Promise.resolve() : ctx.p2.waitForRemoteStreams(2), + skipInMeetingChecks ? Promise.resolve() : ctx.p3.waitForRemoteStreams(2) + ]); +} + +/** + * Ensure that there are four participants. + * + * @param {Object} ctx - The context. + * @param {IJoinOptions} options - The options to use when joining the participant. + * @returns {Promise} + */ +export async function ensureFourParticipants(ctx: IContext, options: IJoinOptions = {}): Promise { await joinTheModeratorAsP1(ctx, options); // these need to be all, so we get the error when one fails await Promise.all([ _joinParticipant('participant2', ctx.p2, p => { ctx.p2 = p; - }, options), + }, { + displayName: 'p2', + ...options + }), _joinParticipant('participant3', ctx.p3, p => { ctx.p3 = p; - }, options) + }, { + displayName: 'p3', + ...options + }), + _joinParticipant('participant4', ctx.p4, p => { + ctx.p4 = p; + }, { + displayName: 'p4', + ...options + }) ]); + const { skipInMeetingChecks } = options; + await Promise.all([ - ctx.p2.waitForRemoteStreams(2), - ctx.p3.waitForRemoteStreams(2) + skipInMeetingChecks ? Promise.resolve() : ctx.p2.waitForRemoteStreams(3), + skipInMeetingChecks ? Promise.resolve() : ctx.p3.waitForRemoteStreams(3), + skipInMeetingChecks ? Promise.resolve() : ctx.p3.waitForRemoteStreams(3) ]); } @@ -58,7 +102,7 @@ export async function ensureThreeParticipants(ctx: IContext, options?: IJoinOpti * @returns {Promise} */ async function joinTheModeratorAsP1(ctx: IContext, options?: IJoinOptions) { - const p1DisplayName = 'participant1'; + const p1DisplayName = 'p1'; let token; // if it is jaas create the first one to be moderator and second not moderator @@ -67,9 +111,10 @@ async function joinTheModeratorAsP1(ctx: IContext, options?: IJoinOptions) { } // make sure the first participant is moderator, if supported by deployment - await _joinParticipant(p1DisplayName, ctx.p1, p => { + await _joinParticipant('participant1', ctx.p1, p => { ctx.p1 = p; }, { + displayName: p1DisplayName, ...options, skipInMeetingChecks: true }, token); @@ -89,7 +134,10 @@ export async function ensureTwoParticipants(ctx: IContext, options: IJoinOptions await Promise.all([ _joinParticipant('participant2', ctx.p2, p => { ctx.p2 = p; - }, options), + }, { + displayName: 'p2', + ...options + }), skipInMeetingChecks ? Promise.resolve() : ctx.p1.waitForRemoteStreams(1), skipInMeetingChecks ? Promise.resolve() : ctx.p2.waitForRemoteStreams(1) ]); diff --git a/tests/helpers/types.ts b/tests/helpers/types.ts index c86b2bc474a5..c1d314e4fa6c 100644 --- a/tests/helpers/types.ts +++ b/tests/helpers/types.ts @@ -5,6 +5,7 @@ import WebhookProxy from './WebhookProxy'; export type IContext = { conferenceJid: string; + dialInPin: string; iframeAPI: boolean; jwtKid: string; jwtPrivateKeyPath: string; @@ -14,6 +15,7 @@ export type IContext = { p4: Participant; roomName: string; skipSuiteTests: boolean; + times: any; webhooksProxy: WebhookProxy; }; @@ -24,6 +26,11 @@ export type IJoinOptions = { */ configOverwrite?: IConfig; + /** + * The display name to use. + */ + displayName?: string; + /** * Whether to skip setting display name. */ diff --git a/tests/pageobjects/BreakoutRooms.ts b/tests/pageobjects/BreakoutRooms.ts index a106af9dbb47..4d31c3da33b2 100644 --- a/tests/pageobjects/BreakoutRooms.ts +++ b/tests/pageobjects/BreakoutRooms.ts @@ -227,4 +227,3 @@ export default class BreakoutRooms extends BasePageObject { // } } - diff --git a/tests/pageobjects/Filmstrip.ts b/tests/pageobjects/Filmstrip.ts index 110a551846ee..75d00f0070b8 100644 --- a/tests/pageobjects/Filmstrip.ts +++ b/tests/pageobjects/Filmstrip.ts @@ -3,6 +3,11 @@ import { Participant } from '../helpers/Participant'; import BaseDialog from './BaseDialog'; import BasePageObject from './BasePageObject'; +const LOCAL_VIDEO_XPATH = '//span[@id="localVideoContainer"]'; +const LOCAL_VIDEO_MENU_TRIGGER = '#local-video-menu-trigger'; +const LOCAL_USER_CONTROLS = 'aria/Local user controls'; +const HIDE_SELF_VIEW_BUTTON_XPATH = '//div[contains(@class, "popover")]//div[@id="hideselfviewButton"]'; + /** * Filmstrip elements. */ @@ -48,6 +53,28 @@ export default class Filmstrip extends BasePageObject { return await remoteDisplayName.getText(); } + /** + * Returns the remote video id of a participant with endpointID. + * @param endpointId + */ + async getRemoteVideoId(endpointId: string) { + const remoteDisplayName = this.participant.driver.$(`span[id="participant_${endpointId}"]`); + + await remoteDisplayName.moveTo(); + + return await this.participant.driver.execute(eId => + document.evaluate(`//span[@id="participant_${eId}"]//video`, + document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue?.srcObject?.id, endpointId); + } + + /** + * Returns the local video id. + */ + async getLocalVideoId() { + return await this.participant.driver.execute( + 'return document.getElementById("localVideo_container").srcObject.id'); + } + /** * Pins a participant by clicking on their thumbnail. * @param participant The participant. @@ -94,6 +121,7 @@ export default class Filmstrip extends BasePageObject { const popoverElement = this.participant.driver.$( `//div[contains(@class, 'popover')]//div[contains(@class, '${linkClassname}')]`); + await popoverElement.waitForExist(); await popoverElement.waitForDisplayed(); await popoverElement.click(); @@ -121,4 +149,65 @@ export default class Filmstrip extends BasePageObject { async muteVideo(participant: Participant) { await this.clickOnRemoteMenuLink(await participant.getEndpointId(), 'mutevideolink', true); } + + /** + * Kicks a participant. + * @param participantId + */ + async kickParticipant(participantId: string) { + await this.clickOnRemoteMenuLink(participantId, 'kicklink', true); + } + + /** + * Clicks on the hide self view button from local video. + */ + async hideSelfView() { + // open local video menu + await this.participant.driver.$(LOCAL_VIDEO_MENU_TRIGGER).moveTo(); + await this.participant.driver.$(LOCAL_USER_CONTROLS).moveTo(); + + // click Hide self view button + const hideSelfViewButton = this.participant.driver.$(HIDE_SELF_VIEW_BUTTON_XPATH); + + await hideSelfViewButton.waitForExist(); + await hideSelfViewButton.waitForClickable(); + await hideSelfViewButton.click(); + } + + /** + * Checks whether the local self view is displayed or not. + */ + async assertSelfViewIsHidden(hidden: boolean) { + await this.participant.driver.$(LOCAL_VIDEO_XPATH).waitForDisplayed({ + reverse: hidden, + timeout: 5000, + timeoutMsg: `Local video thumbnail is${hidden ? '' : ' not'} displayed for ${this.participant.name}` + }); + } + + /** + * Toggles the filmstrip. + */ + async toggle() { + const toggleButton = this.participant.driver.$('#toggleFilmstripButton'); + + await toggleButton.moveTo(); + await toggleButton.waitForDisplayed(); + await toggleButton.click(); + } + + /** + * Asserts that the remote videos are hidden or not. + * @param reverse + */ + async assertRemoteVideosHidden(reverse = false) { + await this.participant.driver.waitUntil( + async () => + await this.participant.driver.$$('//div[@id="remoteVideos" and contains(@class, "hidden")]').length > 0, + { + timeout: 10_000, // 10 seconds + timeoutMsg: `Timeout waiting fore remote videos to be hidden: ${!reverse}.` + } + ); + } } diff --git a/tests/pageobjects/InviteDialog.ts b/tests/pageobjects/InviteDialog.ts new file mode 100644 index 000000000000..e938ec65a4c4 --- /dev/null +++ b/tests/pageobjects/InviteDialog.ts @@ -0,0 +1,102 @@ +import BaseDialog from './BaseDialog'; + +const CONFERENCE_ID = 'conference-id'; +const CONFERENCE_URL = 'invite-more-dialog-conference-url'; +const DIALOG_CONTAINER = 'invite-more-dialog'; +const MORE_NUMBERS = 'more-numbers'; +const PHONE_NUMBER = 'phone-number'; + +/** + * Represents the invite dialog in a particular participant. + */ +export default class InviteDialog extends BaseDialog { + /** + * Checks if the dialog is open. + */ + async isOpen() { + return this.participant.driver.$(`.${DIALOG_CONTAINER}`).isExisting(); + } + + /** + * Open the invite dialog, if the info dialog is closed. + */ + async open() { + if (await this.isOpen()) { + return; + } + + await this.participant.getParticipantsPane().clickInvite(); + } + + /** + * Returns the PIN for the conference. + */ + async getPinNumber() { + await this.open(); + + return (await this.getValueAfterColon(CONFERENCE_ID)).replace(/[# ]/g, ''); + } + + /** + * Private helper to get values after colons. The invite dialog lists conference specific information + * after a label, followed by a colon. + * + * @param className + * @private + */ + private async getValueAfterColon(className: string) { + const elem = this.participant.driver.$(`.${className}`); + + await elem.waitForExist({ timeout: 5000 }); + + const fullText = await elem.getText(); + + this.participant.log(`Extracted text in invite dialog: ${fullText}`); + + return fullText.split(':')[1].trim(); + } + + /** + * Returns the meeting url displayed in the dialog. + */ + async getMeetingURL() { + const elem = this.participant.driver.$(`.${CONFERENCE_URL}`); + + await elem.waitForExist(); + + return (await elem.getText())?.trim(); + } + + /** + * Waits for the dialog to be open or closed. + * @param reverse + */ + async waitTillOpen(reverse = false) { + await this.participant.driver.waitUntil( + /* eslint-disable no-extra-parens */ + async () => (reverse ? !await this.isOpen() : await this.isOpen()), + { + timeout: 2_000, + timeoutMsg: `invite dialog did not ${reverse ? 'close' : 'open'}` + } + ); + } + + /** + * Gets the string that contains the dial in number for the current conference. + */ + async getDialInNumber() { + return await this.getValueAfterColon(PHONE_NUMBER); + } + + /** + * Clicks the link to open a page to show all available dial in numbers. + */ + async openDialInNumbersPage() { + const moreNumbers = this.participant.driver.$(`.${MORE_NUMBERS}`); + + await moreNumbers.waitForExist(); + await moreNumbers.waitForClickable(); + await moreNumbers.click(); + } +} diff --git a/tests/pageobjects/Notifications.ts b/tests/pageobjects/Notifications.ts index d596260892ff..465e8f27d339 100644 --- a/tests/pageobjects/Notifications.ts +++ b/tests/pageobjects/Notifications.ts @@ -5,6 +5,8 @@ const JOIN_ONE_TEST_ID = 'notify.connectedOneMember'; const JOIN_TWO_TEST_ID = 'notify.connectedTwoMembers'; const JOIN_MULTIPLE_TEST_ID = 'notify.connectedThreePlusMembers'; const RAISE_HAND_NOTIFICATION_ID = 'notify.raisedHand'; +const REENABLE_SELF_VIEW_NOTIFICATION_ID = 'notify.selfViewTitle'; +const REENABLE_SELF_VIEW_CLOSE_NOTIFICATION = 'notify.selfViewTitle-dismiss'; /** * Gathers all notifications logic in the UI and obtaining those. @@ -41,4 +43,23 @@ export default class Notifications extends BasePageObject { [ `${JOIN_ONE_TEST_ID}-dismiss`, `${JOIN_TWO_TEST_ID}-dismiss`, `${JOIN_MULTIPLE_TEST_ID}-dismiss` ] .map(async id => this.participant.driver.$(`#${id}"]`).click())); } + + /** + * Waits for the self view notification to be displayed. + */ + async waitForReEnableSelfViewNotification() { + const el + = this.participant.driver.$(`div[data-testid="${REENABLE_SELF_VIEW_NOTIFICATION_ID}"]`); + + await el.waitForExist({ timeout: 2000 }); + await el.waitForDisplayed(); + + } + + /** + * Closes the self view notification. + */ + async closeReEnableSelfViewNotification() { + await this.participant.driver.$(`div[data-testid="${REENABLE_SELF_VIEW_CLOSE_NOTIFICATION}"]`).click(); + } } diff --git a/tests/pageobjects/ParticipantsPane.ts b/tests/pageobjects/ParticipantsPane.ts index 38515fbe787c..9649aad7e0c1 100644 --- a/tests/pageobjects/ParticipantsPane.ts +++ b/tests/pageobjects/ParticipantsPane.ts @@ -8,6 +8,8 @@ import BasePageObject from './BasePageObject'; */ const PARTICIPANTS_PANE = 'participants_pane'; +const INVITE = 'Invite someone'; + /** * Represents the participants pane from the UI. */ @@ -168,4 +170,18 @@ export default class ParticipantsPane extends BasePageObject { await meetingParticipantMoreOptions.moveTo(); await meetingParticipantMoreOptions.click(); } + + /** + * Clicks the invite button. + */ + async clickInvite() { + if (!await this.isOpen()) { + await this.open(); + } + + const inviteButton = this.participant.driver.$(`aria/${INVITE}`); + + await inviteButton.waitForDisplayed(); + await inviteButton.click(); + } } diff --git a/tests/pageobjects/SettingsDialog.ts b/tests/pageobjects/SettingsDialog.ts index e38ad03311c0..9bc5cf975749 100644 --- a/tests/pageobjects/SettingsDialog.ts +++ b/tests/pageobjects/SettingsDialog.ts @@ -1,7 +1,11 @@ import BaseDialog from './BaseDialog'; const EMAIL_FIELD = '#setEmail'; +const FOLLOW_ME_CHECKBOX = '//input[@name="follow-me"]'; +const HIDE_SELF_VIEW_CHECKBOX = '//input[@name="hide-self-view"]'; const SETTINGS_DIALOG_CONTENT = '.settings-pane'; +const X_PATH_MODERATOR_TAB = '//div[contains(@class, "settings-dialog")]//*[text()="Moderator"]'; +const X_PATH_MORE_TAB = '//div[contains(@class, "settings-dialog")]//*[text()="General"]'; const X_PATH_PROFILE_TAB = '//div[contains(@class, "settings-dialog")]//*[text()="Profile"]'; /** @@ -34,6 +38,20 @@ export default class SettingsDialog extends BaseDialog { await this.openTab(X_PATH_PROFILE_TAB); } + /** + * Selects the More tab to be displayed. + */ + async openMoreTab() { + await this.openTab(X_PATH_MORE_TAB); + } + + /** + * Selects the moderator tab to be displayed. + */ + async openModeratorTab() { + await this.openTab(X_PATH_MODERATOR_TAB); + } + /** * Enters the passed in email into the email field. * @param email @@ -59,4 +77,56 @@ export default class SettingsDialog extends BaseDialog { async submit() { await this.clickOkButton(); } + + /** + * Sets the state checked/selected of a checkbox in the settings dialog. + */ + async setHideSelfView(hideSelfView: boolean) { + await this.openMoreTab(); + + await this.setCheckbox(HIDE_SELF_VIEW_CHECKBOX, hideSelfView); + } + + /** + * Sets the follow me feature to enabled/disabled. + * @param enable + */ + async setFollowMe(enable: boolean) { + await this.openModeratorTab(); + + await this.setCheckbox(FOLLOW_ME_CHECKBOX, enable); + } + + /** + * Returns true if the follow me checkbox is displayed in the settings dialog. + */ + async isFollowMeDisplayed() { + const elem = this.participant.driver.$(X_PATH_MODERATOR_TAB); + + if (!await elem.isExisting()) { + return false; + } + + await this.openModeratorTab(); + + return await this.participant.driver.$$(FOLLOW_ME_CHECKBOX).length > 0; + } + + /** + * Sets the state of a checkbox. + * @param selector + * @param enable + * @private + */ + private async setCheckbox(selector: string, enable: boolean) { + const checkbox = this.participant.driver.$(selector); + + await checkbox.waitForExist(); + + if (enable !== await checkbox.isSelected()) { + // we show a div with svg and text after the input and those elements grab the click + // so we need to click on the parent element + await this.participant.driver.$(`${selector}//ancestor::div[1]`).click(); + } + } } diff --git a/tests/pageobjects/Toolbar.ts b/tests/pageobjects/Toolbar.ts index ff839a170847..77deb73718b2 100644 --- a/tests/pageobjects/Toolbar.ts +++ b/tests/pageobjects/Toolbar.ts @@ -5,11 +5,17 @@ const AUDIO_UNMUTE = 'Unmute microphone'; const CHAT = 'Open chat'; const CLOSE_CHAT = 'Close chat'; const CLOSE_PARTICIPANTS_PANE = 'Close participants pane'; +const DESKTOP = 'Start sharing your screen'; +const HANGUP = 'Leave the meeting'; const OVERFLOW_MENU = 'More actions menu'; const OVERFLOW = 'More actions'; const PARTICIPANTS = 'Open participants pane'; const PROFILE = 'Edit your profile'; const RAISE_HAND = 'Raise your hand'; +const SETTINGS = 'Open settings'; +const STOP_DESKTOP = 'Stop sharing your screen'; +const ENTER_TILE_VIEW_BUTTON = 'Enter tile view'; +const EXIT_TILE_VIEW_BUTTON = 'Exit tile view'; const VIDEO_QUALITY = 'Manage video quality'; const VIDEO_MUTE = 'Stop camera'; const VIDEO_UNMUTE = 'Start camera'; @@ -107,7 +113,6 @@ export default class Toolbar extends BasePageObject { await this.getButton(CLOSE_PARTICIPANTS_PANE).click(); } - /** * Clicks Participants pane button. * @@ -160,6 +165,49 @@ export default class Toolbar extends BasePageObject { await this.getButton(CLOSE_CHAT).click(); } + /** + * Clicks on the desktop sharing button that starts desktop sharing. + */ + async clickDesktopSharingButton() { + await this.getButton(DESKTOP).click(); + } + + /** + * Clicks on the desktop sharing button to stop it. + */ + async clickStopDesktopSharingButton() { + await this.getButton(STOP_DESKTOP).click(); + } + + /** + * Clicks on the tile view button which enables tile layout. + */ + async clickEnterTileViewButton() { + await this.getButton(ENTER_TILE_VIEW_BUTTON).click(); + } + + /** + * Clicks on the tile view button which exits tile layout. + */ + async clickExitTileViewButton() { + await this.getButton(EXIT_TILE_VIEW_BUTTON).click(); + } + + /** + * Clicks on the hangup button that ends the conference. + */ + async clickHangupButton(): Promise { + this.participant.log('Clicking on: Hangup Button'); + await this.getButton(HANGUP).click(); + } + + /** + * Clicks on the settings toolbar button which opens or closes the settings panel. + */ + async clickSettingsButton() { + await this.clickButtonInOverflowMenu(SETTINGS); + } + /** * Ensure the overflow menu is open and clicks on a specified button. * @param accessibilityLabel The accessibility label of the button to be clicked. @@ -168,6 +216,10 @@ export default class Toolbar extends BasePageObject { private async clickButtonInOverflowMenu(accessibilityLabel: string) { await this.openOverflowMenu(); + // sometimes the overflow button tooltip is over the last entry in the menu, + // so let's move focus away before clicking the button + await this.participant.driver.$('#overflow-context-menu').moveTo(); + this.participant.log(`Clicking on: ${accessibilityLabel}`); await this.getButton(accessibilityLabel).click(); diff --git a/tests/specs/2way/displayName.spec.ts b/tests/specs/2way/displayName.spec.ts new file mode 100644 index 000000000000..97b1f449902b --- /dev/null +++ b/tests/specs/2way/displayName.spec.ts @@ -0,0 +1,45 @@ +import { ensureTwoParticipants } from '../../helpers/participants'; + +describe('DisplayName - ', () => { + it('joining the meeting', async () => { + await ensureTwoParticipants(ctx, { + skipDisplayName: true + }); + }); + + it('check change', async () => { + const { p1, p2 } = ctx; + + // default remote display name + const defaultDisplayName = await p1.driver.execute(() => config.defaultRemoteDisplayName); + const p1EndpointId = await p1.getEndpointId(); + const p2EndpointId = await p2.getEndpointId(); + + // Checks whether default display names are set and shown, when both sides still miss the display name. + expect(await p1.getFilmstrip().getRemoteDisplayName(p2EndpointId)).toBe(defaultDisplayName); + expect(await p2.getFilmstrip().getRemoteDisplayName(p1EndpointId)).toBe(defaultDisplayName); + + const randomName = `Name${Math.trunc(Math.random() * 1_000_000)}`; + + await p2.setLocalDisplayName(randomName); + expect(await p2.getLocalDisplayName()).toBe(randomName); + expect(await p1.getFilmstrip().getRemoteDisplayName(p2EndpointId)).toBe(randomName); + }); + + it('check persistence', async () => { + const { p2 } = ctx; + const randomName = `Name${Math.trunc(Math.random() * 1_000_000)}`; + + await p2.setLocalDisplayName(randomName); + + expect(await p2.getLocalDisplayName()).toBe(randomName); + + await p2.hangup(); + + await ensureTwoParticipants(ctx, { + skipDisplayName: true + }); + + expect(await p2.getLocalDisplayName()).toBe(randomName); + }); +}); diff --git a/tests/specs/2way/endConference.spec.ts b/tests/specs/2way/endConference.spec.ts new file mode 100644 index 000000000000..5cb2f54e8add --- /dev/null +++ b/tests/specs/2way/endConference.spec.ts @@ -0,0 +1,22 @@ +import { ensureTwoParticipants } from '../../helpers/participants'; + +describe('End Conference - ', () => { + it('joining the meeting', async () => { + await ensureTwoParticipants(ctx); + }); + + it('hangup call and check', async () => { + const { p1 } = ctx; + const url = await p1.driver.getUrl(); + + await p1.getToolbar().clickHangupButton(); + + await p1.driver.waitUntil( + async () => await p1.driver.getUrl() !== url, + { + timeout: 5000, + timeoutMsg: 'p1 did not navigate away from the conference' + } + ); + }); +}); diff --git a/tests/specs/2way/fakeDialInAudio.spec.ts b/tests/specs/2way/fakeDialInAudio.spec.ts new file mode 100644 index 000000000000..b9b785b0e24a --- /dev/null +++ b/tests/specs/2way/fakeDialInAudio.spec.ts @@ -0,0 +1,52 @@ +import process from 'node:process'; + +import { ensureOneParticipant, ensureTwoParticipants } from '../../helpers/participants'; +import { cleanup, isDialInEnabled, waitForAudioFromDialInParticipant } from '../helpers/DialIn'; + +describe('Fake Dial-In - ', () => { + it('join participant', async () => { + // we execute fake dial in only if the real dial in is not enabled + + // check rest url is not configured + if (process.env.DIAL_IN_REST_URL) { + ctx.skipSuiteTests = true; + + return; + } + + await ensureOneParticipant(ctx); + + // check dial-in is enabled, so skip + if (await isDialInEnabled(ctx.p1)) { + ctx.skipSuiteTests = true; + } + }); + + it('open invite dialog', async () => { + await ctx.p1.getInviteDialog().open(); + + await ctx.p1.getInviteDialog().clickCloseButton(); + }); + + it('invite second participant', async () => { + if (!await ctx.p1.isInMuc()) { + // local participant did not join abort + return; + } + + await ensureTwoParticipants(ctx); + }); + + it('wait for audio from second participant', async () => { + const { p1 } = ctx; + + if (!await p1.isInMuc()) { + // local participant did not join abort + return; + } + + await waitForAudioFromDialInParticipant(p1); + + await cleanup(p1); + }); +}); diff --git a/tests/specs/2way/selfView.spec.ts b/tests/specs/2way/selfView.spec.ts new file mode 100644 index 000000000000..9fd8507028b0 --- /dev/null +++ b/tests/specs/2way/selfView.spec.ts @@ -0,0 +1,70 @@ +import type { Participant } from '../../helpers/Participant'; +import { ensureTwoParticipants } from '../../helpers/participants'; + +describe('Self view - ', () => { + it('joining the meeting', async () => { + await ensureTwoParticipants(ctx); + }); + + it('hide from menu', async () => { + const { p1 } = ctx; + + await checkSelfViewHidden(p1, false); + + await p1.getFilmstrip().hideSelfView(); + + await checkSelfViewHidden(p1, true, true); + + await p1.getToolbar().clickEnterTileViewButton(); + + await checkSelfViewHidden(p1, true); + }); + + it('show from settings', async () => { + const { p1 } = ctx; + + await toggleSelfViewFromSettings(p1, false); + + await checkSelfViewHidden(p1, false); + }); + + it('hide from settings', async () => { + const { p1 } = ctx; + + await toggleSelfViewFromSettings(p1, true); + await checkSelfViewHidden(p1, true, true); + }); + + it('check in alone meeting', async () => { + const { p1, p2 } = ctx; + + await checkSelfViewHidden(p1, true); + await p2.hangup(); + await checkSelfViewHidden(p1, true); + }); +}); + +/** + * Toggles the self view option from the settings dialog. + */ +async function toggleSelfViewFromSettings(participant: Participant, hide: boolean) { + await participant.getToolbar().clickSettingsButton(); + + const settings = participant.getSettingsDialog(); + + await settings.waitForDisplay(); + await settings.setHideSelfView(hide); + await settings.submit(); +} + +/** + * Checks whether the local self view is displayed or not. + */ +async function checkSelfViewHidden(participant: Participant, hidden: boolean, checkNotification = false) { + if (checkNotification) { + await participant.getNotifications().waitForReEnableSelfViewNotification(); + await participant.getNotifications().closeReEnableSelfViewNotification(); + } + + await participant.getFilmstrip().assertSelfViewIsHidden(hidden); +} diff --git a/tests/specs/3way/followMe.spec.ts b/tests/specs/3way/followMe.spec.ts new file mode 100644 index 000000000000..4c29a600d0a3 --- /dev/null +++ b/tests/specs/3way/followMe.spec.ts @@ -0,0 +1,93 @@ +import { ensureThreeParticipants, ensureTwoParticipants } from '../../helpers/participants'; + +describe('Follow Me - ', () => { + it('joining the meeting', async () => { + await ensureTwoParticipants(ctx); + + const { p1 } = ctx; + + await p1.getToolbar().clickSettingsButton(); + + const settings = p1.getSettingsDialog(); + + await settings.waitForDisplay(); + await settings.setFollowMe(true); + await settings.submit(); + }); + + it('follow me checkbox visible only for moderators', async () => { + const { p2 } = ctx; + + if (!await p2.isModerator()) { + await p2.getToolbar().clickSettingsButton(); + + const settings = p2.getSettingsDialog(); + + await settings.waitForDisplay(); + expect(await settings.isFollowMeDisplayed()).toBe(false); + + await settings.clickCloseButton(); + } + }); + + it('filmstrip commands', async () => { + const { p1, p2 } = ctx; + + const p1Filmstrip = p1.getFilmstrip(); + const p2Filmstrip = p2.getFilmstrip(); + + await p1Filmstrip.toggle(); + + await p1Filmstrip.assertRemoteVideosHidden(); + await p2Filmstrip.assertRemoteVideosHidden(); + }); + + it('tile view', async () => { + await ensureThreeParticipants(ctx); + + const { p1, p2, p3 } = ctx; + + await p1.waitForTileViewDisplay(); + + await p1.getToolbar().clickExitTileViewButton(); + + await Promise.all([ + p1.waitForTileViewDisplay(true), + p2.waitForTileViewDisplay(true), + p3.waitForTileViewDisplay(true) + ]); + + await p1.getToolbar().clickEnterTileViewButton(); + + await Promise.all([ + p1.waitForTileViewDisplay(), + p2.waitForTileViewDisplay(), + p3.waitForTileViewDisplay() + ]); + }); + + it('next on stage', async () => { + const { p1, p2, p3 } = ctx; + + await p1.getFilmstrip().pinParticipant(p2); + + const p2Filmstrip = p2.getFilmstrip(); + const localVideoId = await p2Filmstrip.getLocalVideoId(); + + await p2.driver.waitUntil( + async () => await localVideoId === await p2.getLargeVideoId(), + { + timeout: 5_000, + timeoutMsg: 'The pinned participant is not displayed on stage for p2' + }); + + const p2VideoIdOnp3 = await p3.getFilmstrip().getRemoteVideoId(await p2.getEndpointId()); + + await p3.driver.waitUntil( + async () => p2VideoIdOnp3 === await p3.getLargeVideoId(), + { + timeout: 5_000, + timeoutMsg: 'The pinned participant is not displayed on stage for p3' + }); + }); +}); diff --git a/tests/specs/4way/desktopSharing.spec.ts b/tests/specs/4way/desktopSharing.spec.ts new file mode 100644 index 000000000000..0c693536d79c --- /dev/null +++ b/tests/specs/4way/desktopSharing.spec.ts @@ -0,0 +1,353 @@ +import { SET_AUDIO_ONLY } from '../../../react/features/base/audio-only/actionTypes'; +import type { Participant } from '../../helpers/Participant'; +import { + ensureFourParticipants, + ensureOneParticipant, + ensureThreeParticipants, + ensureTwoParticipants +} from '../../helpers/participants'; + +describe('Desktop sharing - ', () => { + it('start', async () => { + await ensureTwoParticipants(ctx, { + configOverwrite: { + p2p: { + enabled: true + } + } + }); + const { p1, p2 } = ctx; + + await p2.getToolbar().clickDesktopSharingButton(); + + // Check if a remote screen share tile is created on p1. + await checkForScreensharingTile(p2, p1); + + // Check if a local screen share tile is created on p2. + await checkForScreensharingTile(p2, p2); + + expect(await p2.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + }); + + it('stop', async () => { + const { p1, p2 } = ctx; + + await p2.getToolbar().clickStopDesktopSharingButton(); + + // Check if the local screen share thumbnail disappears on p2. + await checkForScreensharingTile(p2, p2, true); + + // Check if the remote screen share thumbnail disappears on p1. + await checkForScreensharingTile(p1, p2, true); + }); + + /** + * Ensures screen share is still visible when the call switches from p2p to jvb connection. + */ + it('p2p to jvb switch', async () => { + await ctx.p2.getToolbar().clickDesktopSharingButton(); + + await ensureThreeParticipants(ctx); + const { p1, p2, p3 } = ctx; + + // Check if a remote screen share tile is created on all participants. + await checkForScreensharingTile(p2, p1); + await checkForScreensharingTile(p2, p2); + await checkForScreensharingTile(p2, p2); + + expect(await p3.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + }); + + /** + * Ensure screen share is still visible when the call switches from jvb to p2p and back. + */ + it('p2p to jvb switch and back', async () => { + const { p1, p2, p3 } = ctx; + + await p3.hangup(); + + // Check if a remote screen share tile is created on p1 and p2 after switching back to p2p. + await checkForScreensharingTile(p2, p1); + await checkForScreensharingTile(p2, p2); + + // The video should be playing. + expect(await p1.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + + // Start desktop share on p1. + await p1.getToolbar().clickDesktopSharingButton(); + + // Check if a new tile for p1's screen share is created on both p1 and p2. + await checkForScreensharingTile(p1, p1); + await checkForScreensharingTile(p1, p2); + + await ensureThreeParticipants(ctx); + + await checkForScreensharingTile(p1, p3); + await checkForScreensharingTile(p2, p3); + + // The large video should be playing on p3. + expect(await p3.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + }); + + /** + * Ensure that screen share is still visible in jvb connection when share is toggled while the users are + * in p2p mode, i.e., share is restarted when user is in p2p mode and then the call switches over to jvb mode. + */ + it('stop screen sharing and back', async () => { + const { p1, p2, p3 } = ctx; + + // Stop share on both p1 and p2. + await p1.getToolbar().clickStopDesktopSharingButton(); + await p2.getToolbar().clickStopDesktopSharingButton(); + + await p3.hangup(); + + // Start share on both p1 and p2. + await p1.getToolbar().clickDesktopSharingButton(); + await p2.getToolbar().clickDesktopSharingButton(); + + // Check if p1 and p2 can see each other's shares in p2p. + await checkForScreensharingTile(p1, p2); + await checkForScreensharingTile(p2, p1); + + // Add p3 back to the conference and check if p1 and p2's shares are visible on p3. + await ensureThreeParticipants(ctx); + + await checkForScreensharingTile(p1, p3); + await checkForScreensharingTile(p2, p3); + + // The large video should be playing on p3. + expect(await p3.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + }); + + /** + * Ensures screen share is visible when a muted screen share track is added to the conference, i.e., + * users starts and stops the share before anyone else joins the call. + * The call switches to jvb and then back to p2p. + */ + it('screen sharing toggle before others join', async () => { + await Promise.all([ ctx.p1.hangup(), ctx.p2.hangup(), ctx.p3.hangup() ]); + + await ensureOneParticipant(ctx, { + configOverwrite: { + p2p: { + enabled: true + } + } + }); + const { p1 } = ctx; + + // p1 starts share when alone in the call. + await p1.getToolbar().clickDesktopSharingButton(); + await checkForScreensharingTile(p1, p1); + + // p1 stops share. + await p1.getToolbar().clickStopDesktopSharingButton(); + + // Call switches to jvb. + await ensureThreeParticipants(ctx); + const { p2, p3 } = ctx; + + // p1 starts share again when call switches to jvb. + await p1.getToolbar().clickDesktopSharingButton(); + + // Check p2 and p3 are able to see p1's share. + await checkForScreensharingTile(p1, p2); + await checkForScreensharingTile(p1, p3); + + expect(await p2.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + expect(await p3.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + + // p3 leaves the call. + await p3.hangup(); + + // Make sure p2 see's p1's share after the call switches back to p2p. + await checkForScreensharingTile(p1, p2); + expect(await p2.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + + // p2 starts share when in p2p. + await p2.getToolbar().clickDesktopSharingButton(); + + // Makes sure p2's share is visible on p1. + await checkForScreensharingTile(p2, p1); + expect(await p1.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + }); + + /** + * A case where a non-dominant speaker is sharing screen for a participant in low bandwidth mode + * where only a screen share can be received. A bug fixed in jvb 0c5dd91b where the video was not received. + */ + it('audio only and non dominant screen share', async () => { + await Promise.all([ ctx.p1.hangup(), ctx.p2.hangup(), ctx.p3.hangup() ]); + + await ensureOneParticipant(ctx); + const { p1 } = ctx; + + // a workaround to directly set audio only mode without going through the rest of the settings in the UI + await p1.driver.execute(type => { + APP.store.dispatch({ + type, + audioOnly: true + }); + APP.conference.onToggleAudioOnly(); + }, SET_AUDIO_ONLY); + await p1.getToolbar().clickAudioMuteButton(); + + await ensureThreeParticipants(ctx, { skipInMeetingChecks: true }); + const { p2, p3 } = ctx; + + await p3.getToolbar().clickAudioMuteButton(); + await p3.getToolbar().clickDesktopSharingButton(); + + await checkForScreensharingTile(p3, p1); + await checkForScreensharingTile(p3, p2); + + // the video should be playing + await p1.driver.waitUntil(async () => + await p1.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived()), { + timeout: 5_000, + timeoutMsg: 'expected remote screen share to be on large' + }); + }); + + /** + * A case where first participant is muted (a&v) and enters low bandwidth mode, + * the second one is audio muted only and the one sharing (the third) is dominant speaker. + * A problem fixed in jitsi-meet 3657c19e and d6ab0a72. + */ + it('audio only and dominant screen share', async () => { + await Promise.all([ ctx.p1.hangup(), ctx.p2.hangup(), ctx.p3.hangup() ]); + + await ensureOneParticipant(ctx, { + configOverwrite: { + startWithAudioMuted: true, + startWithVideoMuted: true + } + }); + const { p1 } = ctx; + + // a workaround to directly set audio only mode without going through the rest of the settings in the UI + await p1.driver.execute(type => { + APP.store.dispatch({ + type, + audioOnly: true + }); + APP.conference.onToggleAudioOnly(); + }, SET_AUDIO_ONLY); + + await ensureTwoParticipants(ctx, { + skipInMeetingChecks: true, + configOverwrite: { + startWithAudioMuted: true + } + }); + await ensureThreeParticipants(ctx, { + skipInMeetingChecks: true + }); + const { p2, p3 } = ctx; + + await p3.getToolbar().clickDesktopSharingButton(); + + await checkForScreensharingTile(p3, p1); + await checkForScreensharingTile(p3, p2); + + // The desktop sharing participant should be on large + expect(await p1.driver.execute(() => APP.UI.getLargeVideoID())).toBe(`${await p3.getEndpointId()}-v1`); + + // the video should be playing + await p1.driver.waitUntil(async () => + await p1.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived()), { + timeout: 5_000, + timeoutMsg: 'expected remote screen share to be on large' + }); + }); + + /** + * Test screensharing with lastN. We add p4 with lastN=2 and verify that it receives the expected streams. + */ + it('with lastN', async () => { + await Promise.all([ ctx.p1.hangup(), ctx.p2.hangup(), ctx.p3.hangup() ]); + + await ensureThreeParticipants(ctx); + const { p1, p2, p3 } = ctx; + + await p3.getToolbar().clickDesktopSharingButton(); + + await p1.getToolbar().clickAudioMuteButton(); + await p3.getToolbar().clickAudioMuteButton(); + + await ensureFourParticipants(ctx, { + configOverwrite: { + channelLastN: 2, + startWithAudioMuted: true + } + }); + const { p4 } = ctx; + + // We now have p1, p2, p3, p4. + // p3 is screensharing. + // p1, p3, p4 are audio muted, so p2 should eventually become dominant speaker. + // Participants should display p3 on-stage because it is screensharing. + await checkForScreensharingTile(p3, p1); + await checkForScreensharingTile(p3, p2); + await checkForScreensharingTile(p3, p4); + + // And the video should be playing + expect(await p4.driver.execute(() => JitsiMeetJS.app.testing.isLargeVideoReceived())).toBe(true); + + const p1EndpointId = await p1.getEndpointId(); + + // p4 has lastN=2 and has selected p3. With p2 being dominant speaker p4 should eventually + // see video for [p3, p2] and p1 as ninja. + await p4.driver.$(`//span[@id='participant_${p1EndpointId}']//span[@class='connection_ninja']`) + .waitForDisplayed({ + timeout: 15_000 + }); + + const p2EndpointId = await p2.getEndpointId(); + + await p4.driver.waitUntil(async () => + await p4.driver.execute(epId => JitsiMeetJS.app.testing.isRemoteVideoReceived(`${epId}`), + p2EndpointId) && await p4.driver.$( + `//span[@id="participant_${p2EndpointId}" and contains(@class, "display-video")]`).isExisting(), { + timeout: 15_000, + timeoutMsg: 'expected remote video to be received 15s' + }); + + await p4.driver.waitUntil(async () => + await p4.driver.execute(epId => JitsiMeetJS.app.testing.isRemoteVideoReceived(`${epId}`), + p2EndpointId) && await p4.driver.$( + `//span[@id="participant_${p2EndpointId}" and contains(@class, "display-video")]`).isExisting(), { + timeout: 15_000, + timeoutMsg: 'expected remote video to be received 15s' + }); + + // Let's switch and check, muting participant 2 and unmuting 1 will leave participant 1 as dominant + await p1.getToolbar().clickAudioUnmuteButton(); + await p2.getToolbar().clickAudioMuteButton(); + + // Participant4 should eventually see video for [p3, p1] and p2 as a ninja. + await p4.driver.$(`//span[@id='participant_${p2EndpointId}']//span[@class='connection_ninja']`) + .waitForDisplayed({ + timeout: 15_000 + }); + + await p4.driver.waitUntil(async () => + await p4.driver.execute(epId => JitsiMeetJS.app.testing.isRemoteVideoReceived(`${epId}`), + p1EndpointId) && await p4.driver.$( + `//span[@id="participant_${p1EndpointId}" and contains(@class, "display-video")]`).isExisting(), { + timeout: 15_000, + timeoutMsg: 'expected remote video to be received 15s' + }); + }); +}); + +/** + * Check if a screensharing tile is displayed on the observer. + */ +async function checkForScreensharingTile(sharer: Participant, observer: Participant, reverse = false) { + await observer.driver.$(`//span[@id='participant_${await sharer.getEndpointId()}-v1']`).waitForDisplayed({ + timeout: 3_000, + reverse + }); +} diff --git a/tests/specs/alone/dialInAudio.spec.ts b/tests/specs/alone/dialInAudio.spec.ts new file mode 100644 index 000000000000..2a6ecf11d5e6 --- /dev/null +++ b/tests/specs/alone/dialInAudio.spec.ts @@ -0,0 +1,82 @@ +import https from 'node:https'; +import process from 'node:process'; + +import { ensureOneParticipant } from '../../helpers/participants'; +import { cleanup, isDialInEnabled, waitForAudioFromDialInParticipant } from '../helpers/DialIn'; + +describe('Dial-In - ', () => { + it('join participant', async () => { + // check rest url is configured + if (!process.env.DIAL_IN_REST_URL) { + ctx.skipSuiteTests = true; + + return; + } + + await ensureOneParticipant(ctx); + + // check dial-in is enabled + if (!await isDialInEnabled(ctx.p1)) { + ctx.skipSuiteTests = true; + } + }); + + it('retrieve pin', async () => { + const dialInPin = await ctx.p1.getInviteDialog().getPinNumber(); + + await ctx.p1.getInviteDialog().clickCloseButton(); + + if (dialInPin.length === 0) { + console.error('dial-in.test.no-pin'); + } + + expect(dialInPin.length >= 9).toBe(true); + + ctx.dialInPin = dialInPin; + }); + + it('invite dial-in participant', async () => { + if (!await ctx.p1.isInMuc()) { + // local participant did not join abort + return; + } + + const restUrl = process.env.DIAL_IN_REST_URL?.replace('{0}', ctx.dialInPin); + + // we have already checked in the first test that DIAL_IN_REST_URL exist so restUrl cannot be '' + const responseData: string = await new Promise((resolve, reject) => { + https.get(restUrl || '', res => { + let data = ''; + + res.on('data', chunk => { + data += chunk; + }); + + res.on('end', () => { + ctx.times.restAPIExecutionTS = performance.now(); + + resolve(data); + }); + }).on('error', err => { + console.error('dial-in.test.restAPI.request.fail'); + console.error(err); + reject(err); + }); + }); + + console.log(`dial-in.test.call_session_history_id:${JSON.parse(responseData).call_session_history_id}`); + }); + + it('wait for audio from dial-in participant', async () => { + const { p1 } = ctx; + + if (!await p1.isInMuc()) { + // local participant did not join abort + return; + } + + await waitForAudioFromDialInParticipant(p1); + + await cleanup(p1); + }); +}); diff --git a/tests/specs/alone/invite.spec.ts b/tests/specs/alone/invite.spec.ts new file mode 100644 index 000000000000..f455b9e9c946 --- /dev/null +++ b/tests/specs/alone/invite.spec.ts @@ -0,0 +1,87 @@ +import { ensureOneParticipant } from '../../helpers/participants'; +import { isDialInEnabled } from '../helpers/DialIn'; + +describe('Invite - ', () => { + it('join participant', async () => { + await ensureOneParticipant(ctx); + }); + + it('url displayed', async () => { + const { p1 } = ctx; + const inviteDialog = p1.getInviteDialog(); + + await inviteDialog.open(); + await inviteDialog.waitTillOpen(); + + const driverUrl = await p1.driver.getUrl(); + + expect(driverUrl.includes(await inviteDialog.getMeetingURL())).toBe(true); + + await inviteDialog.clickCloseButton(); + + await inviteDialog.waitTillOpen(true); + }); + + it('dial-in displayed', async () => { + const { p1 } = ctx; + + if (!await isDialInEnabled(p1)) { + return; + } + + const inviteDialog = p1.getInviteDialog(); + + await inviteDialog.open(); + await inviteDialog.waitTillOpen(); + + expect((await inviteDialog.getDialInNumber()).length > 0).toBe(true); + expect((await inviteDialog.getPinNumber()).length > 0).toBe(true); + }); + + it('view more numbers', async () => { + const { p1 } = ctx; + + if (!await isDialInEnabled(p1)) { + return; + } + + const inviteDialog = p1.getInviteDialog(); + + await inviteDialog.open(); + await inviteDialog.waitTillOpen(); + + const windows = await p1.driver.getWindowHandles(); + + expect(windows.length).toBe(1); + + const meetingWindow = windows[0]; + + const displayedNumber = await inviteDialog.getDialInNumber(); + const displayedPin = await inviteDialog.getPinNumber(); + + await inviteDialog.openDialInNumbersPage(); + + const newWindow = (await p1.driver.getWindowHandles()).filter(w => w !== meetingWindow); + + expect(newWindow.length).toBe(1); + + const moreNumbersWindow = newWindow[0]; + + await p1.driver.switchWindow(moreNumbersWindow); + + await browser.pause(5000); + + await p1.driver.$('.dial-in-numbers-list').waitForExist(); + + const conferenceIdMessage = p1.driver.$('//div[contains(@class, "pinLabel")]'); + + expect((await conferenceIdMessage.getText()).replace(/ /g, '').includes(displayedPin)).toBe(true); + + const numbers = p1.driver.$$('.dial-in-number'); + + const nums = await numbers.filter( + async el => (await el.getText()).trim() === displayedNumber); + + expect(nums.length).toBe(1); + }); +}); diff --git a/tests/specs/helpers/DialIn.ts b/tests/specs/helpers/DialIn.ts new file mode 100644 index 000000000000..a9d088283dd2 --- /dev/null +++ b/tests/specs/helpers/DialIn.ts @@ -0,0 +1,48 @@ +import type { Participant } from '../../helpers/Participant'; + +/** + * Helper functions for dial-in related operations. + * To be able to create a fake dial-in test that will run most of the logic for the real dial-in test. + */ + +/** + * Waits for the audio from the dial-in participant. + * @param participant + */ +export async function waitForAudioFromDialInParticipant(participant: Participant) { + // waits 15 seconds for the participant to join + await participant.waitForParticipants(1, `dial-in.test.jigasi.participant.no.join.for:${ + ctx.times.restAPIExecutionTS + 15_000} ms.`); + + const joinedTS = performance.now(); + + console.log(`dial-in.test.jigasi.participant.join.after:${joinedTS - ctx.times.restAPIExecutionTS}`); + + await participant.waitForIceConnected(); + await participant.waitForRemoteStreams(1); + + await participant.waitForSendReceiveData(20_000, 'dial-in.test.jigasi.participant.no.audio.after.join'); + console.log(`dial-in.test.jigasi.participant.received.audio.after.join:${performance.now() - joinedTS} ms.`); +} + +/** + * Cleans up the dial-in participant by kicking it if the local participant is a moderator. + * @param participant + */ +export async function cleanup(participant: Participant) { + // cleanup + if (await participant.isModerator()) { + const jigasiEndpointId = await participant.driver.execute(() => APP.conference.listMembers()[0].getId()); + + await participant.getFilmstrip().kickParticipant(jigasiEndpointId); + } +} + +/** + * Checks if the dial-in is enabled. + * @param participant + */ +export async function isDialInEnabled(participant: Participant) { + return await participant.driver.execute(() => Boolean( + config.dialInConfCodeUrl && config.dialInNumbersUrl && config.hosts?.muc)); +} diff --git a/tests/wdio.conf.ts b/tests/wdio.conf.ts index 1280cc9444bb..f2cf75822d5e 100644 --- a/tests/wdio.conf.ts +++ b/tests/wdio.conf.ts @@ -17,6 +17,8 @@ const allure = require('allure-commandline'); // we need it to be able to reuse jitsi-meet code in tests require.extensions['.web.ts'] = require.extensions['.ts']; +const usingGrid = Boolean(new URL(import.meta.url).searchParams.get('grid')); + const chromeArgs = [ '--allow-insecure-localhost', '--use-fake-ui-for-media-stream', @@ -33,7 +35,8 @@ const chromeArgs = [ // Avoids - "You are checking for animations on an inactive tab, animations do not run for inactive tabs" // when executing waitForStable() '--disable-renderer-backgrounding', - `--use-file-for-fake-audio-capture=${process.env.REMOTE_RESOURCE_PATH || 'tests/resources'}/fakeAudioStream.wav` + `--use-file-for-fake-audio-capture=${ + usingGrid ? process.env.REMOTE_RESOURCE_PATH : 'tests/resources'}/fakeAudioStream.wav` ]; if (process.env.RESOLVER_RULES) { @@ -47,7 +50,7 @@ if (process.env.HEADLESS === 'true') { chromeArgs.push('--window-size=1280,720'); } if (process.env.VIDEO_CAPTURE_FILE) { - chromeArgs.push(`use-file-for-fake-video-capture=${process.env.VIDEO_CAPTURE_FILE}`); + chromeArgs.push(`--use-file-for-fake-video-capture=${process.env.VIDEO_CAPTURE_FILE}`); } const chromePreferences = { @@ -188,7 +191,9 @@ export const config: WebdriverIO.MultiremoteConfig = { const globalAny: any = global; const roomName = `jitsimeettorture-${crypto.randomUUID()}`; - globalAny.ctx = {} as IContext; + globalAny.ctx = { + times: {} + } as IContext; globalAny.ctx.roomName = roomName; globalAny.ctx.jwtPrivateKeyPath = process.env.JWT_PRIVATE_KEY_PATH; globalAny.ctx.jwtKid = process.env.JWT_KID; diff --git a/tests/wdio.firefox.conf.ts b/tests/wdio.firefox.conf.ts index 028acf86f3c8..74ded693fbd2 100644 --- a/tests/wdio.firefox.conf.ts +++ b/tests/wdio.firefox.conf.ts @@ -21,7 +21,10 @@ if (process.env.HEADLESS === 'true') { const ffExcludes = [ 'specs/2way/iFrameParticipantsPresence.spec.ts', // FF does not support uploading files (uploadFile) - 'specs/3way/activeSpeaker.spec.ts' // FF does not support setting a file as mic input + + // FF does not support setting a file as mic input, no dominant speaker events + 'specs/3way/activeSpeaker.spec.ts', + 'specs/4way/desktopSharing.spec.ts' ]; const mergedConfig = merge(defaultConfig, { diff --git a/tests/wdio.grid.conf.ts b/tests/wdio.grid.conf.ts index 07015bfdea4b..36280eacb8e8 100644 --- a/tests/wdio.grid.conf.ts +++ b/tests/wdio.grid.conf.ts @@ -4,7 +4,7 @@ import { merge } from 'lodash-es'; import { URL } from 'url'; // @ts-ignore -import { config as defaultConfig } from './wdio.conf.ts'; +import { config as defaultConfig } from './wdio.conf.ts?grid=true'; const gridUrl = new URL(process.env.GRID_HOST_URL as string); const protocol = gridUrl.protocol.replace(':', ''); diff --git a/tsconfig.native.json b/tsconfig.native.json index 7cdacf79c77f..1a27ddd64783 100644 --- a/tsconfig.native.json +++ b/tsconfig.native.json @@ -4,7 +4,7 @@ "allowSyntheticDefaultImports": true, "target": "es2020", "jsx": "react-native", - "lib": [ "es2020"], + "lib": [ "ES2020", "ES2024.Promise" ], "types": [ "react-native" ], "skipLibCheck": true, "moduleResolution": "Node", diff --git a/tsconfig.web.json b/tsconfig.web.json index 72c80b216912..1d0ee77a1219 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -5,7 +5,7 @@ "module": "es2020", "target": "es2020", "jsx": "react", - "lib": [ "ES2020", "DOM" ], + "lib": [ "ES2020", "ES2024.Promise", "DOM" ], "skipLibCheck": true, "moduleResolution": "Node", "strict": true,