Mobile CI with Tests (#631)

* stuff

* stuff (but for android)

* test mobile ci

* move pnpm up

* install ndk

* add ios & cleanup

* onboarding flow test

* test ci

* fixes, cleanup, caches

* why you do this cargo

* fix pnpm-lock

* add path to build rust script?

* ci is fun

* yolo

* fix broken flow..

* fix pnpm

* probably not gonna work

* test x2

* use real branch of pcr

* android emulator and try ios x2

* Use react native architectures, instead of all.

* override architecture to speed up android build

* protoc & build android on macos too

* fix java ndk

* android gradle

* disable ios for now

* use simulator sdk & debug configuration on ios build

* cleanup

* avd test

* fix avd settings.

* only build for x86_64 on ci

* Fix ios build

* Add IOS testing

* maestro script

* ios release build & wait for library creation

* clean up and disable android for now

* fix pnpm-lock

* Add concurrency to cancel previous runs

* fix pnpm-lock

---------

Co-authored-by: Brendan Allan <brendonovich@outlook.com>
This commit is contained in:
Utku 2023-04-03 11:12:28 +03:00 committed by GitHub
parent 76c70d1052
commit 54a2eee827
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 451 additions and 285 deletions

View file

@ -58,6 +58,7 @@ if [ "${1:-}" == "mobile" ]; then
rustup target add aarch64-apple-ios
rustup target add aarch64-apple-ios-sim
rustup target add x86_64-apple-ios # for CI
fi
# Android requires python

View file

@ -12,6 +12,11 @@ on:
env:
SPACEDRIVE_CUSTOM_APT_FLAGS: --no-install-recommends
# Cancel previous runs of the same workflow on the same branch.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
typescript:
name: TypeScript

211
.github/workflows/mobile-ci.yml vendored Normal file
View file

@ -0,0 +1,211 @@
name: Mobile CI
on:
pull_request:
push:
branches:
- main
paths-ignore:
- '**/.md'
workflow_dispatch:
env:
SPACEDRIVE_CUSTOM_APT_FLAGS: --no-install-recommends
SPACEDRIVE_CI: '1'
# Cancel previous runs of the same workflow on the same branch.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# Disabled until I can figure out why our app on x86_64 crashes on startup.
# android:
# name: Android
# runs-on: macos-12
# steps:
# - name: Checkout repository
# uses: actions/checkout@v3
# - name: Setup Java JDK
# uses: actions/setup-java@v3.10.0
# with:
# java-version: '18'
# distribution: 'temurin'
# - name: Install pnpm
# uses: pnpm/action-setup@v2.2.2
# with:
# version: 7.x.x
# - name: Install Node.js
# uses: actions/setup-node@v3
# with:
# node-version: 18
# cache: 'pnpm'
# - name: Install Rust stable
# uses: actions-rs/toolchain@v1
# with:
# toolchain: stable
# profile: minimal
# - name: Cache Rust deps
# uses: Swatinem/rust-cache@v2
# with:
# save-if: ${{ inputs.save-cache }} == "true"
# - name: Run 'setup-system.sh' script
# shell: bash
# run: ./.github/scripts/setup-system.sh mobile
# - name: Generate Prisma client
# uses: ./.github/actions/generate-prisma-client
# - name: Install pnpm dependencies
# run: pnpm i --frozen-lockfile
# - name: Setup Android SDK Tools
# uses: android-actions/setup-android@v2.0.2
# - name: Cache NDK
# uses: actions/cache@v3
# with:
# path: ${{ env.ANDROID_HOME }}/ndk/23.1.7779620
# key: ndk-23.1.7779620
# - name: Install NDK
# run: echo "y" | sudo ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --install "ndk;23.1.7779620"
# - name: Cache Gradle
# uses: gradle/gradle-build-action@v2
# - name: Build Android
# working-directory: ./apps/mobile/android
# run: chmod +x ./gradlew && ./gradlew assembleRelease -PreactNativeArchitectures=x86_64 --no-daemon
# - name: Cache AVD
# uses: actions/cache@v3
# id: avd-cache
# with:
# path: |
# ~/.android/avd/*
# ~/.android/adb*
# key: avd-30
# - name: Generate AVD Snapshot
# if: steps.avd-cache.outputs.cache-hit != 'true'
# uses: ReactiveCircus/android-emulator-runner@v2.28.0
# with:
# arch: x86_64
# api-level: 30
# target: google_apis
# ndk: 23.1.7779620
# ram-size: 4096M
# emulator-boot-timeout: 12000
# force-avd-creation: false
# emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: false
# script: echo "Generated AVD snapshot."
# - name: Install Maestro
# run: |
# # workaround for https://github.com/mobile-dev-inc/maestro/issues/877
# export MAESTRO_VERSION=1.21.3; curl -Ls "https://get.maestro.mobile.dev" | bash
# echo "$HOME/.maestro/bin" >> $GITHUB_PATH
# - name: Run Tests
# uses: ReactiveCircus/android-emulator-runner@v2.28.0
# with:
# arch: x86_64
# api-level: 30
# target: google_apis
# ndk: 23.1.7779620
# ram-size: 4096M
# emulator-boot-timeout: 12000
# force-avd-creation: false
# emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
# disable-animations: true
# script: |
# adb install -r apps/mobile/android/app/build/outputs/apk/release/app-release.apk
# adb wait-for-device
# bash ./apps/mobile/scripts/run-maestro-tests android
ios:
name: iOS
runs-on: macos-12
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install Xcode
uses: maxim-lobanov/setup-xcode@v1.5.1
with:
xcode-version: latest-stable
- name: Install pnpm
uses: pnpm/action-setup@v2.2.2
with:
version: 7.x.x
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
cache: 'pnpm'
- name: Install Rust stable
uses: actions-rs/toolchain@v1
with:
toolchain: stable
profile: minimal
- name: Cache Rust deps
uses: Swatinem/rust-cache@v2
with:
save-if: ${{ inputs.save-cache }} == "true"
- name: Run 'setup-system.sh' script
shell: bash
run: ./.github/scripts/setup-system.sh mobile
- name: Generate Prisma client
uses: ./.github/actions/generate-prisma-client
- name: Install pnpm dependencies
run: pnpm i --frozen-lockfile
- name: Cache Pods
uses: actions/cache@v3
with:
path: |
./apps/mobile/ios/Pods
~/Library/Caches/CocoaPods
~/.cocoapods
key: pods-${{ hashFiles('./apps/mobile/ios/Podfile.lock') }}
restore-keys: pods-
- name: Install Pods
working-directory: ./apps/mobile/ios
run: pod install --repo-update
- name: Build iOS
working-directory: ./apps/mobile/ios
run: xcodebuild -workspace ./Spacedrive.xcworkspace -scheme Spacedrive -configuration Release -sdk iphonesimulator -derivedDataPath build -arch x86_64
- name: Install Maestro
run: |
curl -Ls "https://get.maestro.mobile.dev" | bash
brew tap facebook/fb
brew install facebook/fb/idb-companion
echo "$HOME/.maestro/bin" >> $GITHUB_PATH
- name: Run Simulator
uses: futureware-tech/simulator-action@v2
with:
model: 'iPhone 11'
- name: Run Tests
run: |
xcrun simctl install booted apps/mobile/ios/build/Build/Products/Release-iphonesimulator/Spacedrive.app
bash ./apps/mobile/scripts/run-maestro-tests ios

View file

@ -48,10 +48,10 @@
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.code-search": true,
"**/*.code-search": true
// Hiding these folders bcs they create a lot of noise in the search results
"apps/mobile/android": true,
"apps/mobile/ios": true
// "apps/mobile/android": true
// "apps/mobile/ios": true
},
"eslint.workingDirectories": [
"apps/landing",

6
Cargo.lock generated
View file

@ -5491,7 +5491,7 @@ dependencies = [
[[package]]
name = "prisma-client-rust"
version = "0.6.4"
source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=c965b89f1a07a6931d90f4b5556421f7ffcda03b#c965b89f1a07a6931d90f4b5556421f7ffcda03b"
source = "git+https://github.com/Brendonovich/prisma-client-rust?branch=spacedrive#c965b89f1a07a6931d90f4b5556421f7ffcda03b"
dependencies = [
"base64 0.13.1",
"bigdecimal",
@ -5525,7 +5525,7 @@ dependencies = [
[[package]]
name = "prisma-client-rust-cli"
version = "0.6.4"
source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=c965b89f1a07a6931d90f4b5556421f7ffcda03b#c965b89f1a07a6931d90f4b5556421f7ffcda03b"
source = "git+https://github.com/Brendonovich/prisma-client-rust?branch=spacedrive#c965b89f1a07a6931d90f4b5556421f7ffcda03b"
dependencies = [
"directories",
"flate2",
@ -5545,7 +5545,7 @@ dependencies = [
[[package]]
name = "prisma-client-rust-sdk"
version = "0.6.4"
source = "git+https://github.com/Brendonovich/prisma-client-rust?rev=c965b89f1a07a6931d90f4b5556421f7ffcda03b#c965b89f1a07a6931d90f4b5556421f7ffcda03b"
source = "git+https://github.com/Brendonovich/prisma-client-rust?branch=spacedrive#c965b89f1a07a6931d90f4b5556421f7ffcda03b"
dependencies = [
"convert_case 0.5.0",
"dml",

View file

@ -13,19 +13,19 @@ members = [
]
[workspace.dependencies]
prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", rev = "c965b89f1a07a6931d90f4b5556421f7ffcda03b", features = [
prisma-client-rust = { git = "https://github.com/Brendonovich/prisma-client-rust", branch = "spacedrive", features = [
"rspc",
"sqlite-create-many",
"migrations",
"sqlite",
], default-features = false }
prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", rev = "c965b89f1a07a6931d90f4b5556421f7ffcda03b", features = [
prisma-client-rust-cli = { git = "https://github.com/Brendonovich/prisma-client-rust", branch = "spacedrive", features = [
"rspc",
"sqlite-create-many",
"migrations",
"sqlite",
], default-features = false }
prisma-client-rust-sdk = { git = "https://github.com/Brendonovich/prisma-client-rust", rev = "c965b89f1a07a6931d90f4b5556421f7ffcda03b", features = [
prisma-client-rust-sdk = { git = "https://github.com/Brendonovich/prisma-client-rust", branch = "spacedrive", features = [
"sqlite",
], default-features = false }

View file

@ -30,6 +30,9 @@ build/
local.properties
*.iml
*.hprof
.cxx/
*.keystore
!debug.keystore
# node.js
#
@ -43,10 +46,10 @@ yarn-error.log
# CocoaPods
/ios/Pods/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
# Expo
.expo/
web-build/
dist/
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*
dist/

View file

@ -3,18 +3,25 @@ apply plugin: "com.facebook.react"
import com.android.build.OutputFile
// SPACEDRIVE CODE
apply plugin: 'org.mozilla.rust-android-gradle.rust-android'
def cargoTargets = []
if (System.getenv('SPACEDRIVE_CI') == "1") {
cargoTargets = ["x86_64"]
} else {
cargoTargets = ["arm", "arm64", "x86", "x86_64"]
}
cargo {
module = "../../crates/android"
libname = "sd_mobile_android"
pythonCommand = 'python3'
profile = 'release'
targets = ["arm", "arm64", "x86", "x86_64"]
// profile = 'debug'
// targets = ["arm64"]
profile = 'release' // 'debug'
targets = cargoTargets
targetDirectory = "../.././../../target" // Monorepo moment
}
@ -25,7 +32,7 @@ tasks.whenTaskAdded { task ->
}
}
// SPACEDRIVE CODE END
// END SPACEDRIVE CODE
def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
def expoDebuggableVariants = ['debug']
@ -46,11 +53,6 @@ react {
reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
debuggableVariants = expoDebuggableVariants
// Use Expo CLI to bundle the app, this ensures the Metro config
// works correctly with Expo projects.
cliFile = new File(["node", "--print", "require.resolve('@expo/cli')"].execute(null, rootDir).text.trim())
bundleCommand = "export:embed"
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '..'
@ -59,6 +61,8 @@ react {
// reactNativeDir = file("../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen
// codegenDir = file("../node_modules/react-native-codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
// cliFile = file("../node_modules/react-native/cli.js")
/* Variants */
// The list of variants to that are debuggable. For those we're going to
@ -69,7 +73,9 @@ react {
/* Bundling */
// A list containing the node command and its flags. Default is just 'node'.
// nodeExecutableAndArgs = ["node"]
//
// The command to run when bundling. By default is 'bundle'
// bundleCommand = "ram-bundle"
//
// The path to the CLI configuration file. Default is empty.
// bundleConfig = file(../rn-cli.config.js)
@ -138,8 +144,9 @@ android {
compileSdkVersion rootProject.ext.compileSdkVersion
namespace 'com.spacedrive.app'
defaultConfig {
applicationId "com.spacedrive.app"
applicationId 'com.spacedrive.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
@ -257,4 +264,4 @@ dependencies {
}
apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
applyNativeModulesAppBuildGradle(project)
applyNativeModulesAppBuildGradle(project)

View file

@ -1,10 +1,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.spacedrive.app">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- For accessing lat & long and EXIF tags on assets -->
<!-- Spacedrive - For accessing lat & long and EXIF tags on assets -->
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<queries>
<intent>
@ -13,13 +13,22 @@
<data android:scheme="https" />
</intent>
</queries>
<application android:requestLegacyExternalStorage="true" android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true">
<application android:name=".MainApplication" android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true">
<meta-data android:name="expo.modules.updates.ENABLED" android:value="false" />
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="46.0.0" />
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS" />
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="48.0.0" />
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH"
android:value="ALWAYS" />
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0" />
<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="https://exp.host/@utkudev/spacedrive" />
<activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true" android:screenOrientation="portrait">
<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL"
android:value="https://exp.host/@spacedrive/spacedrive" />
<activity android:name=".MainActivity" android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.App.SplashScreen" android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
@ -32,6 +41,7 @@
<data android:scheme="com.spacedrive.app" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" />
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"
android:exported="false" />
</application>
</manifest>

View file

@ -1,48 +0,0 @@
THIS_DIR := $(call my-dir)
include $(REACT_ANDROID_DIR)/Android-prebuilt.mk
# If you wish to add a custom TurboModule or Fabric component in your app you
# will have to include the following autogenerated makefile.
# include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk
include $(CLEAR_VARS)
LOCAL_PATH := $(THIS_DIR)
# You can customize the name of your application .so file here.
LOCAL_MODULE := spacedrive_appmodules
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
# If you wish to add a custom TurboModule or Fabric component in your app you
# will have to uncomment those lines to include the generated source
# files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni)
#
# LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
# LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp)
# LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
# Here you should add any native library you wish to depend on.
LOCAL_SHARED_LIBRARIES := \
libfabricjni \
libfbjni \
libfolly_runtime \
libglog \
libjsi \
libreact_codegen_rncore \
libreact_debug \
libreact_nativemodule_core \
libreact_render_componentregistry \
libreact_render_core \
libreact_render_debug \
libreact_render_graphics \
librrc_view \
libruntimeexecutor \
libturbomodulejsijni \
libyoga
LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall
include $(BUILD_SHARED_LIBRARY)

View file

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splashscreen_background"/>
<item android:drawable="@color/splashscreen_background" />
</layer-list>

View file

@ -1,6 +1,3 @@
<resources>
<string name="app_name">Spacedrive</string>
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="expo_system_ui_user_interface_style" translatable="false">automatic</string>
</resources>

View file

@ -1,5 +1,3 @@
import org.apache.tools.ant.taskdefs.condition.Os
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
@ -34,7 +32,6 @@ buildscript {
allprojects {
repositories {
mavenLocal()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android'))

View file

@ -1,29 +0,0 @@
{
"cli": {
"version": ">= 0.56.0",
"promptToConfigurePushNotifications": false
},
"build": {
"production": {
"node": "18.12.1"
},
"preview": {
"extends": "production",
"distribution": "internal"
},
"development": {
"extends": "production",
"developmentClient": true,
"distribution": "internal",
"android": {
"gradleCommand": ":app:assembleDebug"
},
"ios": {
"buildConfiguration": "Debug"
}
}
},
"submit": {
"production": {}
}
}

View file

@ -86,4 +86,4 @@ target 'Spacedrive' do
Pod::UI.warn e
end
end
end
end

View file

@ -9,7 +9,7 @@ PODS:
- ExpoModulesCore
- EXFont (11.1.1):
- ExpoModulesCore
- EXMediaLibrary (15.2.2):
- EXMediaLibrary (15.2.3):
- ExpoModulesCore
- React-Core
- Expo (48.0.6):
@ -609,7 +609,7 @@ SPEC CHECKSUMS:
EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9
EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d
EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272
EXMediaLibrary: 792fe9b828b5bfa2c5a8b629730f175af2938285
EXMediaLibrary: 587cd8aad27a6fc8d7c38b950bc75bc1845a7480
Expo: 04ba1ddde0be07aff4306ae636a1804810679145
ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a
ExpoModulesCore: 1667335d4f4c9b7801990930e6f0eea42c916a21
@ -661,6 +661,6 @@ SPEC CHECKSUMS:
RNSVG: 07dbd870b0dcdecc99b3a202fa37c8ca163caec2
Yoga: 5ed1699acbba8863755998a4245daa200ff3817b
PODFILE CHECKSUM: 17065850599b1e955efad7a619cf825c012744d7
PODFILE CHECKSUM: a82d2337be62e4c4d092a59fb73875196b22ca98
COCOAPODS: 1.11.3

View file

@ -147,8 +147,8 @@
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Spacedrive" */;
buildPhases = (
BC1F37E21575379C81F561DC /* [CP] Check Pods Manifest.lock */,
FD10A7F022414F080027D42C /* Start Packager */,
350DC403297BF2B8009CD6A1 /* Build Spacedrive Core */,
FD10A7F022414F080027D42C /* Start Packager */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
@ -222,7 +222,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export NODE_BINARY=node\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\n`node --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n";
shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" $PROJECT_ROOT ios relative | tail -n 1)\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
};
350DC403297BF2B8009CD6A1 /* Build Spacedrive Core */ = {
isa = PBXShellScriptBuildPhase;
@ -241,7 +241,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/zsh;
shellScript = "env -i CONFIGURATION=$CONFIGURATION PLATFORM_NAME=$PLATFORM_NAME ./build-rust.sh\n";
shellScript = "env -i SPACEDRIVE_CI=$SPACEDRIVE_CI CONFIGURATION=$CONFIGURATION PLATFORM_NAME=$PLATFORM_NAME ./build-rust.sh\n";
};
65CB42BC732A49C59CCA544A /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
@ -299,7 +299,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `node --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `node --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n";
shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\nexport RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `$NODE_BINARY --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n";
showEnvVarsInLog = 0;
};
FFF29AD1ADC998E2209017DB /* [CP] Copy Pods Resources */ = {
@ -432,6 +432,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.spacedrive.app;
PRODUCT_NAME = Spacedrive;
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
@ -527,6 +528,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.spacedrive.app;
PRODUCT_NAME = Spacedrive;
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";

View file

@ -28,16 +28,6 @@
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
BuildableName = "mobilenewTests.xctest"
BlueprintName = "mobilenewTests"
ReferencedContainer = "container:Spacedrive.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
@ -52,15 +42,6 @@
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "Spacedrive.app"
BlueprintName = "Spacedrive"
ReferencedContainer = "container:spacedrive.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
@ -68,7 +49,7 @@
BlueprintName = "Spacedrive"
ReferencedContainer = "container:Spacedrive.xcodeproj">
</BuildableReference>
</MacroExpansion>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View file

@ -4,4 +4,4 @@
@interface AppDelegate : EXAppDelegateWrapper
@end
@end

View file

@ -64,4 +64,4 @@
return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
@end
@end

View file

@ -11,6 +11,6 @@
<key>EXUpdatesSDKVersion</key>
<string>48.0.0</string>
<key>EXUpdatesURL</key>
<string>https://exp.host/@utkudev/spacedrive</string>
<string>https://exp.host/@spacedrive/spacedrive</string>
</dict>
</plist>

View file

@ -6,4 +6,5 @@ int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
}

View file

@ -2,8 +2,6 @@
set -e
export PROTOC=/opt/homebrew/bin/protoc
TARGET_DIRECTORY=../../../target
CARGO_FLAGS=
@ -11,6 +9,27 @@ if [[ $CONFIGURATION != "Debug" ]]; then
CARGO_FLAGS=--release
fi
# TODO: Also do this for non-Apple Silicon Macs
if [[ $SPACEDRIVE_CI == "1" ]]; then
# Required for CI
export PATH="$HOME/.cargo/bin:$PATH"
export PROTOC=/usr/local/bin/protoc
cargo build -p sd-mobile-ios --target x86_64-apple-ios
if [[ $PLATFORM_NAME = "iphonesimulator" ]]
then
lipo -create -output $TARGET_DIRECTORY/libsd_mobile_ios-iossim.a $TARGET_DIRECTORY/x86_64-apple-ios/debug/libsd_mobile_ios.a
else
lipo -create -output $TARGET_DIRECTORY/libsd_mobile_ios-ios.a $TARGET_DIRECTORY/x86_64-apple-ios/debug/libsd_mobile_ios.a
fi
exit 0
fi
# Required for M1 Mac builds (?)
export PROTOC=/opt/homebrew/bin/protoc
if [[ $PLATFORM_NAME = "iphonesimulator" ]]
then
cargo build -p sd-mobile-ios --target aarch64-apple-ios-sim

View file

@ -12,7 +12,8 @@
"android-studio": "open -a '/Applications/Android Studio.app' ./android",
"lint": "eslint src",
"typecheck": "tsc -b",
"eas-build-pre-install": "npm i -g pnpm@7.18.2"
"clean:android": "cd android && ./gradlew clean && cd ../",
"clean:ios": "cd ios && xcodebuild clean && cd ../"
},
"dependencies": {
"@gorhom/bottom-sheet": "^4.4.5",
@ -32,9 +33,9 @@
"byte-size": "^8.1.0",
"class-variance-authority": "^0.4.0",
"dayjs": "^1.11.5",
"expo": "^48.0.6",
"expo": "~48.0.6",
"expo-linking": "~4.0.1",
"expo-media-library": "~15.2.2",
"expo-media-library": "~15.2.3",
"expo-splash-screen": "~0.18.1",
"expo-status-bar": "~1.4.4",
"intl": "^1.2.5",
@ -60,6 +61,7 @@
"zod": "^3.21.4"
},
"devDependencies": {
"@babel/core": "^7.21.0",
"@rnx-kit/metro-config": "^1.3.5",
"@sd/config": "workspace:*",
"@types/react": "~18.0.27",

View file

@ -1,19 +0,0 @@
// @ts-ignore
let fs = require('fs-extra');
let path = require('path');
// Not used atm, keeping it here in case we need it in the future
async function copyReactNativeCodegen() {
const paths = [
['../../../node_modules/react-native-codegen', '../node_modules/react-native-codegen'],
['../../../node_modules/jsc-android', '../node_modules/jsc-android']
];
for (const pathTuple of paths) {
const [src, dest] = [path.join(__dirname, pathTuple[0]), path.join(__dirname, pathTuple[1])];
await fs.remove(dest).catch(() => {});
await fs.move(src, dest).catch(() => {});
}
}
copyReactNativeCodegen();

View file

@ -0,0 +1,50 @@
#!/bin/bash
trap 'exit' INT
PLATFORM=${1:-}
case $PLATFORM in
ios | android )
;;
*)
echo "Error! You must pass either 'android' or 'ios'"
echo ""
exit 1
;;
esac
# NOTE: This script is intended to be run from the root of the project (CI)
if [ "$PLATFORM" == "ios" ]; then
testFiles=$(ls apps/mobile/tests/*.yml apps/mobile/tests/ios-only/*.yml)
else
testFiles=$(ls apps/mobile/tests/*.yml apps/mobile/tests/android-only/*.yml)
fi
failedTests=()
for file in $testFiles
do
if ! maestro test "$file"
then
echo "Test ${file} failed. Retrying in 30 seconds..."
sleep 30
if ! maestro test "$file"
then
echo "Test ${file} failed again. Retrying for the last time in 120 seconds..."
sleep 120
if ! maestro test "$file"
then
failedTests+=("$file")
fi
fi
fi
done
if [ ${#failedTests[@]} -eq 0 ]; then
exit 0
else
echo "These tests failed:"
printf '%s\n' "${failedTests[@]}"
exit 1
fi

View file

@ -22,7 +22,11 @@ export default function Header() {
})}
>
<View style={tw`flex h-10 flex-row items-center`}>
<Pressable style={tw`h-full justify-center px-3`} onPress={() => navigation.openDrawer()}>
<Pressable
testID="drawer-toggle"
style={tw`h-full justify-center px-3`}
onPress={() => navigation.openDrawer()}
>
<MotiView
animate={{ rotate: isDrawerOpen ? '90deg' : '0deg' }}
transition={{ type: 'timing' }}

View file

@ -79,7 +79,13 @@ const MasterPasswordScreen = ({ navigation }: OnboardingStackScreenProps<'Master
control={form.control}
name="password"
render={({ field: { onBlur, onChange, value } }) => (
<PasswordInput onChangeText={onChange} onBlur={onBlur} value={value} isNewPassword />
<PasswordInput
testID="master-password"
onChangeText={onChange}
onBlur={onBlur}
value={value}
isNewPassword
/>
)}
/>
</View>
@ -90,6 +96,7 @@ const MasterPasswordScreen = ({ navigation }: OnboardingStackScreenProps<'Master
name="password_validate"
render={({ field: { onBlur, onChange, value } }) => (
<PasswordInput
testID="master-password-confirm"
onChangeText={onChange}
onBlur={onBlur}
value={value}

View file

@ -46,6 +46,7 @@ const NewLibraryScreen = ({ navigation }: OnboardingStackScreenProps<'NewLibrary
control={form.control}
render={({ field: { onBlur, onChange, value } }) => (
<Input
testID="library-name"
style={tw`my-3`}
placeholder='e.g. "James Library"'
onBlur={onBlur}

View file

@ -4,7 +4,7 @@ import { Animated, FlatList, Text, View } from 'react-native';
import { Swipeable } from 'react-native-gesture-handler';
import { LibraryConfigWrapped, useBridgeQuery } from '@sd/client';
import DeleteLibraryModal from '~/components/modal/confirm-modals/DeleteLibraryModal';
import { AnimatedButton } from '~/components/primitive/Button';
import { AnimatedButton, FakeButton } from '~/components/primitive/Button';
import { tw, twStyle } from '~/lib/tailwind';
import { SettingsStackScreenProps } from '~/navigation/SettingsNavigator';
@ -37,9 +37,9 @@ function LibraryItem({
<DeleteLibraryModal
libraryUuid={library.uuid}
trigger={
<AnimatedButton style={tw`mx-2`}>
<FakeButton style={tw`mx-2`}>
<Trash size={18} color="white" />
</AnimatedButton>
</FakeButton>
}
/>
</Animated.View>

View file

@ -6,7 +6,7 @@ import { useBridgeMutation, useLibraryContext } from '@sd/client';
import { Input } from '~/components/form/Input';
import { Switch } from '~/components/form/Switch';
import DeleteLibraryModal from '~/components/modal/confirm-modals/DeleteLibraryModal';
import { AnimatedButton } from '~/components/primitive/Button';
import { FakeButton } from '~/components/primitive/Button';
import { Divider } from '~/components/primitive/Divider';
import { SettingsContainer, SettingsInputTitle } from '~/components/settings/SettingsContainer';
import { SettingsItem } from '~/components/settings/SettingsItem';
@ -72,9 +72,9 @@ const LibraryGeneralSettingsScreen = ({
<DeleteLibraryModal
libraryUuid={library.uuid}
trigger={
<AnimatedButton size="sm" variant="danger">
<FakeButton size="sm" variant="danger">
<Trash color={tw.color('ink')} size={20} />
</AnimatedButton>
</FakeButton>
}
/>
}

View file

@ -0,0 +1,26 @@
appId: com.spacedrive.app
---
- launchApp:
clearState: true
- tapOn: 'Get Started'
- tapOn:
id: 'library-name'
- inputText: 'TestLib'
- tapOn: 'New Library'
- tapOn:
id: 'master-password'
- inputText: '12345678'
- tapOn: 'Set Password'
- tapOn:
id: 'master-password-confirm'
- inputText: '12345678'
- tapOn: 'Confirm Password'
- tapOn: 'Continue'
# Library creation can take a while...
- extendedWaitUntil:
visible:
id: 'drawer-toggle'
timeout: 180000 # 3 minutes
- tapOn:
id: 'drawer-toggle'
- assertVisible: 'TestLib'

View file

@ -1,4 +1,5 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"allowJs": true,
"esModuleInterop": true,

View file

@ -183,6 +183,7 @@ importers:
apps/mobile:
specifiers:
'@babel/core': ^7.21.0
'@gorhom/bottom-sheet': ^4.4.5
'@hookform/resolvers': ^2.9.11
'@react-native-async-storage/async-storage': ~1.17.11
@ -205,9 +206,9 @@ importers:
class-variance-authority: ^0.4.0
dayjs: ^1.11.5
eslint-plugin-react-native: ^4.0.0
expo: ^48.0.6
expo: ~48.0.6
expo-linking: ~4.0.1
expo-media-library: ~15.2.2
expo-media-library: ~15.2.3
expo-splash-screen: ~0.18.1
expo-status-bar: ~1.4.4
intl: ^1.2.5
@ -254,7 +255,7 @@ importers:
dayjs: 1.11.7
expo: 48.0.6_@babel+core@7.21.3
expo-linking: 4.0.1_expo@48.0.6
expo-media-library: 15.2.2_expo@48.0.6
expo-media-library: 15.2.3_expo@48.0.6
expo-splash-screen: 0.18.1_mjojxfzfqol2n3a5upkwgtvxki
expo-status-bar: 1.4.4
intl: 1.2.5
@ -279,6 +280,7 @@ importers:
valtio: 1.10.3_react@18.2.0
zod: 3.21.4
devDependencies:
'@babel/core': 7.21.3
'@rnx-kit/metro-config': 1.3.5_chpi2hywxvcqr7jb5bivwozu4e
'@sd/config': link:../../packages/config
'@types/react': 18.0.27
@ -747,7 +749,7 @@ packages:
resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.21.2
'@babel/types': 7.21.3
jsesc: 2.5.2
source-map: 0.5.7
dev: true
@ -755,18 +757,9 @@ packages:
/@babel/generator/7.20.7:
resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.21.2
'@jridgewell/gen-mapping': 0.3.2
jsesc: 2.5.2
/@babel/generator/7.21.1:
resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.21.3
'@jridgewell/gen-mapping': 0.3.2
'@jridgewell/trace-mapping': 0.3.17
jsesc: 2.5.2
/@babel/generator/7.21.3:
@ -799,8 +792,8 @@ packages:
dependencies:
'@babel/compat-data': 7.20.10
'@babel/core': 7.20.12
'@babel/helper-validator-option': 7.18.6
browserslist: 4.21.4
'@babel/helper-validator-option': 7.21.0
browserslist: 4.21.5
lru-cache: 5.1.1
semver: 6.3.0
@ -812,30 +805,11 @@ packages:
dependencies:
'@babel/compat-data': 7.20.10
'@babel/core': 7.21.3
'@babel/helper-validator-option': 7.18.6
'@babel/helper-validator-option': 7.21.0
browserslist: 4.21.4
lru-cache: 5.1.1
semver: 6.3.0
/@babel/helper-create-class-features-plugin/7.20.12_@babel+core@7.21.3:
resolution: {integrity: sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
dependencies:
'@babel/core': 7.21.3
'@babel/helper-annotate-as-pure': 7.18.6
'@babel/helper-environment-visitor': 7.18.9
'@babel/helper-function-name': 7.21.0
'@babel/helper-member-expression-to-functions': 7.20.7
'@babel/helper-optimise-call-expression': 7.18.6
'@babel/helper-replace-supers': 7.20.7
'@babel/helper-skip-transparent-expression-wrappers': 7.20.0
'@babel/helper-split-export-declaration': 7.18.6
transitivePeerDependencies:
- supports-color
dev: false
/@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.20.12:
resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==}
engines: {node: '>=6.9.0'}
@ -955,13 +929,6 @@ packages:
dependencies:
'@babel/types': 7.21.3
/@babel/helper-member-expression-to-functions/7.20.7:
resolution: {integrity: sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.21.3
dev: false
/@babel/helper-member-expression-to-functions/7.21.0:
resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==}
engines: {node: '>=6.9.0'}
@ -984,8 +951,8 @@ packages:
'@babel/helper-split-export-declaration': 7.18.6
'@babel/helper-validator-identifier': 7.19.1
'@babel/template': 7.20.7
'@babel/traverse': 7.21.2
'@babel/types': 7.21.2
'@babel/traverse': 7.21.3
'@babel/types': 7.21.3
transitivePeerDependencies:
- supports-color
@ -1082,10 +1049,6 @@ packages:
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
engines: {node: '>=6.9.0'}
/@babel/helper-validator-option/7.18.6:
resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
engines: {node: '>=6.9.0'}
/@babel/helper-validator-option/7.21.0:
resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
engines: {node: '>=6.9.0'}
@ -1106,8 +1069,8 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/template': 7.20.7
'@babel/traverse': 7.21.2
'@babel/types': 7.21.2
'@babel/traverse': 7.21.3
'@babel/types': 7.21.3
transitivePeerDependencies:
- supports-color
@ -1134,14 +1097,15 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
'@babel/types': 7.21.2
'@babel/types': 7.21.3
/@babel/parser/7.21.2:
resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
'@babel/types': 7.21.2
'@babel/types': 7.21.3
dev: true
/@babel/parser/7.21.3:
resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==}
@ -1244,7 +1208,7 @@ packages:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.21.3
'@babel/helper-create-class-features-plugin': 7.20.12_@babel+core@7.21.3
'@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.3
'@babel/helper-plugin-utils': 7.20.2
'@babel/helper-replace-supers': 7.20.7
'@babel/helper-split-export-declaration': 7.18.6
@ -2826,13 +2790,13 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.18.6
'@babel/generator': 7.21.1
'@babel/generator': 7.21.3
'@babel/helper-environment-visitor': 7.18.9
'@babel/helper-function-name': 7.21.0
'@babel/helper-hoist-variables': 7.18.6
'@babel/helper-split-export-declaration': 7.18.6
'@babel/parser': 7.21.2
'@babel/types': 7.21.2
'@babel/parser': 7.21.3
'@babel/types': 7.21.3
debug: 4.3.4
globals: 11.12.0
transitivePeerDependencies:
@ -2842,28 +2806,11 @@ packages:
/@babel/traverse/7.20.12:
resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.18.6
'@babel/generator': 7.21.1
'@babel/helper-environment-visitor': 7.18.9
'@babel/helper-function-name': 7.19.0
'@babel/helper-hoist-variables': 7.18.6
'@babel/helper-split-export-declaration': 7.18.6
'@babel/parser': 7.21.2
'@babel/types': 7.21.2
debug: 4.3.4
globals: 11.12.0
transitivePeerDependencies:
- supports-color
/@babel/traverse/7.21.2:
resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.18.6
'@babel/generator': 7.21.3
'@babel/helper-environment-visitor': 7.18.9
'@babel/helper-function-name': 7.21.0
'@babel/helper-function-name': 7.19.0
'@babel/helper-hoist-variables': 7.18.6
'@babel/helper-split-export-declaration': 7.18.6
'@babel/parser': 7.21.3
@ -3675,7 +3622,7 @@ packages:
resolution: {integrity: sha512-uhmrXNemXTbCTKP/ycyJHOU/KLGdFwVCrWNBzz1VkwnmL8yJV5F3C18a83ybFFnUNfkGHeH5LtID7CSNbbTWKg==}
hasBin: true
dependencies:
'@babel/runtime': 7.20.7
'@babel/runtime': 7.21.0
'@expo/code-signing-certificates': 0.0.5
'@expo/config': 8.0.2
'@expo/config-plugins': 6.0.1
@ -3698,7 +3645,7 @@ packages:
bplist-parser: 0.3.2
cacache: 15.3.0
chalk: 4.1.2
ci-info: 3.7.1
ci-info: 3.8.0
debug: 4.3.4
env-editor: 0.4.2
form-data: 3.0.1
@ -3715,7 +3662,7 @@ packages:
md5-file: 3.2.3
md5hex: 1.0.0
minipass: 3.1.6
node-fetch: 2.6.8
node-fetch: 2.6.9
node-forge: 1.3.1
npm-package-arg: 7.0.0
ora: 3.4.0
@ -3821,7 +3768,7 @@ packages:
fs-extra: 9.0.0
is-docker: 2.2.1
is-wsl: 2.2.0
node-fetch: 2.6.8
node-fetch: 2.6.9
open: 8.4.0
resolve-from: 5.0.0
semver: 7.3.2
@ -3953,7 +3900,7 @@ packages:
'@segment/loosely-validate-event': 2.0.0
fetch-retry: 4.1.1
md5: 2.3.0
node-fetch: 2.6.8
node-fetch: 2.6.9
remove-trailing-slash: 0.1.1
uuid: 8.3.2
transitivePeerDependencies:
@ -6575,7 +6522,7 @@ packages:
'@storybook/core-events': 7.0.0-rc.10
'@storybook/csf': 0.0.2-next.11
'@storybook/csf-tools': 7.0.0-rc.10
'@storybook/docs-mdx': 0.0.1-next.6
'@storybook/docs-mdx': 0.0.1-next.7
'@storybook/global': 5.0.0
'@storybook/manager': 7.0.0-rc.10
'@storybook/node-logger': 7.0.0-rc.10
@ -6648,8 +6595,8 @@ packages:
type-fest: 2.19.0
dev: true
/@storybook/docs-mdx/0.0.1-next.6:
resolution: {integrity: sha512-DjoSIXADmLJtdroXAjUotFiZlcZ2usWhqrS7aeOtZs0DVR0Ws5WQjnwtpDUXt8gryTSd+OZJ0cNsDcqg4JDEvQ==}
/@storybook/docs-mdx/0.0.1-next.7:
resolution: {integrity: sha512-JbgBf/EMBtx65iXtB3pOiX3818UeL9jZ+KAY241OAPqJVXjMQ5KaVOdg/57MSmd508HDIGx7CiImOMEmWwQ9/g==}
dev: true
/@storybook/docs-tools/7.0.0-rc.10:
@ -8715,7 +8662,7 @@ packages:
dependencies:
'@babel/plugin-proposal-decorators': 7.20.7_@babel+core@7.21.3
'@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.3
'@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.21.3
'@babel/plugin-transform-react-jsx': 7.21.0_@babel+core@7.21.3
'@babel/preset-env': 7.20.2_@babel+core@7.21.3
babel-plugin-module-resolver: 4.1.0
babel-plugin-react-native-web: 0.18.10
@ -9020,8 +8967,8 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001472
electron-to-chromium: 1.4.342
node-releases: 2.0.10
electron-to-chromium: 1.4.284
node-releases: 2.0.8
update-browserslist-db: 1.0.10_browserslist@4.21.5
/bser/2.1.1:
@ -9289,11 +9236,6 @@ packages:
/ci-info/2.0.0:
resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
/ci-info/3.7.1:
resolution: {integrity: sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==}
engines: {node: '>=8'}
dev: false
/ci-info/3.8.0:
resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
engines: {node: '>=8'}
@ -10341,9 +10283,6 @@ packages:
/electron-to-chromium/1.4.284:
resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==}
/electron-to-chromium/1.4.342:
resolution: {integrity: sha512-dTei3VResi5bINDENswBxhL+N0Mw5YnfWyTqO75KGsVldurEkhC9+CelJVAse8jycWyP8pv3VSj4BSyP8wTWJA==}
/electron/11.5.0:
resolution: {integrity: sha512-WjNDd6lGpxyiNjE3LhnFCAk/D9GIj1rU3GSDealVShhkkkPR3Vh4q8ErXGDl1OAO/faomVa10KoFPUN/pLbNxg==}
engines: {node: '>= 8.6'}
@ -11032,8 +10971,8 @@ packages:
- supports-color
dev: false
/expo-media-library/15.2.2_expo@48.0.6:
resolution: {integrity: sha512-GebBavV9H+m0Qzoy4G7++BWmwUcddLnCee1qGYkCyHT6CvuLNhXUgC3FV9NINEwlii3HGAuCzk1auaEY60SGDA==}
/expo-media-library/15.2.3_expo@48.0.6:
resolution: {integrity: sha512-Oz8b8Xsvfj7YcutUBtI84NUIqSnt7iCM5HZ5DyKoWKKiDK/+aUuj3RXNQELG8jUw6pQPgEwgbZ1+J8SdH/y9jw==}
peerDependencies:
expo: '*'
dependencies:
@ -11080,7 +11019,7 @@ packages:
resolution: {integrity: sha512-ylm91v/xYjBBEqFHH+mpNyGijJgFXx4NwgKgHCIEfcAQyTZLXpGCL6teOVzAmHCCVF7EdalLl3If/+n09jOi4g==}
hasBin: true
dependencies:
'@babel/runtime': 7.20.7
'@babel/runtime': 7.21.0
'@expo/cli': 0.6.2_6weo4dzsrefthwodkc5gdxxcii
'@expo/config': 8.0.2
'@expo/config-plugins': 6.0.1
@ -11099,7 +11038,7 @@ packages:
getenv: 1.0.0
invariant: 2.2.4
md5-file: 3.2.3
node-fetch: 2.6.8
node-fetch: 2.6.9
pretty-format: 26.6.2
uuid: 3.4.0
transitivePeerDependencies:
@ -14098,8 +14037,8 @@ packages:
/metro-source-map/0.73.7:
resolution: {integrity: sha512-gbC/lfUN52TtQhEsTTA+987MaFUpQlufuCI05blLGLosDcFCsARikHsxa65Gtslm/rG2MqvFLiPA5hviONNv9g==}
dependencies:
'@babel/traverse': 7.21.2
'@babel/types': 7.21.2
'@babel/traverse': 7.21.3
'@babel/types': 7.21.3
invariant: 2.2.4
metro-symbolicate: 0.73.7
nullthrows: 1.1.1
@ -14700,9 +14639,6 @@ packages:
/node-int64/0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
/node-releases/2.0.10:
resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
/node-releases/2.0.8:
resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==}