[SELF-676] feat: upgrade React Native from 0.75.4 to 0.76.9 (#943)

* chore: upgrade build tooling to Node 22 and AGP 8.6

* chore: upgrade react-native to 0.76.9

* update lock files and formatting

* fix path

* fix: handle hermes-engine cache mismatch in CI after React Native upgrade

- Add fallback logic to run 'pod update hermes-engine' when pod install fails
- This resolves CocoaPods cache issues that occur after React Native version upgrades
- Fixes CI pipeline failures on codex/update-core-tooling-for-react-native-upgrade branch

* fix: improve hermes-engine cache handling in CI

- Preemptively clear CocoaPods cache before pod install
- This prevents dependency analysis failures that occur when cached podspecs conflict
- Addresses the root cause: cache conflicts during 'Analyzing dependencies' phase
- Keeps fallback logic for additional safety

* fix: handle hermes-engine cache in mobile-bundle-analysis workflow

- Add pod-install-with-cache-fix.sh script to handle hermes-engine cache conflicts
- Update install-app:setup script to use the new cache fix approach
- This fixes the mobile-bundle-analysis.yml workflow failures after React Native upgrade
- Proactively clears CocoaPods cache and has fallback for hermes-engine updates

* formatting

* fix: robust hermes-engine cache handling in CI workflows

- Apply comprehensive cache clearing to mobile-ci.yml and mobile-e2e.yml
- Pre-emptively run 'pod update hermes-engine' before pod install
- Clear multiple cache locations to handle CI environment differences
- This prevents 'hermes-engine differs from Pods/Local Podspecs' errors
- Fixes all workflows affected by React Native 0.76.9 upgrade cache issues

* fixes

* clean up

* update lock files

* fix tests

* sort

* fixes

* fix ci

* fix deployment target

* android fixes

* upgrade fix

* fixes

* fix: streamline mobile CI build and caching (#946)

* fix: streamline mobile CI build and caching

* Enable mobile E2E tests on codex/fix-mobile-ci-workflow-errors branch

* test

* simplify and fix path

* workflow fixes

* fix loading on 0.76.9

* clean up unnecessary comments

* fix readme

* finalize upgrade to 0.76.9

* fix android build and upgrade

* fix bundler caching

* download cli to fix "yarn start" issues

* fix cli build erorr

* fix script path

* better path

* abstract build step to prevent race condition

* fixes

* better cache

* fix corepack build error

* update lock

* update lock

* add yarn cache to workflows

* fix test building

* ci caching improvements

* fix common type check

* fix common ci

* better mobile sdk alpha building logic

* chore: speed up mobile e2e workflow (#962)

* chore: speed up mobile e2e workflow

* chore: disable android e2e job

* chore: speed up ios build

* fix: bundle js for ios debug build

* fix e2e
This commit is contained in:
Justin Hernandez
2025-08-26 20:27:51 -07:00
committed by GitHub
parent 6c3cd978ad
commit 590f188f3c
41 changed files with 1727 additions and 1474 deletions

View File

@@ -14,6 +14,10 @@ on:
- ".github/workflows/artifacts.yml"
workflow_dispatch:
concurrency:
group: circuits-build-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ["self-hosted", "selfxyz-org", "ubuntu-22-04", "128ram"]

View File

@@ -115,6 +115,15 @@ jobs:
- name: Print Circom version
run: circom --version
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
circuits/node_modules
cache-version: v1
- name: Install Yarn dependencies
uses: ./.github/actions/yarn-install
with:

View File

@@ -9,15 +9,25 @@ jobs:
contents: read
steps:
- uses: actions/checkout@v4
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Build @selfxyz/common
run: yarn workspace @selfxyz/common build
- name: Build dependencies
run: yarn workspace @selfxyz/mobile-app run build:deps
- name: Cache build artifacts
uses: actions/cache/save@v4
with:
path: common/dist
key: common-build-${{ runner.os }}-${{ github.sha }}
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: build-deps-${{ runner.os }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
lint:
runs-on: ubuntu-latest
@@ -25,6 +35,14 @@ jobs:
contents: read
steps:
- uses: actions/checkout@v4
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Run linter
@@ -37,18 +55,30 @@ jobs:
contents: read
steps:
- uses: actions/checkout@v4
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Restore build artifacts
id: restore-common-dist
id: restore-build-deps
uses: actions/cache/restore@v4
with:
path: common/dist
key: common-build-${{ runner.os }}-${{ github.sha }}
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: build-deps-${{ runner.os }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build @selfxyz/common (fallback on cache miss)
if: steps.restore-common-dist.outputs.cache-hit != 'true'
if: steps.restore-build-deps.outputs.cache-hit != 'true'
run: yarn workspace @selfxyz/common build
- name: Build @selfxyz/mobile-sdk-alpha
run: yarn workspace @selfxyz/mobile-sdk-alpha build
- name: Yarn types
run: yarn types
@@ -59,17 +89,29 @@ jobs:
contents: read
steps:
- uses: actions/checkout@v4
- name: Cache Yarn dependencies
uses: ./.github/actions/cache-yarn
with:
path: |
.yarn/cache
node_modules
common/node_modules
cache-version: v1
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Restore build artifacts
id: restore-common-dist
id: restore-build-deps
uses: actions/cache/restore@v4
with:
path: common/dist
key: common-build-${{ runner.os }}-${{ github.sha }}
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: build-deps-${{ runner.os }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build @selfxyz/common (fallback on cache miss)
if: steps.restore-common-dist.outputs.cache-hit != 'true'
if: steps.restore-build-deps.outputs.cache-hit != 'true'
run: yarn workspace @selfxyz/common build
- name: Build @selfxyz/mobile-sdk-alpha
run: yarn workspace @selfxyz/mobile-sdk-alpha build
- name: Run @selfxyz/common tests
run: yarn workspace @selfxyz/common test

View File

@@ -14,6 +14,11 @@ on:
paths:
- "contracts/**"
- "common/**"
concurrency:
group: contracts-ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
test_contracts:
if: github.event.pull_request.draft == false

View File

@@ -10,6 +10,7 @@ on:
pull_request:
paths:
- "app/**"
- "packages/mobile-sdk-alpha/**"
- ".github/workflows/mobile-bundle-analysis.yml"
- ".github/actions/**"
workflow_dispatch:

View File

@@ -20,6 +20,7 @@ on:
paths:
- "common/**"
- "app/**"
- "packages/mobile-sdk-alpha/**"
- ".github/workflows/mobile-ci.yml"
- ".github/actions/**"
workflow_dispatch: {}
@@ -29,7 +30,7 @@ concurrency:
cancel-in-progress: true
jobs:
lint:
build-deps:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
@@ -50,6 +51,10 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Enable Corepack
run: corepack enable
- name: Activate Yarn 4.6.0
run: corepack prepare yarn@4.6.0 --activate
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
@@ -58,11 +63,30 @@ jobs:
node_modules
app/node_modules
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}
- name: Restore Built Dependencies
id: built-deps-restore
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build dependencies (cache miss)
if: steps.built-deps-restore.outputs.cache-hit != 'true'
run: |
echo "Cache miss for built dependencies. Building now..."
yarn workspace @selfxyz/mobile-app run build:deps
- name: Save Built Dependencies
if: steps.built-deps-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Build Dependencies
run: yarn build:deps
working-directory: ./app
- name: Run linter
run: yarn lint
working-directory: ./app
@@ -75,6 +99,7 @@ jobs:
test:
runs-on: macos-latest
needs: build-deps
steps:
- uses: actions/checkout@v4
- name: Read and sanitize Node.js version
@@ -94,6 +119,10 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Enable Corepack
run: corepack enable
- name: Activate Yarn 4.6.0
run: corepack prepare yarn@4.6.0 --activate
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
@@ -102,17 +131,36 @@ jobs:
node_modules
app/node_modules
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}
- name: Restore Built Dependencies
id: built-deps-restore
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build dependencies (cache miss)
if: steps.built-deps-restore.outputs.cache-hit != 'true'
run: |
echo "Cache miss for built dependencies. Building now..."
yarn workspace @selfxyz/mobile-app run build:deps
- name: Save Built Dependencies
if: steps.built-deps-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Build
run: yarn build:deps
working-directory: ./app
- name: Test
run: yarn test
working-directory: ./app
build-ios:
runs-on: macos-latest
needs: build-deps
env:
# iOS project configuration - hardcoded for CI stability
IOS_PROJECT_NAME: "Self"
@@ -136,6 +184,10 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Enable Corepack
run: corepack enable
- name: Activate Yarn 4.6.0
run: corepack prepare yarn@4.6.0 --activate
- name: Set up Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
@@ -159,7 +211,6 @@ jobs:
with:
ruby-version: ${{ env.RUBY_VERSION }}
bundler-cache: false
working-directory: ./app
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
@@ -171,7 +222,7 @@ jobs:
- name: Cache Ruby gems
uses: ./.github/actions/cache-bundler
with:
path: app/vendor/bundle
path: app/ios/vendor/bundle
lock-file: app/Gemfile.lock
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-ruby${{ env.RUBY_VERSION }}
- name: Cache Pods
@@ -189,25 +240,41 @@ jobs:
app/ios/build
~/Library/Developer/Xcode/DerivedData
~/Library/Caches/com.apple.dt.Xcode
key: ${{ runner.os }}-xcode-${{ hashFiles('app/ios/Podfile.lock') }}-${{ hashFiles('app/ios/${{ env.IOS_PROJECT_NAME }}.xcworkspace/contents.xcworkspacedata') }}
key: ${{ runner.os }}-xcode-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock', 'app/ios/OpenPassport.xcworkspace/contents.xcworkspacedata', 'app/ios/Self.xcworkspace/contents.xcworkspacedata') }}
restore-keys: |
${{ runner.os }}-xcode-${{ hashFiles('app/ios/Podfile.lock') }}-
${{ runner.os }}-xcode-
${{ runner.os }}-xcode-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock') }}-
${{ runner.os }}-xcode-${{ env.XCODE_VERSION }}-
- name: Cache Xcode Index
uses: actions/cache@v4
with:
path: app/ios/build/Index.noindex
key: ${{ runner.os }}-xcode-index-${{ hashFiles('app/ios/Podfile.lock') }}
key: ${{ runner.os }}-xcode-index-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-xcode-index-
${{ runner.os }}-xcode-index-${{ env.XCODE_VERSION }}-
- name: Restore Built Dependencies
id: built-deps-restore
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build dependencies (cache miss)
if: steps.built-deps-restore.outputs.cache-hit != 'true'
run: |
echo "Cache miss for built dependencies. Building now..."
yarn workspace @selfxyz/mobile-app run build:deps
- name: Save Built Dependencies
if: steps.built-deps-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
- name: Install Mobile Dependencies
uses: ./.github/actions/yarn-install
- name: Build Dependencies
run: |
echo "Building dependencies..."
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
echo "✅ Dependencies built successfully"
working-directory: ./app
- name: Install Ruby Dependencies
run: |
echo "Installing Ruby dependencies..."
@@ -221,11 +288,29 @@ jobs:
# Reuse the same guarded flow as local to ensure reproducibility
bundle exec bash scripts/pod-install-with-cache-fix.sh
working-directory: ./app
- name: Resolve iOS workspace
run: |
WORKSPACE_OPEN="ios/OpenPassport.xcworkspace"
WORKSPACE_SELF="ios/Self.xcworkspace"
if xcodebuild -list -workspace "$WORKSPACE_OPEN" 2>/dev/null | grep -q "OpenPassport"; then
WORKSPACE_PATH="$WORKSPACE_OPEN"
else
WORKSPACE_PATH="$WORKSPACE_SELF"
fi
echo "WORKSPACE_PATH=$WORKSPACE_PATH" >> "$GITHUB_ENV"
echo "Resolved workspace: $WORKSPACE_PATH"
working-directory: ./app
- name: Verify iOS Workspace
run: |
echo "Verifying iOS workspace setup..."
WORKSPACE_PATH="ios/${{ env.IOS_PROJECT_NAME }}.xcworkspace"
if [ -z "$WORKSPACE_PATH" ]; then
echo "❌ WORKSPACE_PATH is not set"
exit 1
fi
if [ ! -d "$WORKSPACE_PATH" ]; then
echo "❌ Workspace not found at: $WORKSPACE_PATH"
echo "Available workspaces:"
@@ -258,9 +343,6 @@ jobs:
run: |
echo "Building iOS app for simulator (no signing required)..."
echo "Project: ${{ env.IOS_PROJECT_NAME }}, Scheme: ${{ env.IOS_PROJECT_SCHEME }}"
WORKSPACE_PATH="ios/${{ env.IOS_PROJECT_NAME }}.xcworkspace"
# Build for iOS Simulator to avoid code signing issues in CI
xcodebuild -workspace "$WORKSPACE_PATH" \
-scheme ${{ env.IOS_PROJECT_SCHEME }} \
@@ -276,6 +358,7 @@ jobs:
build-android:
runs-on: ubuntu-latest
needs: build-deps
steps:
- uses: actions/checkout@v4
- name: Read and sanitize Node.js version
@@ -295,6 +378,10 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
- name: Enable Corepack
run: corepack enable
- name: Activate Yarn 4.6.0
run: corepack prepare yarn@4.6.0 --activate
- name: Cache Yarn
uses: ./.github/actions/cache-yarn
with:
@@ -323,14 +410,30 @@ jobs:
key: ${{ runner.os }}-ndk-${{ env.ANDROID_NDK_VERSION }}
- name: Install NDK
run: sdkmanager "ndk;${{ env.ANDROID_NDK_VERSION }}"
- name: Restore Built Dependencies
id: built-deps-restore
uses: actions/cache/restore@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
fail-on-cache-miss: false
- name: Build dependencies (cache miss)
if: steps.built-deps-restore.outputs.cache-hit != 'true'
run: |
echo "Cache miss for built dependencies. Building now..."
yarn workspace @selfxyz/mobile-app run build:deps
- name: Save Built Dependencies
if: steps.built-deps-restore.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: |
common/dist
packages/mobile-sdk-alpha/dist
key: built-deps-${{ env.GH_CACHE_VERSION }}-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('common/**/*', 'packages/mobile-sdk-alpha/**/*', '!common/dist/**', '!packages/mobile-sdk-alpha/dist/**') }}
- name: Install Mobile Dependencies
uses: ./.github/actions/yarn-install
- name: Build Dependencies
run: |
echo "Building dependencies..."
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
echo "✅ Dependencies built successfully"
working-directory: ./app
- name: Build Android
run: |
cd android

View File

@@ -8,6 +8,11 @@ on:
- "app/**"
- "!app/**/*.md"
- "!app/docs/**"
- "packages/mobile-sdk-alpha/**"
concurrency:
group: mobile-deploy-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: write
@@ -30,7 +35,7 @@ jobs:
echo "🔍 Checking deployment conditions..."
# Skip if PR has skip-deploy in title or body
if [[ "${{ github.event.pull_request.title }}" =~ \[skip-deploy\] ]] ||
if [[ "${{ github.event.pull_request.title }}" =~ \[skip-deploy\] ]] ||
[[ "${{ github.event.pull_request.body }}" =~ \[skip-deploy\] ]]; then
echo "should_deploy=false" >> $GITHUB_OUTPUT
echo "⏭️ Skipping deployment due to [skip-deploy] flag"

View File

@@ -89,6 +89,10 @@ on:
required: false
default: false
concurrency:
group: mobile-deploy-${{ inputs.deployment_track || github.ref_name }}
cancel-in-progress: false
jobs:
build-ios:
runs-on: macos-latest
@@ -153,7 +157,7 @@ jobs:
id: gems-cache
uses: ./.github/actions/cache-bundler
with:
path: ${{ env.APP_PATH }}/vendor/bundle
path: ${{ env.APP_PATH }}/ios/vendor/bundle
key: ${{ runner.os }}-ruby${{ env.RUBY_VERSION }}-gems-${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-${{ hashFiles('app/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-ruby${{ env.RUBY_VERSION }}-gems-${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-
@@ -538,8 +542,8 @@ jobs:
echo "Node modules: $NODE_SIZE"
fi
if [ -d "${{ env.APP_PATH }}/vendor/bundle" ]; then
GEMS_SIZE=$(du -sh "${{ env.APP_PATH }}/vendor/bundle" | cut -f1)
if [ -d "${{ env.APP_PATH }}/ios/vendor/bundle" ]; then
GEMS_SIZE=$(du -sh "${{ env.APP_PATH }}/ios/vendor/bundle" | cut -f1)
echo "Ruby gems: $GEMS_SIZE"
fi
@@ -595,7 +599,7 @@ jobs:
id: gems-cache
uses: ./.github/actions/cache-bundler
with:
path: ${{ env.APP_PATH }}/vendor/bundle
path: ${{ env.APP_PATH }}/ios/vendor/bundle
key: ${{ runner.os }}-ruby${{ env.RUBY_VERSION }}-gems-${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-${{ hashFiles('app/Gemfile.lock') }}
restore-keys: |
${{ runner.os }}-ruby${{ env.RUBY_VERSION }}-gems-${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-
@@ -803,8 +807,8 @@ jobs:
echo "Node modules: $NODE_SIZE"
fi
if [ -d "${{ env.APP_PATH }}/vendor/bundle" ]; then
GEMS_SIZE=$(du -sh "${{ env.APP_PATH }}/vendor/bundle" | cut -f1)
if [ -d "${{ env.APP_PATH }}/ios/vendor/bundle" ]; then
GEMS_SIZE=$(du -sh "${{ env.APP_PATH }}/ios/vendor/bundle" | cut -f1)
echo "Ruby gems: $GEMS_SIZE"
fi

View File

@@ -10,7 +10,7 @@ env:
GH_CACHE_VERSION: v1 # Global cache version
GH_GEMS_CACHE_VERSION: v1 # Ruby gems cache version
# Performance optimizations
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.workers.max=4 -Dorg.gradle.parallel=true -Dorg.gradle.configureondemand=true -Dorg.gradle.caching=true
GRADLE_OPTS: -Dorg.gradle.workers.max=4 -Dorg.gradle.parallel=true -Dorg.gradle.caching=true
CI: true
# Disable Maestro analytics in CI
MAESTRO_CLI_NO_ANALYTICS: true
@@ -29,12 +29,7 @@ on:
jobs:
e2e-android:
# TODO: The Android E2E test job is temporarily disabled due to a recurring
# Maestro driver timeout issue in the CI environment. The emulator becomes
# unresponsive, preventing Maestro from connecting. This needs further
# investigation, but has been disabled to unblock the pipeline.
# To test locally, run `./scripts/test-e2e-local.sh android --workflow-match`
if: false
if: false # Temporarily disable Android E2E until emulator disk issue resolved
concurrency:
group: ${{ github.workflow }}-android-${{ github.ref }}
cancel-in-progress: true
@@ -61,13 +56,13 @@ jobs:
- run: corepack enable
- run: corepack prepare yarn@4.6.0 --activate
- name: Cache Yarn dependencies
uses: actions/cache@v4
uses: ./.github/actions/cache-yarn
with:
path: .yarn/cache
key: ${{ runner.os }}-node-${{ env.NODE_VERSION_SANITIZED }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node-${{ env.NODE_VERSION_SANITIZED }}-yarn-
cache-version: ${{ env.GH_CACHE_VERSION }}-node-${{ env.NODE_VERSION_SANITIZED }}
- run: yarn install --immutable --silent
- name: Validate Maestro test file
run: |
[ -f app/tests/e2e/launch.android.flow.yaml ] || { echo "❌ Android E2E test file missing"; exit 1; }
- name: Cache Maestro
id: cache-maestro
uses: actions/cache@v4
@@ -90,12 +85,6 @@ jobs:
uses: android-actions/setup-android@v3
with:
accept-android-sdk-licenses: true
- name: Cache NDK
uses: actions/cache@v4
with:
path: ${{ env.ANDROID_HOME }}/ndk/${{ env.ANDROID_NDK_VERSION }}
key: ${{ runner.os }}-ndk-${{ env.ANDROID_NDK_VERSION }}
- name: Install NDK
run: sdkmanager "ndk;${{ env.ANDROID_NDK_VERSION }}"
- name: Build dependencies (outside emulator)
@@ -103,29 +92,12 @@ jobs:
echo "Building dependencies..."
yarn workspace @selfxyz/mobile-app run build:deps --silent || { echo "❌ Dependency build failed"; exit 1; }
echo "✅ Dependencies built successfully"
- name: Cache Android build
uses: actions/cache@v4
with:
path: |
app/android/app/build
app/android/.gradle
key: ${{ runner.os }}-android-build-${{ hashFiles('app/android/**/*.gradle*', 'app/android/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-android-build-
- name: Build Android APK
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ env.ANDROID_API_LEVEL }}
arch: x86_64
target: google_apis
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none -camera-front none -memory 8192 -cores 4 -accel on
disable-animations: true
script: |
echo "Building Android APK..."
chmod +x app/android/gradlew
(cd app/android && ./gradlew assembleRelease --quiet --parallel --build-cache --no-configuration-cache) || { echo "❌ Android build failed"; exit 1; }
echo "✅ Android build succeeded"
run: |
echo "Building Android APK..."
chmod +x app/android/gradlew
(cd app/android && ./gradlew assembleDebug --quiet --parallel --build-cache --no-configuration-cache) || { echo "❌ Android build failed"; exit 1; }
echo "✅ Android build succeeded"
- name: Install and Test on Android
uses: reactivecircus/android-emulator-runner@v2
with:
@@ -137,7 +109,7 @@ jobs:
disable-animations: true
script: |
echo "Installing app on emulator..."
APK_PATH="app/android/app/build/outputs/apk/release/app-release.apk"
APK_PATH="app/android/app/build/outputs/apk/debug/app-debug.apk"
[ -f "$APK_PATH" ] || { echo "❌ APK not found at $APK_PATH"; exit 1; }
adb install -r "$APK_PATH" || { echo "❌ App installation failed"; exit 1; }
echo "✅ App installed successfully"
@@ -147,9 +119,7 @@ jobs:
echo "🎭 Running Maestro tests..."
export MAESTRO_DRIVER_STARTUP_TIMEOUT=180000
maestro test tests/e2e/launch.android.flow.yaml --format junit --output app/maestro-results.xml
env:
E2E_BUILD: "true"
maestro test app/tests/e2e/launch.android.flow.yaml --format junit --output app/maestro-results.xml
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
@@ -191,13 +161,13 @@ jobs:
- run: corepack enable
- run: corepack prepare yarn@4.6.0 --activate
- name: Cache Yarn dependencies
uses: actions/cache@v4
uses: ./.github/actions/cache-yarn
with:
path: .yarn/cache
key: ${{ runner.os }}-node-${{ env.NODE_VERSION_SANITIZED }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node-${{ env.NODE_VERSION_SANITIZED }}-yarn-
cache-version: ${{ env.GH_CACHE_VERSION }}-node-${{ env.NODE_VERSION_SANITIZED }}
- run: yarn install --immutable --silent
- name: Validate Maestro test file
run: |
[ -f app/tests/e2e/launch.ios.flow.yaml ] || { echo "❌ iOS E2E test file missing"; exit 1; }
- name: Cache Maestro
id: cache-maestro
uses: actions/cache@v4
@@ -226,19 +196,12 @@ jobs:
xcodebuild -version
echo "Xcode path:"
xcode-select -p
- name: Cache Node modules
uses: actions/cache@v4
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
path: app/node_modules
key: ${{ runner.os }}-node-${{ env.NODE_VERSION_SANITIZED }}-${{ hashFiles('app/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node-${{ env.NODE_VERSION_SANITIZED }}-
- name: Cache Ruby gems
uses: ./.github/actions/cache-bundler
with:
path: app/vendor/bundle
lock-file: app/Gemfile.lock
cache-version: ${{ env.GH_CACHE_VERSION }}-${{ env.GH_GEMS_CACHE_VERSION }}-ruby${{ env.RUBY_VERSION }}
ruby-version: "3.3"
bundler-cache: true
working-directory: app
- name: Cache Pods
uses: ./.github/actions/cache-pods
with:
@@ -246,33 +209,14 @@ jobs:
app/ios/Pods
~/Library/Caches/CocoaPods
lock-file: app/ios/Podfile.lock
- name: Cache Xcode build
- name: Cache DerivedData
uses: actions/cache@v4
with:
path: |
app/ios/build
~/Library/Developer/Xcode/DerivedData
~/Library/Caches/com.apple.dt.Xcode
key: ${{ runner.os }}-xcode-${{ hashFiles('app/ios/Podfile.lock') }}-${{ hashFiles('app/ios/${{ env.IOS_PROJECT_NAME }}.xcworkspace/contents.xcworkspacedata') }}
path: app/ios/build
key: ${{ runner.os }}-derived-data-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock', 'app/ios/OpenPassport.xcworkspace/contents.xcworkspacedata', 'app/ios/Self.xcworkspace/contents.xcworkspacedata') }}
restore-keys: |
${{ runner.os }}-xcode-${{ hashFiles('app/ios/Podfile.lock') }}-
${{ runner.os }}-xcode-
- name: Cache Xcode Index
uses: actions/cache@v4
with:
path: app/ios/build/Index.noindex
key: ${{ runner.os }}-xcode-index-${{ hashFiles('app/ios/Podfile.lock') }}
restore-keys: |
${{ runner.os }}-xcode-index-
- name: Cache iOS Simulator
uses: actions/cache@v4
with:
path: |
~/Library/Developer/CoreSimulator/Devices
~/Library/Developer/Xcode/iOS DeviceSupport
key: ${{ runner.os }}-simulator-v1
restore-keys: |
${{ runner.os }}-simulator-
${{ runner.os }}-derived-data-${{ env.XCODE_VERSION }}-${{ hashFiles('app/ios/Podfile.lock') }}-
${{ runner.os }}-derived-data-${{ env.XCODE_VERSION }}-
- name: Verify iOS Runtime
run: |
echo "📱 Verifying iOS Runtime availability..."
@@ -286,8 +230,9 @@ jobs:
- name: Install iOS dependencies
run: |
echo "Installing iOS dependencies..."
(cd app/ios && pod install --silent) || { echo "❌ Pod install failed"; exit 1; }
echo "✅ Pods installed successfully"
cd app/ios
echo "📦 Installing pods via centralized script…"
BUNDLE_GEMFILE=../Gemfile bundle exec bash scripts/pod-install-with-cache-fix.sh || { echo "❌ Pod install failed"; exit 1; }
- name: Setup iOS Simulator
run: |
echo "Setting up iOS Simulator..."
@@ -358,13 +303,29 @@ jobs:
# Store simulator ID for later use
echo "IOS_SIMULATOR_ID=$AVAILABLE_SIMULATOR" >> $GITHUB_ENV
echo "IOS_SIMULATOR_NAME=$SIMULATOR_NAME" >> $GITHUB_ENV
- name: Resolve iOS workspace
run: |
WORKSPACE_OPEN="app/ios/OpenPassport.xcworkspace"
WORKSPACE_SELF="app/ios/Self.xcworkspace"
if xcodebuild -list -workspace "$WORKSPACE_OPEN" 2>/dev/null | grep -q "OpenPassport"; then
WORKSPACE_PATH="$WORKSPACE_OPEN"
else
WORKSPACE_PATH="$WORKSPACE_SELF"
fi
echo "WORKSPACE_PATH=$WORKSPACE_PATH" >> "$GITHUB_ENV"
echo "Resolved workspace: $WORKSPACE_PATH"
- name: Build iOS App
run: |
echo "Building iOS app..."
echo "Project: ${{ env.IOS_PROJECT_NAME }}, Scheme: ${{ env.IOS_PROJECT_SCHEME }}"
# Verify workspace exists before building
WORKSPACE_PATH="app/ios/${{ env.IOS_PROJECT_NAME }}.xcworkspace"
if [ -z "$WORKSPACE_PATH" ]; then
echo "❌ WORKSPACE_PATH is not set"
exit 1
fi
if [ ! -d "$WORKSPACE_PATH" ]; then
echo "❌ Workspace not found at: $WORKSPACE_PATH"
echo "Available workspaces:"
@@ -388,13 +349,15 @@ jobs:
echo "✅ Using scheme: ${{ env.IOS_PROJECT_SCHEME }}"
# Use cached derived data and enable parallel builds for faster compilation
# Additional flags disable indexing, restrict architecture, and use whole-module Swift compilation
# Use the simulator that was set up earlier in the workflow
xcodebuild -workspace "$WORKSPACE_PATH" -scheme ${{ env.IOS_PROJECT_SCHEME }} -configuration Release -destination "id=${{ env.IOS_SIMULATOR_ID }}" -derivedDataPath app/ios/build -jobs "$(sysctl -n hw.ncpu)" -parallelizeTargets -quiet || { echo "❌ iOS build failed"; exit 1; }
FORCE_BUNDLING=1 RCT_NO_LAUNCH_PACKAGER=1 \
xcodebuild -workspace "$WORKSPACE_PATH" -scheme ${{ env.IOS_PROJECT_SCHEME }} -configuration Debug -destination "id=${{ env.IOS_SIMULATOR_ID }}" -derivedDataPath app/ios/build -jobs "$(sysctl -n hw.ncpu)" -parallelizeTargets -quiet COMPILER_INDEX_STORE_ENABLE=NO ONLY_ACTIVE_ARCH=YES SWIFT_COMPILATION_MODE=wholemodule || { echo "❌ iOS build failed"; exit 1; }
echo "✅ iOS build succeeded"
- name: Install and Test on iOS
run: |
echo "Installing app on simulator..."
APP_PATH=$(find app/ios/build/Build/Products/Release-iphonesimulator -name "*.app" | head -1)
APP_PATH=$(find app/ios/build/Build/Products/Debug-iphonesimulator -name "*.app" | head -1)
[ -z "$APP_PATH" ] && { echo "❌ Could not find built iOS app"; exit 1; }
echo "Found app at: $APP_PATH"

View File

@@ -25,7 +25,7 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.4.0)
aws-partitions (1.1150.0)
aws-partitions (1.1151.0)
aws-sdk-core (3.230.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
@@ -99,7 +99,7 @@ GEM
drb (2.2.3)
emoji_regex (3.2.3)
escape (0.0.4)
ethon (0.17.0)
ethon (0.15.0)
ffi (>= 1.15.0)
excon (0.112.0)
faraday (1.10.4)
@@ -256,17 +256,17 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.4.1)
rexml (3.4.2)
rouge (3.28.0)
ruby-macho (2.5.1)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
securerandom (0.4.1)
security (0.1.5)
signet (0.20.0)
signet (0.21.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
jwt (>= 1.5, < 4.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
@@ -280,8 +280,8 @@ GEM
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
typhoeus (1.4.1)
ethon (>= 0.9.0)
typhoeus (1.5.0)
ethon (>= 0.9.0, < 0.16.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
uber (0.1.0)

View File

@@ -4,7 +4,7 @@
| Requirement | Version | Installation Guide |
| ----------- | -------- | ------------------------------------------------------------------------ |
| nodejs | > v18 | [Install nodejs](https://nodejs.org/) |
| nodejs | >= 22 | [Install nodejs](https://nodejs.org/) |
| ruby | >= 3.1.0 | [Install ruby](https://www.ruby-lang.org/en/documentation/installation/) |
| circom | Latest | [Install circom](https://docs.circom.io/) |
| snarkjs | Latest | [Install snarkjs](https://github.com/iden3/snarkjs) |

View File

@@ -3,14 +3,14 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 33
compileSdkVersion 35
defaultConfig {
minSdkVersion 23
targetSdkVersion 33
minSdkVersion 24
targetSdkVersion 35
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
// multidex not needed for libraries (and native multidex is default on API 21+)
}
buildTypes {

View File

@@ -198,7 +198,7 @@ class PassportDetailsFragment : androidx.fragment.app.Fragment() {
try {
binding?.valueDocumentSigningCertificateThumbprint?.text = StringUtils.bytesToHex(MessageDigest.getInstance("SHA-1").digest(
docSigningCertificate.encoded)).toUpperCase()
docSigningCertificate.encoded)).uppercase()
} catch (e: Exception) {
e.printStackTrace()
}

View File

@@ -704,19 +704,6 @@ class TouchImageView : androidx.appcompat.widget.AppCompatImageView {
performLongClick()
}
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
if (fling != null) {
//
// If a previous fling is still active, it should be cancelled so that two flings
// are not run simultaenously.
//
fling!!.cancelFling()
}
fling = Fling(velocityX.toInt(), velocityY.toInt())
compatPostOnAnimation(fling as TouchImageView.Fling)
return super.onFling(e1, e2, velocityX, velocityY)
}
override fun onDoubleTap(e: MotionEvent): Boolean {
var consumed = false
if (doubleTapListener != null) {
@@ -763,8 +750,6 @@ class TouchImageView : androidx.appcompat.widget.AppCompatImageView {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
last.set(curr)
if (fling != null)
fling!!.cancelFling()
setState(State.DRAG)
}

View File

@@ -91,7 +91,7 @@ class KeyStoreUtils {
if (endIndex < 0) {
endIndex = issuerName.length
}
val countryCode = issuerName.substring(startIndex + 2, endIndex).trim { it <= ' ' }.toUpperCase()
val countryCode = issuerName.substring(startIndex + 2, endIndex).trim { it <= ' ' }.uppercase()
return try {
Country.getInstance(countryCode)
} catch (e: Exception) {
@@ -129,7 +129,7 @@ class KeyStoreUtils {
val serial = x509Certificate.getSerialNumber()
val country = getCountry(issuer)
val isSelfSigned = (issuer == null && subject == null) || subject.equals(issuer)
val outName = country!!.toAlpha2Code().toLowerCase().toString() + "_" + (if (isSelfSigned) "root_" else "link_") + (++i) + ".cer"
val outName = country!!.toAlpha2Code().lowercase().toString() + "_" + (if (isSelfSigned) "root_" else "link_") + (++i) + ".cer"
treeMap.put(outName, x509Certificate)
}
@@ -167,4 +167,4 @@ class KeyStoreUtils {
Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)
}
}
}
}

View File

@@ -49,7 +49,7 @@ object OcrUtils {
temp = temp.replace("\r".toRegex(), "").replace("\n".toRegex(), "").replace("\t".toRegex(), "").replace(" ", "")
fullRead += "$temp-"
}
fullRead = fullRead.toUpperCase()
fullRead = fullRead.uppercase()
Log.d(TAG, "Read: $fullRead")
// We try with TD1 format first (ID Card)

View File

@@ -20,7 +20,7 @@ buildscript {
mavenLocal()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.1.0'
classpath 'com.android.tools.build:gradle:8.6.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"

View File

@@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
distributionSha256Sum=682b4df7fe5accdca84a4d1ef6a3a6ab096b3efd5edf7de2bd8c758d95b73990

View File

@@ -14,6 +14,7 @@ import com.facebook.react.ReactPackage
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.soloader.SoLoader
import com.facebook.react.soloader.OpenSourceMergedSoMapping
class MainApplication : Application(), ReactApplication {
@@ -21,8 +22,6 @@ class MainApplication : Application(), ReactApplication {
object : DefaultReactNativeHost(this) {
override fun getPackages(): MutableList<ReactPackage> =
PackageList(this).packages.apply {
// Packages that cannot be autolinked yet can be added manually here, for example:
// add(MyReactNativePackage())
add(CameraActivityPackage())
add(QRCodeScannerPackage())
add(BackupPackage())
@@ -38,12 +37,11 @@ class MainApplication : Application(), ReactApplication {
override fun onCreate() {
super.onCreate()
SoLoader.init(this, false)
// CRITICAL CHANGE: Use OpenSourceMergedSoMapping for RN 0.76+ Hermes support
SoLoader.init(this, OpenSourceMergedSoMapping)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
DefaultNewArchitectureEntryPoint.load()
}
// ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(

View File

@@ -3,7 +3,7 @@
buildscript {
ext {
buildToolsVersion = "35.0.0"
minSdkVersion = 23
minSdkVersion = 24
compileSdkVersion = 35
targetSdkVersion = 35
// Updated NDK to support 16k page size devices
@@ -20,16 +20,12 @@ buildscript {
}
}
dependencies {
classpath("com.android.tools.build:gradle:7.3.1")
classpath("com.android.tools.build:gradle:8.6.0")
classpath("com.facebook.react:react-native-gradle-plugin")
// classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
classpath 'com.android.tools.build:gradle:8.1.0'
classpath 'com.google.gms:google-services:4.3.14'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
classpath 'org.mozilla.rust-android-gradle:plugin:0.9.3'
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.0")
classpath("com.google.gms:google-services:4.4.0")
classpath 'com.google.gms:google-services:4.4.0'
// Removed firebase-crashlytics (no usages)—add back 3.x if still applied in modules.
// Removed rust-android-gradle plugin; keep only if you re-enable Rust integration.
}
}

View File

@@ -1,7 +1,7 @@
#Mon Feb 03 16:12:34 CET 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
networkTimeout=600000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

View File

@@ -36,30 +36,10 @@ dependencies {
implementation 'androidx.core:core-ktx:1.9.0'
implementation 'com.wdullaer:materialdatetimepicker:3.5.2'
implementation 'org.jmrtd:jmrtd:0.8.1'
// implementation 'org.jmrtd:jmrtd:0.7.42' // getting different errors whether it's 18 or 40 // 23 <== this works
// implementation files('../../../../../jmrtd-0.7.18-sources/target/jmrtd-0.7.18.jar')
// implementation files('../../app/libs/jmrtd-0.7.18.jar')
implementation 'net.sf.scuba:scuba-sc-android:0.0.18'
// implementation 'com.madgag.spongycastle:prov:1.54.0.0'
implementation 'com.gemalto.jp2:jp2-android:1.0.3'
implementation 'com.github.mhshams:jnbis:1.1.0'
// implementation 'org.bouncycastle:bcpkix-jdk15on:1.65' // do not update
implementation 'commons-io:commons-io:2.8.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
// implementation 'edu.ucar:jj2000:5.2'
implementation 'com.facebook.react:react-native:+'
}
apply plugin: 'org.mozilla.rust-android-gradle.rust-android'
cargo {
module = "../../../ark-circom-passport" // this works
// module = "/Users/turboblitz/code/my-code/passport-sbt/app/halo2-passport"
libname = "ark_circom_passport" // Or whatever matches Cargo.toml's [package] name.
// targets = ["arm", "x86"] // failing
// targets = ["arm64", "darwin-aarch64"] // add this one for apple later
targets = ["arm64"] // Those work
apiLevel = 29
profile = 'release'
}

View File

@@ -1,6 +1,8 @@
pluginManagement { includeBuild("../../node_modules/@react-native/gradle-plugin") }
plugins { id("com.facebook.react.settings") }
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex ->
ex.autolinkLibrariesFromCommand(['yarn','exec','react-native','config'])
}
rootProject.name = 'OpenPassport'
include ':app'
includeBuild('../../node_modules/@react-native/gradle-plugin')

View File

@@ -141,7 +141,7 @@ After deployment, you can check the status:
Before working with this setup, ensure you have the following installed:
* **Node.js** - Version 18 or higher (for JavaScript dependencies and deployment scripts)
* **Node.js** - Version 22 or higher (for JavaScript dependencies and deployment scripts)
* **Yarn** - Package manager for JavaScript dependencies
* **Git** - Required for branch detection and status checking during deployments
* **GitHub CLI (`gh`)** - **Required** for GitHub runner deployments (default method)
@@ -150,7 +150,7 @@ Before working with this setup, ensure you have the following installed:
- Used to trigger GitHub Actions workflows for deployments
* **Ruby** - Fastlane requires Ruby (version 2.6.0 or higher recommended)
* **Bundler** - For managing Ruby dependencies
* **Xcode** - For iOS development (Note: Local development currently requires Xcode 16.2 due to compatibility issues with 16.3)
* **Xcode** - For iOS development (15+; local development currently uses Xcode 16.2 due to compatibility issues with 16.3)
* **Android Studio** - For Android development
* **Docker** - Optional, required for local testing with `act`
@@ -624,7 +624,7 @@ If you encounter issues with version syncing between `package.json` and native p
* Ensure binary is properly signed with distribution certificate
3. **Xcode Version Issues**
* Ensure you're using Xcode 16.2 for local development
* Ensure you're using Xcode 15+ for local development (currently tested with 16.2)
* Check that the correct Xcode version is selected with `xcode-select`
### Android Build Issues

View File

@@ -3,12 +3,24 @@ fastlane documentation
# Installation
Make sure you have the latest version of the Xcode command line tools installed:
Make sure you have the Xcode command line tools installed:
```sh
xcode-select --install
```
**Note:** The above command installs only the Command Line Tools, not the full Xcode app. Some Fastlane lanes and CocoaPods require the full Xcode app and the correct DEVELOPER_DIR. To verify your setup and switch to the proper Xcode app if needed:
```bash
# Verify Xcode and CLT
xcodebuild -version
xcode-select -p
# If needed, point to the correct Xcode app:
sudo xcode-select -s /Applications/Xcode.app
sudo xcodebuild -runFirstLaunch
```
For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)
# Available Actions

View File

@@ -221,7 +221,7 @@ class HelpersTest < Minitest::Test
def test_android_verify_version_code_missing_version_code_line
# Test the error handling when versionCode is missing
gradle_file = Tempfile.new(["build", ".gradle"])
gradle_file.write("applicationId 'com.example.app'\nminSdkVersion 21\n")
gradle_file.write("applicationId 'com.example.app'\nminSdkVersion 24\n")
gradle_file.close
# Test the logic that we improved

3
app/ios/.bundle/config Normal file
View File

@@ -0,0 +1,3 @@
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_CLEAN: "true"

View File

@@ -11,7 +11,10 @@ require Pod::Executable.execute_command("node", ["-p",
project "Self.xcodeproj"
platform :ios, "15.0" if !ENV["ACT"]
# Define consistent iOS deployment target
IOS_DEPLOYMENT_TARGET = "15.1"
platform :ios, IOS_DEPLOYMENT_TARGET if !ENV["ACT"]
prepare_react_native_project!
flipper_enabled = ENV["NO_FLIPPER"] != "1"
@@ -68,7 +71,7 @@ target "Self" do
end
target.build_configurations.each do |config|
config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = "15.0"
config.build_settings["IPHONEOS_DEPLOYMENT_TARGET"] = IOS_DEPLOYMENT_TARGET
config.build_settings["GCC_PREPROCESSOR_DEFINITIONS"] ||= ["$(inherited)", "_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION"]
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -526,7 +526,7 @@
INFOPLIST_FILE = OpenPassport/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = OpenPassport;
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Needed only if you want to upload QRcodes";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -667,7 +667,7 @@
INFOPLIST_KEY_CFBundleDisplayName = OpenPassport;
INFOPLIST_KEY_NSDocumentsFolderUsageDescription = "";
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "Needed only if you want to upload QRcodes";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -764,7 +764,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers",
);
INFOPLIST_KEY_NSCameraUsageDescription = "Needed to scan your passport MRZ, you can however enter it manually.";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD = "";
LDPLUSPLUS = "";
LD_RUNPATH_SEARCH_PATHS = (
@@ -858,7 +858,7 @@
"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers",
);
INFOPLIST_KEY_NSCameraUsageDescription = "Needed to scan your passport MRZ, you can however enter it manually.";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD = "";
LDPLUSPLUS = "";
LD_RUNPATH_SEARCH_PATHS = (

0
app/ios/scripts/pod-install-with-cache-fix.sh Normal file → Executable file
View File

View File

@@ -6,7 +6,12 @@
/** @jest-environment jsdom */
require('react-native-gesture-handler/jestSetup');
jest.mock('react-native/Libraries/Animated/NativeAnimatedHelper');
// Mock NativeAnimatedHelper - using virtual mock during RN 0.76.9 prep phase
jest.mock(
'react-native/src/private/animated/NativeAnimatedHelper',
() => ({}),
{ virtual: true },
);
global.FileReader = class {
constructor() {

View File

@@ -22,16 +22,16 @@
"clean:watchman": "watchman watch-del-all",
"clean:xcode": "rm -rf ~/Library/Developer/Xcode/DerivedData",
"clean:xcode-env-local": "rm -f ios/.xcode.env.local",
"find:type-imports": "node scripts/find-type-import-issues.mjs",
"fmt": "prettier --check .",
"fmt:fix": "prettier --write .",
"format": "yarn nice",
"find:type-imports": "node scripts/find-type-import-issues.mjs",
"ia": "yarn install-app",
"imports:fix": "node ./scripts/alias-imports.cjs",
"install-app": "yarn install-app:setup && cd ios && bundle install && bundle exec pod install && cd .. && yarn clean:xcode-env-local",
"install-app": "yarn install-app:setup && yarn clean:xcode-env-local",
"install-app:mobile-deploy": "yarn install && yarn build:deps && yarn clean:xcode-env-local",
"install-app:mobile-deploy:ios": "yarn install-app:setup && yarn clean:xcode-env-local",
"install-app:setup": "yarn install && yarn build:deps && cd ios && bundle install && bundle exec pod install && cd ..",
"install-app:setup": "yarn install && yarn build:deps && cd ios && bundle install && scripts/pod-install-with-cache-fix.sh && cd ..",
"ios": "yarn build:deps && react-native run-ios --scheme OpenPassport",
"ios:fastlane-debug": "yarn reinstall && bundle exec fastlane --verbose ios internal_test",
"lint": "eslint .",
@@ -53,7 +53,7 @@
"sync-versions": "bundle exec fastlane ios sync_version && bundle exec fastlane android sync_version",
"tag:release": "node scripts/tag.cjs release",
"tag:remove": "node scripts/tag.cjs remove",
"test": "jest --passWithNoTests && node --test scripts/tests/*.cjs",
"test": "yarn build:deps && jest --passWithNoTests && node --test scripts/tests/*.cjs",
"test:build": "yarn build:deps && yarn types && node ./scripts/bundle-analyze-ci.cjs ios && yarn test",
"test:coverage": "jest --coverage --passWithNoTests",
"test:coverage:ci": "jest --coverage --passWithNoTests --ci --coverageReporters=lcov --coverageReporters=text --coverageReporters=json",
@@ -110,7 +110,7 @@
"poseidon-lite": "^0.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-native": "0.75.4",
"react-native": "0.76.9",
"react-native-app-auth": "^8.0.3",
"react-native-biometrics": "^3.0.1",
"react-native-check-version": "^1.3.0",
@@ -144,12 +144,12 @@
"devDependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-transform-private-methods": "^7.23.3",
"@react-native-community/cli": "^19.1.1",
"@react-native/babel-preset": "0.75.4",
"@react-native/eslint-config": "0.75.4",
"@react-native/gradle-plugin": "^0.79.2",
"@react-native/metro-config": "0.75.4",
"@react-native/typescript-config": "0.75.4",
"@react-native-community/cli": "^16.0.3",
"@react-native/babel-preset": "0.76.9",
"@react-native/eslint-config": "0.76.9",
"@react-native/gradle-plugin": "0.76.9",
"@react-native/metro-config": "0.76.9",
"@react-native/typescript-config": "0.76.9",
"@tamagui/types": "1.126.14",
"@testing-library/react-hooks": "^8.0.1",
"@testing-library/react-native": "^13.2.0",
@@ -160,7 +160,6 @@
"@types/node-forge": "^1.3.3",
"@types/react": "^18.3.4",
"@types/react-dom": "^18.3.0",
"@types/react-native": "^0.73.0",
"@types/react-native-dotenv": "^0.2.0",
"@types/react-native-sqlite-storage": "^6.0.5",
"@types/react-native-web": "^0",

View File

@@ -30,7 +30,7 @@ describe('Android build.gradle Configuration', () => {
});
it('sets the expected SDK version numbers', () => {
expect(rootGradleContent).toMatch(/minSdkVersion\s*=\s*23/);
expect(rootGradleContent).toMatch(/minSdkVersion\s*=\s*24/);
expect(rootGradleContent).toMatch(/targetSdkVersion\s*=\s*35/);
});

View File

@@ -338,10 +338,10 @@
"nice:check": "yarn lint && yarn lint:imports:check",
"prepublishOnly": "yarn build",
"test": "vitest run",
"test:watch": "vitest",
"test:ui": "vitest --ui",
"test:exports": "node scripts/validateExports.js && node scripts/testExports.js",
"test:scope": "vitest run tests/scope.test.ts",
"test:ui": "vitest --ui",
"test:watch": "vitest",
"types": "tsc -p tsconfig.json"
},
"dependencies": {

View File

@@ -50,3 +50,12 @@ export { getSKIPEM } from './csca.js';
export { initElliptic } from './certificate_parsing/elliptic.js';
export { parseCertificateSimple } from './certificate_parsing/parseCertificateSimple.js';
export { parseDscCertificateData } from './passports/passport_parsing/parseDscCertificateData.js';
export {
clientKey,
clientPublicKeyHex,
ec,
encryptAES256GCM,
getPayload,
getWSDbRelayerUrl,
} from './proving.js';
export type { TEEPayload, TEEPayloadBase, TEEPayloadDisclose } from './proving.js';

View File

@@ -27,6 +27,10 @@
"test:license-headers": "cd scripts/tests && node check-license-headers.test.mjs",
"types": "yarn workspaces foreach --topological-dev --parallel --exclude @selfxyz/contracts -i --all run types "
},
"resolutions": {
"@typescript-eslint/eslint-plugin": "^8.39.0",
"@typescript-eslint/parser": "^8.39.0"
},
"devDependencies": {
"@types/node": "^22.0.0",
"gitleaks": "1.0.0",
@@ -36,10 +40,6 @@
"postinstall-postinstall": "^2.1.0",
"typescript": "^5.9.2"
},
"resolutions": {
"@typescript-eslint/eslint-plugin": "^8.39.0",
"@typescript-eslint/parser": "^8.39.0"
},
"packageManager": "yarn@4.6.0",
"engines": {
"node": ">=22 <23"

View File

@@ -50,7 +50,7 @@
"test": "vitest run",
"test:build": "yarn build && yarn test && yarn types && yarn lint",
"typecheck": "tsc -p tsconfig.json --noEmit",
"types": "yarn build",
"types": "tsc -p tsconfig.json --noEmit",
"validate:exports": "node ./scripts/validate-exports.mjs",
"validate:pkg": "node ./scripts/verify-conditions.mjs"
},
@@ -58,11 +58,6 @@
"@selfxyz/common": "workspace:*",
"tslib": "^2.6.2"
},
"peerDependencies": {
"react": "^18.3.1",
"react-native": "^0.75.4",
"tamagui": "^1.126.0"
},
"devDependencies": {
"@testing-library/react": "^14.1.2",
"@types/react": "^18.3.4",
@@ -77,11 +72,16 @@
"jsdom": "^24.0.0",
"prettier": "^3.5.3",
"react": "^18.3.1",
"react-native": "0.75.4",
"react-native": "0.76.9",
"tsup": "^8.0.1",
"typescript": "^5.9.2",
"vitest": "^1.6.0"
},
"peerDependencies": {
"react": "^18.3.1",
"react-native": "^0.76.9",
"tamagui": "^1.126.0"
},
"packageManager": "yarn@4.6.0",
"publishConfig": {
"access": "public"

View File

@@ -32,7 +32,7 @@ describe('check-package-versions', () => {
'poseidon-lite': '^0.3.0',
snarkjs: '^0.7.5',
react: '^18.3.1',
'react-native': '0.75.4',
'react-native': '0.76.9',
'@tamagui/config': '1.126.14',
'@tamagui/lucide-icons': '1.126.14',
typescript: '^5.9.2',
@@ -198,7 +198,7 @@ jobs:
const pkg1 = {
dependencies: {
react: '^18.3.1',
'react-native': '0.75.4',
'react-native': '0.76.9',
},
};
const pkg2 = {

View File

@@ -1,8 +1,8 @@
{
"name": "scripts-tests",
"version": "1.0.0",
"type": "module",
"description": "Tests for project scripts",
"type": "module",
"scripts": {
"test": "node check-license-headers.test.mjs",
"test:license-headers": "node check-license-headers.test.mjs"

1421
yarn.lock

File diff suppressed because it is too large Load Diff