diff --git a/.github/ci-paths.json b/.github/ci-paths.json index c0faedd9..abc96865 100644 --- a/.github/ci-paths.json +++ b/.github/ci-paths.json @@ -132,7 +132,8 @@ "packages/react-native-nitro-sqlite-vec/cpp/**", "packages/react-native-nitro-sqlite/RNNitroSQLite.podspec", "packages/react-native-nitro-sqlite-vec/RNNitroSqliteVec.podspec", - "example/Gemfile*", + "packages/react-native-nitro-sqlite/Package.swift", + "packages/react-native-nitro-sqlite-vec/Package.swift", "bun.lock", "package.json", "example/package.json", @@ -140,12 +141,14 @@ "packages/react-native-nitro-sqlite-vec/package.json", "patches/react-native-nitro-modules*", "patches/@react-native-harness*", + "patches/react-native-screens*", + "patches/@react-native-clipboard*", "example/react-native.config.js", "packages/react-native-nitro-sqlite/react-native.config.js", "packages/react-native-nitro-sqlite-vec/react-native.config.js", "packages/react-native-nitro-sqlite/nitro.json", "!packages/react-native-nitro-sqlite/src/__tests__/**", - "scripts/test-podspec-threadsafe.rb", + "scripts/sqlite-package-config.test.ts", "example/index.js", "example/babel.config*.js", "example/app.json", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ac78716..183c9f85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,6 @@ jobs: android_configuration: ${{ steps.select.outputs.android_configuration }} ios: ${{ steps.select.outputs.ios }} macos: ${{ steps.select.outputs.macos }} - ios_pods: ${{ steps.pods.outputs.ios_pods }} macos_pods: ${{ steps.pods.outputs.macos_pods }} steps: - uses: actions/checkout@v7 @@ -89,7 +88,6 @@ jobs: name: ci-lockfiles path: | bun.lock - example/ios/Podfile.lock example/macos/Podfile.lock retention-days: 1 - name: Require committed dependency resolutions @@ -99,7 +97,7 @@ jobs: git diff --exit-code -- bun.lock - name: Select native lockfile checks id: pods - if: steps.select.outputs.dependencies == 'true' && (steps.select.outputs.ios == 'true' || steps.select.outputs.macos == 'true') + if: steps.select.outputs.dependencies == 'true' && steps.select.outputs.macos == 'true' run: node scripts/ci-dependencies.ts env: CI_BASE_SHA: ${{ github.event.pull_request.base.sha || github.event.before || github.sha }} @@ -140,10 +138,9 @@ jobs: - name: Test C++ database lifecycle and SQLite symbols if: steps.select.outputs.cpp_tests == 'true' run: bash scripts/test-cpp.sh - - name: Test SQLite thread-safety pod configuration - # Paused because Nitro V1 doesn't generate the CocoaPods files that the podspec loads. - if: false && steps.select.outputs.ios == 'true' - run: ruby scripts/test-podspec-threadsafe.rb + - name: Test SQLite Swift package configuration + if: steps.select.outputs.ios == 'true' + run: node --test scripts/sqlite-package-config.test.ts - name: Check documentation if: steps.select.outputs.docs == 'true' run: | @@ -153,15 +150,12 @@ jobs: lockfiles: name: Native lockfiles needs: checks - # Paused because Nitro V1 doesn't support CocoaPods. Remove `false &&` to resume it. + # Paused until Nitro V1 supports React Native macOS. Remove `false &&` to resume it. if: >- false && github.event_name != 'push' && !github.event.pull_request.draft && - (needs.checks.outputs.ios_pods == 'true' || needs.checks.outputs.macos_pods == 'true') + needs.checks.outputs.macos_pods == 'true' uses: ./.github/workflows/update-lockfiles.yml - with: - ios: ${{ needs.checks.outputs.ios_pods == 'true' }} - macos: ${{ needs.checks.outputs.macos_pods == 'true' }} android: name: Android @@ -179,10 +173,7 @@ jobs: ios: name: iOS needs: [checks, lockfiles] - # Paused because Nitro V1 builds iOS with Swift Package Manager, which this workflow doesn't set up yet. - # Remove `false &&` to resume it. if: >- - false && !cancelled() && needs.checks.result == 'success' && (needs.lockfiles.result == 'success' || needs.lockfiles.result == 'skipped') && github.event_name != 'push' && !github.event.pull_request.draft && diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 049ea598..984e4f46 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -94,7 +94,7 @@ jobs: bun run sync:lockfile bun run check:lockfile bun install --frozen-lockfile - # The CocoaPods steps are paused because Nitro V1 doesn't support CocoaPods. + # The macOS steps are paused until Nitro V1 supports React Native macOS. - uses: ruby/setup-ruby@v1 if: false with: @@ -104,11 +104,9 @@ jobs: - name: Select Xcode if: false run: sudo xcode-select -s "/Applications/Xcode_26.5.app/Contents/Developer" - - name: Update iOS and macOS lockfiles + - name: Update macOS lockfile if: false - run: | - bun example pods - bun example pods:macos + run: bun example pods:macos - name: Commit lockfiles and optional announcement run: node scripts/commit-release-lockfiles.ts env: diff --git a/.github/workflows/test-harness-ios.yml b/.github/workflows/test-harness-ios.yml index aa931f90..26c89184 100644 --- a/.github/workflows/test-harness-ios.yml +++ b/.github/workflows/test-harness-ios.yml @@ -12,17 +12,16 @@ permissions: jobs: test: - name: iOS integration tests, ${{ matrix.config.name }}, Xcode ${{ matrix.config.xcode }} - runs-on: macos-26 + name: iOS integration tests, Xcode ${{ matrix.config.xcode }} + # Nitro V1 requires Swift 6.4, which GitHub provides in its Xcode 27 preview image. + runs-on: xcode-27 timeout-minutes: 40 strategy: matrix: - config: ${{ fromJSON(inputs.full && '[{"name":"static_frameworks","frameworks":"static","xcode":"26.5"},{"name":"no_frameworks","frameworks":"","xcode":"26.5"},{"name":"static_frameworks","frameworks":"static","xcode":"26.2"}]' || '[{"name":"static_frameworks","frameworks":"static","xcode":"26.5"},{"name":"no_frameworks","frameworks":"","xcode":"26.5"}]') }} + config: ${{ fromJSON(inputs.full && '[{"xcode":"27.0"},{"xcode":"27.1"}]' || '[{"xcode":"27.0"}]') }} env: - USE_CCACHE: 1 - USE_FRAMEWORKS: ${{ matrix.config.frameworks }} - IOS_SIMULATOR_NAME: iPhone 17 Pro - IOS_SIMULATOR_OS: ${{ matrix.config.xcode }} + IOS_SIMULATOR_NAME: iPhone 18 Pro + IOS_SIMULATOR_OS: '27.0' steps: - uses: actions/checkout@v7 - uses: actions/download-artifact@v8 @@ -41,7 +40,7 @@ jobs: uses: hendrikmuhs/ccache-action@v1.2 with: max-size: 500M - key: ${{ runner.os }}-${{ matrix.config.name }}-ccache-example-ios-xcode${{ matrix.config.xcode }} + key: ${{ runner.os }}-ccache-example-ios-xcode${{ matrix.config.xcode }} create-symlink: true - name: Setup ccache behavior run: | @@ -50,13 +49,6 @@ jobs: echo "CCACHE_DEPEND=true" >> $GITHUB_ENV echo "CCACHE_INODECACHE=true" >> $GITHUB_ENV - - name: Setup Ruby (bundle) - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.0 - bundler-cache: true - working-directory: example - - name: Select Xcode ${{ matrix.config.xcode }} run: sudo xcode-select -s "/Applications/Xcode_${{ matrix.config.xcode }}.app/Contents/Developer" @@ -79,9 +71,9 @@ jobs: xcrun simctl boot "$simulator_udid" fi - - name: Install Pods + - name: Generate Swift packages working-directory: example - run: bun pods + run: bun spm - name: Build App working-directory: example/ios @@ -90,7 +82,7 @@ jobs: xcodebuild \ CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ \ -derivedDataPath build/DerivedData -UseModernBuildSystem=YES \ - -workspace NitroSQLiteExample.xcworkspace \ + -project NitroSQLiteExample.xcodeproj \ -scheme NitroSQLiteExample \ -sdk iphonesimulator \ -configuration Debug \ @@ -104,6 +96,10 @@ jobs: timeout-minutes: 10 run: xcrun simctl bootstatus "$IOS_SIMULATOR_UDID" -b + # react-native-harness 1.5.0 fails on Xcode 27, where `simctl appinfo` errors for apps that are not installed. + - name: Install app on the iOS simulator + run: xcrun simctl install "$IOS_SIMULATOR_UDID" example/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/NitroSQLiteExample.app + - name: Run iOS integration tests uses: callstackincubator/react-native-harness@v1.6.0 env: diff --git a/.github/workflows/update-lockfiles.yml b/.github/workflows/update-lockfiles.yml index 55a1ac0d..b6802d2f 100644 --- a/.github/workflows/update-lockfiles.yml +++ b/.github/workflows/update-lockfiles.yml @@ -2,13 +2,6 @@ name: Check native lockfiles on: workflow_call: - inputs: - ios: - type: boolean - default: false - macos: - type: boolean - default: false permissions: contents: read @@ -38,12 +31,7 @@ jobs: working-directory: example - name: Select Xcode 26.5 run: sudo xcode-select -s '/Applications/Xcode_26.5.app/Contents/Developer' - - name: Refresh iOS lockfile - if: inputs.ios - working-directory: example - run: bun pods - name: Refresh macOS lockfile - if: inputs.macos working-directory: example run: bun pods:macos - name: Attach refreshed native lockfiles @@ -52,17 +40,10 @@ jobs: with: name: native-lockfiles path: | - example/ios/Podfile.lock example/macos/Podfile.lock example/Gemfile.lock retention-days: 1 - name: Require committed native dependency resolutions - env: - CHECK_IOS: ${{ inputs.ios }} - CHECK_MACOS: ${{ inputs.macos }} run: | - lockfiles=() - if [[ "$CHECK_IOS" == true ]]; then lockfiles+=(example/ios/Podfile.lock); fi - if [[ "$CHECK_MACOS" == true ]]; then lockfiles+=(example/macos/Podfile.lock); fi - ruby scripts/ci-pod-lockfiles.rb "${lockfiles[@]}" + ruby scripts/ci-pod-lockfiles.rb example/macos/Podfile.lock git diff --exit-code -- example/Gemfile.lock diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03ac47de..2e97d6ea 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,9 +24,10 @@ To run the example app on Android: bun example android ``` -To run the example app on iOS: +To run the example app on iOS, generate its Swift packages first. Run this again after changing native dependencies: ```sh +bun example spm bun example ios ``` @@ -49,7 +50,7 @@ Remember to add tests for your change if possible. Run the unit tests by: bun test ``` -To edit the Objective-C files, open `example/ios/SequelExample.xcworkspace` in XCode and find the source files at `Pods > Development Pods > react-native-nitro-sqlite`. +To edit the Objective-C++ and C++ files, open `example/ios/NitroSQLiteExample.xcodeproj` in Xcode and find the source files in the `RNNitroSQLite` package. To edit the Kotlin files, open `example/android` in Android studio and find the source files at `rnnitrosqlite` under `Android`. diff --git a/example/.eslintrc.js b/example/.eslintrc.js index f937b3da..4132d895 100644 --- a/example/.eslintrc.js +++ b/example/.eslintrc.js @@ -1,6 +1,8 @@ module.exports = { root: true, extends: '../config/.eslintrc.js', + // SwiftPM links native packages under ios/build, including this repository's packages. + ignorePatterns: ['ios/build'], parserOptions: { project: true, tsconfigRootDir: __dirname, diff --git a/example/ios/.gitignore b/example/ios/.gitignore new file mode 100644 index 00000000..c1e540af --- /dev/null +++ b/example/ios/.gitignore @@ -0,0 +1,6 @@ + +# SPM – auto-generated at build time (do not commit) +Package.resolved +build/generated/ +build/xcframeworks/ +.build/ diff --git a/example/ios/NitroSQLiteExample.xcodeproj/.spm-injected.json b/example/ios/NitroSQLiteExample.xcodeproj/.spm-injected.json new file mode 100644 index 00000000..5d6588f7 --- /dev/null +++ b/example/ios/NitroSQLiteExample.xcodeproj/.spm-injected.json @@ -0,0 +1,187 @@ +{ + "rootUuid": "83CBB9F71A601CBA00E9B192", + "target": "NitroSQLiteExample", + "targetUuid": "13B07F861A680F5B00A75B9A", + "injectedUuids": [ + "17CA21E30A8FFCB9D0FC1E35", + "27BDE9D743CB351F53154525", + "3AFDEFB917B01458307FDE0A", + "3F1E298E4A2D7CA403A328B5", + "50A8621D202A6CFB97E2C1B5", + "512EBECF5434FD7A6AF7C967", + "658A88AFBFD620F8BC6F91BA", + "69A7AB74931112BD2779B631", + "8332BE36B9C49BD2E49347C1", + "920F69A9DF98D37C8308D020", + "947DD5EF3BE079FB7F5AFF87", + "94F7C9B714A718310DA6BE9C", + "A700952B9A737913514EB28F", + "B174F870C259554596A4373B", + "C2FECF1430FDAAE3BF355839", + "D6BD17EA9023C9F39246B71F", + "F3857EDDA38AFC0011322D6D" + ], + "createdArrayFields": [ + { + "container": "project", + "key": "packageReferences" + }, + { + "container": "target", + "key": "packageProductDependencies" + } + ], + "buildSettingChanges": [ + { + "configUuid": "13B07F941A680F5B00A75B9A", + "createdArrayKeys": [ + "HEADER_SEARCH_PATHS", + "SWIFT_ACTIVE_COMPILATION_CONDITIONS", + "FRAMEWORK_SEARCH_PATHS" + ], + "appendedArrayValues": { + "OTHER_LDFLAGS": [ + "\"$(RN_SPM_REACT_BINARY)\"", + "\"$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)\"", + "\"$(RN_SPM_HERMES_BINARY)\"" + ] + }, + "createdScalars": [ + "CLANG_CXX_LANGUAGE_STANDARD", + "REACT_NATIVE_PATH", + "RN_SPM_FLAVOR", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xros*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]\"" + ], + "replacedScalars": {} + }, + { + "configUuid": "13B07F951A680F5B00A75B9A", + "createdArrayKeys": [ + "HEADER_SEARCH_PATHS", + "FRAMEWORK_SEARCH_PATHS" + ], + "appendedArrayValues": { + "OTHER_LDFLAGS": [ + "\"$(RN_SPM_REACT_BINARY)\"", + "\"$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)\"", + "\"$(RN_SPM_HERMES_BINARY)\"" + ] + }, + "createdScalars": [ + "CLANG_CXX_LANGUAGE_STANDARD", + "REACT_NATIVE_PATH", + "RN_SPM_FLAVOR", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=macosx*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xros*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xros*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]\"", + "\"RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_BINARY[sdk=xrsimulator*]\"", + "\"RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]\"" + ], + "replacedScalars": {} + } + ], + "generatedSources": {}, + "scriptPhases": {}, + "artifactsVersionOverride": null, + "configCommand": null, + "scheme": { + "file": "NitroSQLiteExample.xcscheme", + "created": false + } +} diff --git a/example/ios/NitroSQLiteExample.xcodeproj/project.pbxproj b/example/ios/NitroSQLiteExample.xcodeproj/project.pbxproj index aa4e212f..14a1b803 100644 --- a/example/ios/NitroSQLiteExample.xcodeproj/project.pbxproj +++ b/example/ios/NitroSQLiteExample.xcodeproj/project.pbxproj @@ -8,13 +8,18 @@ /* Begin PBXBuildFile section */ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 29068BA81B410DFAFD515E63 /* Pods_NitroSQLiteExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3E89C92C507841F368080BD /* Pods_NitroSQLiteExample.framework */; }; 4A947A190A327B2E26F1CC50 /* BenchmarkMemory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A947A180A327B2E26F1CC50 /* BenchmarkMemory.m */; }; 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; 7B5735B8E367752583C44170 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; A7EB6D102DCB00010003AF01 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7EB6D0F2DCB00010003AF01 /* SceneDelegate.swift */; }; D463F2F53B094E469119C69E /* load-file-with-error.sql in Resources */ = {isa = PBXBuildFile; fileRef = D463F2F53B094E469119C69F /* load-file-with-error.sql */; }; + 94F7C9B714A718310DA6BE9C /* ReactHeaders in Frameworks */ = {isa = PBXBuildFile; productRef = 512EBECF5434FD7A6AF7C967 /* ReactHeaders */;}; + 17CA21E30A8FFCB9D0FC1E35 /* ReactNativeHeaders in Frameworks */ = {isa = PBXBuildFile; productRef = 920F69A9DF98D37C8308D020 /* ReactNativeHeaders */;}; + 69A7AB74931112BD2779B631 /* ReactNativeDependenciesHeaders in Frameworks */ = {isa = PBXBuildFile; productRef = 8332BE36B9C49BD2E49347C1 /* ReactNativeDependenciesHeaders */;}; + D6BD17EA9023C9F39246B71F /* Autolinked in Frameworks */ = {isa = PBXBuildFile; productRef = 3AFDEFB917B01458307FDE0A /* Autolinked */;}; + 3F1E298E4A2D7CA403A328B5 /* ReactCodegen in Frameworks */ = {isa = PBXBuildFile; productRef = 947DD5EF3BE079FB7F5AFF87 /* ReactCodegen */;}; + 50A8621D202A6CFB97E2C1B5 /* ReactAppDependencyProvider in Frameworks */ = {isa = PBXBuildFile; productRef = F3857EDDA38AFC0011322D6D /* ReactAppDependencyProvider */;}; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -22,13 +27,10 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = NitroSQLiteExample/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NitroSQLiteExample/Info.plist; sourceTree = ""; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = NitroSQLiteExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 3B4392A12AC88292D35C810B /* Pods-NitroSQLiteExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NitroSQLiteExample.debug.xcconfig"; path = "Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample.debug.xcconfig"; sourceTree = ""; }; 4A947A180A327B2E26F1CC50 /* BenchmarkMemory.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BenchmarkMemory.m; path = NitroSQLiteExample/BenchmarkMemory.m; sourceTree = ""; }; - 5709B34CF0A7D63546082F79 /* Pods-NitroSQLiteExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NitroSQLiteExample.release.xcconfig"; path = "Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample.release.xcconfig"; sourceTree = ""; }; 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = NitroSQLiteExample/AppDelegate.swift; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = NitroSQLiteExample/LaunchScreen.storyboard; sourceTree = ""; }; A7EB6D0F2DCB00010003AF01 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SceneDelegate.swift; path = NitroSQLiteExample/SceneDelegate.swift; sourceTree = ""; }; - C3E89C92C507841F368080BD /* Pods_NitroSQLiteExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_NitroSQLiteExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D463F2F53B094E469119C69F /* load-file-with-error.sql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = "load-file-with-error.sql"; path = "NitroSQLiteExample/load-file-with-error.sql"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ @@ -38,7 +40,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 29068BA81B410DFAFD515E63 /* Pods_NitroSQLiteExample.framework in Frameworks */, + 94F7C9B714A718310DA6BE9C /* ReactHeaders in Frameworks */, + 17CA21E30A8FFCB9D0FC1E35 /* ReactNativeHeaders in Frameworks */, + 69A7AB74931112BD2779B631 /* ReactNativeDependenciesHeaders in Frameworks */, + D6BD17EA9023C9F39246B71F /* Autolinked in Frameworks */, + 3F1E298E4A2D7CA403A328B5 /* ReactCodegen in Frameworks */, + 50A8621D202A6CFB97E2C1B5 /* ReactAppDependencyProvider in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -63,8 +70,6 @@ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - C3E89C92C507841F368080BD /* Pods_NitroSQLiteExample.framework */, ); name = Frameworks; sourceTree = ""; @@ -83,7 +88,6 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, - BBD78D7AC51CEA395F1C20DB /* Pods */, ); indentWidth = 2; sourceTree = ""; @@ -98,29 +102,27 @@ name = Products; sourceTree = ""; }; - BBD78D7AC51CEA395F1C20DB /* Pods */ = { - isa = PBXGroup; - children = ( - 3B4392A12AC88292D35C810B /* Pods-NitroSQLiteExample.debug.xcconfig */, - 5709B34CF0A7D63546082F79 /* Pods-NitroSQLiteExample.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 13B07F861A680F5B00A75B9A /* NitroSQLiteExample */ = { + packageProductDependencies = ( + 512EBECF5434FD7A6AF7C967 /* ReactHeaders */, + 920F69A9DF98D37C8308D020 /* ReactNativeHeaders */, + 8332BE36B9C49BD2E49347C1 /* ReactNativeDependenciesHeaders */, + 3AFDEFB917B01458307FDE0A /* Autolinked */, + 947DD5EF3BE079FB7F5AFF87 /* ReactCodegen */, + F3857EDDA38AFC0011322D6D /* ReactAppDependencyProvider */, + ); isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "NitroSQLiteExample" */; buildPhases = ( - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, + 658A88AFBFD620F8BC6F91BA /* Sync SPM Autolinking */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, + B174F870C259554596A4373B /* Embed React Native Flavored Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -135,6 +137,11 @@ /* Begin PBXProject section */ 83CBB9F71A601CBA00E9B192 /* Project object */ = { + packageReferences = ( + 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "build/xcframeworks" */, + C2FECF1430FDAAE3BF355839 /* XCLocalSwiftPackageReference "build/generated/autolinking" */, + A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "build/generated/ios" */, + ); isa = PBXProject; attributes = { LastUpgradeCheck = 1210; @@ -193,24 +200,7 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { + 658A88AFBFD620F8BC6F91BA /* Sync SPM Autolinking */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -218,36 +208,40 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = "Sync SPM Autolinking"; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-NitroSQLiteExample-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellPath = /bin/bash; + shellScript = "set -euo pipefail\n\n# ---------------------------------------------------------------------------\n# Resolve a node binary and the react-native package dir at BUILD TIME.\n# ---------------------------------------------------------------------------\nNODE_BINARY=\"${NODE_BINARY:-}\"\nif [ -z \"$NODE_BINARY\" ]; then\n # Source RN's standard app-local node-path files. They reference vars that\n # may be unset and may return non-zero, so relax nounset AND errexit while\n # sourcing — a buggy user .xcode.env must degrade to PATH-based node\n # resolution below, not silently abort every build.\n set +eu\n if [ -f \"$SRCROOT/.xcode.env\" ]; then\n . \"$SRCROOT/.xcode.env\"\n fi\n if [ -f \"$SRCROOT/.xcode.env.local\" ]; then\n . \"$SRCROOT/.xcode.env.local\"\n fi\n set -eu\n NODE_BINARY=\"${NODE_BINARY:-}\"\nfi\nif [ -z \"$NODE_BINARY\" ]; then\n NODE_BINARY=\"$(command -v node 2>/dev/null || true)\"\nfi\n\n# Resolve react-native's dir FROM THE APP (require.resolve), not a\n# generation-time baked path — the baked path goes stale in pnpm / hoisted\n# stores. Fall back to the baked path if resolution fails or the resolved dir\n# has no setup-apple-spm.js.\nRN_DIR=\"\"\nif [ -n \"$NODE_BINARY\" ]; then\n RN_DIR=\"$(cd \"$SRCROOT\" && \"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json'))\" 2>/dev/null || true)\"\nfi\nif [ -z \"$RN_DIR\" ] || [ ! -f \"$RN_DIR/scripts/setup-apple-spm.js\" ]; then\n RN_DIR=\"../../node_modules/react-native\"\nfi\n\nSTAMP=\"$SRCROOT/build/generated/autolinking/.spm-sync-stamp\"\nSTALE=0\n\n# Find project root (where package.json lives — may be an ancestor of SRCROOT)\nPROJECT_ROOT=\"$SRCROOT\"\nwhile [ \"$PROJECT_ROOT\" != \"/\" ] && [ ! -f \"$PROJECT_ROOT/package.json\" ]; do\n PROJECT_ROOT=\"$(dirname \"$PROJECT_ROOT\")\"\ndone\nif [ ! -f \"$PROJECT_ROOT/package.json\" ]; then\n PROJECT_ROOT=\"$SRCROOT\"\nfi\n\n# Check 1: dependency inputs (covers app projects after any package manager install)\nfor INPUT in \\\n \"$PROJECT_ROOT/package.json\" \\\n \"$PROJECT_ROOT/react-native.config.js\"; do\n if [ -f \"$INPUT\" ] && [ \"$INPUT\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\ndone\n\n# Check workspace lockfiles and package-manager metadata. These cover package\n# managers that do not reliably bump node_modules mtimes, and Yarn PnP projects\n# that do not have node_modules at all.\nif [ \"$STALE\" -eq 0 ]; then\n DIR=\"$PROJECT_ROOT\"\n while [ \"$DIR\" != \"/\" ]; do\n for INPUT in \\\n \"$DIR/package-lock.json\" \\\n \"$DIR/npm-shrinkwrap.json\" \\\n \"$DIR/yarn.lock\" \\\n \"$DIR/pnpm-lock.yaml\" \\\n \"$DIR/bun.lock\" \\\n \"$DIR/bun.lockb\" \\\n \"$DIR/.pnp.cjs\" \\\n \"$DIR/.pnp.loader.mjs\"; do\n if [ -f \"$INPUT\" ] && [ \"$INPUT\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\n done\n if [ \"$STALE\" -eq 1 ]; then\n break\n fi\n DIR=\"$(dirname \"$DIR\")\"\n done\nfi\n\n# Check node_modules mtime. In monorepos, node_modules may be hoisted to any\n# ancestor between the app package and the workspace root.\nif [ \"$STALE\" -eq 0 ]; then\n DIR=\"$PROJECT_ROOT\"\n while [ \"$DIR\" != \"/\" ]; do\n NM_DIR=\"$DIR/node_modules\"\n if [ -d \"$NM_DIR\" ] && [ \"$NM_DIR\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\n DIR=\"$(dirname \"$DIR\")\"\n done\nfi\n\n# Also check the app root directly when SRCROOT is not the package root.\nif [ \"$STALE\" -eq 0 ] && [ \"$SRCROOT\" != \"$PROJECT_ROOT\" ]; then\n if [ -d \"$SRCROOT/node_modules\" ] && [ \"$SRCROOT/node_modules\" -nt \"$STAMP\" ]; then\n STALE=1\n fi\nfi\n\n# Check 1.5: watched paths (mixed dirs AND files). Dirs catch add/remove of\n# source files in spm.modules and autolinked deps (dir mtime updates on both);\n# files catch edits to a dep's checked-in Package.swift / plugin manifests that\n# would not bump any parent dir mtime. A path that has VANISHED (renamed/moved\n# module root) forces a re-sync so the autolinker surfaces the real, actionable\n# config error rather than the build failing later on dangling-symlink noise.\nWATCH_FILE=\"$SRCROOT/build/generated/autolinking/.spm-sync-watch-paths\"\nif [ \"$STALE\" -eq 0 ] && [ -f \"$WATCH_FILE\" ]; then\n while IFS= read -r P; do\n [ -z \"$P\" ] && continue\n if [ -d \"$P\" ]; then\n # .swiftpm holds Xcode's own per-user scheme state, which it rewrites\n # during a build — reading it as a change makes every IDE build re-sync.\n if [ -n \"$(find \"$P\" -name .swiftpm -prune -o -newer \"$STAMP\" -print -quit 2>/dev/null)\" ]; then\n STALE=1\n break\n fi\n elif [ -f \"$P\" ]; then\n if [ \"$P\" -nt \"$STAMP\" ]; then\n STALE=1\n break\n fi\n else\n STALE=1\n break\n fi\n done < \"$WATCH_FILE\"\nfi\n\n# Check 2: codegen spec files changed via git (covers monorepo after git pull)\nif [ \"$STALE\" -eq 0 ] && [ -f \"$STAMP\" ]; then\n STAMP_TIME=$(stat -f %m \"$STAMP\" 2>/dev/null || stat -c %Y \"$STAMP\" 2>/dev/null || echo 0)\n LATEST_SPEC_COMMIT=$(git -C \"$SRCROOT\" log -1 --format=%ct -- '*.js' '*.ts' 2>/dev/null || echo 0)\n if [ \"$LATEST_SPEC_COMMIT\" -gt \"$STAMP_TIME\" ]; then\n STALE=1\n fi\nfi\n\nif [ ! -f \"$STAMP\" ]; then\n STALE=1\nfi\n\n# Re-sync codegen + autolinking when a dependency input changed. Runtime\n# framework slots and Xcode linker settings are only changed by spm update.\nif [ \"$STALE\" -eq 1 ]; then\n echo \"SPM sync inputs changed — re-syncing (codegen + autolinking)...\"\n\n WITH_ENVIRONMENT=\"$RN_DIR/scripts/xcode/with-environment.sh\"\n\n if [ -f \"$WITH_ENVIRONMENT\" ]; then\n # with-environment.sh references PODS_ROOT and $1, which may be unset.\n # Temporarily disable nounset to avoid failures when sourcing.\n export PODS_ROOT=\"${PODS_ROOT:-$SRCROOT}\"\n set +u\n . \"$WITH_ENVIRONMENT\"\n set -u\n fi\n\n cd \"$SRCROOT\"\n # `|| RC=$?` so a non-zero exit is CAPTURED rather than aborting the phase\n # under `set -e` — the whole point is to branch on the code below (2 = fail\n # the build with a scaffold hint; other non-zero = warn but don't break).\n RC=0\n if [ -n \"$NODE_BINARY\" ] && [ -f \"$RN_DIR/scripts/setup-apple-spm.js\" ]; then\n # Direct, dependency-free dispatch (no `npx react-native`, which needs\n # @react-native-community/cli).\n \"$NODE_BINARY\" \"$RN_DIR/scripts/setup-apple-spm.js\" sync || RC=$?\n elif command -v npx >/dev/null 2>&1; then\n npx react-native spm sync || RC=$?\n else\n echo \"warning: node/npx not found — skipping SPM sync\"\n fi\n if [ \"$RC\" -eq 2 ]; then\n # Exit 2 = an autolinked community dependency has no Package.swift. The\n # autolinker already printed an `error:` line per dep (so Xcode shows them\n # and the fix). Fail the build — the developer must run\n # `npx react-native spm scaffold` from a terminal to generate the manifest.\n exit 1\n elif [ \"$RC\" -ne 0 ]; then\n echo \"warning: SPM sync failed — build may use stale codegen/autolinking\"\n fi\nfi\n\n"; }; - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { + B174F870C259554596A4373B /* Embed React Native Flavored Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "$(SRCROOT)/build/xcframeworks/.artifact-stamp", + "$(RN_SPM_REACT_FRAMEWORK)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK)", + "$(RN_SPM_HERMES_FRAMEWORK)", + ); + name = "Embed React Native Flavored Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(TARGET_BUILD_DIR)/$(FRAMEWORKS_FOLDER_PATH)/React.framework", + "$(TARGET_BUILD_DIR)/$(FRAMEWORKS_FOLDER_PATH)/ReactNativeDependencies.framework", + "$(TARGET_BUILD_DIR)/$(FRAMEWORKS_FOLDER_PATH)/hermesvm.framework", ); runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NitroSQLiteExample/Pods-NitroSQLiteExample-resources.sh\"\n"; - showEnvVarsInLog = 0; + shellPath = /bin/bash; + shellScript = "set -euo pipefail\n\ndestination=\"$TARGET_BUILD_DIR/$FRAMEWORKS_FOLDER_PATH\"\nmkdir -p \"$destination\"\n\nvalidate_framework() {\n source=\"$1\"\n name=\"$2\"\n if [ -z \"$source\" ] || [ ! -d \"$source\" ]; then\n echo \"error: React Native SwiftPM framework '$name' is unavailable for configuration '$CONFIGURATION' and SDK '$SDK_NAME': $source\"\n exit 1\n fi\n binary=\"${name%.framework}\"\n if [ ! -e \"$source/$binary\" ] && [ ! -e \"$source/Versions/Current/$binary\" ]; then\n echo \"error: React Native SwiftPM framework '$name' is invalid for configuration '$CONFIGURATION': expected $source/$binary or $source/Versions/Current/$binary\"\n exit 1\n fi\n}\n\ncopy_and_sign() {\n source=\"$1\"\n name=\"$2\"\n /usr/bin/rsync -a --delete \"$source/\" \"$destination/$name/\"\n if [ \"${CODE_SIGNING_ALLOWED:-YES}\" != \"NO\" ]; then\n identity=\"${EXPANDED_CODE_SIGN_IDENTITY:--}\"\n if [ \"$identity\" = \"-\" ]; then\n /usr/bin/codesign --force --sign - --timestamp=none --preserve-metadata=identifier,entitlements,flags \"$destination/$name\"\n else\n /usr/bin/codesign --force --sign \"$identity\" --preserve-metadata=identifier,entitlements,flags \"$destination/$name\"\n fi\n fi\n}\n\nvalidate_framework \"${RN_SPM_REACT_FRAMEWORK:-}\" \"React.framework\"\nvalidate_framework \"${RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK:-}\" \"ReactNativeDependencies.framework\"\nvalidate_framework \"${RN_SPM_HERMES_FRAMEWORK:-}\" \"hermesvm.framework\"\ncopy_and_sign \"${RN_SPM_REACT_FRAMEWORK:-}\" \"React.framework\"\ncopy_and_sign \"${RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK:-}\" \"ReactNativeDependencies.framework\"\ncopy_and_sign \"${RN_SPM_HERMES_FRAMEWORK:-}\" \"hermesvm.framework\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -267,8 +261,75 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-NitroSQLiteExample.debug.xcconfig */; buildSettings = { + "RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64"; + "RN_SPM_HERMES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_HERMES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework/Versions/1/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64"; + "RN_SPM_HERMES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64"; + "RN_SPM_HERMES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64"; + "RN_SPM_REACT_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework"; + RN_SPM_FLAVOR = debug; + REACT_NATIVE_PATH = "../../node_modules/react-native"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(RN_SPM_REACT_SEARCH_PATH)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH)", + "$(RN_SPM_HERMES_SEARCH_PATH)", + ); + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/build/generated/autolinking/headers", + ); ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; @@ -285,6 +346,9 @@ "$(inherited)", "-ObjC", "-lc++", + "$(RN_SPM_REACT_BINARY)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)", + "$(RN_SPM_HERMES_BINARY)", ); PRODUCT_BUNDLE_IDENTIFIER = com.margelo.rnnitrosqlite.example; PRODUCT_NAME = NitroSQLiteExample; @@ -296,8 +360,71 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-NitroSQLiteExample.release.xcconfig */; buildSettings = { + "RN_SPM_HERMES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64"; + "RN_SPM_HERMES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/xros-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_HERMES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework/Versions/1/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-maccatalyst/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64"; + "RN_SPM_HERMES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/ios-arm64/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_HERMES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64_x86_64-simulator/hermesvm.framework"; + "RN_SPM_HERMES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64"; + "RN_SPM_HERMES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework/hermesvm"; + "RN_SPM_HERMES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/hermes-engine.xcframework/tvos-arm64/hermesvm.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xrsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=xros*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/xros-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-maccatalyst/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/ios-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvsimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64_x86_64-simulator/ReactNativeDependencies.framework"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework/ReactNativeDependencies"; + "RN_SPM_REACT_NATIVE_DEPENDENCIES_FRAMEWORK[sdk=appletvos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/ReactNativeDependencies.xcframework/tvos-arm64/ReactNativeDependencies.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst"; + "RN_SPM_REACT_BINARY[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=macosx*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-maccatalyst/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator"; + "RN_SPM_REACT_BINARY[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphonesimulator*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64_x86_64-simulator/React.framework"; + "RN_SPM_REACT_SEARCH_PATH[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64"; + "RN_SPM_REACT_BINARY[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework/React"; + "RN_SPM_REACT_FRAMEWORK[sdk=iphoneos*]" = "$(SRCROOT)/build/xcframeworks/$(RN_SPM_FLAVOR)/React.xcframework/ios-arm64/React.framework"; + RN_SPM_FLAVOR = release; + REACT_NATIVE_PATH = "../../node_modules/react-native"; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(RN_SPM_REACT_SEARCH_PATH)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_SEARCH_PATH)", + "$(RN_SPM_HERMES_SEARCH_PATH)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/build/generated/autolinking/headers", + ); ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = 1; @@ -313,6 +440,9 @@ "$(inherited)", "-ObjC", "-lc++", + "$(RN_SPM_REACT_BINARY)", + "$(RN_SPM_REACT_NATIVE_DEPENDENCIES_BINARY)", + "$(RN_SPM_HERMES_BINARY)", ); PRODUCT_BUNDLE_IDENTIFIER = com.margelo.rnnitrosqlite.example; PRODUCT_NAME = NitroSQLiteExample; @@ -575,6 +705,21 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ +/* Begin XCLocalSwiftPackageReference section */ + 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "build/xcframeworks" */ = {isa = XCLocalSwiftPackageReference; relativePath = build/xcframeworks;}; + C2FECF1430FDAAE3BF355839 /* XCLocalSwiftPackageReference "build/generated/autolinking" */ = {isa = XCLocalSwiftPackageReference; relativePath = build/generated/autolinking;}; + A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "build/generated/ios" */ = {isa = XCLocalSwiftPackageReference; relativePath = build/generated/ios;}; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 512EBECF5434FD7A6AF7C967 /* ReactHeaders */ = {isa = XCSwiftPackageProductDependency; package = 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "build/xcframeworks" */; productName = ReactHeaders;}; + 920F69A9DF98D37C8308D020 /* ReactNativeHeaders */ = {isa = XCSwiftPackageProductDependency; package = 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "build/xcframeworks" */; productName = ReactNativeHeaders;}; + 8332BE36B9C49BD2E49347C1 /* ReactNativeDependenciesHeaders */ = {isa = XCSwiftPackageProductDependency; package = 27BDE9D743CB351F53154525 /* XCLocalSwiftPackageReference "build/xcframeworks" */; productName = ReactNativeDependenciesHeaders;}; + 3AFDEFB917B01458307FDE0A /* Autolinked */ = {isa = XCSwiftPackageProductDependency; package = C2FECF1430FDAAE3BF355839 /* XCLocalSwiftPackageReference "build/generated/autolinking" */; productName = Autolinked;}; + 947DD5EF3BE079FB7F5AFF87 /* ReactCodegen */ = {isa = XCSwiftPackageProductDependency; package = A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "build/generated/ios" */; productName = ReactCodegen;}; + F3857EDDA38AFC0011322D6D /* ReactAppDependencyProvider */ = {isa = XCSwiftPackageProductDependency; package = A700952B9A737913514EB28F /* XCLocalSwiftPackageReference "build/generated/ios" */; productName = ReactAppDependencyProvider;}; +/* End XCSwiftPackageProductDependency section */ + }; rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; } diff --git a/example/ios/NitroSQLiteExample.xcodeproj/xcshareddata/xcschemes/NitroSQLiteExample.xcscheme b/example/ios/NitroSQLiteExample.xcodeproj/xcshareddata/xcschemes/NitroSQLiteExample.xcscheme index cb48a5b1..d03281ff 100644 --- a/example/ios/NitroSQLiteExample.xcodeproj/xcshareddata/xcschemes/NitroSQLiteExample.xcscheme +++ b/example/ios/NitroSQLiteExample.xcodeproj/xcshareddata/xcschemes/NitroSQLiteExample.xcscheme @@ -5,6 +5,215 @@ + + + + + + + + + + - - - - - - diff --git a/example/ios/NitroSQLiteExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/NitroSQLiteExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/example/ios/NitroSQLiteExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/example/ios/Podfile b/example/ios/Podfile index 4112c136..59feb741 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,45 +1,2 @@ -ENV['RCT_NEW_ARCH_ENABLED'] = '1' -# Default to static frameworks locally, while allowing CI to select either mode. -ENV['USE_FRAMEWORKS'] ||= 'static' -ENV['NITRO_SQLITE_VEC'] = '1' - -# Resolve react_native_pods.rb with node to allow for hoisting -require Pod::Executable.execute_command('node', ['-p', - 'require.resolve( - "react-native/scripts/react_native_pods.rb", - {paths: [process.argv[1]]}, - )', __dir__]).strip - -platform :ios, min_ios_version_supported -prepare_react_native_project! - -linkage = ENV['USE_FRAMEWORKS'] -unless linkage.to_s.empty? - Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green - use_frameworks! :linkage => linkage.to_sym -end - -target 'NitroSQLiteExample' do - config = use_native_modules! - - use_react_native!( - :path => config[:reactNativePath], - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/.." - ) - - post_install do |installer| - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false, - :ccache_enabled => ENV['USE_CCACHE'] == '1' - ) - - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['DEAD_CODE_STRIPPING'] = 'YES' - end - end - end -end +# React Native CLI 20 uses this file to discover the iOS project. +# All native dependencies are built through Swift Package Manager. diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock deleted file mode 100644 index 8a61cb30..00000000 --- a/example/ios/Podfile.lock +++ /dev/null @@ -1,2321 +0,0 @@ -PODS: - - boost (1.84.0): - - ReactNativeDependencies - - DoubleConversion (1.1.6): - - ReactNativeDependencies - - fast_float (8.0.0): - - ReactNativeDependencies - - FBLazyVector (0.88.0): - - React-Core-prebuilt - - fmt (12.1.0): - - ReactNativeDependencies - - glog (0.3.5): - - ReactNativeDependencies - - hermes-engine (260318099.0.4): - - hermes-engine/Pre-built (= 260318099.0.4) - - hermes-engine/Pre-built (260318099.0.4) - - NitroModules (0.37.1): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-callinvoker - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - RCT-Folly (2024.11.18.00): - - RCT-Folly/Default (= 2024.11.18.00) - - ReactNativeDependencies - - RCT-Folly/Default (2024.11.18.00): - - ReactNativeDependencies - - RCTDeprecation (0.88.0): - - React-Core-prebuilt - - RCTRequired (0.88.0): - - React-Core-prebuilt - - RCTSwiftUI (0.88.0) - - RCTSwiftUIWrapper (0.88.0): - - RCTSwiftUI - - RCTTypeSafety (0.88.0): - - FBLazyVector (= 0.88.0) - - RCTRequired (= 0.88.0) - - React-Core (= 0.88.0) - - React (0.88.0): - - React-Core (= 0.88.0) - - React-Core/DevSupport (= 0.88.0) - - React-Core/RCTWebSocket (= 0.88.0) - - React-RCTActionSheet (= 0.88.0) - - React-RCTAnimation (= 0.88.0) - - React-RCTBlob (= 0.88.0) - - React-RCTImage (= 0.88.0) - - React-RCTLinking (= 0.88.0) - - React-RCTNetwork (= 0.88.0) - - React-RCTSettings (= 0.88.0) - - React-RCTText (= 0.88.0) - - React-RCTVibration (= 0.88.0) - - React-bridging (0.88.0): - - React-callinvoker - - React-Core-prebuilt - - React-jsi - - React-timing - - ReactNativeDependencies - - React-callinvoker (0.88.0): - - React-callinvoker/callinvokerUmbrella (= 0.88.0) - - React-cxxstableapi - - React-callinvoker/callinvokerUmbrella (0.88.0): - - React-cxxstableapi - - React-Core (0.88.0): - - React-Core-prebuilt - - React-Core/Default (= 0.88.0) - - React-Core-prebuilt (0.88.0): - - ReactNativeDependencies - - React-Core/CoreModulesHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/Default (0.88.0): - - React-Core-prebuilt - - React-Core/DevSupport (0.88.0): - - React-Core-prebuilt - - React-Core/RCTActionSheetHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTAnimationHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTBlobHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTImageHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTLinkingHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTNetworkHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTSettingsHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTTextHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTVibrationHeaders (0.88.0): - - React-Core-prebuilt - - React-Core/RCTWebSocket (0.88.0): - - React-Core-prebuilt - - React-CoreModules (0.88.0): - - RCTTypeSafety (= 0.88.0) - - React-Core-prebuilt - - React-Core/CoreModulesHeaders (= 0.88.0) - - React-debug - - React-featureflags - - React-jsi (= 0.88.0) - - React-jsinspector - - React-jsinspectorcdp - - React-jsinspectortracing - - React-NativeModulesApple - - React-networking - - React-RCTBlob - - React-RCTFBReactNativeSpec - - React-RCTImage (= 0.88.0) - - React-runtimeexecutor - - React-utils - - ReactCommon - - ReactNativeDependencies - - React-cxxreact (0.88.0): - - hermes-engine - - React-callinvoker (= 0.88.0) - - React-Core-prebuilt - - React-debug (= 0.88.0) - - React-jserrorhandler (= 0.88.0) - - React-jsi (= 0.88.0) - - React-jsinspector - - React-jsinspectorcdp - - React-jsinspectortracing - - React-logger (= 0.88.0) - - React-perflogger (= 0.88.0) - - React-runtimeexecutor - - React-timing (= 0.88.0) - - React-utils - - ReactNativeDependencies - - React-cxxstableapi (0.88.0) - - React-debug (0.88.0): - - React-cxxstableapi - - React-debug/debugUmbrella (= 0.88.0) - - React-debug/redbox (= 0.88.0) - - React-debug/debugUmbrella (0.88.0): - - React-cxxstableapi - - React-debug/redbox (0.88.0): - - React-cxxstableapi - - React-defaultsnativemodule (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxstableapi - - React-domnativemodule - - React-Fabric/animated - - React-featureflags - - React-featureflagsnativemodule - - React-idlecallbacksnativemodule - - React-intersectionobservernativemodule - - React-jsi - - React-jsiexecutor - - React-microtasksnativemodule - - React-mutationobservernativemodule - - React-RCTFBReactNativeSpec - - React-resizeobservernativemodule - - React-viewtransitionnativemodule - - React-webperformancenativemodule - - ReactNativeDependencies - - Yoga - - React-domnativemodule (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxstableapi - - React-Fabric - - React-Fabric/bridging - - React-FabricComponents - - React-graphics - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-Fabric (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric/animated (= 0.88.0) - - React-Fabric/animationbackend (= 0.88.0) - - React-Fabric/animations (= 0.88.0) - - React-Fabric/attributedstring (= 0.88.0) - - React-Fabric/bridging (= 0.88.0) - - React-Fabric/componentregistry (= 0.88.0) - - React-Fabric/componentregistrynative (= 0.88.0) - - React-Fabric/components (= 0.88.0) - - React-Fabric/consistency (= 0.88.0) - - React-Fabric/core (= 0.88.0) - - React-Fabric/dom (= 0.88.0) - - React-Fabric/imagemanager (= 0.88.0) - - React-Fabric/leakchecker (= 0.88.0) - - React-Fabric/mounting (= 0.88.0) - - React-Fabric/observers (= 0.88.0) - - React-Fabric/scheduler (= 0.88.0) - - React-Fabric/telemetry (= 0.88.0) - - React-Fabric/uimanager (= 0.88.0) - - React-Fabric/viewtransition (= 0.88.0) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/animated (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric/animationbackend - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/animationbackend (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/animations (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/attributedstring (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/bridging (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/componentregistry (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/componentregistrynative (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.88.0) - - React-Fabric/components/root (= 0.88.0) - - React-Fabric/components/scrollview (= 0.88.0) - - React-Fabric/components/view (= 0.88.0) - - React-Fabric/components/viewUmbrella (= 0.88.0) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/legacyviewmanagerinterop (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/root (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/scrollview (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/components/view (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-renderercss - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-Fabric/components/viewUmbrella (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/consistency (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/core (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/dom (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/imagemanager (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/leakchecker (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/mounting (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-jsinspectortracing - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric/observers/events (= 0.88.0) - - React-Fabric/observers/intersection (= 0.88.0) - - React-Fabric/observers/mutation (= 0.88.0) - - React-Fabric/observers/resize (= 0.88.0) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/events (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/intersection (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/mutation (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/observers/resize (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/scheduler (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric/animationbackend - - React-Fabric/observers/events - - React-Fabric/viewtransition - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-performancecdpmetrics - - React-performancetimeline - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/telemetry (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/uimanager (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric/uimanager/consistency (= 0.88.0) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/uimanager/consistency (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-Fabric/viewtransition (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-FabricComponents (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.88.0) - - React-FabricComponents/textlayoutmanager (= 0.88.0) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.88.0) - - React-FabricComponents/components/iostextinput (= 0.88.0) - - React-FabricComponents/components/modal (= 0.88.0) - - React-FabricComponents/components/rncore (= 0.88.0) - - React-FabricComponents/components/safeareaview (= 0.88.0) - - React-FabricComponents/components/switch (= 0.88.0) - - React-FabricComponents/components/text (= 0.88.0) - - React-FabricComponents/components/textinput (= 0.88.0) - - React-FabricComponents/components/unimplementedview (= 0.88.0) - - React-FabricComponents/components/virtualview (= 0.88.0) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/inputaccessory (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/iostextinput (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/modal (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/rncore (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/safeareaview (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/switch (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/text (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/textinput (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/unimplementedview (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/components/virtualview (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricComponents/textlayoutmanager (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-RCTFBReactNativeSpec - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-FabricImage (0.88.0): - - hermes-engine - - RCTRequired (= 0.88.0) - - RCTTypeSafety (= 0.88.0) - - React-Core-prebuilt - - React-cxxstableapi - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-jsiexecutor (= 0.88.0) - - React-logger - - React-rendererdebug - - React-utils - - ReactCommon - - ReactNativeDependencies - - Yoga - - React-featureflags (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - React-featureflags/featureflagsUmbrella (= 0.88.0) - - ReactNativeDependencies - - React-featureflags/featureflagsUmbrella (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - ReactNativeDependencies - - React-featureflagsnativemodule (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxstableapi - - React-featureflags - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-graphics (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-featureflags - - React-jsi - - React-jsiexecutor - - React-rendererdebug - - React-utils - - ReactNativeDependencies - - React-hermes (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxreact (= 0.88.0) - - React-cxxstableapi - - React-jsi - - React-jsiexecutor (= 0.88.0) - - React-jsinspector - - React-jsinspectorcdp - - React-jsinspectortracing - - React-jsitooling - - React-oscompat - - React-perflogger (= 0.88.0) - - React-runtimeexecutor - - ReactNativeDependencies - - React-idlecallbacksnativemodule (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxstableapi - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - React-runtimescheduler - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-ImageManager (0.88.0): - - React-Core-prebuilt - - React-Core/Default - - React-cxxstableapi - - React-debug - - React-Fabric - - React-graphics - - React-rendererdebug - - React-utils - - ReactNativeDependencies - - React-intersectionobservernativemodule (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-Fabric - - React-Fabric/bridging - - React-graphics - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - React-runtimescheduler - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-jserrorhandler (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-featureflags - - React-jsi - - ReactNativeDependencies - - React-jsi (0.88.0): - - hermes-engine - - React-Core-prebuilt - - ReactNativeDependencies - - React-jsiexecutor (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-jserrorhandler - - React-jsi - - React-jsinspector - - React-jsinspectorcdp - - React-jsinspectortracing - - React-jsitooling - - React-perflogger - - React-runtimeexecutor - - React-utils - - ReactNativeDependencies - - React-jsinspector (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-featureflags - - React-jsi - - React-jsinspectorcdp - - React-jsinspectornetwork - - React-jsinspectortracing - - React-oscompat - - React-perflogger (= 0.88.0) - - React-runtimeexecutor - - React-utils - - ReactNativeDependencies - - React-jsinspectorcdp (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - ReactNativeDependencies - - React-jsinspectornetwork (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - React-jsinspectorcdp - - ReactNativeDependencies - - React-jsinspectortracing (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxstableapi - - React-jsi - - React-jsinspectornetwork - - React-oscompat - - React-timing - - React-utils - - ReactNativeDependencies - - React-jsitooling (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxreact (= 0.88.0) - - React-cxxstableapi - - React-debug - - React-jsi (= 0.88.0) - - React-jsinspector - - React-jsinspectorcdp - - React-jsinspectortracing - - React-runtimeexecutor - - React-utils - - ReactNativeDependencies - - React-jsitracing (0.88.0): - - React-jsi - - React-logger (0.88.0): - - React-Core-prebuilt - - ReactNativeDependencies - - React-Mapbuffer (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Mapbuffer/mapbufferUmbrella (= 0.88.0) - - ReactNativeDependencies - - React-Mapbuffer/mapbufferUmbrella (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - ReactNativeDependencies - - React-microtasksnativemodule (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxstableapi - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-mutationobservernativemodule (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-Fabric - - React-Fabric/bridging - - React-Fabric/observers/mutation - - React-featureflags - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - react-native-safe-area-context (5.10.1): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - react-native-safe-area-context/common (= 5.10.1) - - react-native-safe-area-context/fabric (= 5.10.1) - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - react-native-safe-area-context/common (5.10.1): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - react-native-safe-area-context/fabric (5.10.1): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - react-native-safe-area-context/common - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-NativeModulesApple (0.88.0): - - hermes-engine - - React-bridging - - React-callinvoker - - React-Core - - React-Core-prebuilt - - React-cxxreact - - React-debug - - React-featureflags - - React-jsi - - React-jsinspector - - React-jsinspectorcdp - - React-runtimeexecutor - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - React-networking (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - React-jsinspectornetwork - - React-jsinspectortracing - - React-performancetimeline - - React-timing - - ReactNativeDependencies - - React-oscompat (0.88.0): - - React-cxxstableapi - - React-perflogger (0.88.0): - - React-Core-prebuilt - - ReactNativeDependencies - - React-performancecdpmetrics (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxstableapi - - React-jsi - - React-performancetimeline - - React-runtimeexecutor - - React-timing - - ReactNativeDependencies - - React-performancetimeline (0.88.0): - - React-Core-prebuilt - - React-cxxstableapi - - React-featureflags - - React-jsinspector - - React-jsinspectortracing - - React-perflogger - - React-timing - - ReactNativeDependencies - - React-RCTActionSheet (0.88.0): - - React-Core/RCTActionSheetHeaders (= 0.88.0) - - React-RCTAnimatedModuleProvider (0.88.0): - - hermes-engine - - React-Core - - React-Core-prebuilt - - React-Fabric/animated - - React-featureflags - - ReactCommon - - ReactNativeDependencies - - Yoga - - React-RCTAnimation (0.88.0): - - RCTTypeSafety - - React-Core-prebuilt - - React-Core/RCTAnimationHeaders - - React-debug - - React-featureflags - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactNativeDependencies - - React-RCTAppDelegate (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-Core - - React-Core-prebuilt - - React-CoreModules - - React-debug - - React-defaultsnativemodule - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-jsitooling - - React-NativeModulesApple - - React-RCTAnimatedModuleProvider - - React-RCTFabric - - React-RCTFBReactNativeSpec - - React-RCTImage - - React-RCTLinking - - React-RCTNetwork - - React-RCTRuntime - - React-rendererdebug - - React-RuntimeApple - - React-RuntimeCore - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactCommon - - ReactNativeDependencies - - React-RCTBlob (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-jsinspector - - React-jsinspectorcdp - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - React-RCTNetwork - - ReactCommon - - ReactNativeDependencies - - React-RCTFabric (0.88.0): - - React-Core-prebuilt - - React-RCTFBReactNativeSpec (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec/components (= 0.88.0) - - ReactCommon - - ReactNativeDependencies - - React-RCTFBReactNativeSpec/components (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-NativeModulesApple - - React-rendererdebug - - React-utils - - ReactCommon - - ReactNativeDependencies - - Yoga - - React-RCTImage (0.88.0): - - RCTTypeSafety - - React-Core-prebuilt - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - React-RCTNetwork - - ReactCommon - - ReactNativeDependencies - - React-RCTLinking (0.88.0): - - React-Core/RCTLinkingHeaders (= 0.88.0) - - React-jsi (= 0.88.0) - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactCommon/turbomodule/core (= 0.88.0) - - React-RCTNetwork (0.88.0): - - RCTTypeSafety - - React-Core-prebuilt - - React-Core/RCTNetworkHeaders - - React-debug - - React-featureflags - - React-jsi - - React-jsinspectorcdp - - React-jsinspectornetwork - - React-NativeModulesApple - - React-networking - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactNativeDependencies - - React-RCTRuntime (0.88.0): - - React-Core-prebuilt - - React-RCTSettings (0.88.0): - - RCTTypeSafety - - React-Core-prebuilt - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactNativeDependencies - - React-RCTText (0.88.0): - - React-Core/RCTTextHeaders (= 0.88.0) - - Yoga - - React-RCTVibration (0.88.0): - - React-Core-prebuilt - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTFBReactNativeSpec - - ReactCommon - - ReactNativeDependencies - - React-rendererconsistency (0.88.0) - - React-renderercss (0.88.0): - - React-debug - - React-utils - - React-rendererdebug (0.88.0): - - React-Core-prebuilt - - React-debug - - ReactNativeDependencies - - React-resizeobservernativemodule (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-Fabric - - React-Fabric/bridging - - React-Fabric/observers/resize - - React-graphics - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - React-runtimescheduler - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-RuntimeApple (0.88.0): - - hermes-engine - - React-callinvoker - - React-Core-prebuilt - - React-Core/Default - - React-CoreModules - - React-cxxreact - - React-cxxstableapi - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-Mapbuffer - - React-NativeModulesApple - - React-RCTFabric - - React-RCTFBReactNativeSpec - - React-RuntimeCore - - React-runtimeexecutor - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - ReactNativeDependencies - - React-RuntimeCore (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-Fabric - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-jsitooling - - React-performancetimeline - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - ReactNativeDependencies - - React-runtimeexecutor (0.88.0): - - React-Core-prebuilt - - React-debug - - React-featureflags - - React-jsi (= 0.88.0) - - React-utils - - ReactNativeDependencies - - React-RuntimeHermes (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-cxxstableapi - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-jsinspectorcdp - - React-jsinspectortracing - - React-jsitooling - - React-jsitracing - - React-RuntimeCore - - React-runtimeexecutor - - React-utils - - ReactNativeDependencies - - React-runtimescheduler (0.88.0): - - hermes-engine - - React-callinvoker - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-debug - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsinspectortracing - - React-performancetimeline - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-timing - - React-utils - - ReactNativeDependencies - - React-timing (0.88.0): - - React-cxxstableapi - - React-debug - - React-timing/timingUmbrella (= 0.88.0) - - React-timing/timingUmbrella (0.88.0): - - React-cxxstableapi - - React-debug - - React-utils (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-debug - - React-jsi (= 0.88.0) - - ReactNativeDependencies - - React-viewtransitionnativemodule (0.88.0): - - hermes-engine - - React-Core-prebuilt - - React-Fabric - - React-Fabric/bridging - - React-jsi - - React-jsiexecutor - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - React-webperformancenativemodule (0.88.0): - - hermes-engine - - React-bridging - - React-Core-prebuilt - - React-cxxreact - - React-cxxstableapi - - React-jsi - - React-jsiexecutor - - React-performancetimeline - - React-RCTFBReactNativeSpec - - React-runtimeexecutor - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - ReactAppDependencyProvider (0.88.0): - - ReactCodegen - - ReactCodegen (0.88.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-debug - - React-Fabric - - React-FabricImage - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-RCTAppDelegate - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - ReactCommon (0.88.0): - - React-Core-prebuilt - - ReactCommon/turbomodule (= 0.88.0) - - ReactNativeDependencies - - ReactCommon/turbomodule (0.88.0): - - hermes-engine - - React-callinvoker (= 0.88.0) - - React-Core-prebuilt - - React-jsi (= 0.88.0) - - React-logger (= 0.88.0) - - React-perflogger (= 0.88.0) - - ReactCommon/turbomodule/core (= 0.88.0) - - ReactNativeDependencies - - ReactCommon/turbomodule/core (0.88.0): - - hermes-engine - - React-bridging - - React-callinvoker (= 0.88.0) - - React-Core-prebuilt - - React-cxxreact (= 0.88.0) - - React-debug (= 0.88.0) - - React-featureflags (= 0.88.0) - - React-jsi (= 0.88.0) - - React-logger (= 0.88.0) - - React-perflogger (= 0.88.0) - - React-utils (= 0.88.0) - - ReactNativeDependencies - - ReactNativeDependencies (0.88.0) - - RNCClipboard (1.16.3): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - RNNitroSQLite (10.2.0): - - hermes-engine - - NitroModules - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - RNNitroSqliteVec (10.2.0): - - RNNitroSQLite - - RNScreens (4.30.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - RNScreens/common (= 4.30.0) - - Yoga - - RNScreens/common (4.30.0): - - hermes-engine - - RCTRequired - - RCTTypeSafety - - React-bridging - - React-Core - - React-Core-prebuilt - - React-cxxstableapi - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-renderercss - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - ReactNativeDependencies - - Yoga - - SocketRocket (0.7.1): - - ReactNativeDependencies - - Yoga (0.0.0): - - React-Core-prebuilt - -DEPENDENCIES: - - boost (from `build/rndeps-facades/boost`) - - DoubleConversion (from `build/rndeps-facades/DoubleConversion`) - - fast_float (from `build/rndeps-facades/fast_float`) - - FBLazyVector (from `build/rncore-facades/FBLazyVector`) - - fmt (from `build/rndeps-facades/fmt`) - - glog (from `build/rndeps-facades/glog`) - - hermes-engine (from `../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - - NitroModules (from `../../node_modules/react-native-nitro-modules`) - - RCT-Folly (from `build/rndeps-facades/RCT-Folly`) - - RCTDeprecation (from `build/rncore-facades/RCTDeprecation`) - - RCTRequired (from `build/rncore-facades/RCTRequired`) - - RCTSwiftUI (from `../../node_modules/react-native/ReactApple/RCTSwiftUI`) - - RCTSwiftUIWrapper (from `../../node_modules/react-native/ReactApple/RCTSwiftUIWrapper`) - - RCTTypeSafety (from `../../node_modules/react-native/Libraries/TypeSafety`) - - React (from `../../node_modules/react-native/`) - - React-bridging (from `../../node_modules/react-native/ReactCommon/react/bridging`) - - React-callinvoker (from `../../node_modules/react-native/ReactCommon/callinvoker`) - - React-Core (from `build/rncore-facades/React-Core`) - - React-Core-prebuilt (from `../../node_modules/react-native/React-Core-prebuilt.podspec`) - - React-Core/RCTWebSocket (from `build/rncore-facades/React-Core`) - - React-CoreModules (from `../../node_modules/react-native/React/CoreModules`) - - React-cxxreact (from `../../node_modules/react-native/ReactCommon/cxxreact`) - - React-cxxstableapi (from `../../node_modules/react-native/ReactCommon/react/cxxstableapi`) - - React-debug (from `../../node_modules/react-native/ReactCommon/react/debug`) - - React-defaultsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/defaults`) - - React-domnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/dom`) - - React-Fabric (from `../../node_modules/react-native/ReactCommon`) - - React-FabricComponents (from `../../node_modules/react-native/ReactCommon`) - - React-FabricImage (from `../../node_modules/react-native/ReactCommon`) - - React-featureflags (from `../../node_modules/react-native/ReactCommon/react/featureflags`) - - React-featureflagsnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`) - - React-graphics (from `../../node_modules/react-native/ReactCommon/react/renderer/graphics`) - - React-hermes (from `../../node_modules/react-native/ReactCommon/hermes`) - - React-idlecallbacksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`) - - React-ImageManager (from `../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) - - React-intersectionobservernativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver`) - - React-jserrorhandler (from `../../node_modules/react-native/ReactCommon/jserrorhandler`) - - React-jsi (from `../../node_modules/react-native/ReactCommon/jsi`) - - React-jsiexecutor (from `../../node_modules/react-native/ReactCommon/jsiexecutor`) - - React-jsinspector (from `../../node_modules/react-native/ReactCommon/jsinspector-modern`) - - React-jsinspectorcdp (from `../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`) - - React-jsinspectornetwork (from `../../node_modules/react-native/ReactCommon/jsinspector-modern/network`) - - React-jsinspectortracing (from `../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`) - - React-jsitooling (from `../../node_modules/react-native/ReactCommon/jsitooling`) - - React-jsitracing (from `../../node_modules/react-native/ReactCommon/hermes/executor/`) - - React-logger (from `../../node_modules/react-native/ReactCommon/logger`) - - React-Mapbuffer (from `../../node_modules/react-native/ReactCommon`) - - React-microtasksnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) - - React-mutationobservernativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver`) - - react-native-safe-area-context (from `../../node_modules/react-native-safe-area-context`) - - React-NativeModulesApple (from `../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - React-networking (from `../../node_modules/react-native/ReactCommon/react/networking`) - - React-oscompat (from `../../node_modules/react-native/ReactCommon/oscompat`) - - React-perflogger (from `../../node_modules/react-native/ReactCommon/reactperflogger`) - - React-performancecdpmetrics (from `../../node_modules/react-native/ReactCommon/react/performance/cdpmetrics`) - - React-performancetimeline (from `../../node_modules/react-native/ReactCommon/react/performance/timeline`) - - React-RCTActionSheet (from `../../node_modules/react-native/Libraries/ActionSheetIOS`) - - React-RCTAnimatedModuleProvider (from `../../node_modules/react-native/ReactApple/RCTAnimatedModuleProvider`) - - React-RCTAnimation (from `../../node_modules/react-native/Libraries/NativeAnimation`) - - React-RCTAppDelegate (from `../../node_modules/react-native/Libraries/AppDelegate`) - - React-RCTBlob (from `../../node_modules/react-native/Libraries/Blob`) - - React-RCTFabric (from `build/rncore-facades/React-RCTFabric`) - - React-RCTFBReactNativeSpec (from `../../node_modules/react-native/React`) - - React-RCTImage (from `../../node_modules/react-native/Libraries/Image`) - - React-RCTLinking (from `../../node_modules/react-native/Libraries/LinkingIOS`) - - React-RCTNetwork (from `../../node_modules/react-native/Libraries/Network`) - - React-RCTRuntime (from `build/rncore-facades/React-RCTRuntime`) - - React-RCTSettings (from `../../node_modules/react-native/Libraries/Settings`) - - React-RCTText (from `../../node_modules/react-native/Libraries/Text`) - - React-RCTVibration (from `../../node_modules/react-native/Libraries/Vibration`) - - React-rendererconsistency (from `../../node_modules/react-native/ReactCommon/react/renderer/consistency`) - - React-renderercss (from `../../node_modules/react-native/ReactCommon/react/renderer/css`) - - React-rendererdebug (from `../../node_modules/react-native/ReactCommon/react/renderer/debug`) - - React-resizeobservernativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/resizeobserver`) - - React-RuntimeApple (from `../../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) - - React-RuntimeCore (from `../../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimeexecutor (from `../../node_modules/react-native/ReactCommon/runtimeexecutor`) - - React-RuntimeHermes (from `../../node_modules/react-native/ReactCommon/react/runtime`) - - React-runtimescheduler (from `../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) - - React-timing (from `../../node_modules/react-native/ReactCommon/react/timing`) - - React-utils (from `../../node_modules/react-native/ReactCommon/react/utils`) - - React-viewtransitionnativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition`) - - React-webperformancenativemodule (from `../../node_modules/react-native/ReactCommon/react/nativemodule/webperformance`) - - ReactAppDependencyProvider (from `build/generated/ios/ReactAppDependencyProvider`) - - ReactCodegen (from `build/generated/ios/ReactCodegen`) - - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`) - - ReactNativeDependencies (from `../../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec`) - - "RNCClipboard (from `../../node_modules/@react-native-clipboard/clipboard`)" - - RNNitroSQLite (from `../../packages/react-native-nitro-sqlite`) - - RNNitroSqliteVec (from `../../node_modules/react-native-nitro-sqlite-vec`) - - RNScreens (from `../../node_modules/react-native-screens`) - - SocketRocket (from `build/rndeps-facades/SocketRocket`) - - Yoga (from `build/rncore-facades/Yoga`) - -EXTERNAL SOURCES: - boost: - :path: build/rndeps-facades/boost - DoubleConversion: - :path: build/rndeps-facades/DoubleConversion - fast_float: - :path: build/rndeps-facades/fast_float - FBLazyVector: - :path: build/rncore-facades/FBLazyVector - fmt: - :path: build/rndeps-facades/fmt - glog: - :path: build/rndeps-facades/glog - hermes-engine: - :podspec: "../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" - :tag: hermes-v260318099.0.2 - NitroModules: - :path: "../../node_modules/react-native-nitro-modules" - RCT-Folly: - :path: build/rndeps-facades/RCT-Folly - RCTDeprecation: - :path: build/rncore-facades/RCTDeprecation - RCTRequired: - :path: build/rncore-facades/RCTRequired - RCTSwiftUI: - :path: "../../node_modules/react-native/ReactApple/RCTSwiftUI" - RCTSwiftUIWrapper: - :path: "../../node_modules/react-native/ReactApple/RCTSwiftUIWrapper" - RCTTypeSafety: - :path: "../../node_modules/react-native/Libraries/TypeSafety" - React: - :path: "../../node_modules/react-native/" - React-bridging: - :path: "../../node_modules/react-native/ReactCommon/react/bridging" - React-callinvoker: - :path: "../../node_modules/react-native/ReactCommon/callinvoker" - React-Core: - :path: build/rncore-facades/React-Core - React-Core-prebuilt: - :podspec: "../../node_modules/react-native/React-Core-prebuilt.podspec" - React-CoreModules: - :path: "../../node_modules/react-native/React/CoreModules" - React-cxxreact: - :path: "../../node_modules/react-native/ReactCommon/cxxreact" - React-cxxstableapi: - :path: "../../node_modules/react-native/ReactCommon/react/cxxstableapi" - React-debug: - :path: "../../node_modules/react-native/ReactCommon/react/debug" - React-defaultsnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/defaults" - React-domnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/dom" - React-Fabric: - :path: "../../node_modules/react-native/ReactCommon" - React-FabricComponents: - :path: "../../node_modules/react-native/ReactCommon" - React-FabricImage: - :path: "../../node_modules/react-native/ReactCommon" - React-featureflags: - :path: "../../node_modules/react-native/ReactCommon/react/featureflags" - React-featureflagsnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags" - React-graphics: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/graphics" - React-hermes: - :path: "../../node_modules/react-native/ReactCommon/hermes" - React-idlecallbacksnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" - React-ImageManager: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" - React-intersectionobservernativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/intersectionobserver" - React-jserrorhandler: - :path: "../../node_modules/react-native/ReactCommon/jserrorhandler" - React-jsi: - :path: "../../node_modules/react-native/ReactCommon/jsi" - React-jsiexecutor: - :path: "../../node_modules/react-native/ReactCommon/jsiexecutor" - React-jsinspector: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern" - React-jsinspectorcdp: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp" - React-jsinspectornetwork: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/network" - React-jsinspectortracing: - :path: "../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing" - React-jsitooling: - :path: "../../node_modules/react-native/ReactCommon/jsitooling" - React-jsitracing: - :path: "../../node_modules/react-native/ReactCommon/hermes/executor/" - React-logger: - :path: "../../node_modules/react-native/ReactCommon/logger" - React-Mapbuffer: - :path: "../../node_modules/react-native/ReactCommon" - React-microtasksnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" - React-mutationobservernativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/mutationobserver" - react-native-safe-area-context: - :path: "../../node_modules/react-native-safe-area-context" - React-NativeModulesApple: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" - React-networking: - :path: "../../node_modules/react-native/ReactCommon/react/networking" - React-oscompat: - :path: "../../node_modules/react-native/ReactCommon/oscompat" - React-perflogger: - :path: "../../node_modules/react-native/ReactCommon/reactperflogger" - React-performancecdpmetrics: - :path: "../../node_modules/react-native/ReactCommon/react/performance/cdpmetrics" - React-performancetimeline: - :path: "../../node_modules/react-native/ReactCommon/react/performance/timeline" - React-RCTActionSheet: - :path: "../../node_modules/react-native/Libraries/ActionSheetIOS" - React-RCTAnimatedModuleProvider: - :path: "../../node_modules/react-native/ReactApple/RCTAnimatedModuleProvider" - React-RCTAnimation: - :path: "../../node_modules/react-native/Libraries/NativeAnimation" - React-RCTAppDelegate: - :path: "../../node_modules/react-native/Libraries/AppDelegate" - React-RCTBlob: - :path: "../../node_modules/react-native/Libraries/Blob" - React-RCTFabric: - :path: build/rncore-facades/React-RCTFabric - React-RCTFBReactNativeSpec: - :path: "../../node_modules/react-native/React" - React-RCTImage: - :path: "../../node_modules/react-native/Libraries/Image" - React-RCTLinking: - :path: "../../node_modules/react-native/Libraries/LinkingIOS" - React-RCTNetwork: - :path: "../../node_modules/react-native/Libraries/Network" - React-RCTRuntime: - :path: build/rncore-facades/React-RCTRuntime - React-RCTSettings: - :path: "../../node_modules/react-native/Libraries/Settings" - React-RCTText: - :path: "../../node_modules/react-native/Libraries/Text" - React-RCTVibration: - :path: "../../node_modules/react-native/Libraries/Vibration" - React-rendererconsistency: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/consistency" - React-renderercss: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/css" - React-rendererdebug: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/debug" - React-resizeobservernativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/resizeobserver" - React-RuntimeApple: - :path: "../../node_modules/react-native/ReactCommon/react/runtime/platform/ios" - React-RuntimeCore: - :path: "../../node_modules/react-native/ReactCommon/react/runtime" - React-runtimeexecutor: - :path: "../../node_modules/react-native/ReactCommon/runtimeexecutor" - React-RuntimeHermes: - :path: "../../node_modules/react-native/ReactCommon/react/runtime" - React-runtimescheduler: - :path: "../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" - React-timing: - :path: "../../node_modules/react-native/ReactCommon/react/timing" - React-utils: - :path: "../../node_modules/react-native/ReactCommon/react/utils" - React-viewtransitionnativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/viewtransition" - React-webperformancenativemodule: - :path: "../../node_modules/react-native/ReactCommon/react/nativemodule/webperformance" - ReactAppDependencyProvider: - :path: build/generated/ios/ReactAppDependencyProvider - ReactCodegen: - :path: build/generated/ios/ReactCodegen - ReactCommon: - :path: "../../node_modules/react-native/ReactCommon" - ReactNativeDependencies: - :podspec: "../../node_modules/react-native/third-party-podspecs/ReactNativeDependencies.podspec" - RNCClipboard: - :path: "../../node_modules/@react-native-clipboard/clipboard" - RNNitroSQLite: - :path: "../../packages/react-native-nitro-sqlite" - RNNitroSqliteVec: - :path: "../../node_modules/react-native-nitro-sqlite-vec" - RNScreens: - :path: "../../node_modules/react-native-screens" - SocketRocket: - :path: build/rndeps-facades/SocketRocket - Yoga: - :path: build/rncore-facades/Yoga - -SPEC CHECKSUMS: - boost: 8502bfdc46e2804408af2e163049ece181009af4 - DoubleConversion: 501a575c40c0b50c89685762dd3e415e6bb26fb0 - fast_float: 7c925d1cebf8328d4018d061f49377e9f887e3b4 - FBLazyVector: fdebac2dfe9c53bca49f8218fbdf1e24e36c8be0 - fmt: ba0886e864ebb21d14c98b2e12e164b8002f5b93 - glog: 3cf7cb46f743c4bc758ae3e6d9c15bd1b4cfd6d4 - hermes-engine: 6a00d96909f1648698fe5419972fe3c9e628755e - NitroModules: 92c2f230ec822ce8be72c8330fe292cdcf24e3a4 - RCT-Folly: 82921e585c0400eda46fac1068297aa9dfb035e4 - RCTDeprecation: e134f2a2c096a6450f5fcbbe949531f913a2ff04 - RCTRequired: f1a68295837ee8f91e112ed1b5694d12e7ff1784 - RCTSwiftUI: 4b21ec5b1f86acb9c96bb429100ad88d4023ed76 - RCTSwiftUIWrapper: 68bd9fac4e710259cb2b202472adc5f4d113e872 - RCTTypeSafety: 77078a9c26030dd84a6bdae74ed900159f89a098 - React: 8dafd0ef058191e9e7238cfa6b3deaa24398e5dd - React-bridging: 7c54be133225720d355418ec645943262a1aa5bb - React-callinvoker: b76a26472ac4f42362f18393379740ea003b2bc6 - React-Core: a831be15fcea0e345a24cb10d6cc0b87e9913d03 - React-Core-prebuilt: 0fd2555a42f40e7770ced1c7dfc5ee1dbfe041cd - React-CoreModules: a86fbe698fd817c17b3936832dc1106a130c4694 - React-cxxreact: 48ca56bd4f26de869478a803a5544b101a57cde6 - React-cxxstableapi: fea1bdba65658838a2582e2d211fc5b0fd1d31d8 - React-debug: d413aea8e974ee4362b4b8913c7b3be944788e63 - React-defaultsnativemodule: 3514f99a4ae7078f987563e400e24c24eb318836 - React-domnativemodule: 59be66200936fe915adb202b8ffa073ee2878b27 - React-Fabric: eb762ffff8f575de96e5c416174738c8e51cfdab - React-FabricComponents: 0f2c3e6e081c5cd859c9fb8b060b3cc7205bafa9 - React-FabricImage: e50334f0473af14bc2ca12f65a8a7fee359839eb - React-featureflags: 2bd99e0ccd64f0320a02c7d589f779b31bc758b8 - React-featureflagsnativemodule: 1e4ca2e7e386cb87f602d3c0dd2ed1d034988cd2 - React-graphics: bb85e3c7a30a9323ca1fcbae2212958964c60b85 - React-hermes: 9ce7aaf6784709e196ac51bfd89dd6c551e3fb4c - React-idlecallbacksnativemodule: 34f6f350a99ee90c4ba655ab7b7c047750194255 - React-ImageManager: f4efe88c800ad56056b089f60575c3e6b11d5825 - React-intersectionobservernativemodule: 0710821b9b6dac1b5f2c2d12871e54e8d9cfcc5b - React-jserrorhandler: e3cee4ff5a8a6ac9140d5ec55548b1dcf7ea1534 - React-jsi: 489de0620905b88a17ccb0ac2328046af43e7ebd - React-jsiexecutor: f0e2ae6d98b587d3505ebde246599ee3ad97cee1 - React-jsinspector: e715dc5199f3f5181235507326fa51aa9d2f2d3e - React-jsinspectorcdp: 4f25139f0722f2b027446ae073328807e5df137a - React-jsinspectornetwork: 7b4262a993bbe180c30c7c84bf0bcc50c440e6b9 - React-jsinspectortracing: 59683a44de6535592c2281d6b3e702832569cf15 - React-jsitooling: dd3db25eda3ce6522d4ad941e0471b3d4a895e8a - React-jsitracing: b13814b765648a561b42f4f65574ad523cf76b57 - React-logger: 3d2b406a780fed50ad0bbd07452b373c2a515308 - React-Mapbuffer: cf4026a5c35cd3598b648ce6f3ac6e8bfae12ad5 - React-microtasksnativemodule: 3c7c5f3624403317fe91b4ddefa86b60023552a8 - React-mutationobservernativemodule: 7284a91b3c7d7fb85b5d4ac04f7f8da811b22977 - react-native-safe-area-context: 7b143af09becaf26ba247b9a82d355f91b77b9b0 - React-NativeModulesApple: 52f3def085f129de1307e3eb78e26729ff70f421 - React-networking: e97a095de90a95bf811b887e2dfdb225f20fd493 - React-oscompat: 6865eead03a4aeba8d15b74cf168c7db3377cb63 - React-perflogger: f1466e0f46ce706aef73a559337eca85f51a40b7 - React-performancecdpmetrics: eb59528fed6350aac279bcb21066925c2b6a75ad - React-performancetimeline: 1f5ff676c0df6d8a186a044d44fa410b1551be49 - React-RCTActionSheet: 81662769b1f576e9c2e074deb41d6b83d1c7e29f - React-RCTAnimatedModuleProvider: a9829773197f782c19ad86c5438a2cc199203774 - React-RCTAnimation: ad9dd2c6c3b4d07e583c2b79354858c4f34481a0 - React-RCTAppDelegate: 70398a06e10ada27cdf77dc2b43f883126a91ac0 - React-RCTBlob: f3d86b491b8f28c36ced0cb750878b62f72e1380 - React-RCTFabric: 3767f97183c40ba3dadf007b17a01be2cd4e632a - React-RCTFBReactNativeSpec: 0ccd140627de551daa70ff0b90b8533622127b9f - React-RCTImage: 46ad408f777dce991d4095d7e73a568212be6baa - React-RCTLinking: 547427cc885bfa74b3cbba405971c5270defde7a - React-RCTNetwork: 52c00c0fe07327df9b9fe9881b4f5550dc5ced37 - React-RCTRuntime: 081fd457d305c3aee76c335c568e693ed107f48e - React-RCTSettings: 9cd0b2be41404574ec280b6b8e73c2208c842050 - React-RCTText: 5a6d38456eabc0a1a7c0d47d592390d35c6de57c - React-RCTVibration: c1815b4f471462954a4b7d8835155e053cec5412 - React-rendererconsistency: b8a15b544e2ccdab6ecf101eca394ec5220dafe9 - React-renderercss: 8131cc0b15780d74e2b37946592ce12eb9bfecd3 - React-rendererdebug: fb6e7dc1ec63c856170b88c1fd01bb103ce9223b - React-resizeobservernativemodule: b67f74c61268664cacc7cce4046513c5df1a63ef - React-RuntimeApple: 9b00a3d025fe85e18bfed4815c15fd7b42386e9c - React-RuntimeCore: 29d5a812271391b797e60461157a939c490aebea - React-runtimeexecutor: 59e6d950badc34655ca87c8ce3cf4159b8064332 - React-RuntimeHermes: b123e7cd8e900b300ff861ed368f7d99589b62d2 - React-runtimescheduler: 0dc48303a33d9a7fb332b934158b8083d8f08447 - React-timing: 67b61a284a1862cdf3124e56cbf9eff3a443bac2 - React-utils: bbbcc3ce4efc8d8f434d87ed439881e8fc9ae968 - React-viewtransitionnativemodule: 22ae58bc9260c2b9651b1a8fad1ef37ce9996ec1 - React-webperformancenativemodule: d5706a015640e1e52a3b7e85e11a91bdff982ff7 - ReactAppDependencyProvider: 782ee9546c9cd3b53b73f1e9e3dd728540085fc7 - ReactCodegen: f6ec2e701fd5bdea51130af52261c517363b726d - ReactCommon: 145a14b942b19fc2fe38927f261955ada56978aa - ReactNativeDependencies: d3b7423ba1e52525e42085c8470109abde583d2e - RNCClipboard: 27d5e530990704ebda46ddd789fb816fbca618f6 - RNNitroSQLite: 24196ad7dd39934bd6341ed266a17a79f5da8a79 - RNNitroSqliteVec: bdf5ec9611da0f0fcc70443951c7d5a790d02dc4 - RNScreens: 96c6d636ee9b2b4c3f062db05eecc59217e7f7df - SocketRocket: 37aec555668fb852ec12e3c0de59a86ca58f0871 - Yoga: d1c536142c5ff8ec8cd856ab2a7c227a1d875c8e - -PODFILE CHECKSUM: fd5bc9f335e919fdcd0b0eaf293b8e68d12e6ed4 - -COCOAPODS: 1.15.2 diff --git a/example/package.json b/example/package.json index d6c7466b..2508ce30 100644 --- a/example/package.json +++ b/example/package.json @@ -10,9 +10,9 @@ "start": "react-native start", "android": "react-native run-android", "ios": "react-native run-ios", + "spm": "react-native spm", "macos": "bun --cwd macos macos", "bundle-install": "bundle install", - "pods": "cd ios && bundle exec pod install", "pods:macos": "cd macos && bundle exec pod install", "typecheck": "tsc --build", "lint": "eslint \"**/*.{js,mjs,ts,tsx}\" --fix", diff --git a/packages/react-native-nitro-sqlite-vec/Package.swift b/packages/react-native-nitro-sqlite-vec/Package.swift new file mode 100644 index 00000000..c98314b1 --- /dev/null +++ b/packages/react-native-nitro-sqlite-vec/Package.swift @@ -0,0 +1,53 @@ +// swift-tools-version: 6.2 + +import Foundation +import PackageDescription + +let useSystemSQLite = Context.environment["NITRO_SQLITE_USE_PHONE_VERSION"] == "1" +let defines: [(name: String, value: String)] = + [("SQLITE_CORE", "1"), ("SQLITE_VEC_STATIC", "1")] + (useSystemSQLite ? [("NITRO_SQLITE_USE_PHONE_VERSION", "1")] : []) +// sqlite-vec must use the core's sqlite3.h, which renames the bundled SQLite symbols. +let coreSQLiteHeaders = findCoreSQLiteHeaders() + +let package = Package( + name: "RNNitroSqliteVec", + platforms: [.iOS(.v16)], + products: [ + .library(name: "RNNitroSqliteVec", targets: ["RNNitroSqliteVec"]) + ], + targets: [ + .target( + name: "RNNitroSqliteVec", + path: "cpp", + publicHeadersPath: ".", + cSettings: defines.map { .define($0.name, to: $0.value) } + [ + .unsafeFlags(["-I", coreSQLiteHeaders]), + .disableWarning("shorten-64-to-32"), + .disableWarning("comma"), + .disableWarning("unreachable-code"), + .disableWarning("conditional-uninitialized"), + ], + cxxSettings: defines.map { .define($0.name, to: $0.value) } + [ + .unsafeFlags(["-I", coreSQLiteHeaders]) + ] + ) + ], + cxxLanguageStandard: .cxx20 +) + +/// Finds `cpp/sqlite` of react-native-nitro-sqlite next to this package, either through React Native's +/// `libs/` alias or in node_modules. +func findCoreSQLiteHeaders() -> String { + let parent = URL(fileURLWithPath: Context.packageDirectory).deletingLastPathComponent() + let candidates = ["RNNitroSQLite", "react-native-nitro-sqlite"].map { + parent.appendingPathComponent($0).appendingPathComponent("cpp/sqlite") + } + guard + let headers = candidates.first(where: { + FileManager.default.fileExists(atPath: $0.appendingPathComponent("sqlite3.h").path) + }) + else { + fatalError("react-native-nitro-sqlite-vec requires react-native-nitro-sqlite. Install it in your app.") + } + return headers.path +} diff --git a/packages/react-native-nitro-sqlite-vec/RNNitroSqliteVec.podspec b/packages/react-native-nitro-sqlite-vec/RNNitroSqliteVec.podspec index b8b36147..6e69fbe7 100644 --- a/packages/react-native-nitro-sqlite-vec/RNNitroSqliteVec.podspec +++ b/packages/react-native-nitro-sqlite-vec/RNNitroSqliteVec.podspec @@ -2,12 +2,8 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) -# Apple-platform opt-in (NITRO_SQLITE_VEC=1); compile sqlite-vec and static-link into the core's sqlite3. -nitro_sqlite_vec = ENV['NITRO_SQLITE_VEC'] == '1' - -# The core's bundled sqlite3.h (compiled with SQLITE_CORE to link it directly). -core_sqlite_headers = File.expand_path(File.join(__dir__, "..", "react-native-nitro-sqlite", "cpp", "sqlite")) - +# React Native CLI 20 still requires a podspec to discover iOS dependencies. +# Native sources are built through Package.swift. Pod::Spec.new do |s| s.name = "RNNitroSqliteVec" s.version = package["version"] @@ -15,24 +11,10 @@ Pod::Spec.new do |s| s.homepage = "https://github.com/margelo/react-native-nitro-sqlite" s.license = "MIT" s.authors = "Margelo" + s.source = { :git => "https://github.com/margelo/react-native-nitro-sqlite.git", :tag => "#{s.version}" } s.platforms = { - :ios => min_ios_version_supported, + :ios => "16.0", :visionos => "1.0", :osx => "10.13", } - s.source = { :git => "https://github.com/margelo/react-native-nitro-sqlite.git", :tag => "#{s.version}" } - - if nitro_sqlite_vec - s.source_files = "cpp/**/*.{c,cpp,h,hpp}" - s.pod_target_xcconfig = { - "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) SQLITE_CORE=1 SQLITE_VEC_STATIC=1" + (ENV['NITRO_SQLITE_USE_PHONE_VERSION'] == '1' ? " NITRO_SQLITE_USE_PHONE_VERSION=1" : ""), - "USER_HEADER_SEARCH_PATHS" => "\"#{core_sqlite_headers}\"", - "HEADER_SEARCH_PATHS" => "\"#{core_sqlite_headers}\"", - "WARNING_CFLAGS" => "-Wno-shorten-64-to-32 -Wno-comma -Wno-unreachable-code -Wno-conditional-uninitialized", - } - s.dependency "RNNitroSQLite" - else - # Disabled: ship headers only, compile nothing. - s.source_files = "cpp/**/*.{h,hpp}" - end end diff --git a/packages/react-native-nitro-sqlite-vec/cpp/NitroSQLiteVecOnLoad.mm b/packages/react-native-nitro-sqlite-vec/cpp/NitroSQLiteVecOnLoad.mm new file mode 100644 index 00000000..69dcb7c5 --- /dev/null +++ b/packages/react-native-nitro-sqlite-vec/cpp/NitroSQLiteVecOnLoad.mm @@ -0,0 +1,14 @@ +#import "NitroSQLiteVecRegisterVectorExtensions.hpp" +#import + +// Swift Package Manager builds this package separately from the core, so register before any database opens. +@interface NitroSQLiteVecOnLoad : NSObject +@end + +@implementation NitroSQLiteVecOnLoad + ++ (void)load { + margelo::rnnitrosqlitevec::registerVectorExtensions(); +} + +@end diff --git a/packages/react-native-nitro-sqlite-vec/package.json b/packages/react-native-nitro-sqlite-vec/package.json index 73da8329..30fbc245 100644 --- a/packages/react-native-nitro-sqlite-vec/package.json +++ b/packages/react-native-nitro-sqlite-vec/package.json @@ -11,6 +11,7 @@ "!**/__tests__", "cpp", "RNNitroSqliteVec.podspec", + "Package.swift", "react-native.config.js", "README.md" ], @@ -65,5 +66,8 @@ "statements": 100 } } + }, + "swiftpmConfig": { + "name": "RNNitroSqliteVec" } } diff --git a/packages/react-native-nitro-sqlite-vec/react-native.config.js b/packages/react-native-nitro-sqlite-vec/react-native.config.js index 2faef343..b440dc7a 100644 --- a/packages/react-native-nitro-sqlite-vec/react-native.config.js +++ b/packages/react-native-nitro-sqlite-vec/react-native.config.js @@ -1,4 +1,4 @@ -// CocoaPods autolinks this package on Apple platforms; Android compiles it via the core's CMake. +// Swift Package Manager builds this package on iOS; Android compiles it via the core's CMake. module.exports = { dependency: { platforms: { diff --git a/packages/react-native-nitro-sqlite/Package.swift b/packages/react-native-nitro-sqlite/Package.swift new file mode 100644 index 00000000..a826b10c --- /dev/null +++ b/packages/react-native-nitro-sqlite/Package.swift @@ -0,0 +1,363 @@ +// swift-tools-version: 6.2 + +import Foundation +import PackageDescription + +let package = Package( + name: "RNNitroSQLite", + platforms: [.iOS(.v16)] +) + +// SwiftPM caches the evaluated manifest by its contents and environment, not by the package.json it reads. +// After changing nitroSQLite settings, delete ~/Library/Caches/org.swift.swiftpm/manifests and rebuild. +let sqlite = SQLiteBuildOptions.resolve() + +addNitrogenTargets( + to: package, + // SwiftPM cannot build Objective-C++ in a Swift target, so OnLoad.mm builds with the C++ sources. + swiftSources: [], + cxxSources: ["cpp", "ios/OnLoad.mm"], + cxxSettings: sqlite.defines.map { .define($0.name, to: $0.value) } +) + +// addNitrogenTargets only applies C++ settings, but the bundled sqlite3.c is compiled as C. +for target in package.targets where target.name == "RNNitroSQLiteCxx" { + target.cSettings = sqlite.defines.map { .define($0.name, to: $0.value) } + [ + .disableWarning("shorten-64-to-32"), + .disableWarning("comma"), + .disableWarning("unreachable-code"), + .disableWarning("conditional-uninitialized"), + .disableWarning("deprecated-declarations"), + ] + if sqlite.useSystemSQLite { + target.exclude.append("cpp/sqlite/sqlite3.c") + target.linkerSettings = [.linkedLibrary("sqlite3")] + } +} + +/// SQLite compile options from the app's `nitroSQLite` package.json settings and environment overrides. +struct SQLiteBuildOptions { + var defines: [(name: String, value: String?)] + var useSystemSQLite: Bool + + static func resolve() -> SQLiteBuildOptions { + let config = readAppConfig() + let threadSafe = + readEnvironmentFlag("NITRO_SQLITE_THREADSAFE") ?? readConfigFlag(config, "threadSafe") ?? true + let performanceMode = + readEnvironmentFlag("NITRO_SQLITE_PERFORMANCE_MODE") ?? readConfigFlag(config, "performanceMode") ?? true + let enableRTree = readConfigFlag(config, "enableRTree") ?? true + let useSystemSQLite = Context.environment["NITRO_SQLITE_USE_PHONE_VERSION"] == "1" + + var defines: [(name: String, value: String?)] = [("SQLITE_THREADSAFE", threadSafe ? "1" : "0")] + // SQLite checks whether this macro is defined, so disabling RTree must omit it. + if enableRTree { + defines.append(("SQLITE_ENABLE_RTREE", "1")) + } + if performanceMode { + defines += [ + ("SQLITE_DQS", "0"), + ("SQLITE_DEFAULT_MEMSTATUS", "0"), + ("SQLITE_DEFAULT_WAL_SYNCHRONOUS", "1"), + ("SQLITE_LIKE_DOESNT_MATCH_BLOBS", "1"), + ("SQLITE_MAX_EXPR_DEPTH", "0"), + ("SQLITE_OMIT_DEPRECATED", "1"), + ("SQLITE_OMIT_PROGRESS_CALLBACK", "1"), + ("SQLITE_OMIT_SHARED_CACHE", "1"), + ("SQLITE_USE_ALLOCA", "1"), + ] + } + if useSystemSQLite { + defines.append(("NITRO_SQLITE_USE_PHONE_VERSION", "1")) + } + // Like nitroSqliteFlags on Android, custom definitions replace defaults with the same name. + let customDefines = readCustomDefines(config) + let customNames = Set(customDefines.map(\.name)) + defines.removeAll { + customNames.contains($0.name) || ($0.name == "SQLITE_THREADSAFE" && customNames.contains("THREADSAFE")) + } + return SQLiteBuildOptions(defines: defines + customDefines, useSystemSQLite: useSystemSQLite) + } +} + +/// A JSON value that only distinguishes booleans and strings, so other settings can be rejected. +enum ConfigValue: Decodable { + case bool(Bool) + case string(String) + case other + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let value = try? container.decode(Bool.self) { + self = .bool(value) + } else if let value = try? container.decode(String.self) { + self = .string(value) + } else { + self = .other + } + } +} + +struct AppPackage: Decodable { + var nitroSQLite: [String: ConfigValue]? +} + +/// Reads `nitroSQLite` from the nearest package.json above this package, which is the app's. +/// React Native links this package through `/ios/build/generated/autolinking/libs/RNNitroSQLite`. +func readAppConfig() -> [String: ConfigValue] { + var directory = URL(fileURLWithPath: Context.packageDirectory).deletingLastPathComponent() + while directory.path != "/" { + let packageJson = directory.appendingPathComponent("package.json") + if let data = FileManager.default.contents(atPath: packageJson.path) { + do { + return try JSONDecoder().decode(AppPackage.self, from: data).nitroSQLite ?? [:] + } catch DecodingError.typeMismatch(_, let context) where context.codingPath.count == 1 { + fatalError("nitroSQLite in package.json must be an object") + } catch { + fatalError("Failed to read \(packageJson.path): \(error)") + } + } + directory.deleteLastPathComponent() + } + return [:] +} + +func readConfigFlag(_ config: [String: ConfigValue], _ name: String) -> Bool? { + switch config[name] { + case nil: + return nil + case .bool(let value): + return value + case .string, .other: + fatalError("nitroSQLite.\(name) in package.json must be true or false") + } +} + +/// Parses `nitroSQLite.iosSqliteFlags`, a string of `-DNAME` or `-DNAME=VALUE` definitions. +func readCustomDefines(_ config: [String: ConfigValue]) -> [(name: String, value: String?)] { + let flags: String + switch config["iosSqliteFlags"] { + case nil: + return [] + case .string(let value): + flags = value + case .bool, .other: + fatalError("nitroSQLite.iosSqliteFlags in package.json must be a string") + } + return flags.split(whereSeparator: \.isWhitespace).map { flag in + let definition = flag.dropFirst(2).split(separator: "=", maxSplits: 1, omittingEmptySubsequences: false) + guard flag.hasPrefix("-D"), let name = definition.first, name.first?.isNumber == false, + name.allSatisfy({ $0.isASCII && ($0 == "_" || $0.isLetter || $0.isNumber) }) + else { + fatalError("nitroSQLite.iosSqliteFlags in package.json must only contain -D definitions, found \(flag)") + } + return (String(name), definition.count > 1 ? String(definition[1]) : nil) + } +} + +func readEnvironmentFlag(_ name: String) -> Bool? { + guard let value = Context.environment[name] else { + return nil + } + switch value { + case "true", "1": + return true + case "false", "0": + return false + default: + fatalError("\(name) must be true, false, 1, or 0") + } +} + +// nitrogen:begin +// +// This section was generated by nitrogen. DO NOT MODIFY THIS SECTION. +// Running nitrogen replaces everything between "nitrogen:begin" and "nitrogen:end". +// https://github.com/margelo/nitro +// Copyright © Marc Rousavy @ Margelo +// + +// swift-format-ignore +import Foundation + +/// Adds the `RNNitroSQLite` library and its targets to `package`: +/// +/// - `RNNitroSQLiteCxx`: The generated cross-platform C++ specs, and your C++ sources. +/// - `RNNitroSQLiteAppleCxx`: The generated C++ bridge declarations that Swift imports. +/// - `RNNitroSQLite`: Your Swift sources and the generated Swift specs. +/// - `RNNitroSQLiteSwiftBridge`: The generated C++ wrappers that call into Swift, and autolinking. +/// +/// It also adds the packages these targets depend on: React Native's `ReactNative` package, +/// `NitroModules`, and the Nitro modules whose types the specs use. +/// React Native's autolinking references every library through `build/generated/autolinking/libs/`, +/// and SwiftPM resolves the relative package paths against that location. +/// List every Nitro module this library depends on in `swiftpmConfig.dependencies` in package.json, +/// so React Native's autolinking links it too. +/// Packages without a C++ language standard use C++20. +/// +/// - Parameters: +/// - package: The package to add the library and its targets to. +/// - swiftSources: Directories or files containing your Swift sources, relative to the package root. +/// Paths that don't exist are skipped. +/// - cxxSources: Directories or files containing your C++ sources, relative to the package root. +/// Paths that don't exist are skipped. Their directories are also added to the header search paths. +/// - dependencies: Additional dependencies of all targets. +/// - swiftSettings: Additional Swift settings of the `RNNitroSQLite` Swift target. +/// - cxxSettings: Additional C++ settings of the `RNNitroSQLiteCxx` and `RNNitroSQLiteSwiftBridge` targets. +// swift-format-ignore +func addNitrogenTargets( + to package: Package, + swiftSources: [String] = ["ios"], + cxxSources: [String] = ["cpp"], + dependencies: [Target.Dependency] = [], + swiftSettings: [SwiftSetting] = [], + cxxSettings: [CXXSetting] = [] +) { + package.dependencies += [ + .package(name: "ReactNative", path: "../../../../xcframeworks"), + .package(name: "NitroModules", path: "../NitroModules"), + ] + let nitroModuleDependencies: [Target.Dependency] = [ + .product(name: "NitroModules", package: "NitroModules"), + ] + dependencies + + let packageDirectory = URL(fileURLWithPath: Context.packageDirectory) + func exists(_ path: String) -> Bool { + return FileManager.default.fileExists(atPath: packageDirectory.appendingPathComponent(path).path) + } + let userSwiftSources = swiftSources.filter(exists) + let userCxxSources = cxxSources.filter(exists) + func userHeaderSearchPaths(relativeTo targetPath: String) -> [CXXSetting] { + let targetComponents = packageDirectory.appendingPathComponent(targetPath).standardizedFileURL.pathComponents + return userCxxSources.map { source in + let sourceURL = packageDirectory.appendingPathComponent(source) + var isDirectory: ObjCBool = false + FileManager.default.fileExists(atPath: sourceURL.path, isDirectory: &isDirectory) + let directory = isDirectory.boolValue ? sourceURL : sourceURL.deletingLastPathComponent() + let headerComponents = directory.standardizedFileURL.pathComponents + let commonCount = zip(targetComponents, headerComponents).prefix { $0.0 == $0.1 }.count + let relativeComponents = Array(repeating: "..", count: targetComponents.count - commonCount) + + headerComponents.dropFirst(commonCount) + return .headerSearchPath(relativeComponents.isEmpty ? "." : relativeComponents.joined(separator: "/")) + } + } + + // React Native's prebuilt React.framework is either Debug or Release, keep the C++ ABI in sync. + let releaseSettings: [CXXSetting] = [ + .define("DEBUG", .when(configuration: .debug)), + .define("NDEBUG", .when(configuration: .release)), + ] + let commonCxxSettings: [CXXSetting] = releaseSettings + [ + .disableWarning("nullability-extension"), + ] + let reactNativeDependencies: [Target.Dependency] = [ + .product(name: "ReactNativeHeaders", package: "ReactNative"), + .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), + ] + + let cxxSourcesInTarget = ["nitrogen/generated/shared/c++"] + userCxxSources + let cxxTarget: Target = .target( + name: "RNNitroSQLiteCxx", + dependencies: nitroModuleDependencies + reactNativeDependencies, + path: ".", + exclude: nitrogenExcludes(in: ".", keeping: cxxSourcesInTarget) + + ["nitrogen/generated/shared/c++/include"], + sources: cxxSourcesInTarget, + publicHeadersPath: "nitrogen/generated/shared/c++/include", + cxxSettings: commonCxxSettings + userHeaderSearchPaths(relativeTo: ".") + cxxSettings + ) + + let appleCxxTarget: Target = .target( + name: "RNNitroSQLiteAppleCxx", + dependencies: ["RNNitroSQLiteCxx"] + nitroModuleDependencies, + path: "nitrogen/generated/ios/RNNitroSQLiteAppleCxx", + cxxSettings: commonCxxSettings + userHeaderSearchPaths(relativeTo: "nitrogen/generated/ios/RNNitroSQLiteAppleCxx") + ) + + let swiftSourcesInTarget = userSwiftSources + [ + "nitrogen/generated/ios/swift", + ] + let swiftDependencies: [Target.Dependency] = ["RNNitroSQLiteAppleCxx"] + nitroModuleDependencies + let generatedSwiftSettings: [SwiftSetting] = [ + .swiftLanguageMode(.v6), + .enableUpcomingFeature("InternalImportsByDefault"), + .interoperabilityMode(.Cxx), + .unsafeFlags(["-Xfrontend", "-clang-header-expose-decls=has-expose-attr-or-stdlib"]), + // Swift leaves declarations that use another module's Swift types, like AnyJSON, + // out of the generated header unless that module's header is exposed to it. + .unsafeFlags([ + "-Xfrontend", "-clang-header-expose-module", "-Xfrontend", "NitroModules=NitroModules-Swift.h", + ]), + ] + let swiftTarget: Target = .target( + name: "RNNitroSQLite", + dependencies: swiftDependencies, + path: ".", + exclude: nitrogenExcludes(in: ".", keeping: swiftSourcesInTarget), + sources: swiftSourcesInTarget, + cxxSettings: releaseSettings, + swiftSettings: generatedSwiftSettings + swiftSettings + ) + + let swiftBridgeSources = [ + "c++", + "RNNitroSQLite-Swift-Cxx-Bridge.cpp", + "RNNitroSQLiteAutolinking.cpp", + "RNNitroSQLiteAutolinking.mm", + ].filter { exists("nitrogen/generated/ios/" + $0) } + let swiftBridgeSettings: [CXXSetting] = [ + // Include Swift's generated header textually after the C++ declarations it uses. + // Swift Build and Xcode provide the generated header directory. + .unsafeFlags(["-I${GENERATED_MODULEMAP_DIR}", "-fno-modules"]), + ] + let swiftBridgeTarget: Target = .target( + name: "RNNitroSQLiteSwiftBridge", + dependencies: [ + "RNNitroSQLite", + "RNNitroSQLiteAppleCxx", + ] + nitroModuleDependencies + reactNativeDependencies, + path: "nitrogen/generated/ios", + exclude: nitrogenExcludes(in: "nitrogen/generated/ios", keeping: swiftBridgeSources) + + ["c++/include"], + sources: swiftBridgeSources, + publicHeadersPath: "c++/include", + cxxSettings: commonCxxSettings + userHeaderSearchPaths(relativeTo: "nitrogen/generated/ios") + swiftBridgeSettings + cxxSettings + ) + + package.products.append( + .library(name: "RNNitroSQLite", targets: ["RNNitroSQLiteCxx", "RNNitroSQLite", "RNNitroSQLiteSwiftBridge"]) + ) + package.targets += [cxxTarget, appleCxxTarget, swiftTarget, swiftBridgeTarget] + if package.cxxLanguageStandard == nil { + package.cxxLanguageStandard = .cxx20 + } +} + +/// Returns the files and directories in `path` that are neither `sources` nor contain them. +/// Excluding them stops SwiftPM from scanning unrelated files, like `node_modules`. +// swift-format-ignore +func nitrogenExcludes(in path: String, keeping sources: [String]) -> [String] { + var parents: Set = [""] + for source in sources { + var components = source.split(separator: "/").dropLast() + while !components.isEmpty { + parents.insert(components.joined(separator: "/")) + components = components.dropLast() + } + } + + let targetURL = URL(fileURLWithPath: Context.packageDirectory).appendingPathComponent(path) + var excludes: [String] = [] + for parent in parents.sorted() { + let parentURL = targetURL.appendingPathComponent(parent) + let entries = (try? FileManager.default.contentsOfDirectory(atPath: parentURL.path)) ?? [] + for entry in entries.sorted() where !entry.hasPrefix(".") { + let entryPath = parent.isEmpty ? entry : "\(parent)/\(entry)" + if !sources.contains(entryPath) && !parents.contains(entryPath) { + excludes.append(entryPath) + } + } + } + return excludes +} +// nitrogen:end diff --git a/packages/react-native-nitro-sqlite/RNNitroSQLite.podspec b/packages/react-native-nitro-sqlite/RNNitroSQLite.podspec index fb21f117..121669d3 100644 --- a/packages/react-native-nitro-sqlite/RNNitroSQLite.podspec +++ b/packages/react-native-nitro-sqlite/RNNitroSQLite.podspec @@ -1,54 +1,9 @@ require "json" package = JSON.parse(File.read(File.join(__dir__, "package.json"))) -app_package_json_path = File.expand_path("../package.json", Pod::Config.instance.installation_root) -app_package = File.exist?(app_package_json_path) ? JSON.parse(File.read(app_package_json_path)) : {} -app_config = app_package.fetch("nitroSQLite", {}) - -unless app_config.is_a?(Hash) - raise "nitroSQLite in package.json must be an object" -end - -enable_rtree = app_config.fetch("enableRTree", true) -unless [true, false].include?(enable_rtree) - raise "nitroSQLite.enableRTree in package.json must be true or false" -end - -if ENV.key?("NITRO_SQLITE_THREADSAFE") - thread_safe_value = ENV["NITRO_SQLITE_THREADSAFE"] - unless %w[true false 1 0].include?(thread_safe_value) - raise "NITRO_SQLITE_THREADSAFE must be true, false, 1, or 0" - end - - sqlite_threadsafe = %w[true 1].include?(thread_safe_value) ? "1" : "0" -else - thread_safe_value = app_config.fetch("threadSafe", true) - unless [true, false].include?(thread_safe_value) - raise "nitroSQLite.threadSafe in package.json must be true or false" - end - - sqlite_threadsafe = thread_safe_value ? "1" : "0" -end - -if ENV.key?("NITRO_SQLITE_PERFORMANCE_MODE") - performance_mode_value = ENV["NITRO_SQLITE_PERFORMANCE_MODE"] - unless %w[true false 1 0].include?(performance_mode_value) - raise "NITRO_SQLITE_PERFORMANCE_MODE must be true, false, 1, or 0" - end - - performance_mode = %w[true 1].include?(performance_mode_value) -else - performance_mode = app_config.fetch("performanceMode", true) - - unless [true, false].include?(performance_mode) - raise "nitroSQLite.performanceMode in package.json must be true or false" - end -end -folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1' -log_message = lambda do |message| - puts "\e[34m#{message}\e[0m" -end +# React Native CLI 20 still requires a podspec to discover iOS dependencies. +# Native sources, dependencies, and SQLite build options are in Package.swift. Pod::Spec.new do |s| s.name = "RNNitroSQLite" s.version = package["version"] @@ -56,55 +11,10 @@ Pod::Spec.new do |s| s.homepage = package["homepage"] s.license = package["license"] s.authors = package["author"] + s.source = { :git => "https://github.com/margelo/react-native-nitro-sqlite.git", :tag => "#{s.version}" } s.platforms = { - :ios => min_ios_version_supported, + :ios => "16.0", :visionos => "1.0", :osx => "10.13", } - s.source = { :git => "https://github.com/margelo/react-native-nitro-sqlite.git", :tag => "#{s.version}" } - - # Opt-in vector search (NITRO_SQLITE_VEC=1); the companion pod compiles the sources. - nitro_sqlite_vec = ENV['NITRO_SQLITE_VEC'] == '1' - nitro_sqlite_vec_cpp = File.expand_path(File.join(__dir__, "..", "react-native-nitro-sqlite-vec", "cpp")) - - s.source_files = [ - # Apple platform implementation (Swift) - "ios/**/*.{swift}", - # Apple platform autolinking/registration (Objective-C++) - "ios/**/*.{h,hpp,m,mm}", - # Implementation (C++ objects) - "cpp/**/*.{h,hpp,c,cpp}" - ] - - inherited_cflags = '$(inherited)' - optimized_cflags = '-DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 -DSQLITE_MAX_EXPR_DEPTH=0 -DSQLITE_OMIT_DEPRECATED=1 -DSQLITE_OMIT_PROGRESS_CALLBACK=1 -DSQLITE_OMIT_SHARED_CACHE=1 -DSQLITE_USE_ALLOCA=1' - - log_message.call("SQLite thread safety: SQLITE_THREADSAFE=#{sqlite_threadsafe}") - log_message.call("SQLite performance mode: #{performance_mode ? "enabled" : "disabled"}") - performance_cflags = performance_mode ? " #{optimized_cflags}" : "" - # SQLite checks whether this macro is defined, so disabling RTree must omit it. - rtree_cflags = enable_rtree ? " -DSQLITE_ENABLE_RTREE=1" : "" - other_cflags = "#{inherited_cflags}#{performance_cflags}#{rtree_cflags} -DSQLITE_THREADSAFE=#{sqlite_threadsafe} " - - s.pod_target_xcconfig = { - :GCC_PREPROCESSOR_DEFINITIONS => "HAVE_FULLFSYNC=1", - :WARNING_CFLAGS => "-Wno-shorten-64-to-32 -Wno-comma -Wno-unreachable-code -Wno-conditional-uninitialized -Wno-deprecated-declarations", - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++20', - 'CLANG_CXX_LIBRARY' => 'libc++', - 'DEFINES_MODULE' => 'YES', - "HEADER_SEARCH_PATHS" => "\"${PODS_ROOT}/RCT-Folly\"" + (nitro_sqlite_vec ? " \"#{nitro_sqlite_vec_cpp}\"" : ""), - "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES" + (nitro_sqlite_vec ? " NITRO_SQLITE_VEC=1" : "") + (ENV['NITRO_SQLITE_USE_PHONE_VERSION'] == '1' ? " NITRO_SQLITE_USE_PHONE_VERSION=1" : ""), - "OTHER_CPLUSPLUSFLAGS" => folly_compiler_flags, - "OTHER_CFLAGS" => other_cflags, - } - - load 'nitrogen/generated/ios/RNNitroSQLite+autolinking.rb' - add_nitrogen_files(s) - - install_modules_dependencies(s) - - if ENV['NITRO_SQLITE_USE_PHONE_VERSION'] == '1' then - s.exclude_files = "cpp/sqlite/sqlite3.c", "cpp/sqlite/sqlite3.h" - s.library = "sqlite3" - end end diff --git a/packages/react-native-nitro-sqlite/ios/OnLoad.mm b/packages/react-native-nitro-sqlite/ios/OnLoad.mm index e6aa2920..58c39394 100644 --- a/packages/react-native-nitro-sqlite/ios/OnLoad.mm +++ b/packages/react-native-nitro-sqlite/ios/OnLoad.mm @@ -1,7 +1,6 @@ #import #import -#import "RNNitroSQLite-Swift-Cxx-Umbrella.hpp" -#import "HybridNitroSQLite.hpp" +#import "hybridObjects/HybridNitroSQLite.hpp" #if TARGET_OS_OSX static NSString *macOSDatabaseDirectory(void) { diff --git a/packages/react-native-nitro-sqlite/ios/RNNitroSQLite-Swift.h b/packages/react-native-nitro-sqlite/ios/RNNitroSQLite-Swift.h deleted file mode 100644 index 6f70f09b..00000000 --- a/packages/react-native-nitro-sqlite/ios/RNNitroSQLite-Swift.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/packages/react-native-nitro-sqlite/package.json b/packages/react-native-nitro-sqlite/package.json index 546e2194..e13ade62 100644 --- a/packages/react-native-nitro-sqlite/package.json +++ b/packages/react-native-nitro-sqlite/package.json @@ -51,6 +51,7 @@ "cpp", "nitrogen", "RNNitroSQLite.podspec", + "Package.swift", "!lib/typescript/example", "!android/build", "!android/.cxx", @@ -174,5 +175,11 @@ } ] ] + }, + "swiftpmConfig": { + "name": "RNNitroSQLite", + "dependencies": [ + "react-native-nitro-modules" + ] } } diff --git a/patches/@react-native-clipboard+clipboard+1.16.3.patch b/patches/@react-native-clipboard+clipboard+1.16.3.patch new file mode 100644 index 00000000..69fc3d4a --- /dev/null +++ b/patches/@react-native-clipboard+clipboard+1.16.3.patch @@ -0,0 +1,46 @@ +diff --git a/node_modules/@react-native-clipboard/clipboard/Package.swift b/node_modules/@react-native-clipboard/clipboard/Package.swift +new file mode 100644 +index 0000000..324df4b +--- /dev/null ++++ b/node_modules/@react-native-clipboard/clipboard/Package.swift +@@ -0,0 +1,40 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 20 ++// Cache slot: 0.88.0/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "RNCClipboard", ++ platforms: [.iOS("16.6")], ++ products: [ ++ .library(name: "RNCClipboard", targets: ["RNCClipboardObjC"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ ], ++ targets: [ ++ .target( ++ // A target named like ios/RNCClipboard.h would make it an umbrella header, which SwiftPM rejects next to the .xcodeproj. ++ name: "RNCClipboardObjC", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode")], ++ path: "ios", ++ exclude: ["RNCClipboard.xcodeproj"], ++ publicHeadersPath: ".", ++ cSettings: [], ++ cxxSettings: [.unsafeFlags(["-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", "-Wno-comma", "-Wno-shorten-64-to-32", "-DRCT_NEW_ARCH_ENABLED"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics"), .linkedFramework("MobileCoreServices")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) diff --git a/patches/react-native-screens+4.30.0.patch b/patches/react-native-screens+4.30.0.patch new file mode 100644 index 00000000..5506fd23 --- /dev/null +++ b/patches/react-native-screens+4.30.0.patch @@ -0,0 +1,275 @@ +diff --git a/node_modules/react-native-screens/Package.swift b/node_modules/react-native-screens/Package.swift +new file mode 100644 +index 0000000..f90d726 +--- /dev/null ++++ b/node_modules/react-native-screens/Package.swift +@@ -0,0 +1,253 @@ ++// swift-tools-version: 6.0 ++// AUTO-SCAFFOLDED by react-native spm scaffold — safe to edit & commit via patch-package. ++// AUTO-SCAFFOLDED-VERSION: 20 ++// Cache slot: 0.88.0/dual-flavor ++// Edit the contents below if needed and re-run `npx patch-package ` ++// to persist across `npm install`. To regenerate from the podspec, remove ++// this file (or just this marker) and re-run `npx react-native spm scaffold`. ++// ++// Package references are plain relative paths, computed when this file was ++// scaffolded. They stay correct because the file is re-scaffolded per app ++// and cache slot, and any node_modules relayout reinstalls this package ++// (dropping the file) anyway. ++ ++import PackageDescription ++ ++let package = Package( ++ name: "RNScreens", ++ platforms: [.iOS("16.6")], ++ products: [ ++ .library(name: "RNScreens", targets: ["RNScreens"]), ++ ], ++ dependencies: [ ++ .package(name: "ReactNative", path: "../../../../xcframeworks"), ++ .package(name: "React-GeneratedCode", path: "../../../ios"), ++ ], ++ targets: [ ++ .target( ++ name: "RNScreens", ++ dependencies: [.product(name: "ReactHeaders", package: "ReactNative"), .product(name: "ReactNativeHeaders", package: "ReactNative"), .product(name: "ReactNativeDependenciesHeaders", package: "ReactNative"), .product(name: "ReactAppHeaders", package: "React-GeneratedCode")], ++ path: ".", ++ sources: [ ++ "common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSFormSheetHostState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSFullWindowOverlayState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSSafeAreaViewState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNodeCommitHook.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNodeCommitHook.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderConfigState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenStackHeaderSubviewState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSScreenState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSSplitScreenState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderConfigState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderItemState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackHeaderSubviewState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSStackScreenState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsBottomAccessoryState.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostComponentDescriptor.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostShadowNode.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostShadowNode.h", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostState.cpp", ++ "common/cpp/react/renderer/components/rnscreens/RNSTabsHostState.h", ++ "common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h", ++ "cpp/RNSScreenRemovalListener.cpp", ++ "cpp/RNSScreenRemovalListener.h", ++ "cpp/RNScreensTurboModule.cpp", ++ "cpp/RNScreensTurboModule.h", ++ "ios/RCTImageComponentView+RNSScreenStackHeaderConfig.h", ++ "ios/RCTImageComponentView+RNSScreenStackHeaderConfig.mm", ++ "ios/RNSBarButtonItem.h", ++ "ios/RNSBarButtonItem.mm", ++ "ios/RNSConvert.h", ++ "ios/RNSConvert.mm", ++ "ios/RNSEnums.h", ++ "ios/RNSFullWindowOverlay.h", ++ "ios/RNSFullWindowOverlay.mm", ++ "ios/RNSModalScreen.h", ++ "ios/RNSModalScreen.mm", ++ "ios/RNSModule.h", ++ "ios/RNSModule.mm", ++ "ios/RNSNavigationBar.h", ++ "ios/RNSNavigationBar.mm", ++ "ios/RNSOrientationProviding.h", ++ "ios/RNSPercentDrivenInteractiveTransition.h", ++ "ios/RNSPercentDrivenInteractiveTransition.mm", ++ "ios/RNSReactMountingTransactionObserving.h", ++ "ios/RNSScreen.h", ++ "ios/RNSScreen.mm", ++ "ios/RNSScreenContainer.h", ++ "ios/RNSScreenContainer.mm", ++ "ios/RNSScreenContentWrapper.h", ++ "ios/RNSScreenContentWrapper.mm", ++ "ios/RNSScreenFooter.h", ++ "ios/RNSScreenFooter.mm", ++ "ios/RNSScreenNavigationContainer.h", ++ "ios/RNSScreenNavigationContainer.mm", ++ "ios/RNSScreenStack.h", ++ "ios/RNSScreenStack.mm", ++ "ios/RNSScreenStackAnimator.h", ++ "ios/RNSScreenStackAnimator.mm", ++ "ios/RNSScreenStackHeaderConfig.h", ++ "ios/RNSScreenStackHeaderConfig.mm", ++ "ios/RNSScreenStackHeaderSubview.h", ++ "ios/RNSScreenStackHeaderSubview.mm", ++ "ios/RNSScreenWindowTraits.h", ++ "ios/RNSScreenWindowTraits.mm", ++ "ios/RNSScrollViewBehaviorOverriding.h", ++ "ios/RNSSearchBar.h", ++ "ios/RNSSearchBar.mm", ++ "ios/RNScreens-Bridging-Header.h", ++ "ios/UIScrollView+RNScreens.h", ++ "ios/UIScrollView+RNScreens.mm", ++ "ios/UIViewController+RNScreens.h", ++ "ios/UIViewController+RNScreens.mm", ++ "ios/UIWindow+RNScreens.h", ++ "ios/UIWindow+RNScreens.mm", ++ "ios/bridging/RNSReactBaseView.h", ++ "ios/bridging/RNSReactBaseView.mm", ++ "ios/conversion/RNSConversions-Fabric.mm", ++ "ios/conversion/RNSConversions-ScrollViewMarker.h", ++ "ios/conversion/RNSConversions-ScrollViewMarker.mm", ++ "ios/conversion/RNSConversions-SplitView.mm", ++ "ios/conversion/RNSConversions-Stack.h", ++ "ios/conversion/RNSConversions-Stack.mm", ++ "ios/conversion/RNSConversions-Tabs.mm", ++ "ios/conversion/RNSConversions.h", ++ "ios/conversion/RNSConversions.mm", ++ "ios/conversion/always_false.h", ++ "ios/events/RNSHeaderHeightChangeEvent.h", ++ "ios/events/RNSHeaderHeightChangeEvent.mm", ++ "ios/events/RNSScreenViewEvent.h", ++ "ios/events/RNSScreenViewEvent.mm", ++ "ios/helpers/container/RNSContainer.h", ++ "ios/helpers/container/RNSContainerHelpers.h", ++ "ios/helpers/container/RNSContainerHelpers.mm", ++ "ios/helpers/container/RNSContainerItem.h", ++ "ios/helpers/container/RNSContainerItemSupport.h", ++ "ios/helpers/container/RNSContainerItemSupport.mm", ++ "ios/helpers/container/RNSParentContainerItemRegistry.h", ++ "ios/helpers/container/RNSParentContainerItemRegistry.mm", ++ "ios/helpers/image/RNSImageLoading.h", ++ "ios/helpers/image/RNSImageLoadingHelper.h", ++ "ios/helpers/image/RNSImageLoadingHelper.mm", ++ "ios/helpers/scroll-view/RNSContentScrollViewProviding.h", ++ "ios/helpers/scroll-view/RNSScrollEdgeEffectApplicator.h", ++ "ios/helpers/scroll-view/RNSScrollEdgeEffectApplicator.mm", ++ "ios/helpers/scroll-view/RNSScrollViewFinder.h", ++ "ios/helpers/scroll-view/RNSScrollViewFinder.mm", ++ "ios/helpers/scroll-view/RNSScrollViewHelper.h", ++ "ios/helpers/scroll-view/RNSScrollViewHelper.mm", ++ "ios/integrations/RNSDismissibleModalProtocol.h", ++ "ios/safe-area/RNSSafeAreaProviding.h", ++ "ios/safe-area/RNSSafeAreaViewComponentView.h", ++ "ios/safe-area/RNSSafeAreaViewComponentView.mm", ++ "ios/safe-area/RNSSafeAreaViewNotifications.h", ++ "ios/stubs/RNSGammaStubs.h", ++ "ios/stubs/RNSGammaStubs.mm", ++ "ios/tabs/RCTConvert+RNSTabs.h", ++ "ios/tabs/RCTConvert+RNSTabs.mm", ++ "ios/tabs/RNSTabBarAppearanceCoordinator.h", ++ "ios/tabs/RNSTabBarAppearanceCoordinator.mm", ++ "ios/tabs/RNSTabBarItemCoordinator.h", ++ "ios/tabs/RNSTabBarItemCoordinator.mm", ++ "ios/tabs/RNSTabsSpecialEffectsSupporting.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryComponentView.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryContentComponentView.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryEventEmitter.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryHelper.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryHelper.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryShadowStateProxy.mm", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.h", ++ "ios/tabs/bottom-accessory/RNSTabsBottomAccessoryWrapperView.mm", ++ "ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.h", ++ "ios/tabs/extensions/RNSTabsHostComponentView+RNSImageLoader.mm", ++ "ios/tabs/host/RNSTabBarController.h", ++ "ios/tabs/host/RNSTabBarController.mm", ++ "ios/tabs/host/RNSTabsHostComponentView.h", ++ "ios/tabs/host/RNSTabsHostComponentView.mm", ++ "ios/tabs/host/RNSTabsHostEventEmitter.h", ++ "ios/tabs/host/RNSTabsHostEventEmitter.mm", ++ "ios/tabs/host/RNSTabsNavigationState.h", ++ "ios/tabs/host/RNSTabsNavigationState.mm", ++ "ios/tabs/host/RNSTabsNavigationStateObserverRegistry.h", ++ "ios/tabs/host/RNSTabsNavigationStateObserverRegistry.mm", ++ "ios/tabs/screen/RNSTabsScreenComponentView.h", ++ "ios/tabs/screen/RNSTabsScreenComponentView.mm", ++ "ios/tabs/screen/RNSTabsScreenEventEmitter.h", ++ "ios/tabs/screen/RNSTabsScreenEventEmitter.mm", ++ "ios/tabs/screen/RNSTabsScreenViewController.h", ++ "ios/tabs/screen/RNSTabsScreenViewController.mm", ++ "ios/utils/NSString+RNSUtility.h", ++ "ios/utils/NSString+RNSUtility.mm", ++ "ios/utils/RCTSurfaceTouchHandler+RNSUtility.h", ++ "ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm", ++ "ios/utils/RNSBackBarButtonItem.h", ++ "ios/utils/RNSBackBarButtonItem.mm", ++ "ios/utils/RNSDefines.h", ++ "ios/utils/RNSLog.h", ++ "ios/utils/UINavigationBar+RNSUtility.h", ++ "ios/utils/UINavigationBar+RNSUtility.mm", ++ "ios/utils/UIView+RNSUtility.h", ++ "ios/utils/UIView+RNSUtility.mm", ++ "ios/utils/extensions/RCTImageSource+AccessHiddenMembers.h", ++ ], ++ publicHeadersPath: "ios", ++ cSettings: [.headerSearchPath("common/cpp"), .headerSearchPath("common/cpp/react/renderer/components"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens/utils"), .headerSearchPath("cpp"), .headerSearchPath("ios"), .headerSearchPath("ios/bridging"), .headerSearchPath("ios/conversion"), .headerSearchPath("ios/events"), .headerSearchPath("ios/helpers/container"), .headerSearchPath("ios/helpers/image"), .headerSearchPath("ios/helpers/scroll-view"), .headerSearchPath("ios/integrations"), .headerSearchPath("ios/safe-area"), .headerSearchPath("ios/stubs"), .headerSearchPath("ios/tabs"), .headerSearchPath("ios/tabs/bottom-accessory"), .headerSearchPath("ios/tabs/extensions"), .headerSearchPath("ios/tabs/host"), .headerSearchPath("ios/tabs/screen"), .headerSearchPath("ios/utils"), .headerSearchPath("ios/utils/extensions"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"])], ++ cxxSettings: [.headerSearchPath("common/cpp"), .headerSearchPath("common/cpp/react/renderer/components"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens"), .headerSearchPath("common/cpp/react/renderer/components/rnscreens/utils"), .headerSearchPath("cpp"), .headerSearchPath("ios"), .headerSearchPath("ios/bridging"), .headerSearchPath("ios/conversion"), .headerSearchPath("ios/events"), .headerSearchPath("ios/helpers/container"), .headerSearchPath("ios/helpers/image"), .headerSearchPath("ios/helpers/scroll-view"), .headerSearchPath("ios/integrations"), .headerSearchPath("ios/safe-area"), .headerSearchPath("ios/stubs"), .headerSearchPath("ios/tabs"), .headerSearchPath("ios/tabs/bottom-accessory"), .headerSearchPath("ios/tabs/extensions"), .headerSearchPath("ios/tabs/host"), .headerSearchPath("ios/tabs/screen"), .headerSearchPath("ios/utils"), .headerSearchPath("ios/utils/extensions"), .headerSearchPath("."), .unsafeFlags(["-include", "react-native-spm-prefix.h"]), .define("DEBUG", .when(configuration: .debug)), .define("NDEBUG", .when(configuration: .release))], ++ linkerSettings: [.linkedFramework("UIKit"), .linkedFramework("Foundation"), .linkedFramework("CoreGraphics")] ++ ), ++ ], ++ cxxLanguageStandard: .cxx20 ++) +diff --git a/node_modules/react-native-screens/react-native-spm-prefix.h b/node_modules/react-native-screens/react-native-spm-prefix.h +new file mode 100644 +index 0000000..af5cea0 +--- /dev/null ++++ b/node_modules/react-native-screens/react-native-spm-prefix.h +@@ -0,0 +1,10 @@ ++// AUTO-SCAFFOLDED by react-native spm scaffold — mirrors CocoaPods' default ++// prefix header so ObjC sources that rely on an implicit Foundation/UIKit ++// import compile under SPM (which has no prefix-header mechanism). Safe to ++// delete + regenerate via `npx react-native spm scaffold`. ++#ifdef __OBJC__ ++#import ++#if __has_include() ++#import ++#endif ++#endif diff --git a/scripts/ci-dependencies.test.ts b/scripts/ci-dependencies.test.ts index 3bd8e66e..b3b9e997 100644 --- a/scripts/ci-dependencies.test.ts +++ b/scripts/ci-dependencies.test.ts @@ -113,17 +113,11 @@ test('invalid locked package records fail rather than silently skipping validati ) }) -test('Apple configuration changes only prepare the affected lockfile', () => { - assert.deepEqual(selectPodChecks(['example/ios/Podfile'], false, false), { - ios: true, - macos: false, - }) +test('CocoaPods configuration changes prepare the macOS lockfile', () => { assert.deepEqual(selectPodChecks(['example/macos/Podfile'], false, false), { - ios: false, macos: true, }) assert.deepEqual(selectPodChecks(['example/package.json'], false, false), { - ios: false, macos: false, }) assert.deepEqual( @@ -132,29 +126,19 @@ test('Apple configuration changes only prepare the affected lockfile', () => { false, false, ), - { ios: true, macos: true }, + { macos: true }, ) }) -test('native dependency changes and full runs prepare both Apple lockfiles', () => { - assert.deepEqual(selectPodChecks([], true, false), { ios: true, macos: true }) - assert.deepEqual(selectPodChecks([], false, true), { ios: true, macos: true }) +test('native dependency changes and full runs prepare the macOS lockfile', () => { + assert.deepEqual(selectPodChecks([], true, false), { macos: true }) + assert.deepEqual(selectPodChecks([], false, true), { macos: true }) }) test('direct native lockfile changes require validation before compilation', () => { - assert.deepEqual( - selectPodChecks(['example/ios/Podfile.lock'], false, false), - { - ios: true, - macos: false, - }, - ) assert.deepEqual( selectPodChecks(['example/macos/Podfile.lock'], false, false), - { - ios: false, - macos: true, - }, + { macos: true }, ) }) diff --git a/scripts/ci-dependencies.ts b/scripts/ci-dependencies.ts index bb199cd3..3c753e4a 100644 --- a/scripts/ci-dependencies.ts +++ b/scripts/ci-dependencies.ts @@ -36,36 +36,27 @@ export function nativeDependenciesChanged( } /** - * Selects Apple lockfiles after native dependencies or CocoaPods inputs change. + * Selects the macOS lockfile after native dependencies or CocoaPods inputs change. * @param files Repository-relative paths changed since the base commit. * @param nativeChanged Whether a locked native package changed. - * @param full Whether to validate both Apple platforms unconditionally. - * @returns Independent iOS and macOS lockfile selections. + * @param full Whether to validate the macOS lockfile unconditionally. + * @returns The macOS lockfile selection. */ export function selectPodChecks( files: string[], nativeChanged: boolean, full: boolean, ) { - const shared = [ - '**/*.podspec', - '**/react-native.config.js', - 'example/Gemfile*', - 'patches/**', - ] return { - ios: - full || - nativeChanged || - files.some((file) => - matchesPaths(file, [...shared, 'example/ios/Podfile*']), - ), macos: full || nativeChanged || files.some((file) => matchesPaths(file, [ - ...shared, + '**/*.podspec', + '**/react-native.config.js', + 'example/Gemfile*', + 'patches/**', 'example/macos/Podfile*', 'example/macos/scripts/*config*.js', 'example/macos/scripts/resolve-react-native.js', @@ -108,7 +99,7 @@ function main(): void { if (!output) { throw new Error('GITHUB_OUTPUT is required') } - appendFileSync(output, `ios_pods=${pods.ios}\nmacos_pods=${pods.macos}\n`) + appendFileSync(output, `macos_pods=${pods.macos}\n`) } function resolution(value: unknown): string { diff --git a/scripts/ci.test.ts b/scripts/ci.test.ts index 4b218f9e..d07c3a82 100644 --- a/scripts/ci.test.ts +++ b/scripts/ci.test.ts @@ -1,5 +1,5 @@ import assert from 'node:assert/strict' -import { execFileSync, spawnSync } from 'node:child_process' +import { execFileSync } from 'node:child_process' import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' @@ -94,13 +94,25 @@ test('Harness patches retain both mobile and desktop coverage', () => { assert.equal(checks.macos, true) }) -test('Ruby dependency changes retain both Apple platforms', () => { +test('Ruby dependency changes only select macOS', () => { const checks = selectChecks(['example/Gemfile'], false) - assert.equal(checks.ios, true) assert.equal(checks.macos, true) + assert.equal(checks.ios, false) assert.equal(checks.android, false) }) +test('Swift package changes select iOS without Android', () => { + for (const file of [ + 'packages/react-native-nitro-sqlite/Package.swift', + 'packages/react-native-nitro-sqlite-vec/Package.swift', + 'patches/react-native-screens+4.30.0.patch', + ]) { + const checks = selectChecks([file], false) + assert.equal(checks.ios, true) + assert.equal(checks.android, false) + } +}) + test('a full run selects every check even without file changes', () => { assert.ok(Object.values(selectChecks([], true)).every(Boolean)) }) @@ -185,56 +197,7 @@ test('the CLI routes real Git commits', () => { } }) -test('the real iOS Podfile honors both CI matrix modes and retains the local default', () => { - const script = ` - module Pod - class Config - def self.instance = new - def installation_root = '/stub' - end - module Executable - def self.execute_command(*) = '/stub/react_native_pods.rb' - end - module UI - def self.puts(*) = nil - end - end - class String - def green = self - end - def require(*) = true - def min_ios_version_supported = '15.1' - def platform(*) = nil - def prepare_react_native_project! = nil - def use_frameworks!(linkage:) = STDOUT.puts("frameworks=#{linkage}") - def target(*) = yield - def use_native_modules! = { reactNativePath: '/stub' } - def use_react_native!(**) = nil - def post_install(*) = nil - load ARGV.fetch(0) - ` - for (const [mode, expected] of [ - ['static', 'frameworks=static'], - ['', ''], - [undefined, 'frameworks=static'], - ]) { - const env = { ...process.env } - if (mode === undefined) { - delete env.USE_FRAMEWORKS - } else { - env.USE_FRAMEWORKS = mode - } - const result = spawnSync( - 'ruby', - ['-e', script, join(root, 'example/ios/Podfile')], - { env, encoding: 'utf8' }, - ) - assert.equal(result.status, 0, result.stderr) - assert.equal(result.stdout.trim(), expected) - } -}) - -test('the routine iOS matrix retains both framework configurations', () => { +test('the routine iOS matrix uses Xcode 27', () => { const workflow = readFileSync( join(root, '.github/workflows/test-harness-ios.yml'), 'utf8', @@ -244,10 +207,7 @@ test('the routine iOS matrix retains both framework configurations', () => { ) assert.ok(match?.[2]) const matrix: unknown = JSON.parse(match[2]) - assert.deepEqual(matrix, [ - { name: 'static_frameworks', frameworks: 'static', xcode: '26.5' }, - { name: 'no_frameworks', frameworks: '', xcode: '26.5' }, - ]) + assert.deepEqual(matrix, [{ xcode: '27.0' }]) }) function enabled(checks: ReturnType): string[] { diff --git a/scripts/commit-release-lockfiles.ts b/scripts/commit-release-lockfiles.ts index 258d9afa..173c3b00 100644 --- a/scripts/commit-release-lockfiles.ts +++ b/scripts/commit-release-lockfiles.ts @@ -6,12 +6,7 @@ const branch = process.env.RELEASE_BRANCH const repository = process.env.GITHUB_REPOSITORY if (!branch || !repository) throw new Error('Release branch and repository are required.') -const paths = [ - 'bun.lock', - 'example/ios/Podfile.lock', - 'example/macos/Podfile.lock', - 'example/Gemfile.lock', -] +const paths = ['bun.lock', 'example/macos/Podfile.lock', 'example/Gemfile.lock'] const announcement = process.env.RELEASE_ANNOUNCEMENT if (announcement?.trim()) { const metadata: unknown = JSON.parse(readFileSync('package.json', 'utf8')) diff --git a/scripts/sqlite-package-config.test.ts b/scripts/sqlite-package-config.test.ts new file mode 100644 index 00000000..43b3d385 --- /dev/null +++ b/scripts/sqlite-package-config.test.ts @@ -0,0 +1,337 @@ +import assert from 'node:assert/strict' +import { execFileSync, spawnSync } from 'node:child_process' +import { + copyFileSync, + mkdirSync, + mkdtempSync, + rmSync, + writeFileSync, +} from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import test from 'node:test' +import { fileURLToPath } from 'node:url' + +const root = fileURLToPath(new URL('../', import.meta.url)) +const packageDirectory = join(root, 'packages/react-native-nitro-sqlite') +const sqliteDirectory = join(packageDirectory, 'cpp/sqlite') +const environmentNames = [ + 'NITRO_SQLITE_THREADSAFE', + 'NITRO_SQLITE_PERFORMANCE_MODE', + 'NITRO_SQLITE_USE_PHONE_VERSION', +] +const optimizationDefines = [ + 'SQLITE_DQS=0', + 'SQLITE_DEFAULT_MEMSTATUS=0', + 'SQLITE_DEFAULT_WAL_SYNCHRONOUS=1', + 'SQLITE_LIKE_DOESNT_MATCH_BLOBS=1', + 'SQLITE_MAX_EXPR_DEPTH=0', + 'SQLITE_OMIT_DEPRECATED=1', + 'SQLITE_OMIT_PROGRESS_CALLBACK=1', + 'SQLITE_OMIT_SHARED_CACHE=1', + 'SQLITE_USE_ALLOCA=1', +] + +type Environment = Record +type Setting = { tool: string; kind: Record } +type Target = { + name: string + exclude: string[] + settings: Setting[] +} + +test('defaults enable thread safety, performance mode, and RTree', () => { + const defines = definesFor({}) + assertThreadSafe(defines, '1') + assertOptimizations(defines, true) + assert.ok(defines.includes('SQLITE_ENABLE_RTREE=1')) + compileAndProbe(defines, '1', true) +}) + +test('package.json settings choose SQLite options', () => { + const withoutRTree = definesFor({ nitroSQLite: { enableRTree: false } }) + assert.ok( + !withoutRTree.some((define) => define.startsWith('SQLITE_ENABLE_RTREE')), + ) + compileAndProbe(withoutRTree, '1', false) + + const unsafe = definesFor({ nitroSQLite: { threadSafe: false } }) + assertThreadSafe(unsafe, '0') + assertOptimizations(unsafe, true) + compileAndProbe(unsafe, '0', true) + + const unoptimized = definesFor({ nitroSQLite: { performanceMode: false } }) + assertThreadSafe(unoptimized, '1') + assertOptimizations(unoptimized, false) + assert.ok(unoptimized.includes('SQLITE_ENABLE_RTREE=1')) + compileAndProbe(unoptimized, '1', true) +}) + +test('environment variables override package.json settings', () => { + assertThreadSafe( + definesFor( + { nitroSQLite: { threadSafe: false } }, + { NITRO_SQLITE_THREADSAFE: 'true' }, + ), + '1', + ) + assertThreadSafe( + definesFor( + { nitroSQLite: { threadSafe: true } }, + { NITRO_SQLITE_THREADSAFE: 'false' }, + ), + '0', + ) + assertOptimizations( + definesFor( + { nitroSQLite: { performanceMode: false } }, + { NITRO_SQLITE_PERFORMANCE_MODE: 'true' }, + ), + true, + ) + // An overridden setting is not validated. + assertOptimizations( + definesFor( + { nitroSQLite: { performanceMode: 2 } }, + { NITRO_SQLITE_PERFORMANCE_MODE: 'true' }, + ), + true, + ) + assertOptimizations( + definesFor( + { nitroSQLite: { performanceMode: true } }, + { NITRO_SQLITE_PERFORMANCE_MODE: 'false' }, + ), + false, + ) +}) + +test('invalid settings fail the package resolution', () => { + assertRejected( + { nitroSQLite: true }, + {}, + 'nitroSQLite in package.json must be an object', + ) + assertRejected( + { nitroSQLite: { threadSafe: 1 } }, + {}, + 'nitroSQLite.threadSafe in package.json must be true or false', + ) + assertRejected( + { nitroSQLite: { performanceMode: 1 } }, + {}, + 'nitroSQLite.performanceMode in package.json must be true or false', + ) + assertRejected( + { nitroSQLite: { enableRTree: 'false' } }, + {}, + 'nitroSQLite.enableRTree in package.json must be true or false', + ) + assertRejected( + {}, + { NITRO_SQLITE_THREADSAFE: '2' }, + 'NITRO_SQLITE_THREADSAFE must be true, false, 1, or 0', + ) + assertRejected( + {}, + { NITRO_SQLITE_PERFORMANCE_MODE: 'enabled' }, + 'NITRO_SQLITE_PERFORMANCE_MODE must be true, false, 1, or 0', + ) + assertRejected( + { nitroSQLite: { iosSqliteFlags: true } }, + {}, + 'nitroSQLite.iosSqliteFlags in package.json must be a string', + ) + assertRejected( + { nitroSQLite: { iosSqliteFlags: '-DSQLITE_ENABLE_FTS5=1 -O2' } }, + {}, + 'nitroSQLite.iosSqliteFlags in package.json must only contain -D definitions, found -O2', + ) +}) + +test('iosSqliteFlags add definitions and replace defaults with the same name', () => { + const custom = definesFor({ + nitroSQLite: { + iosSqliteFlags: + '-DSQLITE_ENABLE_FTS5 -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=2 -DTHREADSAFE=2', + }, + }) + assert.ok(custom.includes('SQLITE_ENABLE_FTS5')) + assert.ok(custom.includes('SQLITE_DEFAULT_WAL_SYNCHRONOUS=2')) + assert.ok(!custom.includes('SQLITE_DEFAULT_WAL_SYNCHRONOUS=1')) + // SQLite reads THREADSAFE when SQLITE_THREADSAFE is not defined. + assert.ok(!custom.some((define) => define.startsWith('SQLITE_THREADSAFE='))) + compileAndProbe(custom, '2', true) +}) + +test('system SQLite excludes the bundled amalgamation and links libsqlite3', () => { + const target = sqliteTarget({}, { NITRO_SQLITE_USE_PHONE_VERSION: '1' }) + assert.ok(target.exclude.includes('cpp/sqlite/sqlite3.c')) + assert.ok(defines(target).includes('NITRO_SQLITE_USE_PHONE_VERSION=1')) + assert.ok( + target.settings.some( + (setting) => + setting.tool === 'linker' && + setting.kind.linkedLibrary?._0 === 'sqlite3', + ), + ) +}) + +function definesFor( + appPackage: object, + environment: Environment = {}, +): string[] { + return defines(sqliteTarget(appPackage, environment)) +} + +function defines(target: Target): string[] { + return target.settings + .filter((setting) => setting.tool === 'c' && setting.kind.define) + .map((setting) => String(setting.kind.define?._0)) +} + +function sqliteTarget(appPackage: object, environment: Environment): Target { + const result = dumpPackage(appPackage, environment) + assert.equal(result.status, 0, result.stderr) + const manifest = JSON.parse(result.stdout) as { targets: Target[] } + const target = manifest.targets.find( + ({ name }) => name === 'RNNitroSQLiteCxx', + ) + assert.ok(target, 'RNNitroSQLiteCxx target is missing') + return target +} + +function assertRejected( + appPackage: object, + environment: Environment, + message: string, +): void { + const result = dumpPackage(appPackage, environment) + assert.notEqual(result.status, 0) + assert.match( + result.stderr + result.stdout, + new RegExp(message.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')), + ) +} + +/** + * Evaluates Package.swift where React Native links it, `/ios/build/generated/autolinking/libs/RNNitroSQLite`. + * Each call uses a new directory, because SwiftPM caches evaluated manifests by path and contents. + */ +function dumpPackage(appPackage: object, environment: Environment) { + const app = mkdtempSync(join(tmpdir(), 'nitro-sqlite-app-')) + try { + const linkedPackage = join( + app, + 'ios/build/generated/autolinking/libs/RNNitroSQLite', + ) + mkdirSync(linkedPackage, { recursive: true }) + writeFileSync(join(app, 'package.json'), JSON.stringify(appPackage)) + copyFileSync( + join(packageDirectory, 'Package.swift'), + join(linkedPackage, 'Package.swift'), + ) + const env = { ...process.env } + for (const name of environmentNames) delete env[name] + return spawnSync('swift', ['package', 'dump-package'], { + cwd: linkedPackage, + env: { ...env, ...environment }, + encoding: 'utf8', + }) + } finally { + rmSync(app, { recursive: true, force: true }) + } +} + +function assertThreadSafe(defines: string[], expected: string): void { + assert.ok( + defines.includes(`SQLITE_THREADSAFE=${expected}`), + defines.join(' '), + ) + assert.equal( + defines.filter((define) => define.startsWith('SQLITE_THREADSAFE=')).length, + 1, + ) +} + +function assertOptimizations(defines: string[], enabled: boolean): void { + for (const define of optimizationDefines) { + assert.equal(defines.includes(define), enabled, define) + } +} + +/** Compiles the bundled SQLite with the resolved defines and checks thread safety and RTree at runtime. */ +function compileAndProbe( + defines: string[], + threadSafe: string, + rtree: boolean, +): void { + const directory = mkdtempSync(join(tmpdir(), 'nitro-sqlite-probe-')) + try { + const probe = join(directory, 'probe.c') + const binary = join(directory, 'probe') + writeFileSync( + probe, + `#include +#include +#include +#include "sqlite3.h" + +int main(int argc, char **argv) { + assert(argc == 2); + sqlite3 *db = NULL; + assert(sqlite3_open(argv[1], &db) == SQLITE_OK); + int rc = sqlite3_exec(db, + "CREATE VIRTUAL TABLE SpatialIndex USING rtree(id,minX,maxX,minY,maxY)", + NULL, NULL, NULL); + if (${rtree ? 1 : 0}) { + assert(rc == SQLITE_OK); + assert(sqlite3_exec(db, + "INSERT INTO SpatialIndex VALUES(1,10,20,30,40);" + "CREATE TABLE Item(id INTEGER PRIMARY KEY);" + "INSERT INTO Item VALUES(1);" + "CREATE VIEW SpatialItems AS SELECT Item.id FROM Item JOIN SpatialIndex USING(id);" + "CREATE VIRTUAL TABLE IntIndex USING rtree_i32(id,minX,maxX)", + NULL, NULL, NULL) == SQLITE_OK); + assert(sqlite3_close(db) == SQLITE_OK); + assert(sqlite3_open(argv[1], &db) == SQLITE_OK); + assert(sqlite3_exec(db, + "ALTER TABLE Item RENAME TO RenamedItem;" + "ALTER TABLE SpatialIndex RENAME TO RenamedSpatialIndex;", + NULL, NULL, NULL) == SQLITE_OK); + sqlite3_stmt *statement = NULL; + assert(sqlite3_prepare_v2(db, "SELECT id FROM SpatialItems", -1, &statement, NULL) == SQLITE_OK); + assert(sqlite3_step(statement) == SQLITE_ROW); + assert(sqlite3_column_int(statement, 0) == 1); + assert(sqlite3_step(statement) == SQLITE_DONE); + assert(sqlite3_finalize(statement) == SQLITE_OK); + } else { + assert(rc == SQLITE_ERROR); + assert(strcmp(sqlite3_errmsg(db), "no such module: rtree") == 0); + } + assert(sqlite3_close(db) == SQLITE_OK); + printf("%d", sqlite3_threadsafe()); + return 0; +} +`, + ) + execFileSync(process.env.CC ?? 'cc', [ + ...defines.map((define) => `-D${define}`), + `-I${sqliteDirectory}`, + join(sqliteDirectory, 'sqlite3.c'), + probe, + '-o', + binary, + // FTS5 calls log(), which Linux provides in libm. + '-lm', + ]) + assert.equal( + execFileSync(binary, [join(directory, 'rtree.sqlite')], { + encoding: 'utf8', + }), + threadSafe, + ) + } finally { + rmSync(directory, { recursive: true, force: true }) + } +} diff --git a/scripts/test-podspec-threadsafe.rb b/scripts/test-podspec-threadsafe.rb deleted file mode 100644 index 804995e1..00000000 --- a/scripts/test-podspec-threadsafe.rb +++ /dev/null @@ -1,361 +0,0 @@ -#!/usr/bin/env ruby - -require "shellwords" -require "tmpdir" -require "json" - -ROOT = File.expand_path("..", __dir__) -PACKAGE_DIRECTORY = File.join(ROOT, "packages", "react-native-nitro-sqlite") -PODSPEC = File.join(PACKAGE_DIRECTORY, "RNNitroSQLite.podspec") -SQLITE_SOURCE = File.join(PACKAGE_DIRECTORY, "cpp", "sqlite", "sqlite3.c") - -module Pod - module UI - def self.puts(*) end - end - - class Spec - class << self - attr_accessor :last - - def new - spec = allocate - spec.send(:initialize) - yield spec - self.last = spec - end - end - - attr_reader :attributes_hash - - def initialize - @attributes_hash = {} - end - - def dependency(*) end - - def method_missing(name, *arguments) - attribute = name.to_s - return @attributes_hash[attribute] if arguments.empty? - - if attribute.end_with?("=") && arguments.length == 1 - @attributes_hash[attribute.delete_suffix("=")] = arguments.first - return arguments.first - end - - super - end - - def respond_to_missing?(*_arguments) - true - end - end - - class Config - class << self - attr_accessor :installation_root - - def instance - self - end - end - end -end - -def min_ios_version_supported - "13.4" -end - -def install_modules_dependencies(_spec) end - -def main - default_flags = with_app_package({}) { flags_for(nil) } - assert_threadsafe(default_flags, "1") - assert_optimization_flags(default_flags) - assert_includes(default_flags, "-DSQLITE_ENABLE_RTREE=1") - - without_rtree_flags = with_app_package("nitroSQLite" => {"enableRTree" => false}) do - flags_for(nil) - end - refute_includes(without_rtree_flags, "SQLITE_ENABLE_RTREE") - - unsafe_flags = with_app_package("nitroSQLite" => {"threadSafe" => false}) do - flags_for(nil) - end - assert_threadsafe(unsafe_flags, "0") - assert_optimization_flags(unsafe_flags) - - safe_flags = with_app_package("nitroSQLite" => {"threadSafe" => false}) do - flags_for("true") - end - assert_threadsafe(safe_flags, "1") - assert_optimization_flags(safe_flags) - - environment_unsafe_flags = with_app_package("nitroSQLite" => {"threadSafe" => true}) do - flags_for("false") - end - assert_threadsafe(environment_unsafe_flags, "0") - assert_optimization_flags(environment_unsafe_flags) - - unoptimized_flags = with_app_package("nitroSQLite" => {"performanceMode" => false}) do - flags_for(nil) - end - assert_threadsafe(unoptimized_flags, "1") - refute_optimization_flags(unoptimized_flags) - assert_includes(unoptimized_flags, "-DSQLITE_ENABLE_RTREE=1") - - environment_enabled_flags = with_app_package("nitroSQLite" => {"performanceMode" => false}) do - flags_for(nil, "true") - end - assert_optimization_flags(environment_enabled_flags) - - environment_override_invalid_package = with_app_package("nitroSQLite" => {"performanceMode" => 2}) do - flags_for(nil, "true") - end - assert_optimization_flags(environment_override_invalid_package) - - environment_disabled_flags = with_app_package("nitroSQLite" => {"performanceMode" => true}) do - flags_for(nil, "false") - end - refute_optimization_flags(environment_disabled_flags) - - assert_invalid_package_value_rejected - assert_invalid_package_config_rejected - assert_invalid_environment_value_rejected - assert_invalid_package_performance_mode_rejected - assert_invalid_environment_performance_mode_rejected - assert_invalid_package_rtree_rejected - with_app_package({}) { assert_system_sqlite_configuration } - compile_and_probe(unsafe_flags, "0") - compile_and_probe(safe_flags, "1") - compile_and_probe(unoptimized_flags, "1") - compile_and_probe(without_rtree_flags, "1", false) - - puts "SQLite pod configuration tests passed" -end - -def with_app_package(contents) - Dir.mktmpdir("nitro-sqlite-app") do |directory| - ios_directory = File.join(directory, "ios") - Dir.mkdir(ios_directory) - File.write(File.join(directory, "package.json"), JSON.generate(contents)) - Pod::Config.installation_root = ios_directory - yield - end -end - -def flags_for(threadsafe, performance_mode = nil) - spec = evaluate_podspec( - "NITRO_SQLITE_THREADSAFE" => threadsafe, - "NITRO_SQLITE_PERFORMANCE_MODE" => performance_mode, - "NITRO_SQLITE_USE_PHONE_VERSION" => nil, - ) - spec.attributes_hash.fetch("pod_target_xcconfig").fetch("OTHER_CFLAGS") -end - -def evaluate_podspec(environment) - previous_environment = environment.to_h do |name, _value| - [name, ENV.key?(name) ? ENV.fetch(name) : nil] - end - - environment.each do |name, value| - value.nil? ? ENV.delete(name) : ENV[name] = value - end - - Dir.chdir(PACKAGE_DIRECTORY) { load PODSPEC } - Pod::Spec.last -ensure - previous_environment&.each do |name, value| - value.nil? ? ENV.delete(name) : ENV[name] = value - end -end - -def assert_threadsafe(flags, expected) - assert_includes(flags, "-DSQLITE_THREADSAFE=#{expected}") - other = expected == "1" ? "0" : "1" - refute_includes(flags, "-DSQLITE_THREADSAFE=#{other}") -end - -def assert_optimization_flags(flags) - optimization_flags.each { |flag| assert_includes(flags, flag) } -end - -def refute_optimization_flags(flags) - optimization_flags.each { |flag| refute_includes(flags, flag) } -end - -def optimization_flags - %w[ - -DSQLITE_DQS=0 - -DSQLITE_DEFAULT_MEMSTATUS=0 - -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 - -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 - -DSQLITE_MAX_EXPR_DEPTH=0 - -DSQLITE_OMIT_DEPRECATED=1 - -DSQLITE_OMIT_PROGRESS_CALLBACK=1 - -DSQLITE_OMIT_SHARED_CACHE=1 - -DSQLITE_USE_ALLOCA=1 - ] -end - -def assert_invalid_package_value_rejected - with_app_package("nitroSQLite" => {"threadSafe" => 1}) do - evaluate_podspec("NITRO_SQLITE_THREADSAFE" => nil) - end - fail "Expected an invalid NITRO_SQLITE_THREADSAFE value to fail" -rescue RuntimeError => error - expected = "nitroSQLite.threadSafe in package.json must be true or false" - fail "Unexpected validation error: #{error.message}" unless error.message == expected -end - -def assert_invalid_package_config_rejected - with_app_package("nitroSQLite" => true) do - evaluate_podspec("NITRO_SQLITE_THREADSAFE" => nil) - end - fail "Expected an invalid nitroSQLite configuration to fail" -rescue RuntimeError => error - expected = "nitroSQLite in package.json must be an object" - fail "Unexpected validation error: #{error.message}" unless error.message == expected -end - -def assert_invalid_environment_value_rejected - with_app_package({}) { evaluate_podspec("NITRO_SQLITE_THREADSAFE" => "2") } - fail "Expected an invalid NITRO_SQLITE_THREADSAFE value to fail" -rescue RuntimeError => error - expected = "NITRO_SQLITE_THREADSAFE must be true, false, 1, or 0" - fail "Unexpected validation error: #{error.message}" unless error.message == expected -end - -def assert_invalid_package_performance_mode_rejected - with_app_package("nitroSQLite" => {"performanceMode" => 1}) do - evaluate_podspec( - "NITRO_SQLITE_THREADSAFE" => nil, - "NITRO_SQLITE_PERFORMANCE_MODE" => nil, - ) - end - fail "Expected an invalid nitroSQLite.performanceMode value to fail" -rescue RuntimeError => error - expected = "nitroSQLite.performanceMode in package.json must be true or false" - fail "Unexpected validation error: #{error.message}" unless error.message == expected -end - -def assert_invalid_environment_performance_mode_rejected - with_app_package({}) do - evaluate_podspec( - "NITRO_SQLITE_THREADSAFE" => nil, - "NITRO_SQLITE_PERFORMANCE_MODE" => "enabled", - ) - end - fail "Expected an invalid NITRO_SQLITE_PERFORMANCE_MODE value to fail" -rescue RuntimeError => error - expected = "NITRO_SQLITE_PERFORMANCE_MODE must be true, false, 1, or 0" - fail "Unexpected validation error: #{error.message}" unless error.message == expected -end - -def assert_system_sqlite_configuration - spec = evaluate_podspec( - "NITRO_SQLITE_THREADSAFE" => "1", - "NITRO_SQLITE_USE_PHONE_VERSION" => "1", - ) - attributes = spec.attributes_hash - - assert_equal(attributes.fetch("library"), "sqlite3") - assert_equal( - attributes.fetch("exclude_files"), - ["cpp/sqlite/sqlite3.c", "cpp/sqlite/sqlite3.h"], - ) -end - -def assert_invalid_package_rtree_rejected - with_app_package("nitroSQLite" => {"enableRTree" => "false"}) do - evaluate_podspec("NITRO_SQLITE_THREADSAFE" => nil) - end - fail "Expected an invalid nitroSQLite.enableRTree value to fail" -rescue RuntimeError => error - expected = "nitroSQLite.enableRTree in package.json must be true or false" - fail "Unexpected validation error: #{error.message}" unless error.message == expected -end - -def compile_and_probe(flags, expected, rtree = true) - Dir.mktmpdir("nitro-sqlite-threadsafe") do |directory| - probe = File.join(directory, "probe.c") - binary = File.join(directory, "probe") - File.write( - probe, - <<~C, - #include - #include - #include - #include "sqlite3.h" - - int main(int argc, char **argv) { - assert(argc == 2); - sqlite3 *db = NULL; - assert(sqlite3_open(argv[1], &db) == SQLITE_OK); - int rc = sqlite3_exec(db, - "CREATE VIRTUAL TABLE SpatialIndex USING rtree(id,minX,maxX,minY,maxY)", - NULL, NULL, NULL); - if (#{rtree ? 1 : 0}) { - assert(rc == SQLITE_OK); - assert(sqlite3_exec(db, - "INSERT INTO SpatialIndex VALUES(1,10,20,30,40);" - "CREATE TABLE Item(id INTEGER PRIMARY KEY);" - "INSERT INTO Item VALUES(1);" - "CREATE VIEW SpatialItems AS SELECT Item.id FROM Item JOIN SpatialIndex USING(id);" - "CREATE VIRTUAL TABLE IntIndex USING rtree_i32(id,minX,maxX)", - NULL, NULL, NULL) == SQLITE_OK); - assert(sqlite3_close(db) == SQLITE_OK); - assert(sqlite3_open(argv[1], &db) == SQLITE_OK); - assert(sqlite3_exec(db, - "ALTER TABLE Item RENAME TO RenamedItem;" - "ALTER TABLE SpatialIndex RENAME TO RenamedSpatialIndex;", - NULL, NULL, NULL) == SQLITE_OK); - sqlite3_stmt *statement = NULL; - assert(sqlite3_prepare_v2(db, "SELECT id FROM SpatialItems", -1, - &statement, NULL) == SQLITE_OK); - assert(sqlite3_step(statement) == SQLITE_ROW); - assert(sqlite3_column_int(statement, 0) == 1); - assert(sqlite3_step(statement) == SQLITE_DONE); - assert(sqlite3_finalize(statement) == SQLITE_OK); - } else { - assert(rc == SQLITE_ERROR); - assert(strcmp(sqlite3_errmsg(db), "no such module: rtree") == 0); - } - assert(sqlite3_close(db) == SQLITE_OK); - printf("%d", sqlite3_threadsafe()); - return 0; - } - C - ) - - compile_flags = Shellwords.split(flags).reject { |flag| flag == "$(inherited)" } - command = [ - ENV.fetch("CC", "cc"), - *compile_flags, - "-I#{File.dirname(SQLITE_SOURCE)}", - SQLITE_SOURCE, - probe, - "-o", - binary, - ] - fail "Failed to compile bundled SQLite with SQLITE_THREADSAFE=#{expected}" unless system(*command) - - actual = IO.popen([binary, File.join(directory, "rtree.sqlite")], &:read) - fail "SQLite configuration probe failed" unless $?.success? - assert_equal(actual, expected) - end -end - -def assert_includes(value, expected) - fail "Expected #{value.inspect} to include #{expected.inspect}" unless value.include?(expected) -end - -def refute_includes(value, unexpected) - fail "Expected #{value.inspect} not to include #{unexpected.inspect}" if value.include?(unexpected) -end - -def assert_equal(actual, expected) - fail "Expected #{expected.inspect}, got #{actual.inspect}" unless actual == expected -end - -main