From b4de3c5d4a700e92e5f129f1294378208690a86d Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:33:26 +0000 Subject: [PATCH 1/7] chore: update workflows --- .github/workflows/build-android.yml | 21 ++++++-- .github/workflows/build-ios.yml | 74 +++++++++++++++++++------- .github/workflows/lint-cpp.yml | 28 +++------- .github/workflows/lint-typescript.yml | 26 +++------ .github/workflows/update-lockfiles.yml | 25 ++++++--- 5 files changed, 103 insertions(+), 71 deletions(-) diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index 2fee2f55..3e0d4c6c 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -11,7 +11,7 @@ on: - "**/nitrogen/generated/android/**" - "package/cpp/**" - "package/android/**" - - "bun.lockb" + - "**/bun.lock" - "**/react-native.config.js" - "**/nitro.json" pull_request: @@ -22,7 +22,7 @@ on: - "**/nitrogen/generated/android/**" - "package/cpp/**" - "package/android/**" - - "bun.lockb" + - "**/bun.lock" - "**/react-native.config.js" - "**/nitro.json" @@ -30,13 +30,21 @@ jobs: build: name: Build Android Example App runs-on: ubuntu-latest + strategy: + matrix: + min-sdk: + - "24" + - "26" steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 - name: Install npm dependencies (bun) run: bun install + - name: Set minSdk in build.gradle + run: sed -i "s/minSdkVersion = 24/minSdkVersion = ${{ matrix.min-sdk }}/g" example/android/build.gradle + - name: Setup JDK 17 uses: actions/setup-java@v5 with: @@ -45,11 +53,14 @@ jobs: java-package: jdk - name: Restore Gradle cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + ~/.gradle/wrapper + example/android/app/.cxx + example/android/app/build + key: ${{ runner.os }}-gradle-${{ matrix.min-sdk }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: | ${{ runner.os }}-gradle- - name: Run Gradle Build for example/android/ diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index 0eecdad5..f4707d82 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -34,16 +34,37 @@ env: jobs: build: name: Build iOS Example App - runs-on: macOS-15 + runs-on: macOS-26 + strategy: + matrix: + include: + - name: static_frameworks + use_frameworks: static + - name: no_frameworks + use_frameworks: "" # intentionally unset steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 + - name: Set USE_FRAMEWORKS + if: matrix.use_frameworks != '' + run: echo "USE_FRAMEWORKS=${{ matrix.use_frameworks }}" >> $GITHUB_ENV + - name: Install npm dependencies (bun) run: bun install - - name: Restore ccache + - name: Install Ccache uses: hendrikmuhs/ccache-action@v1.2 + with: + max-size: 1.5G + key: ${{ runner.os }}-${{ matrix.use_frameworks }}-ccache-example-ios + create-symlink: true + - name: Setup ccache behavior + run: | + echo "CCACHE_SLOPPINESS=clang_index_store,file_stat_matches,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros" >> $GITHUB_ENV + echo "CCACHE_FILECLONE=true" >> $GITHUB_ENV + echo "CCACHE_DEPEND=true" >> $GITHUB_ENV + echo "CCACHE_INODECACHE=true" >> $GITHUB_ENV - name: Setup Ruby (bundle) uses: ruby/setup-ruby@v1 @@ -52,26 +73,41 @@ jobs: bundler-cache: true working-directory: example + - name: Select Xcode 26.2 + run: sudo xcode-select -s "/Applications/Xcode_26.2.app/Contents/Developer" + - name: Restore Pods cache - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: example/ios/Pods - key: pods-${{ runner.os }}-${{ hashFiles('**/Podfile.lock', '**/Gemfile.lock') }} + key: ${{ runner.os }}-${{ matrix.use_frameworks }}-pods-${{ hashFiles('**/Podfile.lock', '**/Gemfile.lock') }} restore-keys: | - pods-${{ runner.os }} - + ${{ runner.os }}-${{ matrix.use_frameworks }}-pods- - name: Install Pods - working-directory: example/ios - run: pod install + working-directory: example + run: bun pods + + - name: Restore DerivedData cache + uses: actions/cache@v5 + with: + path: example/ios/build + key: ${{ runner.os }}-${{ matrix.use_frameworks }}-dd-${{ hashFiles('**/Podfile.lock', '**/Gemfile.lock', '**/package.json', '**/bun.lock') }}-xcode26.2 + restore-keys: | + ${{ runner.os }}-${{ matrix.use_frameworks }}-dd- + - name: Build App working-directory: example/ios - run: "set -o pipefail && xcodebuild \ - CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ \ - -derivedDataPath build -UseModernBuildSystem=YES \ - -workspace NitroSQLiteExample.xcworkspace \ - -scheme NitroSQLiteExample \ - -sdk iphonesimulator \ - -configuration Debug \ - -destination 'platform=iOS Simulator,name=iPhone 16' \ - build \ - CODE_SIGNING_ALLOWED=NO" + run: | + set -o pipefail + xcodebuild \ + CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ \ + -derivedDataPath build -UseModernBuildSystem=YES \ + -workspace NitroExample.xcworkspace \ + -scheme NitroExample \ + -sdk iphonesimulator \ + -configuration Debug \ + -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ + -showBuildTimingSummary \ + ONLY_ACTIVE_ARCH=YES \ + build \ + CODE_SIGNING_ALLOWED=NO | xcbeautify --renderer github-actions diff --git a/.github/workflows/lint-cpp.yml b/.github/workflows/lint-cpp.yml index 48f5c230..b9eb97f9 100644 --- a/.github/workflows/lint-cpp.yml +++ b/.github/workflows/lint-cpp.yml @@ -1,4 +1,4 @@ -name: Validate C++ +name: Lint C++ on: push: @@ -11,9 +11,6 @@ on: - "**/*.cpp" - "**/*.c" - "**/*.mm" - paths-ignore: - - "node_modules" - - "**/node_modules" pull_request: paths: - ".github/workflows/lint-cpp.yml" @@ -22,28 +19,17 @@ on: - "**/*.cpp" - "**/*.c" - "**/*.mm" - paths-ignore: - - "node_modules" - - "**/node_modules" jobs: lint: - name: Check clang-format + name: Format C++ runs-on: ubuntu-latest - strategy: - matrix: - path: - - "package/android/src/main/cpp" - - "package/cpp" steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 - - name: Install npm dependencies (bun) - run: bun install + - name: Run clang-format + run: bun run lint-cpp - - name: Run clang-format style check - uses: jidicula/clang-format-action@v4.13.0 - with: - clang-format-version: "18" - check-path: ${{ matrix.path }} + - name: Verify no files have changed after format + run: git diff --exit-code HEAD -- . ':(exclude)bun.lock' diff --git a/.github/workflows/lint-typescript.yml b/.github/workflows/lint-typescript.yml index fc667d57..276af35f 100644 --- a/.github/workflows/lint-typescript.yml +++ b/.github/workflows/lint-typescript.yml @@ -17,10 +17,8 @@ on: - "**/*.js" - "**/*.jsx" - "**/*.json" - - "**/*.lockb" + - "**/bun.lock" - "**/package.json" - - "**/tsconfig.json" - - "**/eslintrc.js" pull_request: paths: - ".github/workflows/lint-typescript.yml" @@ -30,34 +28,24 @@ on: - "**/*.js" - "**/*.jsx" - "**/*.json" - - "**/*.lockb" + - "**/bun.lock" - "**/package.json" - - "**/tsconfig.json" - - "**/eslintrc.js" jobs: tsc: name: Compile TypeScript (tsc) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 - uses: reviewdog/action-setup@v1 - name: Install npm dependencies (bun) run: bun install - - name: Run TypeScript (tsc) in example - working-directory: example - run: | - bun typecheck | reviewdog -name="tsc" -efm="%f(%l,%c): error TS%n: %m" -reporter="github-pr-review" -filter-mode="nofilter" -fail-level=any -tee - env: - REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Run TypeScript (tsc) in react-native-nitro-sqlite - working-directory: package + - name: Run TypeScript (tsc) run: | - bun typecheck | reviewdog -name="tsc" -efm="%f(%l,%c): error TS%n: %m" -reporter="github-pr-review" -filter-mode="nofilter" -fail-level=any -tee + bun typecheck | reviewdog -name="tsc" -efm="%f(%l,%c): error TS%n: %m" -reporter="github-pr-review" -filter-mode="nofilter" -fail-on-error -tee env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -65,7 +53,7 @@ jobs: name: Lint TypeScript (eslint, prettier) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: oven-sh/setup-bun@v2 - name: Install npm dependencies (bun) @@ -79,4 +67,4 @@ jobs: run: bun lint - name: Verify no files have changed after auto-fix - run: git diff --exit-code HEAD -- . ':(exclude)bun.lockb' + run: git diff --exit-code HEAD -- . ':(exclude)bun.lock' diff --git a/.github/workflows/update-lockfiles.yml b/.github/workflows/update-lockfiles.yml index addf04a0..6d0d845b 100644 --- a/.github/workflows/update-lockfiles.yml +++ b/.github/workflows/update-lockfiles.yml @@ -1,4 +1,4 @@ -name: "Update Lockfiles (bun.lockb + Podfile.lock)" +name: "Update Lockfiles (bun.lock + Podfile.lock)" on: push: @@ -19,11 +19,11 @@ permissions: jobs: update-lockfiles: - name: "Update lockfiles (bun.lockb + Podfile.lock)" + name: "Update lockfiles (Podfile.lock)" if: github.actor == 'dependabot[bot]' - runs-on: macOS-latest + runs-on: macOS-26 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 ref: ${{ github.event.pull_request.head.ref }} @@ -37,13 +37,24 @@ jobs: bundler-cache: true working-directory: example/ios + - name: Select Xcode 26.2 + run: sudo xcode-select -s "/Applications/Xcode_26.2.app/Contents/Developer" + - run: | bun install - git add bun.lockb - bun example bundle-install - bun example pods + cd example + bundle install + bun pods + cd .. + + cd docs + bun install + cd .. + + git add bun.lock git add example/ios/Podfile.lock + git add example/Gemfile.lock git config --global user.name 'dependabot[bot]' git config --global user.email 'dependabot[bot]@users.noreply.github.com' From cefb35dbfa55da2c881a8ea4c5941846acc7e8e4 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:36:32 +0000 Subject: [PATCH 2/7] fix: incorrect iOS example --- .github/workflows/build-ios.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index f4707d82..0aedf89f 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -102,8 +102,8 @@ jobs: xcodebuild \ CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ \ -derivedDataPath build -UseModernBuildSystem=YES \ - -workspace NitroExample.xcworkspace \ - -scheme NitroExample \ + -workspace NitroSQLiteExample.xcworkspace \ + -scheme NitroSQLiteExample \ -sdk iphonesimulator \ -configuration Debug \ -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ From 3a1e82f265f235a06a7270ecddec692cdd45fd0f Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:36:52 +0000 Subject: [PATCH 3/7] chore: fail lint-cpp --- package/cpp/operations.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package/cpp/operations.cpp b/package/cpp/operations.cpp index 3f3fa246..60c5dacd 100644 --- a/package/cpp/operations.cpp +++ b/package/cpp/operations.cpp @@ -24,17 +24,19 @@ std::map dbMap = std::map(); void sqliteOpenDb(const std::string& dbName, const std::string& docPath) { std::string dbPath = get_db_path(dbName, docPath); - int sqlOpenFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; +int sqlOpenFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; sqlite3* db; int exit = 0; - exit = sqlite3_open_v2(dbPath.c_str(), &db, sqlOpenFlags, nullptr); + exit = sqlite3_open_v2(dbPath.c_str(), &db, sqlOpenFlags, nullptr); if (exit != SQLITE_OK) { throw NitroSQLiteException(NitroSQLiteExceptionType::DatabaseCannotBeOpened, sqlite3_errmsg(db)); } else { dbMap[dbName] = db; } + + } void sqliteCloseDb(const std::string& dbName) { From 21f9e4c52cc520c87508b5343347ff8d1c954c1b Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:37:37 +0000 Subject: [PATCH 4/7] chore: fail TS and eslint --- package/src/nitro.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package/src/nitro.ts b/package/src/nitro.ts index c1c552e2..58fef72b 100644 --- a/package/src/nitro.ts +++ b/package/src/nitro.ts @@ -3,3 +3,7 @@ import type { NitroSQLite as NitroSQLiteSpec } from './specs/NitroSQLite.nitro' export const HybridNitroSQLite = NitroModules.createHybridObject('NitroSQLite') + +const x: string = 10 + +x + '123' From 7f74cd8884fa7a8c2394c74a8943a935b9645152 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:41:42 +0000 Subject: [PATCH 5/7] fix: fail TS workflow if TS errors --- .github/workflows/lint-typescript.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint-typescript.yml b/.github/workflows/lint-typescript.yml index 276af35f..9f0d40ed 100644 --- a/.github/workflows/lint-typescript.yml +++ b/.github/workflows/lint-typescript.yml @@ -45,7 +45,8 @@ jobs: - name: Run TypeScript (tsc) run: | - bun typecheck | reviewdog -name="tsc" -efm="%f(%l,%c): error TS%n: %m" -reporter="github-pr-review" -filter-mode="nofilter" -fail-on-error -tee + set -o pipefail + bun typecheck | reviewdog -name="tsc" -efm="%f(%l,%c): error TS%n: %m" -reporter="github-pr-review" -filter-mode="nofilter" -fail-level=error -tee env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} From cd60e187b160a8c5d87d293c01e5385f46ece448 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:57:34 +0000 Subject: [PATCH 6/7] fix: remove cpp, ts and lint errors --- package/cpp/operations.cpp | 6 ++---- package/src/nitro.ts | 4 ---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/package/cpp/operations.cpp b/package/cpp/operations.cpp index 60c5dacd..3f3fa246 100644 --- a/package/cpp/operations.cpp +++ b/package/cpp/operations.cpp @@ -24,19 +24,17 @@ std::map dbMap = std::map(); void sqliteOpenDb(const std::string& dbName, const std::string& docPath) { std::string dbPath = get_db_path(dbName, docPath); -int sqlOpenFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; + int sqlOpenFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; sqlite3* db; int exit = 0; - exit = sqlite3_open_v2(dbPath.c_str(), &db, sqlOpenFlags, nullptr); + exit = sqlite3_open_v2(dbPath.c_str(), &db, sqlOpenFlags, nullptr); if (exit != SQLITE_OK) { throw NitroSQLiteException(NitroSQLiteExceptionType::DatabaseCannotBeOpened, sqlite3_errmsg(db)); } else { dbMap[dbName] = db; } - - } void sqliteCloseDb(const std::string& dbName) { diff --git a/package/src/nitro.ts b/package/src/nitro.ts index 58fef72b..c1c552e2 100644 --- a/package/src/nitro.ts +++ b/package/src/nitro.ts @@ -3,7 +3,3 @@ import type { NitroSQLite as NitroSQLiteSpec } from './specs/NitroSQLite.nitro' export const HybridNitroSQLite = NitroModules.createHybridObject('NitroSQLite') - -const x: string = 10 - -x + '123' From d12338a9fe4092a1f7fc705fbb0db092fcd7b704 Mon Sep 17 00:00:00 2001 From: Christoph Pader Date: Sun, 8 Mar 2026 15:59:31 +0000 Subject: [PATCH 7/7] chore: improve Android workflow --- .github/workflows/build-android.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index 3e0d4c6c..e57b114e 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -26,6 +26,10 @@ on: - "**/react-native.config.js" - "**/nitro.json" +env: + # Build a single ABI in CI to reduce native compile time. + TARGET_ANDROID_ARCH: x86_64 + jobs: build: name: Build Android Example App @@ -52,20 +56,21 @@ jobs: java-version: 17 java-package: jdk - - name: Restore Gradle cache + - name: Restore Gradle/CMake cache uses: actions/cache@v5 with: path: | ~/.gradle/caches ~/.gradle/wrapper + example/android/.gradle example/android/app/.cxx - example/android/app/build - key: ${{ runner.os }}-gradle-${{ matrix.min-sdk }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + key: ${{ runner.os }}-gradle-${{ matrix.min-sdk }}-${{ env.TARGET_ANDROID_ARCH }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/CMakeLists.txt', '**/*.cmake') }} restore-keys: | + ${{ runner.os }}-gradle-${{ matrix.min-sdk }}-${{ env.TARGET_ANDROID_ARCH }}- ${{ runner.os }}-gradle- - name: Run Gradle Build for example/android/ working-directory: example/android - run: ./gradlew assembleDebug --no-daemon --build-cache + run: ./gradlew :app:assembleDebug --no-daemon --build-cache -PreactNativeArchitectures=${{ env.TARGET_ANDROID_ARCH }} # Gradle cache doesn't like daemons - name: Stop Gradle Daemon