Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9193f36
feat(android): introduce new & old arch support base
mbudinsky Oct 27, 2025
4c87737
feat(example): harden Metro resolution for RN & improve testing commands
mbudinsky Jan 14, 2026
08a336d
feat(sdk): implement base TS API & native module Specs
mbudinsky Jan 14, 2026
56ad555
feat(sdk): harden dependency resolution versions & improve type and m…
mbudinsky Jan 14, 2026
001c1f5
feat(sdk): implement iOS layer bridging
mbudinsky Jan 14, 2026
ae67c04
feat(sdk): implement Android layer bridging with new/old arch dups
mbudinsky Jan 14, 2026
b44b1ae
feat(tests): introduce TS API Jest tests & setup
mbudinsky Jan 14, 2026
c3b9ae9
feat(tests): add Jest mocks & export them to client side
mbudinsky Jan 14, 2026
e6297a8
feat(example): implement Testapp overhaul & full API tests
mbudinsky Jan 14, 2026
01483d8
feat(expo): add Expo support & implement Android gradle expo plugin
mbudinsky Jan 14, 2026
f6869b1
chore(sdk): improve README files across workspace
mbudinsky Jan 14, 2026
3e8fb70
feat(tests): implement automatic RN architecture switching script for…
mbudinsky Jan 14, 2026
dcf5b53
feat(ci): add full testing matrix with old/new arch based on Turbo
mbudinsky Jan 14, 2026
690e427
chore(sdk): improve linter ignores
mbudinsky Jan 14, 2026
9d6f33d
chore(example): add better config handling for Testapp & CI
mbudinsky Jan 14, 2026
fb2b0a6
chore(android): switch from maven local for CI testing
mbudinsky Jan 14, 2026
daca415
fix(ci): fix iOS build to enforce dynamic linking because of SPM
mbudinsky Jan 14, 2026
b3315cb
fix(ci): attempt fixing old arch builds with less aggressive caching
mbudinsky Jan 14, 2026
5e5501c
fix(ci): force-exclude non-arm archs from iOS builds & move away from…
mbudinsky Jan 14, 2026
9a440a5
fix(ci): disable Pods caching completely
mbudinsky Jan 14, 2026
0ce4dba
fix(ci): fix duplicate CI runs on feature branch pushes
mbudinsky Jan 14, 2026
a06aa6f
fix(ci): disable using the prebuild RNCORE library to resolve linking…
mbudinsky Jan 14, 2026
ee34854
fix(sdk): fix SDK mock structure & MutableAttributes bulk operations …
mbudinsky Jan 14, 2026
fc6fcf1
feat(tests): add more exhaustive attributes TS tests
mbudinsky Jan 14, 2026
feea702
feat(example): add react-navigation & navigation lab for testing
mbudinsky Jan 22, 2026
39c0a53
feat(sdk): add iOS dsymUploader, adjust it for RN & Expo
mbudinsky Jan 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@ end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.{kt,kts,swift,m,mm,h,cpp,hpp}]
indent_size = 4
6 changes: 5 additions & 1 deletion .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Setup
description: Setup Node.js and install dependencies
description: Setup Node.js, enable Corepack, and install dependencies

runs:
using: composite
Expand All @@ -9,6 +9,10 @@ runs:
with:
node-version-file: .nvmrc

- name: Enable Corepack
run: corepack enable
shell: bash

- name: Restore dependencies
id: yarn-cache
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
Expand Down
165 changes: 138 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ on:
push:
branches: [main, develop, feature/next-gen]
pull_request:
branches: [main, develop, feature/next-gen]
merge_group:
types:
- checks_requested
Expand All @@ -14,8 +13,8 @@ concurrency:

jobs:
lint:
name: Lint & Typecheck
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
Expand All @@ -30,8 +29,8 @@ jobs:
run: yarn typecheck

test:
name: Unit Tests
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
Expand All @@ -42,24 +41,49 @@ jobs:
- name: Run unit tests
run: yarn test --maxWorkers=2 --coverage

- name: Upload coverage report
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: coverage-report
path: packages/core/coverage/
retention-days: 7

build-library:
name: Build Library
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Setup
uses: ./.github/actions/setup

- name: Build package
- name: Build SDK package
run: yarn prepare

- name: Verify build artifacts
run: |
test -d packages/core/lib/module || (echo "Missing lib/module" && exit 1)
test -d packages/core/lib/typescript || (echo "Missing lib/typescript" && exit 1)
test -d packages/core/plugin/build || (echo "Missing plugin/build" && exit 1)

