diff --git a/app.config.js b/app.config.js index 0c3588c67f..eafacc6cc1 100644 --- a/app.config.js +++ b/app.config.js @@ -204,7 +204,6 @@ module.exports = function (config) { ], './plugins/withAndroidManifestPlugin.js', './plugins/withAndroidManifestFCMIconPlugin.js', - './plugins/withAndroidManifestLaunchModePlugin.js', './plugins/withAndroidStylesWindowBackgroundPlugin.js', './plugins/withAndroidStylesAccentColorPlugin.js', './plugins/withAndroidSplashScreenStatusBarTranslucentPlugin.js', diff --git a/package.json b/package.json index f613018b18..c062ccc722 100644 --- a/package.json +++ b/package.json @@ -272,6 +272,8 @@ "resolutions": { "@types/react": "^18", "**/zeed-dom": "0.10.9", + "**/expo-constants": "16.0.1", + "**/expo-device": "6.0.2", "@react-native/babel-preset": "0.74.1" }, "jest": { diff --git a/patches/expo-modules-core+1.12.11.md b/patches/expo-modules-core+1.12.11.md new file mode 100644 index 0000000000..a690c8609b --- /dev/null +++ b/patches/expo-modules-core+1.12.11.md @@ -0,0 +1,5 @@ +## expo-modules-core Patch + +This patch fixes crashes seen in some Android clients when using intents to open the app. See https://github.com/expo/expo/pull/29513. + +Do not remove this patch until that PR lands in Expo and is released. diff --git a/patches/expo-modules-core+1.12.11.patch b/patches/expo-modules-core+1.12.11.patch new file mode 100644 index 0000000000..4878bb9f7e --- /dev/null +++ b/patches/expo-modules-core+1.12.11.patch @@ -0,0 +1,14 @@ +diff --git a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +index bb74e80..0aa0202 100644 +--- a/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java ++++ b/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/NativeModulesProxy.java +@@ -90,8 +90,8 @@ public class NativeModulesProxy extends ReactContextBaseJavaModule { + mModuleRegistry.ensureIsInitialized(); + + KotlinInteropModuleRegistry kotlinModuleRegistry = getKotlinInteropModuleRegistry(); +- kotlinModuleRegistry.emitOnCreate(); + kotlinModuleRegistry.installJSIInterop(); ++ kotlinModuleRegistry.emitOnCreate(); + + Map constants = new HashMap<>(3); + constants.put(MODULES_CONSTANTS_KEY, new HashMap<>()); diff --git a/plugins/withAndroidManifestLaunchModePlugin.js b/plugins/withAndroidManifestLaunchModePlugin.js deleted file mode 100644 index 45ab9aeb76..0000000000 --- a/plugins/withAndroidManifestLaunchModePlugin.js +++ /dev/null @@ -1,17 +0,0 @@ -const {withAndroidManifest} = require('expo/config-plugins') - -module.exports = function withAndroidManifestLaunchModePlugin(appConfig) { - return withAndroidManifest(appConfig, function (decoratedAppConfig) { - try { - const mainApplication = - decoratedAppConfig.modResults.manifest.application[0] - const mainActivity = mainApplication.activity.find( - elem => elem.$['android:name'] === '.MainActivity', - ) - mainActivity.$['android:launchMode'] = 'singleTop' - } catch (e) { - console.error(`withAndroidManifestLaunchModePlugin failed`, e) - } - return decoratedAppConfig - }) -} diff --git a/src/components/dms/dialogs/ShareViaChatDialog.tsx b/src/components/dms/dialogs/ShareViaChatDialog.tsx index d353eebe65..d2fefd33bf 100644 --- a/src/components/dms/dialogs/ShareViaChatDialog.tsx +++ b/src/components/dms/dialogs/ShareViaChatDialog.tsx @@ -15,8 +15,24 @@ export function SendViaChatDialog({ control: Dialog.DialogControlProps onSelectChat: (chatId: string) => void }) { - const {_} = useLingui() + return ( + + + + ) +} +function SendViaChatDialogInner({ + control, + onSelectChat, +}: { + control: Dialog.DialogControlProps + onSelectChat: (chatId: string) => void +}) { + const {_} = useLingui() const {mutate: createChat} = useGetConvoForMembers({ onSuccess: data => { onSelectChat(data.convo.id) @@ -39,15 +55,10 @@ export function SendViaChatDialog({ ) return ( - - - + ) } diff --git a/src/lib/media/picker.shared.ts b/src/lib/media/picker.shared.ts index 96e82e4c72..db7dce6b2b 100644 --- a/src/lib/media/picker.shared.ts +++ b/src/lib/media/picker.shared.ts @@ -3,8 +3,9 @@ import { launchImageLibraryAsync, MediaTypeOptions, } from 'expo-image-picker' -import {getDataUriSize} from './util' + import * as Toast from 'view/com/util/Toast' +import {getDataUriSize} from './util' export async function openPicker(opts?: ImagePickerOptions) { const response = await launchImageLibraryAsync({ @@ -12,6 +13,7 @@ export async function openPicker(opts?: ImagePickerOptions) { mediaTypes: MediaTypeOptions.Images, quality: 1, ...opts, + legacy: true, }) if (response.assets && response.assets.length > 4) { diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts index cca1a3fd4c..cda3cbae67 100644 --- a/src/lib/statsig/gates.ts +++ b/src/lib/statsig/gates.ts @@ -3,4 +3,5 @@ export type Gate = | 'request_notifications_permission_after_onboarding_v2' | 'show_avi_follow_button' | 'show_follow_back_label_v2' + | 'show_notification_badge_mobile_web' | 'starter_packs_enabled' diff --git a/src/screens/Onboarding/StepProfile/index.tsx b/src/screens/Onboarding/StepProfile/index.tsx index e0a10419d6..3556bba7a0 100644 --- a/src/screens/Onboarding/StepProfile/index.tsx +++ b/src/screens/Onboarding/StepProfile/index.tsx @@ -102,6 +102,7 @@ export function StepProfile() { mediaTypes: MediaTypeOptions.Images, quality: 1, ...opts, + legacy: true, }) return (response.assets ?? []) diff --git a/src/state/shell/minimal-mode.tsx b/src/state/shell/minimal-mode.tsx index 2c2f60b522..69ce13062a 100644 --- a/src/state/shell/minimal-mode.tsx +++ b/src/state/shell/minimal-mode.tsx @@ -1,9 +1,9 @@ import React from 'react' import { - Easing, + cancelAnimation, SharedValue, useSharedValue, - withTiming, + withSpring, } from 'react-native-reanimated' type StateContext = SharedValue @@ -22,9 +22,10 @@ export function Provider({children}: React.PropsWithChildren<{}>) { const setMode = React.useCallback( (v: boolean) => { 'worklet' - mode.value = withTiming(v ? 1 : 0, { - duration: 400, - easing: Easing.bezier(0.25, 0.1, 0.25, 1), + // Cancel any existing animation + cancelAnimation(mode) + mode.value = withSpring(v ? 1 : 0, { + overshootClamping: true, }) }, [mode], diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 80890286bc..862e36625f 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -107,7 +107,9 @@ export const ComposePost = observer(function ComposePost({ text: initText, imageUris: initImageUris, cancelRef, + isModalReady, }: Props & { + isModalReady: boolean cancelRef?: React.RefObject }) { const {currentAccount} = useSession() @@ -155,12 +157,6 @@ export const ComposePost = observer(function ComposePost({ const [labels, setLabels] = useState([]) const [threadgate, setThreadgate] = useState([]) - React.useEffect(() => { - if (!isAndroid) return - const id = setTimeout(() => textInput.current?.focus(), 100) - return () => clearTimeout(id) - }, []) - const gallery = useMemo( () => new GalleryModel(initImageUris), [initImageUris], @@ -181,9 +177,7 @@ export const ComposePost = observer(function ComposePost({ const onPressCancel = useCallback(() => { if (graphemeLength > 0 || !gallery.isEmpty || extGif) { closeAllDialogs() - if (Keyboard) { - Keyboard.dismiss() - } + Keyboard.dismiss() discardPromptControl.open() } else { onClose() @@ -524,7 +518,11 @@ export const ComposePost = observer(function ComposePost({ ref={textInput} richtext={richtext} placeholder={selectTextInputPlaceholder} - autoFocus={!isAndroid} + // fixes autofocus on android + key={ + isAndroid ? (isModalReady ? 'ready' : 'animating') : 'static' + } + autoFocus={isAndroid ? isModalReady : true} setRichText={setRichText} onPhotoPasted={onPhotoPasted} onPressPublish={onPressPublish} diff --git a/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.android.tsx b/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.android.tsx index 414f98a611..814e39fa9e 100644 --- a/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.android.tsx +++ b/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.android.tsx @@ -1,30 +1,36 @@ import React, {useState} from 'react' - import {ActivityIndicator, Dimensions, StyleSheet} from 'react-native' -import {Image} from 'expo-image' +import {Gesture, GestureDetector} from 'react-native-gesture-handler' import Animated, { runOnJS, + useAnimatedReaction, useAnimatedRef, useAnimatedStyle, - useAnimatedReaction, useSharedValue, withDecay, withSpring, } from 'react-native-reanimated' -import {GestureDetector, Gesture} from 'react-native-gesture-handler' +import {Image} from 'expo-image' + +import type {Dimensions as ImageDimensions, ImageSource} from '../../@types' import useImageDimensions from '../../hooks/useImageDimensions' import { - createTransform, - readTransform, applyRounding, + createTransform, prependPan, prependPinch, prependTransform, + readTransform, TransformMatrix, } from '../../transforms' -import type {ImageSource, Dimensions as ImageDimensions} from '../../@types' -const SCREEN = Dimensions.get('window') +const windowDim = Dimensions.get('window') +const screenDim = Dimensions.get('screen') +const statusBarHeight = windowDim.height - screenDim.height +const SCREEN = { + width: windowDim.width, + height: windowDim.height + statusBarHeight, +} const MIN_DOUBLE_TAP_SCALE = 2 const MAX_ORIGINAL_IMAGE_ZOOM = 2 diff --git a/src/view/com/util/MainScrollProvider.tsx b/src/view/com/util/MainScrollProvider.tsx index f45229dc42..b602da4323 100644 --- a/src/view/com/util/MainScrollProvider.tsx +++ b/src/view/com/util/MainScrollProvider.tsx @@ -1,6 +1,10 @@ import React, {useCallback, useEffect} from 'react' import {NativeScrollEvent} from 'react-native' -import {interpolate, useSharedValue} from 'react-native-reanimated' +import { + cancelAnimation, + interpolate, + useSharedValue, +} from 'react-native-reanimated' import EventEmitter from 'eventemitter3' import {ScrollProvider} from '#/lib/ScrollContext' @@ -117,6 +121,8 @@ export function MainScrollProvider({children}: {children: React.ReactNode}) { const newValue = clamp(startMode.value + dProgress, 0, 1) if (newValue !== mode.value) { // Manually adjust the value. This won't be (and shouldn't be) animated. + // Cancel any any existing animation + cancelAnimation(mode) mode.value = newValue } } else { diff --git a/src/view/shell/Composer.tsx b/src/view/shell/Composer.tsx index c80d7845b3..1d656ca8f6 100644 --- a/src/view/shell/Composer.tsx +++ b/src/view/shell/Composer.tsx @@ -1,4 +1,4 @@ -import React, {useLayoutEffect} from 'react' +import React, {useLayoutEffect, useState} from 'react' import {Modal, View} from 'react-native' import {GestureHandlerRootView} from 'react-native-gesture-handler' import {RootSiblingParent} from 'react-native-root-siblings' @@ -24,8 +24,16 @@ export const Composer = observer(function ComposerImpl({}: { const t = useTheme() const state = useComposerState() const ref = useComposerCancelRef() + const [isModalReady, setIsModalReady] = useState(false) const open = !!state + const [prevOpen, setPrevOpen] = useState(open) + if (open !== prevOpen) { + setPrevOpen(open) + if (!open) { + setIsModalReady(false) + } + } return ( setIsModalReady(true)} onRequestClose={() => ref.current?.onPressCancel()}> { closeAllActiveElements() requestSwitchToAccount({requestedAccount: 'none'}) @@ -103,10 +110,20 @@ export function BottomBarWeb() { {({isActive}) => { const Icon = isActive ? MessageFilled : Message return ( - + <> + + {unreadMessageCount.count > 0 && + gate('show_notification_badge_mobile_web') && ( + + + {unreadMessageCount.numUnread} + + + )} + ) }} @@ -114,10 +131,20 @@ export function BottomBarWeb() { {({isActive}) => { const Icon = isActive ? BellFilled : Bell return ( - + <> + + {notificationCountStr !== '' && + gate('show_notification_badge_mobile_web') && ( + + + {notificationCountStr} + + + )} + ) }} diff --git a/yarn.lock b/yarn.lock index 32d748efc0..08830660fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3425,32 +3425,6 @@ xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-plugins@~5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-5.0.4.tgz#216fea6558fe66615af1370de55193f4181cb23e" - integrity sha512-vzUcVpqOMs3h+hyRdhGwk+eGIOhXa5xYdd92yO17RMNHav3v/+ekMbs7XA2c3lepMO8Yd4/5hqmRw9ZTL6jGzg== - dependencies: - "@expo/config-types" "^47.0.0" - "@expo/json-file" "8.2.36" - "@expo/plist" "0.0.18" - "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.3.5" - slash "^3.0.0" - xcode "^3.0.1" - xml2js "0.4.23" - -"@expo/config-types@^47.0.0": - version "47.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-47.0.0.tgz#99eeabe0bba7a776e0f252b78beb0c574692c38d" - integrity sha512-r0pWfuhkv7KIcXMUiNACJmJKKwlTBGMw9VZHNdppS8/0Nve8HZMTkNRFQzTHW1uH3pBj8jEXpyw/2vSWDHex9g== - "@expo/config-types@^50.0.0-alpha.1": version "50.0.0" resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b" @@ -3478,23 +3452,6 @@ slugify "^1.3.4" sucrase "3.34.0" -"@expo/config@~7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-7.0.3.tgz#c9c634e76186de25e296485e51418f1e52966e6e" - integrity sha512-joVtB5o+NF40Tmsdp65UzryRtbnCuMbXkVO4wJnNJO4aaK0EYLdHCYSewORVqNcDfGN0LphQr8VTG2npbd9CJA== - dependencies: - "@babel/code-frame" "~7.10.4" - "@expo/config-plugins" "~5.0.3" - "@expo/config-types" "^47.0.0" - "@expo/json-file" "8.2.36" - getenv "^1.0.0" - glob "7.1.6" - require-from-string "^2.0.2" - resolve-from "^5.0.0" - semver "7.3.2" - slugify "^1.3.4" - sucrase "^3.20.0" - "@expo/config@~8.5.0": version "8.5.0" resolved "https://registry.yarnpkg.com/@expo/config/-/config-8.5.0.tgz#c618e016c3272335e33fec02fb7fd67e4dcc3342" @@ -3641,15 +3598,6 @@ semver "^7.6.0" tempy "0.3.0" -"@expo/json-file@8.2.36": - version "8.2.36" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.36.tgz#62a505cb7f30a34d097386476794680a3f7385ff" - integrity sha512-tOZfTiIFA5KmMpdW9KF7bc6CFiGjb0xnbieJhTGlHrLL+ps2G0OkqmuZ3pFEXBOMnJYUVpnSy++52LFxvpa5ZQ== - dependencies: - "@babel/code-frame" "~7.10.4" - json5 "^1.0.1" - write-file-atomic "^2.3.0" - "@expo/json-file@^8.2.37": version "8.2.37" resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.37.tgz#9c02d3b42134907c69cc0a027b18671b69344049" @@ -3751,15 +3699,6 @@ split "^1.0.1" sudo-prompt "9.1.1" -"@expo/plist@0.0.18": - version "0.0.18" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0" - integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w== - dependencies: - "@xmldom/xmldom" "~0.7.0" - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - "@expo/plist@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.0.tgz#eabc95f951d14e10c87fd0443ee01d567371f058" @@ -8593,7 +8532,7 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== -"@xmldom/xmldom@~0.7.0", "@xmldom/xmldom@~0.7.7": +"@xmldom/xmldom@~0.7.7": version "0.7.13" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== @@ -12085,15 +12024,7 @@ expo-clipboard@^6.0.3: resolved "https://registry.yarnpkg.com/expo-clipboard/-/expo-clipboard-6.0.3.tgz#dfea74d4a004dce59ecefd063d6fb9f1c356a03f" integrity sha512-RIKDsuHkYfaspifbFpVC8sBVFKR05L7Pj7mU2/XkbrW9m01OBNvdpGraXEMsTFCx97xMGsZpEw9pPquL4j4xVg== -expo-constants@^13.0.2: - version "13.2.4" - resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-13.2.4.tgz#eab4a553f074b2c60ad7a158d3b82e3484a94606" - integrity sha512-Zobau8EuTk2GgafwkfGnWM6CmSLB7X8qnQXVuXe0nd3v92hfQUmRWGhJwH88uxXj3LrfqctM6PaJ8taG1vxfBw== - dependencies: - "@expo/config" "~7.0.0" - uuid "^3.3.2" - -expo-constants@~16.0.0: +expo-constants@16.0.1, expo-constants@^13.0.2, expo-constants@~16.0.0: version "16.0.1" resolved "https://registry.yarnpkg.com/expo-constants/-/expo-constants-16.0.1.tgz#1285e29c85513c6e88e118289e2baab72596d3f7" integrity sha512-s6aTHtglp926EsugWtxN7KnpSsE9FCEjb7CgEjQQ78Gpu4btj4wB+IXot2tlqNwqv+x7xFe5veoPGfJDGF/kVg== @@ -12135,14 +12066,7 @@ expo-dev-menu@5.0.14: expo-dev-menu-interface "1.8.3" semver "^7.5.4" -expo-device@~4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-4.1.1.tgz#5de94144113ffb7fa0f37fa3d70e452113954c10" - integrity sha512-It0SGtKcvzQSf+Co6zdPdB63zZvG2/rDolB1lqswMNKj03Y7KVU41s5tcQCqNczj7tmeN3CJy7A8YhYGKdb7gA== - dependencies: - ua-parser-js "^0.7.19" - -expo-device@~6.0.2: +expo-device@6.0.2, expo-device@~4.1.1, expo-device@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/expo-device/-/expo-device-6.0.2.tgz#9bc3eccd16509c2819c225cc2ca8f7c3e3bdd11e" integrity sha512-sCt91CuTmAuMXX4SlFOn4lIos2UIr8vb0jDstDDZXys6kErcj0uynC7bQAMreU5uRUTKMAl4MAMpKt9ufCXPBw== @@ -15567,7 +15491,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^1.0.1, json5@^1.0.2: +json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -21358,11 +21282,6 @@ typescript@^5.3.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -ua-parser-js@^0.7.19: - version "0.7.37" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.37.tgz#e464e66dac2d33a7a1251d7d7a99d6157ec27832" - integrity sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA== - ua-parser-js@^0.7.33: version "0.7.35" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" @@ -21656,11 +21575,6 @@ utrie@^1.0.2: dependencies: base64-arraybuffer "^1.0.2" -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" @@ -22413,14 +22327,6 @@ xml-name-validator@^4.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xml2js@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - xml2js@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282"