diff --git a/README.md b/README.md index 8d1d6d264..2f4f2fbd2 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,30 @@ There are 2 reasons why we do this: ### Requirement - Install [yarn](https://yarnpkg.com/) - Setup [react native development environment](https://reactnative.dev/docs/environment-setup) use React Native CLI. +- [CMake] is required on the build host for web runner. + + - When building for **Android**, [CMake] should be installed as a part of your + _Android SDK_ (open _SDK Manager_, and look for [CMake] within + the _SDK Tools_ tab). + + - On **MacOS**, the `pkg-config` dependency is also needed. You can install both via [Homebrew], + by executing: + ```shell + $ brew install cmake pkg-config + ``` + **IMPORTANT:** [Homebrew] should have added `eval "$(/opt/homebrew/bin/brew shellenv)"'` + command to your `.zshrc` or `.bashrc`. Although this works for interactive terminals, + it might not work for sessions inside of other apps, such as XCode, therefore you might need to + manually create symbolic links: + + ```shell + $ sudo ln -s $(which cmake) /usr/local/bin/cmake + $ sudo ln -s $(which pkg-config) /usr/local/bin/pkg-config + ``` + + For details read: https://earthly.dev/blog/homebrew-on-m1, + and [Issue#29](https://github.com/birdofpreyru/react-native-static-server/issues/29). + ### Start development - From package folder run `yarn start` to make sure we installed all required packages diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9681c38b3..a6d2c98f0 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -74,26 +74,26 @@ PODS: - FlipperKit/Core - FlipperKit/FlipperKitNetworkPlugin - fmt (6.2.1) - - GCDWebServer (3.5.4): - - GCDWebServer/Core (= 3.5.4) - - GCDWebServer/Core (3.5.4) - glog (0.3.5) - hermes-engine (0.71.12): - hermes-engine/Pre-built (= 0.71.12) - hermes-engine/Pre-built (0.71.12) - libevent (2.1.12) - - libwebp (1.2.4): - - libwebp/demux (= 1.2.4) - - libwebp/mux (= 1.2.4) - - libwebp/webp (= 1.2.4) - - libwebp/demux (1.2.4): + - libwebp (1.3.1): + - libwebp/demux (= 1.3.1) + - libwebp/mux (= 1.3.1) + - libwebp/sharpyuv (= 1.3.1) + - libwebp/webp (= 1.3.1) + - libwebp/demux (1.3.1): - libwebp/webp - - libwebp/mux (1.2.4): + - libwebp/mux (1.3.1): - libwebp/demux - - libwebp/webp (1.2.4) - - MMKV (1.3.0): - - MMKVCore (~> 1.3.0) - - MMKVCore (1.3.0) + - libwebp/sharpyuv (1.3.1) + - libwebp/webp (1.3.1): + - libwebp/sharpyuv + - MMKV (1.3.1): + - MMKVCore (~> 1.3.1) + - MMKVCore (1.3.1) - OpenSSL-Universal (1.1.1100) - RCT-Folly (2021.07.22.00): - boost @@ -381,9 +381,6 @@ PODS: - React-Core - react-native-splash-screen (3.3.0): - React-Core - - react-native-static-server (0.5.0): - - GCDWebServer (~> 3.0) - - React - react-native-version-number (0.3.6): - React - react-native-video (5.2.1): @@ -497,8 +494,6 @@ PODS: - React-Core - SDWebImage (~> 5.11.1) - SDWebImageWebPCoder (~> 0.8.4) - - RNFS (2.20.0): - - React-Core - RNGestureHandler (2.12.0): - React-Core - RNInAppBrowser (3.7.0): @@ -618,7 +613,6 @@ DEPENDENCIES: - react-native-sensitive-info (from `../node_modules/react-native-sensitive-info`) - "react-native-slider (from `../node_modules/@react-native-community/slider`)" - react-native-splash-screen (from `../node_modules/react-native-splash-screen`) - - react-native-static-server (from `../node_modules/react-native-static-server`) - react-native-version-number (from `../node_modules/react-native-version-number`) - react-native-video (from `../node_modules/react-native-video`) - react-native-view-shot (from `../node_modules/react-native-view-shot`) @@ -644,7 +638,6 @@ DEPENDENCIES: - "RNCPicker (from `../node_modules/@react-native-picker/picker`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) - RNFastImage (from `../node_modules/react-native-fast-image`) - - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNInAppBrowser (from `../node_modules/react-native-inappbrowser-reborn`) - RNKeychain (from `../node_modules/react-native-keychain`) @@ -669,7 +662,6 @@ SPEC REPOS: - Flipper-RSocket - FlipperKit - fmt - - GCDWebServer - libevent - libwebp - MMKV @@ -750,8 +742,6 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/slider" react-native-splash-screen: :path: "../node_modules/react-native-splash-screen" - react-native-static-server: - :path: "../node_modules/react-native-static-server" react-native-version-number: :path: "../node_modules/react-native-version-number" react-native-video: @@ -802,8 +792,6 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-device-info" RNFastImage: :path: "../node_modules/react-native-fast-image" - RNFS: - :path: "../node_modules/react-native-fs" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNInAppBrowser: @@ -842,13 +830,12 @@ SPEC CHECKSUMS: Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 FlipperKit: cbdee19bdd4e7f05472a66ce290f1b729ba3cb86 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b hermes-engine: b60ebc812e0179a612d8146ac54730d533c804a2 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 - libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef - MMKV: 9c6c3fa4ddd849f28c7b9a5c9d23aab84f14ee35 - MMKVCore: 9bb7440b170181ac5b81f542ac258103542e693d + libwebp: 33dc822fbbf4503668d09f7885bbfedc76c45e96 + MMKV: 5a07930c70c70b86cd87761a42c8f3836fb681d7 + MMKVCore: e50135dbd33235b6ab390635991bab437ab873c0 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 RCTRequired: 4db5e3e18b906377a502da5b358ff159ba4783ed @@ -877,7 +864,6 @@ SPEC CHECKSUMS: react-native-sensitive-info: d44e909d065f9c0e15734245e5dd6a24b82e3dcd react-native-slider: 33b8d190b59d4f67a541061bb91775d53d617d9d react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457 - react-native-static-server: 201b2a945a35096be3ae7f43e367c65bcbd61343 react-native-version-number: b415bbec6a13f2df62bf978e85bc0d699462f37f react-native-video: c26780b224543c62d5e1b2a7244a5cd1b50e8253 react-native-view-shot: f5507655f122e6b104888a11130f267a427f0d57 @@ -903,7 +889,6 @@ SPEC CHECKSUMS: RNCPicker: 0bc2f0a29abcca7b7ed44a2d036aac9ab6d25700 RNDeviceInfo: 5795b418ed3451ebcaf39384e6cf51f60cb931c9 RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8 - RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 RNGestureHandler: dec4645026e7401a0899f2846d864403478ff6a5 RNInAppBrowser: e36d6935517101ccba0e875bac8ad7b0cb655364 RNKeychain: a65256b6ca6ba6976132cc4124b238a5b13b3d9c diff --git a/package.json b/package.json index e106a4288..e52914516 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ }, "dependencies": { "@coinbase/cbpay-js": "^1.7.0", + "@dr.pogodin/react-native-fs": ">=2.21.0-alpha.1", + "@dr.pogodin/react-native-static-server": "0.8.3", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/free-brands-svg-icons": "^6.2.1", "@fortawesome/free-regular-svg-icons": "^6.2.1", @@ -87,7 +89,6 @@ "react-native-elements": "^3.4.3", "react-native-error-boundary": "^1.2.3", "react-native-fast-image": "^8.6.3", - "react-native-fs": "^2.20.0", "react-native-gesture-handler": "^2.9.0", "react-native-image-picker": "^5.0.1", "react-native-inappbrowser-reborn": "^3.7.0", @@ -109,7 +110,6 @@ "react-native-sensitive-info": "^6.0.0-alpha.9", "react-native-skeleton-placeholder": "^5.2.4", "react-native-splash-screen": "^3.3.0", - "react-native-static-server": "^0.5.0", "react-native-status-bar-height": "^2.6.0", "react-native-svg": "^13.6.0", "react-native-svg-transformer": "^1.0.0", diff --git a/patches/react-native-static-server+0.5.0.patch b/patches/react-native-static-server+0.5.0.patch deleted file mode 100644 index 4bf4aeac7..000000000 --- a/patches/react-native-static-server+0.5.0.patch +++ /dev/null @@ -1,210 +0,0 @@ -diff --git a/node_modules/react-native-static-server/android/build.gradle b/node_modules/react-native-static-server/android/build.gradle -index 0c7bca6..8265099 100644 ---- a/node_modules/react-native-static-server/android/build.gradle -+++ b/node_modules/react-native-static-server/android/build.gradle -@@ -1,62 +1,51 @@ --// android/build.gradle -- --// based on: --// --// * https://github.com/facebook/react-native/blob/0.60-stable/template/android/build.gradle --// original location: --// - https://github.com/facebook/react-native/blob/0.58-stable/local-cli/templates/HelloWorld/android/build.gradle --// --// * https://github.com/facebook/react-native/blob/0.60-stable/template/android/app/build.gradle --// original location: --// - https://github.com/facebook/react-native/blob/0.58-stable/local-cli/templates/HelloWorld/android/app/build.gradle -- --def DEFAULT_COMPILE_SDK_VERSION = 28 --def DEFAULT_BUILD_TOOLS_VERSION = '28.0.3' --def DEFAULT_MIN_SDK_VERSION = 16 --def DEFAULT_TARGET_SDK_VERSION = 28 -- --def safeExtGet(prop, fallback) { -- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback --} -- --apply plugin: 'com.android.library' --apply plugin: 'maven' -+import org.apache.tools.ant.taskdefs.condition.Os - - buildscript { -- // The Android Gradle plugin is only required when opening the android folder stand-alone. -- // This avoids unnecessary downloads and potential conflicts when the library is included as a -- // module dependency in an application project. -- // ref: https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:build_script_external_dependencies - if (project == rootProject) { - repositories { - google() -- jcenter() -+ mavenCentral() - } - dependencies { -- classpath 'com.android.tools.build:gradle:3.4.1' -+ classpath 'com.android.tools.build:gradle:7.0.4' - } - } - } - - apply plugin: 'com.android.library' --apply plugin: 'maven' -+ -+def safeExtGet(prop, fallback) { -+ rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback -+} - - android { -- compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION) -- buildToolsVersion safeExtGet('buildToolsVersion', DEFAULT_BUILD_TOOLS_VERSION) -+ compileSdkVersion safeExtGet('compileSdkVersion', 31) -+ buildToolsVersion safeExtGet('buildToolsVersion', '31.0.0') - defaultConfig { -- minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION) -- targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION) -- versionCode 1 -- versionName "1.0" -+ minSdkVersion safeExtGet('minSdkVersion', 23) -+ if (System.properties['os.arch'] == "aarch64") { -+ // For M1 Users we need to use the NDK 24 which added support for aarch64 -+ ndkVersion safeExtGet('ndkVersion', '24.0.8215888') -+ } else { -+ // Otherwise we default to the side-by-side NDK version from AGP. -+ ndkVersion safeExtGet('ndkVersion', '21.4.7075529') -+ } -+ targetSdkVersion safeExtGet('targetSdkVersion', 31) -+ versionCode 3 -+ versionName "0.5.5" -+ } -+ buildTypes { -+ release { -+ minifyEnabled true -+ } - } - lintOptions { -- abortOnError false -+ disable 'GradleCompatible' - } - } - - repositories { -- // ref: https://www.baeldung.com/maven-local-repository -+ mavenCentral() - mavenLocal() - maven { - // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm -@@ -67,85 +56,10 @@ repositories { - url "$rootDir/../node_modules/jsc-android/dist" - } - google() -- jcenter() - } - - dependencies { -- //noinspection GradleDynamicVersion - implementation 'com.facebook.react:react-native:+' // From node_modules - implementation 'org.nanohttpd:nanohttpd:2.3.1' - implementation 'org.nanohttpd:nanohttpd-webserver:2.3.1' - } -\ No newline at end of file -- --def configureReactNativePom(def pom) { -- def packageJson = new groovy.json.JsonSlurper().parseText(file('../package.json').text) -- -- pom.project { -- name packageJson.title -- artifactId packageJson.name -- version = packageJson.version -- group = "com.futurepress.staticserver" -- description packageJson.description -- url packageJson.repository.baseUrl -- -- licenses { -- license { -- name packageJson.license -- url packageJson.repository.baseUrl + '/blob/master/' + packageJson.licenseFilename -- distribution 'repo' -- } -- } -- -- developers { -- developer { -- id packageJson.author.username -- name packageJson.author.name -- } -- } -- } --} -- --afterEvaluate { project -> -- // some Gradle build hooks ref: -- // https://www.oreilly.com/library/view/gradle-beyond-the/9781449373801/ch03.html -- task androidJavadoc(type: Javadoc) { -- source = android.sourceSets.main.java.srcDirs -- classpath += files(android.bootClasspath) -- classpath += files(project.getConfigurations().getByName('compile').asList()) -- include '**/*.java' -- } -- -- task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) { -- classifier = 'javadoc' -- from androidJavadoc.destinationDir -- } -- -- task androidSourcesJar(type: Jar) { -- classifier = 'sources' -- from android.sourceSets.main.java.srcDirs -- include '**/*.java' -- } -- -- android.libraryVariants.all { variant -> -- def name = variant.name.capitalize() -- def javaCompileTask = variant.javaCompileProvider.get() -- -- task "jar${name}"(type: Jar, dependsOn: javaCompileTask) { -- from javaCompileTask.destinationDir -- } -- } -- -- artifacts { -- archives androidSourcesJar -- archives androidJavadocJar -- } -- -- task installArchives(type: Upload) { -- configuration = configurations.archives -- repositories.mavenDeployer { -- // Deploy to react-native-event-bridge/maven, ready to publish to npm -- repository url: "file://${projectDir}/../android/maven" -- configureReactNativePom pom -- } -- } --} -diff --git a/node_modules/react-native-static-server/index.d.ts b/node_modules/react-native-static-server/index.d.ts -new file mode 100644 -index 0000000..0df153a ---- /dev/null -+++ b/node_modules/react-native-static-server/index.d.ts -@@ -0,0 +1,22 @@ -+declare module 'react-native-static-server' { -+ type Options = { -+ localOnly?: boolean; -+ keepAlive?: boolean; -+ }; -+ -+ export default class StaticServer { -+ constructor(port: number, root?: string, opts?: Options); -+ -+ port: number; -+ root: string; -+ localOnly: boolean; -+ keepAlive: boolean; -+ started: boolean; -+ _origin?: string; -+ -+ start: () => Promise; -+ stop: () => Promise; -+ isRunning: () => Promise; -+ kill: () => void; -+ } -+} -\ No newline at end of file diff --git a/react-native.config.js b/react-native.config.js new file mode 100644 index 000000000..27869f825 --- /dev/null +++ b/react-native.config.js @@ -0,0 +1,9 @@ +module.exports = { + dependencies: { + '@dr.pogodin/react-native-static-server': { + platforms: { + android: null, + }, + }, + }, +}; diff --git a/src/components/common/ReactNativeStaticServer/index.ts b/src/components/common/ReactNativeStaticServer/index.ts new file mode 100644 index 000000000..c6048ab82 --- /dev/null +++ b/src/components/common/ReactNativeStaticServer/index.ts @@ -0,0 +1,12 @@ +import { Platform } from 'react-native'; + +let StaticServer = null; +let STATES = null; + +if (Platform.OS === 'ios') { + const module = require('@dr.pogodin/react-native-static-server'); + StaticServer = module.default; + STATES = module.STATES; +} + +export { StaticServer, STATES }; diff --git a/src/providers/WebRunnerProvider/WebRunner.tsx b/src/providers/WebRunnerProvider/WebRunner.tsx index 69746db53..8ac9eb0a7 100644 --- a/src/providers/WebRunnerProvider/WebRunner.tsx +++ b/src/providers/WebRunnerProvider/WebRunner.tsx @@ -5,10 +5,11 @@ import React, { useReducer } from 'react'; import WebView from 'react-native-webview'; import { WebViewMessage } from 'react-native-webview/lib/WebViewTypes'; import { WebRunnerState, WebRunnerStatus } from 'providers/contexts'; -import StaticServer from 'react-native-static-server'; import { listenMessage, restartAllHandlers } from 'messaging/index'; +// @ts-ignore +import { StaticServer, STATES } from 'components/common/ReactNativeStaticServer'; import { Message } from '@subwallet/extension-base/types'; -import RNFS from 'react-native-fs'; +import { MainBundlePath } from '@dr.pogodin/react-native-fs'; import i18n from 'utils/i18n/i18n'; import VersionNumber from 'react-native-version-number'; import { getId } from '@subwallet/extension-base/utils/getId'; @@ -64,7 +65,8 @@ function isWebRunnerAlive(eventData: NativeSyntheticEvent): bool class WebRunnerHandler { eventEmitter?: EventEmitter; webRef?: React.RefObject>; - server?: StaticServer; + // @ts-ignore + server?: typeof StaticServer; state?: WebRunnerGlobalState; runnerState: WebRunnerState = {}; lastTimeResponse?: number; @@ -156,7 +158,8 @@ class WebRunnerHandler { return true; } - const isRunning = await this.server.isRunning(); + // @ts-ignore + const isRunning = this.server.state === STATES.ACTIVE; if (!isRunning) { await this.server.start(); } @@ -275,7 +278,8 @@ class WebRunnerHandler { constructor() { if (Platform.OS === 'ios') { - this.server = new StaticServer(WEB_SERVER_PORT, RNFS.MainBundlePath + '/Web.bundle', { localOnly: true }); + // @ts-ignore + this.server = new StaticServer({ port: WEB_SERVER_PORT, fileDir: MainBundlePath + '/Web.bundle' }); } AppState.addEventListener('change', (state: string) => { const now = new Date().getTime(); @@ -388,6 +392,7 @@ export const WebRunner = React.memo(({ webRunnerRef, webRunnerStateRef, webRunne onError={e => console.debug('### WebRunner error', e)} onHttpError={e => console.debug('### WebRunner HttpError', e)} javaScriptEnabled={true} + webviewDebuggingEnabled allowFileAccess={true} allowUniversalAccessFromFileURLs={true} allowFileAccessFromFileURLs={true} diff --git a/src/screens/Account/RestoreJson/index.tsx b/src/screens/Account/RestoreJson/index.tsx index 1292405da..89c5ad52c 100644 --- a/src/screens/Account/RestoreJson/index.tsx +++ b/src/screens/Account/RestoreJson/index.tsx @@ -8,7 +8,7 @@ import { InputFile } from 'components/common/Field/InputFile'; import { KeyringPair$Json } from '@polkadot/keyring/types'; import { KeyringPairs$Json } from '@polkadot/ui-keyring/types'; import { DirectoryPickerResponse, DocumentPickerResponse } from 'react-native-document-picker'; -import * as RNFS from 'react-native-fs'; +import * as RNFS from '@dr.pogodin/react-native-fs'; import { isKeyringPairs$Json } from 'types/typeGuards'; import { batchRestoreV2, jsonGetAccountInfo, jsonRestoreV2 } from 'messaging/index'; import { ResponseJsonGetAccountInfo } from '@subwallet/extension-base/background/types'; diff --git a/src/screens/Home/Browser/BrowserTab.tsx b/src/screens/Home/Browser/BrowserTab.tsx index e88835228..834507fdc 100644 --- a/src/screens/Home/Browser/BrowserTab.tsx +++ b/src/screens/Home/Browser/BrowserTab.tsx @@ -23,7 +23,7 @@ import { WebViewNavigationEvent, WebViewProgressEvent, } from 'react-native-webview/lib/WebViewTypes'; -import * as RNFS from 'react-native-fs'; +import * as RNFS from '@dr.pogodin/react-native-fs'; import { DEVICE } from 'constants/index'; import { BrowserService } from 'screens/Home/Browser/BrowserService'; import { BrowserOptionModal, BrowserOptionModalRef } from 'screens/Home/Browser/BrowserOptionModal'; diff --git a/src/screens/MasterPassword/Login/index.tsx b/src/screens/MasterPassword/Login/index.tsx index f1a3a8f19..17cacf382 100644 --- a/src/screens/MasterPassword/Login/index.tsx +++ b/src/screens/MasterPassword/Login/index.tsx @@ -101,6 +101,10 @@ const Login: React.FC = ({ navigation }) => { return; } unlockApp(); + // Lock master password incase always require + if (timeAutoLock === LockTimeout.ALWAYS) { + keyringLock().catch((e: Error) => console.log(e)); + } if (faceIdEnabled && !isUseBiometric) { // Deprecated: Migrate use biometrics createKeychainPassword(password) @@ -127,10 +131,6 @@ const Login: React.FC = ({ navigation }) => { }) .finally(() => { setLoading(false); - // Lock master password incase always require - if (timeAutoLock === LockTimeout.ALWAYS) { - keyringLock().catch((e: Error) => console.log(e)); - } }); }); // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/yarn.lock b/yarn.lock index cbae1d9d9..ee6b2935a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1365,6 +1365,25 @@ resolved "https://registry.yarnpkg.com/@docknetwork/node-types/-/node-types-0.16.0.tgz#23570042c823a6320654ee2c5b8c0da5d7c43d21" integrity sha512-VUZB8guX9161hDIEVn/UKJEUlXjIDE6vH5flx6uDHVc0QOhBy1bq6AGLayG4ZH19dCN39ta2sKGIFq9wLO4H2A== +"@dr.pogodin/js-utils@^0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@dr.pogodin/js-utils/-/js-utils-0.0.6.tgz#60f076dd90b87caa7812ad5aecd98bf960a7ad51" + integrity sha512-6DyIS8s+V2d2GKqhW/TOxPugcskKPsKiJt9lFLBEddw012WKGicchPizar9osq+p7ECnNmYMsDUPAC3T+ZkZKw== + +"@dr.pogodin/react-native-fs@>=2.21.0-alpha.1": + version "2.21.0-alpha.3" + resolved "https://registry.yarnpkg.com/@dr.pogodin/react-native-fs/-/react-native-fs-2.21.0-alpha.3.tgz#948be09264e57861cf1d5e6b7dd8a15ef3fe5a44" + integrity sha512-blM6rbLJVK2KmY4CgcOiP755YFWZGFcp6O332oItUALr4dlfMvF4hWactr6whs4REC89Yrbz86YtvQ6f4HQcvA== + dependencies: + buffer "^6.0.3" + +"@dr.pogodin/react-native-static-server@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@dr.pogodin/react-native-static-server/-/react-native-static-server-0.8.3.tgz#67af02deff1c8332a9aaf26f5a29483deb88c322" + integrity sha512-yNtdJh1TbjZ/3E8bLOQbKsbNhEMWA6DeF/gNXOLkFto05ZI4jzCBOR9Ubo7M5K/xaqbosLiOgVPeI17DwYnfrw== + dependencies: + "@dr.pogodin/js-utils" "^0.0.6" + "@edgeware/node-types@3.6.2-wako": version "3.6.2-wako" resolved "https://registry.yarnpkg.com/@edgeware/node-types/-/node-types-3.6.2-wako.tgz#21463fe18f68d5f3f0675244683d416d45ab0a3d" @@ -6222,7 +6241,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-64@0.1.0, base-64@^0.1.0: +base-64@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== @@ -15056,14 +15075,6 @@ react-native-fast-image@^8.6.3: resolved "https://registry.yarnpkg.com/react-native-fast-image/-/react-native-fast-image-8.6.3.tgz#6edc3f9190092a909d636d93eecbcc54a8822255" integrity sha512-Sdw4ESidXCXOmQ9EcYguNY2swyoWmx53kym2zRsvi+VeFCHEdkO+WG1DK+6W81juot40bbfLNhkc63QnWtesNg== -react-native-fs@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/react-native-fs/-/react-native-fs-2.20.0.tgz#05a9362b473bfc0910772c0acbb73a78dbc810f6" - integrity sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ== - dependencies: - base-64 "^0.1.0" - utf8 "^3.0.0" - react-native-gesture-handler@^2.9.0: version "2.12.0" resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.12.0.tgz#59ca9d97e4c71f70b9c258f14a1a081f4c689976" @@ -15229,11 +15240,6 @@ react-native-splash-screen@^3.3.0: resolved "https://registry.yarnpkg.com/react-native-splash-screen/-/react-native-splash-screen-3.3.0.tgz#3af71ed17afe50fee69590a45aec399d071ead02" integrity sha512-rGjt6HkoSXxMqH4SQUJ1gnPQlPJV8+J47+4yhgTIan4bVvAwJhEeJH7wWt9hXSdH4+VfwTS0GTaflj1Tw83IhA== -react-native-static-server@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/react-native-static-server/-/react-native-static-server-0.5.0.tgz#4b396082bfe7dfdbba6fe7d7de894de5ba4ebadb" - integrity sha512-RGteckPoBZq48p9Y8V67bjZGPxLHKkEOAffLSUJiGC7hkx+H+zuekqCR+04F30NuWB7y+nb8N7Qld2RGjX5DNg== - react-native-status-bar-height@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/react-native-status-bar-height/-/react-native-status-bar-height-2.6.0.tgz#b6afd25b6e3d533c43d0fcdcfd5cafd775592cea" @@ -15315,9 +15321,9 @@ react-native-webview@^13.2.3: invariant "2.2.4" react-native@^0.71.12: - version "0.71.12" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.12.tgz#a4a37de71931b5f483a15b8ab9114b9c01e1317d" - integrity sha512-1zDOTdalLepcVB8ZRIZpWlIGyyJISzAF4MIYSDdW7VDJtIRC7ybXsj/kSARF1zpGSg+LgAV8NMCZzGg598M7Iw== + version "0.71.13" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.71.13.tgz#e20007904f5f8a4b8b1faf1e60f0d7eb9f578ed6" + integrity sha512-zEa69YQNLdv8Sf5Pn0CNDB1K9eGuNy1KoMNxXlrZ89JZ8d02b5hihZIoOCCIwhH+iPgslYwr3ZoGd3AY6FMrgw== dependencies: "@jest/create-cache-key-function" "^29.2.1" "@react-native-community/cli" "10.2.4"