build-android:
name: Build Android (${{ matrix.arch }} arch)
runs-on: ubuntu-latest
needs: [build-library]
strategy:
fail-fast: false
matrix:
arch: [old, new]
include:
- arch: old
new_arch_enabled: false
- arch: new
new_arch_enabled: true

env:
TURBO_CACHE_DIR: .turbo/android
TURBO_CACHE_DIR: .turbo/android-${{ matrix.arch }}
ORG_GRADLE_PROJECT_newArchEnabled: ${{ matrix.new_arch_enabled }}

steps:
- name: Checkout
Expand All @@ -68,12 +92,13 @@ jobs:
- name: Setup
uses: ./.github/actions/setup

- name: Cache turborepo for Android
- name: Cache turborepo for Android (${{ matrix.arch }})
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ${{ env.TURBO_CACHE_DIR }}
key: ${{ runner.os }}-turborepo-android-${{ hashFiles('yarn.lock') }}
key: ${{ runner.os }}-turborepo-android-${{ matrix.arch }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-turborepo-android-${{ matrix.arch }}-
${{ runner.os }}-turborepo-android-

- name: Check turborepo cache for Android
Expand All @@ -88,13 +113,17 @@ jobs:
if: env.turbo_cache_hit != 1
uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1
with:
distribution: 'zulu'
distribution: 'temurin'
java-version: '17'

- name: Finalize Android SDK
- name: Setup Android SDK
if: env.turbo_cache_hit != 1
run: |
/bin/bash -c "yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null"
echo "ANDROID_HOME: $ANDROID_HOME"
echo "ANDROID_SDK_ROOT: $ANDROID_SDK_ROOT"

yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses || true
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0"

- name: Cache Gradle
if: env.turbo_cache_hit != 1
Expand All @@ -103,24 +132,53 @@ jobs:
path: |
~/.gradle/wrapper
~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('example/android/gradle/wrapper/gradle-wrapper.properties') }}
key: ${{ runner.os }}-gradle-${{ matrix.arch }}-${{ hashFiles('example/android/gradle/wrapper/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-${{ matrix.arch }}-
${{ runner.os }}-gradle-

- name: Build example for Android
- name: Set architecture in gradle.properties
if: env.turbo_cache_hit != 1
run: |
sed -i "s/^newArchEnabled=.*/newArchEnabled=${{ matrix.new_arch_enabled }}/" example/android/gradle.properties
echo "Architecture setting:"
grep newArchEnabled example/android/gradle.properties

- name: Build example app for Android (${{ matrix.arch }})
env:
JAVA_OPTS: "-XX:MaxHeapSize=6g"
# Splunk configuration (injected via babel at build time)
SPLUNK_REALM: ${{ secrets.SPLUNK_REALM }}
SPLUNK_RUM_ACCESS_TOKEN: ${{ secrets.SPLUNK_RUM_ACCESS_TOKEN }}
SPLUNK_ENVIRONMENT: ci
run: |
yarn turbo run build:android --cache-dir="${{ env.TURBO_CACHE_DIR }}"

build-ios:
runs-on: macos-latest
name: Build iOS (${{ matrix.arch }} arch)
runs-on: macos-14
needs: [build-library]
strategy:
fail-fast: false
matrix:
arch: [old, new]
include:
- arch: old
new_arch_enabled: '0'
# TODO: Prebuilt RNCore causes linking errors with USE_FRAMEWORKS=dynamic on old arch
# Re-test after RN updates to see if this can be enabled
use_prebuilt_rncore: '0'
- arch: new
new_arch_enabled: '1'
use_prebuilt_rncore: '1'

env:
XCODE_VERSION: 16.3
TURBO_CACHE_DIR: .turbo/ios
XCODE_VERSION: '16.2'
TURBO_CACHE_DIR: .turbo/ios-${{ matrix.arch }}
RCT_NEW_ARCH_ENABLED: ${{ matrix.new_arch_enabled }}
RCT_USE_RN_DEP: 1
RCT_USE_PREBUILT_RNCORE: 1
RCT_USE_PREBUILT_RNCORE: ${{ matrix.use_prebuilt_rncore }}
USE_FRAMEWORKS: dynamic

steps:
- name: Checkout
Expand All @@ -129,12 +187,13 @@ jobs:
- name: Setup
uses: ./.github/actions/setup

- name: Cache turborepo for iOS
- name: Cache turborepo for iOS (${{ matrix.arch }})
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ${{ env.TURBO_CACHE_DIR }}
key: ${{ runner.os }}-turborepo-ios-${{ hashFiles('yarn.lock') }}
key: ${{ runner.os }}-turborepo-ios-${{ matrix.arch }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-turborepo-ios-${{ matrix.arch }}-
${{ runner.os }}-turborepo-ios-

- name: Check turborepo cache for iOS
Expand All @@ -145,20 +204,72 @@ jobs:
echo "turbo_cache_hit=1" >> $GITHUB_ENV
fi

- name: Use appropriate Xcode version
- name: Select Xcode version
if: env.turbo_cache_hit != 1
uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0
with:
xcode-version: ${{ env.XCODE_VERSION }}
run: |
XCODE_PATH="/Applications/Xcode_${{ env.XCODE_VERSION }}.app"
if [[ -d "$XCODE_PATH" ]]; then
sudo xcode-select -s "$XCODE_PATH/Contents/Developer"
else
echo "Available Xcode versions:"
ls -la /Applications/ | grep Xcode
echo "Using default Xcode"
fi
xcodebuild -version

# CocoaPods cache disabled - need fresh pod install with USE_FRAMEWORKS=dynamic bcs of our SPM SDK
# TODO: Re-enable caching once Podfile.lock is regenerated with dynamic frameworks

- name: Install cocoapods
if: env.turbo_cache_hit != 1 && steps.cocoapods-cache.outputs.cache-hit != 'true'
- name: Set architecture in Podfile
if: env.turbo_cache_hit != 1
run: |
if [[ "${{ matrix.new_arch_enabled }}" == "1" ]]; then
sed -i '' "s/^ENV\['RCT_NEW_ARCH_ENABLED'\] = '0'/ENV['RCT_NEW_ARCH_ENABLED'] = '1'/" example/ios/Podfile
else
sed -i '' "s/^ENV\['RCT_NEW_ARCH_ENABLED'\] = '1'/ENV['RCT_NEW_ARCH_ENABLED'] = '0'/" example/ios/Podfile
fi
echo "Architecture setting:"
head -1 example/ios/Podfile

- name: Clean Pods (ensure fresh dynamic framework build)
if: env.turbo_cache_hit != 1
run: |
rm -rf example/ios/Pods
rm -rf example/ios/build
rm -rf ~/Library/Caches/CocoaPods
rm -f example/ios/Podfile.lock

- name: Install CocoaPods
if: env.turbo_cache_hit != 1
run: |
cd example
bundle install
bundle exec pod repo update --verbose
bundle exec pod install --project-directory=ios
RCT_NEW_ARCH_ENABLED=${{ matrix.new_arch_enabled }} USE_FRAMEWORKS=dynamic bundle exec pod install --project-directory=ios

- name: Build example for iOS
- name: Build example app for iOS (${{ matrix.arch }})
env:
# Splunk configuration (injected via babel at build time)
SPLUNK_REALM: ${{ secrets.SPLUNK_REALM }}
SPLUNK_RUM_ACCESS_TOKEN: ${{ secrets.SPLUNK_RUM_ACCESS_TOKEN }}
SPLUNK_ENVIRONMENT: ci
run: |
yarn turbo run build:ios --cache-dir="${{ env.TURBO_CACHE_DIR }}"

ci-success:
name: CI Success
runs-on: ubuntu-latest
needs: [lint, test, build-library, build-android, build-ios]
if: always()
steps:
- name: Check all jobs passed
run: |
if [[ "${{ needs.lint.result }}" != "success" ]] ||
[[ "${{ needs.test.result }}" != "success" ]] ||
[[ "${{ needs.build-library.result }}" != "success" ]] ||
[[ "${{ needs.build-android.result }}" != "success" ]] ||
[[ "${{ needs.build-ios.result }}" != "success" ]]; then
echo "One or more jobs failed"
exit 1
fi
echo "All CI jobs passed successfully!"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,9 @@ android/generated

# React Native Nitro Modules
nitrogen/

native-android-sdk/
native-ios-sdk/

# Local config with secrets (use config.local.template.ts as reference)
example/src/config.local.ts
3 changes: 3 additions & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
nodeLinker: node-modules
nmHoistingLimits: workspaces

# Ensure React is deduplicated across workspaces
nmMode: hardlinks-local

plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
Expand Down
26 changes: 0 additions & 26 deletions NOTICE

This file was deleted.

Loading
Loading