Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Replace react-native-paste-input with expo-paste-input (#10158)

Co-authored-by: Eric Bailey <git@esb.lol>

authored by

Arunabh Verma
Eric Bailey
and committed by
GitHub
b196ddef 5a213573

+63 -341
+1 -1
package.json
··· 109 109 "@ipld/dag-cbor": "^9.2.0", 110 110 "@lingui/core": "^5.9.2", 111 111 "@lingui/react": "^5.9.2", 112 - "@mattermost/react-native-paste-input": "mattermost/react-native-paste-input", 113 112 "@miblanchard/react-native-slider": "^2.6.0", 114 113 "@mozzius/expo-dynamic-app-icon": "^1.8.0", 115 114 "@react-native-async-storage/async-storage": "2.2.0", ··· 167 166 "expo-location": "~19.0.8", 168 167 "expo-media-library": "~18.2.1", 169 168 "expo-notifications": "~0.32.16", 169 + "expo-paste-input": "^0.1.10", 170 170 "expo-privacy-sensitive": "^0.1.0", 171 171 "expo-screen-orientation": "~9.0.8", 172 172 "expo-sharing": "~14.0.8",
-13
patches/@mattermost+react-native-paste-input+0.8.1.patch
··· 1 - diff --git a/node_modules/@mattermost/react-native-paste-input/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt b/node_modules/@mattermost/react-native-paste-input/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt 2 - index 4ed2307..ede1181 100644 3 - --- a/node_modules/@mattermost/react-native-paste-input/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt 4 - +++ b/node_modules/@mattermost/react-native-paste-input/android/src/main/java/com/mattermost/pasteinputtext/PasteTextInputManager.kt 5 - @@ -54,7 +54,7 @@ class PasteTextInputManager(context: ReactApplicationContext) : ReactTextInputMa 6 - } 7 - 8 - override fun getExportedCustomBubblingEventTypeConstants(): MutableMap<String, Any> { 9 - - val map = super.getExportedCustomBubblingEventTypeConstants()!! 10 - + val map = super.getExportedCustomBubblingEventTypeConstants().toMutableMap() 11 - map["onPaste"] = MapBuilder.of( 12 - "phasedRegistrationNames", 13 - MapBuilder.of("bubbled", "onPaste")
-264
patches/@mattermost+react-native-paste-input+0.8.1.patch.disabled
··· 1 - diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 2 - index e916023..5049c33 100644 3 - --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 4 - +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteInputView.m 5 - @@ -4,6 +4,7 @@ 6 - // 7 - // Created by Elias Nahum on 04-11-20. 8 - // Copyright © 2020 Facebook. All rights reserved. 9 - +// Updated to remove parent’s default text view 10 - // 11 - 12 - #import "PasteInputView.h" 13 - @@ -12,49 +13,78 @@ 14 - 15 - @implementation PasteInputView 16 - { 17 - - PasteInputTextView *_backedTextInputView; 18 - + // We'll store the custom text view in this ivar 19 - + PasteInputTextView *_customBackedTextView; 20 - } 21 - 22 - - (instancetype)initWithBridge:(RCTBridge *)bridge 23 - { 24 - + // Must call the super’s designated initializer 25 - if (self = [super initWithBridge:bridge]) { 26 - - _backedTextInputView = [[PasteInputTextView alloc] initWithFrame:self.bounds]; 27 - - _backedTextInputView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 28 - - _backedTextInputView.textInputDelegate = self; 29 - + // 1. The parent (RCTMultilineTextInputView) has already created 30 - + // its own _backedTextInputView = [RCTUITextView new] in super init. 31 - + // We can remove that subview: 32 - 33 - - [self addSubview:_backedTextInputView]; 34 - - } 35 - + id<RCTBackedTextInputViewProtocol> parentInputView = super.backedTextInputView; 36 - + if ([parentInputView isKindOfClass:[UIView class]]) { 37 - + UIView *parentSubview = (UIView *)parentInputView; 38 - + if (parentSubview.superview == self) { 39 - + [parentSubview removeFromSuperview]; 40 - + } 41 - + } 42 - 43 - + // 2. Now create our custom PasteInputTextView 44 - + _customBackedTextView = [[PasteInputTextView alloc] initWithFrame:self.bounds]; 45 - + _customBackedTextView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 46 - + _customBackedTextView.textInputDelegate = self; 47 - + 48 - + // Optional: disable inline predictions for iOS 17+ 49 - + if (@available(iOS 17.0, *)) { 50 - + _customBackedTextView.inlinePredictionType = UITextInlinePredictionTypeNo; 51 - + } 52 - + 53 - + // 3. Add your custom text view as the only subview 54 - + [self addSubview:_customBackedTextView]; 55 - + } 56 - return self; 57 - } 58 - 59 - +/** 60 - + * Override the parent's accessor so that anywhere in RN that calls 61 - + * `self.backedTextInputView` will get the custom PasteInputTextView. 62 - + */ 63 - - (id<RCTBackedTextInputViewProtocol>)backedTextInputView 64 - { 65 - - return _backedTextInputView; 66 - + return _customBackedTextView; 67 - } 68 - 69 - -- (void)setDisableCopyPaste:(BOOL)disableCopyPaste { 70 - - _backedTextInputView.disableCopyPaste = disableCopyPaste; 71 - +#pragma mark - Setters for React Props 72 - + 73 - +- (void)setDisableCopyPaste:(BOOL)disableCopyPaste 74 - +{ 75 - + _customBackedTextView.disableCopyPaste = disableCopyPaste; 76 - } 77 - 78 - -- (void)setOnPaste:(RCTDirectEventBlock)onPaste { 79 - - _backedTextInputView.onPaste = onPaste; 80 - +- (void)setOnPaste:(RCTDirectEventBlock)onPaste 81 - +{ 82 - + _customBackedTextView.onPaste = onPaste; 83 - } 84 - 85 - -- (void)setSmartPunctuation:(NSString *)smartPunctuation { 86 - - if ([smartPunctuation isEqualToString:@"enable"]) { 87 - - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeYes]; 88 - - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeYes]; 89 - - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeYes]; 90 - - } else if ([smartPunctuation isEqualToString:@"disable"]) { 91 - - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeNo]; 92 - - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeNo]; 93 - - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeNo]; 94 - - } else { 95 - - [_backedTextInputView setSmartDashesType:UITextSmartDashesTypeDefault]; 96 - - [_backedTextInputView setSmartQuotesType:UITextSmartQuotesTypeDefault]; 97 - - [_backedTextInputView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeDefault]; 98 - - } 99 - +- (void)setSmartPunctuation:(NSString *)smartPunctuation 100 - +{ 101 - + if ([smartPunctuation isEqualToString:@"enable"]) { 102 - + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeYes]; 103 - + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeYes]; 104 - + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeYes]; 105 - + } else if ([smartPunctuation isEqualToString:@"disable"]) { 106 - + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeNo]; 107 - + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeNo]; 108 - + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeNo]; 109 - + } else { 110 - + [_customBackedTextView setSmartDashesType:UITextSmartDashesTypeDefault]; 111 - + [_customBackedTextView setSmartQuotesType:UITextSmartQuotesTypeDefault]; 112 - + [_customBackedTextView setSmartInsertDeleteType:UITextSmartInsertDeleteTypeDefault]; 113 - + } 114 - } 115 - 116 - #pragma mark - UIScrollViewDelegate 117 - @@ -62,7 +92,6 @@ - (void)setSmartPunctuation:(NSString *)smartPunctuation { 118 - - (void)scrollViewDidScroll:(UIScrollView *)scrollView 119 - { 120 - RCTDirectEventBlock onScroll = self.onScroll; 121 - - 122 - if (onScroll) { 123 - CGPoint contentOffset = scrollView.contentOffset; 124 - CGSize contentSize = scrollView.contentSize; 125 - @@ -71,22 +100,22 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView 126 - 127 - onScroll(@{ 128 - @"contentOffset": @{ 129 - - @"x": @(contentOffset.x), 130 - - @"y": @(contentOffset.y) 131 - + @"x": @(contentOffset.x), 132 - + @"y": @(contentOffset.y) 133 - }, 134 - @"contentInset": @{ 135 - - @"top": @(contentInset.top), 136 - - @"left": @(contentInset.left), 137 - - @"bottom": @(contentInset.bottom), 138 - - @"right": @(contentInset.right) 139 - + @"top": @(contentInset.top), 140 - + @"left": @(contentInset.left), 141 - + @"bottom": @(contentInset.bottom), 142 - + @"right": @(contentInset.right) 143 - }, 144 - @"contentSize": @{ 145 - - @"width": @(contentSize.width), 146 - - @"height": @(contentSize.height) 147 - + @"width": @(contentSize.width), 148 - + @"height": @(contentSize.height) 149 - }, 150 - @"layoutMeasurement": @{ 151 - - @"width": @(size.width), 152 - - @"height": @(size.height) 153 - + @"width": @(size.width), 154 - + @"height": @(size.height) 155 - }, 156 - @"zoomScale": @(scrollView.zoomScale ?: 1), 157 - }); 158 - diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm 159 - index dd50053..2ed7017 100644 160 - --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm 161 - +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInput.mm 162 - @@ -122,8 +122,8 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & 163 - const auto &newTextInputProps = static_cast<const PasteTextInputProps &>(*props); 164 - 165 - // Traits: 166 - - if (newTextInputProps.traits.multiline != oldTextInputProps.traits.multiline) { 167 - - [self _setMultiline:newTextInputProps.traits.multiline]; 168 - + if (newTextInputProps.multiline != oldTextInputProps.multiline) { 169 - + [self _setMultiline:newTextInputProps.multiline]; 170 - } 171 - 172 - if (newTextInputProps.traits.autocapitalizationType != oldTextInputProps.traits.autocapitalizationType) { 173 - @@ -421,7 +421,7 @@ - (void)textInputDidChangeSelection 174 - return; 175 - } 176 - const auto &props = static_cast<const PasteTextInputProps &>(*_props); 177 - - if (props.traits.multiline && ![_lastStringStateWasUpdatedWith isEqual:_backedTextInputView.attributedText]) { 178 - + if (props.multiline && ![_lastStringStateWasUpdatedWith isEqual:_backedTextInputView.attributedText]) { 179 - [self textInputDidChange]; 180 - _ignoreNextTextInputCall = YES; 181 - } 182 - @@ -708,11 +708,11 @@ - (BOOL)_textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldTe 183 - - (SubmitBehavior)getSubmitBehavior 184 - { 185 - const auto &props = static_cast<const PasteTextInputProps &>(*_props); 186 - - const SubmitBehavior submitBehaviorDefaultable = props.traits.submitBehavior; 187 - + const SubmitBehavior submitBehaviorDefaultable = props.submitBehavior; 188 - 189 - // We should always have a non-default `submitBehavior`, but in case we don't, set it based on multiline. 190 - if (submitBehaviorDefaultable == SubmitBehavior::Default) { 191 - - return props.traits.multiline ? SubmitBehavior::Newline : SubmitBehavior::BlurAndSubmit; 192 - + return props.multiline ? SubmitBehavior::Newline : SubmitBehavior::BlurAndSubmit; 193 - } 194 - 195 - return submitBehaviorDefaultable; 196 - diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp 197 - index 29e094f..7ef519a 100644 198 - --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp 199 - +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.cpp 200 - @@ -22,8 +22,7 @@ PasteTextInputProps::PasteTextInputProps( 201 - const PropsParserContext &context, 202 - const PasteTextInputProps &sourceProps, 203 - const RawProps& rawProps) 204 - - : ViewProps(context, sourceProps, rawProps), 205 - - BaseTextProps(context, sourceProps, rawProps), 206 - + : BaseTextInputProps(context, sourceProps, rawProps), 207 - traits(convertRawProp(context, rawProps, sourceProps.traits, {})), 208 - smartPunctuation(convertRawProp(context, rawProps, "smartPunctuation", sourceProps.smartPunctuation, {})), 209 - disableCopyPaste(convertRawProp(context, rawProps, "disableCopyPaste", sourceProps.disableCopyPaste, {false})), 210 - @@ -133,7 +132,7 @@ TextAttributes PasteTextInputProps::getEffectiveTextAttributes(Float fontSizeMul 211 - ParagraphAttributes PasteTextInputProps::getEffectiveParagraphAttributes() const { 212 - auto result = paragraphAttributes; 213 - 214 - - if (!traits.multiline) { 215 - + if (!multiline) { 216 - result.maximumNumberOfLines = 1; 217 - } 218 - 219 - diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h 220 - index 723d00c..31cfe66 100644 221 - --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h 222 - +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/Props.h 223 - @@ -15,6 +15,7 @@ 224 - #include <react/renderer/components/iostextinput/conversions.h> 225 - #include <react/renderer/components/iostextinput/primitives.h> 226 - #include <react/renderer/components/text/BaseTextProps.h> 227 - +#include <react/renderer/components/textinput/BaseTextInputProps.h> 228 - #include <react/renderer/components/view/ViewProps.h> 229 - #include <react/renderer/core/Props.h> 230 - #include <react/renderer/core/PropsParserContext.h> 231 - @@ -25,7 +26,7 @@ 232 - 233 - namespace facebook::react { 234 - 235 - -class PasteTextInputProps final : public ViewProps, public BaseTextProps { 236 - +class PasteTextInputProps final : public BaseTextInputProps { 237 - public: 238 - PasteTextInputProps() = default; 239 - PasteTextInputProps(const PropsParserContext& context, const PasteTextInputProps& sourceProps, const RawProps& rawProps); 240 - diff --git a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp 241 - index 31e07e3..7f0ebfb 100644 242 - --- a/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp 243 - +++ b/node_modules/@mattermost/react-native-paste-input/ios/PasteTextInputSpecs/ShadowNodes.cpp 244 - @@ -91,20 +91,11 @@ void PasteTextInputShadowNode::updateStateIfNeeded( 245 - const auto& state = getStateData(); 246 - 247 - react_native_assert(textLayoutManager_); 248 - - react_native_assert( 249 - - (!state.layoutManager || state.layoutManager == textLayoutManager_) && 250 - - "`StateData` refers to a different `TextLayoutManager`"); 251 - - 252 - - if (state.reactTreeAttributedString == reactTreeAttributedString && 253 - - state.layoutManager == textLayoutManager_) { 254 - - return; 255 - - } 256 - 257 - auto newState = TextInputState{}; 258 - newState.attributedStringBox = AttributedStringBox{reactTreeAttributedString}; 259 - newState.paragraphAttributes = getConcreteProps().paragraphAttributes; 260 - newState.reactTreeAttributedString = reactTreeAttributedString; 261 - - newState.layoutManager = textLayoutManager_; 262 - newState.mostRecentEventCount = getConcreteProps().mostRecentEventCount; 263 - setStateData(std::move(newState)); 264 - }
+52 -52
src/view/com/composer/text-input/TextInput.tsx
··· 8 8 import { 9 9 type NativeSyntheticEvent, 10 10 Text as RNText, 11 + TextInput as RNTextInput, 11 12 type TextInputSelectionChangeEventData, 12 13 View, 13 14 } from 'react-native' 15 + import {type PasteEventPayload, TextInputWrapper} from 'expo-paste-input' 14 16 import {AppBskyRichtextFacet, RichText} from '@atproto/api' 15 - import PasteInput, { 16 - type PastedFile, 17 - type PasteInputRef, 18 - // @ts-expect-error no types when installing from github 19 - // eslint-disable-next-line import-x/no-unresolved 20 - } from '@mattermost/react-native-paste-input' 17 + import {useLingui} from '@lingui/react/macro' 21 18 22 19 import {POST_IMG_MAX} from '#/lib/constants' 23 20 import {downloadAndResize} from '#/lib/media/manip' 24 21 import {isUriImage} from '#/lib/media/util' 25 - import {cleanError} from '#/lib/strings/errors' 26 22 import {getMentionAt, insertMentionAt} from '#/lib/strings/mention-manip' 27 23 import {useTheme} from '#/lib/ThemeContext' 28 24 import { ··· 51 47 onError, 52 48 ...props 53 49 }: TextInputProps) { 50 + const {t: l} = useLingui() 54 51 const {theme: t, fonts} = useAlf() 55 - const textInput = useRef<PasteInputRef>(null) 52 + const textInput = useRef<RNTextInput>(null) 56 53 const textInputSelection = useRef<Selection>({start: 0, end: 0}) 57 54 const theme = useTheme() 58 55 const [autocompletePrefix, setAutocompletePrefix] = useState('') ··· 129 126 ) 130 127 131 128 const onPaste = useCallback( 132 - async (err: string | undefined, files: PastedFile[]) => { 133 - if (err) { 134 - return onError(cleanError(err)) 129 + (payload: PasteEventPayload) => { 130 + if (payload.type === 'unsupported') { 131 + onError(l`Unsupported clipboard content`) 132 + return 135 133 } 136 134 137 - const uris = files.map(f => f.uri) 138 - const uri = uris.find(isUriImage) 139 - 140 - if (uri) { 141 - onPhotoPasted(uri) 135 + if (payload.type === 'images') { 136 + for (const uri of payload.uris) { 137 + if (isUriImage(uri)) { 138 + onPhotoPasted(uri) 139 + } 140 + } 142 141 } 143 142 }, 144 - [onError, onPhotoPasted], 143 + [l, onError, onPhotoPasted], 145 144 ) 146 145 147 146 const onSelectionChange = useCallback( ··· 217 216 218 217 return ( 219 218 <View style={[a.flex_1, a.pl_md, hasRightPadding && a.pr_4xl]}> 220 - <PasteInput 221 - testID="composerTextInput" 222 - ref={textInput} 223 - onChangeText={onChangeText} 224 - onPaste={onPaste} 225 - onSelectionChange={onSelectionChange} 226 - placeholder={placeholder} 227 - placeholderTextColor={t.atoms.text_contrast_low.color} 228 - keyboardAppearance={theme.colorScheme} 229 - autoFocus={props.autoFocus !== undefined ? props.autoFocus : true} 230 - allowFontScaling 231 - multiline 232 - scrollEnabled={false} 233 - numberOfLines={2} 234 - // Note: should be the default value, but as of v1.104 235 - // it switched to "none" on Android 236 - autoCapitalize="sentences" 237 - {...props} 238 - style={[ 239 - inputTextStyle, 240 - a.w_full, 241 - !autocompletePrefix && a.h_full, 242 - { 243 - textAlignVertical: 'top', 244 - minHeight: 60, 245 - includeFontPadding: false, 246 - }, 247 - { 248 - borderWidth: 1, 249 - borderColor: 'transparent', 250 - }, 251 - props.style, 252 - ]}> 253 - {textDecorated} 254 - </PasteInput> 219 + <TextInputWrapper onPaste={onPaste}> 220 + <RNTextInput 221 + testID="composerTextInput" 222 + ref={textInput} 223 + onChangeText={onChangeText} 224 + onSelectionChange={onSelectionChange} 225 + placeholder={placeholder} 226 + placeholderTextColor={t.atoms.text_contrast_low.color} 227 + keyboardAppearance={theme.colorScheme} 228 + autoFocus={props.autoFocus !== undefined ? props.autoFocus : true} 229 + allowFontScaling 230 + multiline 231 + scrollEnabled={false} 232 + numberOfLines={2} 233 + // Note: should be the default value, but as of v1.104 234 + // it switched to "none" on Android 235 + autoCapitalize="sentences" 236 + {...props} 237 + style={[ 238 + inputTextStyle, 239 + a.w_full, 240 + !autocompletePrefix && a.h_full, 241 + { 242 + textAlignVertical: 'top', 243 + minHeight: 60, 244 + includeFontPadding: false, 245 + }, 246 + { 247 + borderWidth: 1, 248 + borderColor: 'transparent', 249 + }, 250 + props.style, 251 + ]}> 252 + {textDecorated} 253 + </RNTextInput> 254 + </TextInputWrapper> 255 255 <Autocomplete 256 256 prefix={autocompletePrefix} 257 257 onSelect={onSelectAutocompleteItem}
+10 -11
yarn.lock
··· 3894 3894 "@babel/runtime" "^7.20.13" 3895 3895 "@lingui/core" "5.9.2" 3896 3896 3897 - "@mattermost/react-native-paste-input@mattermost/react-native-paste-input": 3898 - version "0.8.1" 3899 - resolved "https://codeload.github.com/mattermost/react-native-paste-input/tar.gz/f260447edc645a817ab1ba7b46d8341d84dba8e9" 3900 - dependencies: 3901 - semver "7.6.3" 3902 - 3903 3897 "@messageformat/parser@^5.0.0": 3904 3898 version "5.1.0" 3905 3899 resolved "https://registry.yarnpkg.com/@messageformat/parser/-/parser-5.1.0.tgz#05e4851c782d633ad735791dd0a68ee65d2a7201" ··· 9085 9079 badgin "^1.1.5" 9086 9080 expo-application "~7.0.8" 9087 9081 expo-constants "~18.0.13" 9082 + 9083 + expo-paste-input@^0.1.10: 9084 + version "0.1.10" 9085 + resolved "https://registry.yarnpkg.com/expo-paste-input/-/expo-paste-input-0.1.10.tgz#7df0a07ae6ecd381004624dbe88762997d962780" 9086 + integrity sha512-TkAauK1eIq7+vk2SA39trmDO6dLfFLQL+09KIVZh//3XWs8gHC5ezH3vjfjr7xj9xi67amyeiDCErP5caTDIKg== 9088 9087 9089 9088 expo-privacy-sensitive@^0.1.0: 9090 9089 version "0.1.0" ··· 14648 14647 dependencies: 14649 14648 node-forge "^1" 14650 14649 14651 - semver@7.6.3, semver@^7.1.3: 14652 - version "7.6.3" 14653 - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 14654 - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 14655 - 14656 14650 semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: 14657 14651 version "6.3.1" 14658 14652 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 14659 14653 integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 14654 + 14655 + semver@^7.1.3: 14656 + version "7.6.3" 14657 + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 14658 + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 14660 14659 14661 14660 semver@^7.3.5, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@~7.5.4: 14662 14661 version "7.5.4"