diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9bf8bb7b..2cdb3250 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,12 +37,17 @@ jobs: test-ios: needs: test-rn - runs-on: macos-13 + runs-on: macos-14 + env: + RCT_NEW_ARCH_ENABLED: 0 + RCT_NO_LAUNCH_PACKAGER: 1 + USE_METRO_BUNDLER: 0 + FORCE_BUNDLING: 1 steps: - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '15.2' + xcode-version: '16.1' - name: Checkout uses: actions/checkout@v2 @@ -52,6 +57,12 @@ jobs: with: node-version: ${{ env.NODE_JS_VERSION }} + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.2' + bundler-cache: true # Caches gems + - name: Install SDK Dependencies run: yarn install --frozen-lockfile @@ -62,13 +73,34 @@ jobs: working-directory: ./sample run: npm ci --legacy-peer-deps - - name: Install pods + - name: Bundle install (Ruby gems) working-directory: ./sample - run: cd ios && pod install + run: | + bundle config set path 'vendor/bundle' + bundle install --jobs 4 --retry 3 + + - name: Install pods (via bundler) + working-directory: ./sample/ios + run: | + pod deintegrate + pod cache clean --all + bundle exec pod install --repo-update + + - name: Clean Xcode Build Artifacts + run: | + rm -rf ~/Library/Developer/Xcode/DerivedData/* - name: Run tests - working-directory: ./sample - run: cd ios && xcodebuild -workspace sample.xcworkspace -scheme "sample" -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 14' test + working-directory: ./sample/ios + run: | + set -o pipefail && \ + xcodebuild \ + -workspace sample.xcworkspace \ + -scheme "sample" \ + -sdk iphonesimulator \ + -destination 'platform=iOS Simulator,OS=latest,name=iPhone 16 Pro' \ + -only-testing:sampleTests \ + test | bundle exec xcpretty && exit ${PIPESTATUS[0]} test-android: needs: test-rn diff --git a/package-lock.json b/package-lock.json index 939c10e3..36def354 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -103,7 +102,6 @@ "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -433,6 +431,7 @@ "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" @@ -450,6 +449,7 @@ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -466,6 +466,7 @@ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -482,6 +483,7 @@ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -500,6 +502,7 @@ "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.3" @@ -665,6 +668,7 @@ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" }, @@ -774,6 +778,7 @@ "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -963,6 +968,7 @@ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1032,6 +1038,7 @@ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1081,6 +1088,7 @@ "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" @@ -1153,6 +1161,7 @@ "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1170,6 +1179,7 @@ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1186,6 +1196,7 @@ "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1203,6 +1214,7 @@ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1219,6 +1231,7 @@ "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" @@ -1236,6 +1249,7 @@ "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1252,6 +1266,7 @@ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1320,6 +1335,7 @@ "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1368,6 +1384,7 @@ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1384,6 +1401,7 @@ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1418,6 +1436,7 @@ "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -1437,6 +1456,7 @@ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1471,6 +1491,7 @@ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1539,6 +1560,7 @@ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" @@ -1640,6 +1662,7 @@ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1740,6 +1763,7 @@ "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1757,6 +1781,7 @@ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1843,6 +1868,7 @@ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1859,6 +1885,7 @@ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1895,6 +1922,7 @@ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1911,6 +1939,7 @@ "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1945,6 +1974,7 @@ "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2066,6 +2096,7 @@ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -3777,7 +3808,6 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4025,7 +4055,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4792,7 +4821,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -6108,7 +6136,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -13077,7 +13104,6 @@ "version": "4.0.3", "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -14109,7 +14135,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14169,7 +14194,6 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.6.tgz", "integrity": "sha512-kvIWSmf4QPfY41HC25TR285N7Fv0Pyn3DAEK8qRL9dA35usSaxsJkHfw+VqnonqJjXOaoKCEanwudRAJ60TBGA==", "license": "MIT", - "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.79.6", @@ -16118,7 +16142,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/sample/Gemfile b/sample/Gemfile index 6a4c5f17..790c5099 100644 --- a/sample/Gemfile +++ b/sample/Gemfile @@ -1,16 +1,17 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby ">= 2.6.10" +ruby ">= 3.2.0" # Exclude problematic versions of cocoapods and activesupport that causes build failures. -gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' -gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' -gem 'xcodeproj', '< 1.26.0' -gem 'concurrent-ruby', '< 1.3.4' +gem 'cocoapods', '~> 1.16.2' +gem 'xcodeproj', '~> 1.27.0' +gem 'activesupport', '>= 7.0' +gem 'concurrent-ruby' # Ruby 3.4.0 has removed some libraries from the standard library. gem 'bigdecimal' gem 'logger' gem 'benchmark' gem 'mutex_m' +gem 'xcpretty' diff --git a/sample/ios/Podfile b/sample/ios/Podfile index 84580409..ef74db8f 100644 --- a/sample/ios/Podfile +++ b/sample/ios/Podfile @@ -1,4 +1,4 @@ -# Resolve react_native_pods.rb com node para permitir hoisting +# Resolve react_native_pods.rb with Node to allow hoisting require Pod::Executable.execute_command('node', ['-p', 'require.resolve( "react-native/scripts/react_native_pods.rb", @@ -21,21 +21,32 @@ target 'sample' do # Development: Use local SDK pod 'react-native-usercentrics', :path => '../..' - - # Testing: Use GitHub version (uncomment to test with published version) + # Testing (optional): Use GitHub version # pod 'react-native-usercentrics', :git => 'https://github.com/Usercentrics/usercentrics-react-native.git', :tag => 'v2.22.2' + # ✅ Test target: inherit search paths only, not full settings + target 'sampleTests' do + inherit! :search_paths + end + + # ✅ Post-install hook (safe for CircleCI and macOS 13+) post_install do |installer| react_native_post_install( installer, :mac_catalyst_enabled => false ) - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++20' - config.build_settings['CLANG_CXX_LIBRARY'] = 'libc++' - config.build_settings['OTHER_CPLUSPLUSFLAGS'] = '-std=c++20 -stdlib=libc++' + targets = installer&.pods_project&.targets + Array(targets).compact.each do |t| + next unless t.respond_to?(:build_configurations) + name = t.respond_to?(:name) ? t.name.to_s : "" + next if name.include?("Tests") + + Array(t.build_configurations).compact.each do |config| + next unless config.respond_to?(:build_settings) && config.build_settings.is_a?(Hash) + config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = '$(inherited) c++20' + config.build_settings['CLANG_CXX_LIBRARY'] = '$(inherited) libc++' + config.build_settings['OTHER_CPLUSPLUSFLAGS'] = '$(inherited) -std=c++20 -stdlib=libc++' end end end diff --git a/sample/ios/Podfile.lock b/sample/ios/Podfile.lock new file mode 100644 index 00000000..6c8e1455 --- /dev/null +++ b/sample/ios/Podfile.lock @@ -0,0 +1,2034 @@ +PODS: + - boost (1.84.0) + - DoubleConversion (1.1.6) + - fast_float (6.1.4) + - FBLazyVector (0.79.6) + - fmt (11.0.2) + - glog (0.3.5) + - hermes-engine (0.79.6): + - hermes-engine/Pre-built (= 0.79.6) + - hermes-engine/Pre-built (0.79.6) + - RCT-Folly (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Default (= 2024.11.18.00) + - RCT-Folly/Default (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - RCT-Folly/Fabric (2024.11.18.00): + - boost + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - RCTDeprecation (0.79.6) + - RCTRequired (0.79.6) + - RCTTypeSafety (0.79.6): + - FBLazyVector (= 0.79.6) + - RCTRequired (= 0.79.6) + - React-Core (= 0.79.6) + - React (0.79.6): + - React-Core (= 0.79.6) + - React-Core/DevSupport (= 0.79.6) + - React-Core/RCTWebSocket (= 0.79.6) + - React-RCTActionSheet (= 0.79.6) + - React-RCTAnimation (= 0.79.6) + - React-RCTBlob (= 0.79.6) + - React-RCTImage (= 0.79.6) + - React-RCTLinking (= 0.79.6) + - React-RCTNetwork (= 0.79.6) + - React-RCTSettings (= 0.79.6) + - React-RCTText (= 0.79.6) + - React-RCTVibration (= 0.79.6) + - React-callinvoker (0.79.6) + - React-Core (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default (= 0.79.6) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/CoreModulesHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/Default (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/DevSupport (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default (= 0.79.6) + - React-Core/RCTWebSocket (= 0.79.6) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTActionSheetHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTAnimationHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTBlobHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTImageHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTLinkingHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTNetworkHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTSettingsHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTTextHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTVibrationHeaders (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTWebSocket (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTDeprecation + - React-Core/Default (= 0.79.6) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-CoreModules (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - RCT-Folly (= 2024.11.18.00) + - RCTTypeSafety (= 0.79.6) + - React-Core/CoreModulesHeaders (= 0.79.6) + - React-jsi (= 0.79.6) + - React-jsinspector + - React-jsinspectortracing + - React-NativeModulesApple + - React-RCTBlob + - React-RCTFBReactNativeSpec + - React-RCTImage (= 0.79.6) + - ReactCommon + - SocketRocket (= 0.7.1) + - React-cxxreact (0.79.6): + - boost + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-callinvoker (= 0.79.6) + - React-debug (= 0.79.6) + - React-jsi (= 0.79.6) + - React-jsinspector + - React-jsinspectortracing + - React-logger (= 0.79.6) + - React-perflogger (= 0.79.6) + - React-runtimeexecutor (= 0.79.6) + - React-timing (= 0.79.6) + - React-debug (0.79.6) + - React-defaultsnativemodule (0.79.6): + - hermes-engine + - RCT-Folly + - React-domnativemodule + - React-featureflagsnativemodule + - React-hermes + - React-idlecallbacksnativemodule + - React-jsi + - React-jsiexecutor + - React-microtasksnativemodule + - React-RCTFBReactNativeSpec + - React-domnativemodule (0.79.6): + - hermes-engine + - RCT-Folly + - React-Fabric + - React-FabricComponents + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.79.6) + - React-Fabric/attributedstring (= 0.79.6) + - React-Fabric/componentregistry (= 0.79.6) + - React-Fabric/componentregistrynative (= 0.79.6) + - React-Fabric/components (= 0.79.6) + - React-Fabric/consistency (= 0.79.6) + - React-Fabric/core (= 0.79.6) + - React-Fabric/dom (= 0.79.6) + - React-Fabric/imagemanager (= 0.79.6) + - React-Fabric/leakchecker (= 0.79.6) + - React-Fabric/mounting (= 0.79.6) + - React-Fabric/observers (= 0.79.6) + - React-Fabric/scheduler (= 0.79.6) + - React-Fabric/telemetry (= 0.79.6) + - React-Fabric/templateprocessor (= 0.79.6) + - React-Fabric/uimanager (= 0.79.6) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/animations (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistry (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistrynative (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.79.6) + - React-Fabric/components/root (= 0.79.6) + - React-Fabric/components/scrollview (= 0.79.6) + - React-Fabric/components/view (= 0.79.6) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/legacyviewmanagerinterop (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/root (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/scrollview (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/view (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-renderercss + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric/consistency (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/core (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/dom (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/imagemanager (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/leakchecker (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/mounting (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.79.6) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers/events (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/scheduler (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/telemetry (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/templateprocessor (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.79.6) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager/consistency (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-FabricComponents (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.79.6) + - React-FabricComponents/textlayoutmanager (= 0.79.6) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.79.6) + - React-FabricComponents/components/iostextinput (= 0.79.6) + - React-FabricComponents/components/modal (= 0.79.6) + - React-FabricComponents/components/rncore (= 0.79.6) + - React-FabricComponents/components/safeareaview (= 0.79.6) + - React-FabricComponents/components/scrollview (= 0.79.6) + - React-FabricComponents/components/text (= 0.79.6) + - React-FabricComponents/components/textinput (= 0.79.6) + - React-FabricComponents/components/unimplementedview (= 0.79.6) + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/inputaccessory (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/iostextinput (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/modal (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/rncore (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/safeareaview (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/scrollview (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/text (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/textinput (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/unimplementedview (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/textlayoutmanager (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-FabricImage (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - RCTRequired (= 0.79.6) + - RCTTypeSafety (= 0.79.6) + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsiexecutor (= 0.79.6) + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - Yoga + - React-featureflags (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - React-featureflagsnativemodule (0.79.6): + - hermes-engine + - RCT-Folly + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - React-graphics (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-hermes + - React-jsi + - React-jsiexecutor + - React-utils + - React-hermes (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-cxxreact (= 0.79.6) + - React-jsi + - React-jsiexecutor (= 0.79.6) + - React-jsinspector + - React-jsinspectortracing + - React-perflogger (= 0.79.6) + - React-runtimeexecutor + - React-idlecallbacksnativemodule (0.79.6): + - glog + - hermes-engine + - RCT-Folly + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - React-runtimescheduler + - ReactCommon/turbomodule/core + - React-ImageManager (0.79.6): + - glog + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - React-jserrorhandler (0.79.6): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - ReactCommon/turbomodule/bridging + - React-jsi (0.79.6): + - boost + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-jsiexecutor (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-cxxreact (= 0.79.6) + - React-jsi (= 0.79.6) + - React-jsinspector + - React-jsinspectortracing + - React-perflogger (= 0.79.6) + - React-jsinspector (0.79.6): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly + - React-featureflags + - React-jsi + - React-jsinspectortracing + - React-perflogger (= 0.79.6) + - React-runtimeexecutor (= 0.79.6) + - React-jsinspectortracing (0.79.6): + - RCT-Folly + - React-oscompat + - React-jsitooling (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - RCT-Folly (= 2024.11.18.00) + - React-cxxreact (= 0.79.6) + - React-jsi (= 0.79.6) + - React-jsinspector + - React-jsinspectortracing + - React-jsitracing (0.79.6): + - React-jsi + - React-logger (0.79.6): + - glog + - React-Mapbuffer (0.79.6): + - glog + - React-debug + - React-microtasksnativemodule (0.79.6): + - hermes-engine + - RCT-Folly + - React-hermes + - React-jsi + - React-jsiexecutor + - React-RCTFBReactNativeSpec + - ReactCommon/turbomodule/core + - react-native-safe-area-context (5.6.1): + - React-Core + - react-native-usercentrics (2.23.3): + - React-Core + - React-NativeModulesApple + - UsercentricsUI (= 2.23.3) + - react-native-webview (13.16.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-NativeModulesApple (0.79.6): + - glog + - hermes-engine + - React-callinvoker + - React-Core + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-oscompat (0.79.6) + - React-perflogger (0.79.6): + - DoubleConversion + - RCT-Folly (= 2024.11.18.00) + - React-performancetimeline (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - React-cxxreact + - React-featureflags + - React-jsinspectortracing + - React-perflogger + - React-timing + - React-RCTActionSheet (0.79.6): + - React-Core/RCTActionSheetHeaders (= 0.79.6) + - React-RCTAnimation (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - React-RCTAppDelegate (0.79.6): + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-jsitooling + - React-NativeModulesApple + - React-RCTFabric + - React-RCTFBReactNativeSpec + - React-RCTImage + - React-RCTNetwork + - React-RCTRuntime + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-runtimescheduler + - React-utils + - ReactCommon + - React-RCTBlob (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - React-RCTFabric (0.79.6): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-jsinspector + - React-jsinspectortracing + - React-performancetimeline + - React-RCTAnimation + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-renderercss + - React-rendererdebug + - React-runtimescheduler + - React-utils + - Yoga + - React-RCTFBReactNativeSpec (0.79.6): + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-hermes + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - ReactCommon + - React-RCTImage (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - React-RCTNetwork + - ReactCommon + - React-RCTLinking (0.79.6): + - React-Core/RCTLinkingHeaders (= 0.79.6) + - React-jsi (= 0.79.6) + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - ReactCommon/turbomodule/core (= 0.79.6) + - React-RCTNetwork (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - React-RCTRuntime (0.79.6): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-Core + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectortracing + - React-jsitooling + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - React-RCTSettings (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - React-RCTText (0.79.6): + - React-Core/RCTTextHeaders (= 0.79.6) + - Yoga + - React-RCTVibration (0.79.6): + - RCT-Folly (= 2024.11.18.00) + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTFBReactNativeSpec + - ReactCommon + - React-rendererconsistency (0.79.6) + - React-renderercss (0.79.6): + - React-debug + - React-utils + - React-rendererdebug (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - RCT-Folly (= 2024.11.18.00) + - React-debug + - React-rncore (0.79.6) + - React-RuntimeApple (0.79.6): + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - 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 + - React-RuntimeCore (0.79.6): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-cxxreact + - React-Fabric + - React-featureflags + - React-hermes + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-jsitooling + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - React-runtimeexecutor (0.79.6): + - React-jsi (= 0.79.6) + - React-RuntimeHermes (0.79.6): + - hermes-engine + - RCT-Folly/Fabric (= 2024.11.18.00) + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsinspectortracing + - React-jsitooling + - React-jsitracing + - React-RuntimeCore + - React-utils + - React-runtimescheduler (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspectortracing + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - React-timing (0.79.6) + - React-utils (0.79.6): + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-debug + - React-hermes + - React-jsi (= 0.79.6) + - ReactAppDependencyProvider (0.79.6): + - ReactCodegen + - ReactCodegen (0.79.6): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-hermes + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-RCTAppDelegate + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactCommon (0.79.6): + - ReactCommon/turbomodule (= 0.79.6) + - ReactCommon/turbomodule (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-callinvoker (= 0.79.6) + - React-cxxreact (= 0.79.6) + - React-jsi (= 0.79.6) + - React-logger (= 0.79.6) + - React-perflogger (= 0.79.6) + - ReactCommon/turbomodule/bridging (= 0.79.6) + - ReactCommon/turbomodule/core (= 0.79.6) + - ReactCommon/turbomodule/bridging (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-callinvoker (= 0.79.6) + - React-cxxreact (= 0.79.6) + - React-jsi (= 0.79.6) + - React-logger (= 0.79.6) + - React-perflogger (= 0.79.6) + - ReactCommon/turbomodule/core (0.79.6): + - DoubleConversion + - fast_float (= 6.1.4) + - fmt (= 11.0.2) + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - React-callinvoker (= 0.79.6) + - React-cxxreact (= 0.79.6) + - React-debug (= 0.79.6) + - React-featureflags (= 0.79.6) + - React-jsi (= 0.79.6) + - React-logger (= 0.79.6) + - React-perflogger (= 0.79.6) + - React-utils (= 0.79.6) + - RNScreens (4.16.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.11.18.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - SocketRocket (0.7.1) + - Usercentrics (2.23.3) + - UsercentricsUI (2.23.3): + - Usercentrics (= 2.23.3) + - Yoga (0.0.0) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) + - RCTRequired (from `../node_modules/react-native/Libraries/Required`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - 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-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-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-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - react-native-usercentrics (from `../..`) + - react-native-webview (from `../node_modules/react-native-webview`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - 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 `../node_modules/react-native/React`) + - 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 `../node_modules/react-native/React/Runtime`) + - 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-rncore (from `../node_modules/react-native/ReactCommon`) + - 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`) + - ReactAppDependencyProvider (from `build/generated/ios`) + - ReactCodegen (from `build/generated/ios`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNScreens (from `../node_modules/react-native-screens`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - SocketRocket + - Usercentrics + - UsercentricsUI + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + fast_float: + :podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2025-06-04-RNv0.79.3-7f9a871eefeb2c3852365ee80f0b6733ec12ac3b + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../node_modules/react-native/Libraries/Required" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + 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-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-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-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + react-native-usercentrics: + :path: "../.." + react-native-webview: + :path: "../node_modules/react-native-webview" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-oscompat: + :path: "../node_modules/react-native/ReactCommon/oscompat" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + 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: "../node_modules/react-native/React" + 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: "../node_modules/react-native/React/Runtime" + 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-rncore: + :path: "../node_modules/react-native/ReactCommon" + 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" + ReactAppDependencyProvider: + :path: build/generated/ios + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNScreens: + :path: "../node_modules/react-native-screens" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 + DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb + fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 + FBLazyVector: 07309209b7b914451b8f822544a18e2a0a85afff + fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd + glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 + hermes-engine: 44bb6fe76a6eb400d3a992e2d0b21946ae999fa9 + RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82 + RCTDeprecation: 9bc64754b40b86fa5e32f293ab3ea8eea2248339 + RCTRequired: ee36c1ce9a5e65a3f629c13f38a85308eb8eebda + RCTTypeSafety: 7c0b654b92ef732fffc2a3992a02d10dc8f94bfd + React: bc28da5a227fa5e7b43e7ed68061f34740d4c880 + React-callinvoker: b78b18b44bc2c6634f7e594ad4fd206e624d41e3 + React-Core: 790dbe4191ce86ac1f45fb883f20d3b1d3cd9c17 + React-CoreModules: ee0b89806b53e36ccd02e5bf2f5743a902d7bf4b + React-cxxreact: 58b3e3e5242d59e0f4d1f8995a08c63a046db793 + React-debug: 4e8a1d0753d6c58a6d7a8a7ffad5839542b20458 + React-defaultsnativemodule: a809ac29a5a6153afd7b795106d1effa92b90dce + React-domnativemodule: a4fa2defc6d829da06cd4a43db7225de7b31c38d + React-Fabric: 6695ddf6024fe91609274020d2a884b02323ad26 + React-FabricComponents: 0ef451cfa96b8373763749e82ee166f5b929ab56 + React-FabricImage: c2bd134f814cbb1b71cfa46e909b292ebb336187 + React-featureflags: 3f2d22836c7a4ce883de0cd8c4d79c264095a1d6 + React-featureflagsnativemodule: 92f5a393fe0bda121b280dd3977c998adc60502e + React-graphics: 8aff3b3d9f81147b0f3835faee9b6da86d969212 + React-hermes: 35f643c32d754a1b2b53cad842f23cfaa99f8d8f + React-idlecallbacksnativemodule: 7d3f625a86e99b93682ce9c379b991c13b0c5592 + React-ImageManager: 797f791c447a06ef345a870bf1352f6e14a10edf + React-jserrorhandler: 71e93d00000a5319e4a67ba27e16f7837fb5d4a0 + React-jsi: 6a616bbcb9d9120a026b725ecce4f35f98f09ba1 + React-jsiexecutor: 57d3e09d0f1d3768ac5e2939995943d39bb9654f + React-jsinspector: 9d45649347df031967b83d5594e9ece581edf94b + React-jsinspectortracing: 4f324b98c0b94b308ee494cf403d231aa9869a40 + React-jsitooling: 58c3a832eb709175600af5c9b071fa09e18a5bb7 + React-jsitracing: 91c504cef20d07d252ab373032c771301ac48e46 + React-logger: 1426d04b594a2e68b0ac2add21d45422d06397a3 + React-Mapbuffer: 28c35d4355981ed4a9da6b13bd7f38189533ae05 + React-microtasksnativemodule: e46cff912b07dc383f04715b4225ca131b325a4a + react-native-safe-area-context: 2243039f43d10cb1ea30ec5ac57fc6d1448413f4 + react-native-usercentrics: b2d2e6997ccee845fd5d5403ccbeed1f474a2816 + react-native-webview: 1c3043d5b62512b9913b880cf9e4c4fd5bb46a42 + React-NativeModulesApple: 3e3e6bf35c6ba5d0aa785e899087385821fa78bd + React-oscompat: 56b4766e96b06843a3af49a6763ef40992e720aa + React-perflogger: 8fe9ec5f9ddbab1b8906c1aec159aa946e0ba041 + React-performancetimeline: a5f07d484d6d89060902fba214dc96d39406f593 + React-RCTActionSheet: 5eeca393823ffd882b0345e3237d79f886f45f39 + React-RCTAnimation: 8682725461a95efc7e14733a8c39395ca4919325 + React-RCTAppDelegate: 5826b081f6dfb35a187375a82f11327c07d8a3ff + React-RCTBlob: eea4f351d8ab91228bc520643c5c9d58ee399361 + React-RCTFabric: 64c4abff081dea2a208388e60bd1b0e45644e8a7 + React-RCTFBReactNativeSpec: 8e84c9c69af7de829d2194780ec98f98117eb7b0 + React-RCTImage: 22fe53e2d833e6686b9ca87fb7d2d9cdaf642e32 + React-RCTLinking: 03282f3e8d12602a1ba8cf0805576c8b24da6c37 + React-RCTNetwork: e1abf95b6f01437abaf650a287093f34d1e2ee42 + React-RCTRuntime: a938146e2bb401cfd6c7cd1d89b85ab3c5058c0d + React-RCTSettings: ed75f2bbce6a1827afc359df54bfcb931d5f1a8c + React-RCTText: 1c3233668a4b3df7180b630d55fdca54b54afa5e + React-RCTVibration: 71215147f2651948e303698e1b7397f7f72143a7 + React-rendererconsistency: a0a4076853d5d9f332f9d3e5a8c0737d767d17da + React-renderercss: b01288b20be664e3181c3f88fc4273920802bc7e + React-rendererdebug: 1a2a3effec37e8b3fa68f22720c3b955b61da275 + React-rncore: 54b792a0e8213b943b8b36c6d72e49f4532db48b + React-RuntimeApple: 253bb2f416be5f985925ea4e03bffe33d4e78640 + React-RuntimeCore: c211b65ee5b2a0504bb49c1883a30cfe4151297b + React-runtimeexecutor: 86f4ae22d81c71b192f245140734caf657351e2c + React-RuntimeHermes: 61ef3928c8734ce79f131f8d53ef8f2c524006e6 + React-runtimescheduler: 694783abcf3a854280ba0eedc0a0a3b990c619b2 + React-timing: ae9056c65f6741b38c1f0c497152b6a3776a8df6 + React-utils: f71a27c48d7f03b87cb9172990e9a2e40b233a12 + ReactAppDependencyProvider: ae0be24eb18014a031b4b220cb3973d07c3cbaf8 + ReactCodegen: 3d5c9def468f7df3b90b05d3098ab8d47d76c62e + ReactCommon: 4c22936ee38ecf885efc95ac5832f430f27e0271 + RNScreens: 7612f84ae9e88debc5e05ef55f027abc99c013a5 + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Usercentrics: c72acec7a9da00699c18926b914582d3e5b6d27b + UsercentricsUI: 49a42b203dedbb5ddaad69359687e57075cd33ed + Yoga: b37eeaa6148984cac70ecaf8022bb209e03296cb + +PODFILE CHECKSUM: aede0e8c70697530e096d216387babdc06765e7e + +COCOAPODS: 1.16.2 diff --git a/sample/ios/sample.xcodeproj/project.pbxproj b/sample/ios/sample.xcodeproj/project.pbxproj index b2d90d0f..a3f84da4 100644 --- a/sample/ios/sample.xcodeproj/project.pbxproj +++ b/sample/ios/sample.xcodeproj/project.pbxproj @@ -3,36 +3,69 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 77; objects = { /* Begin PBXBuildFile section */ 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 64AFA32A2DDB54942BF68566 /* Pods_sample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D98E067E86847122A6FFB478 /* Pods_sample.framework */; }; + 420EA70000DF6814120DCB3A /* Pods_sample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C958AFA022AE4909BEF03FC /* Pods_sample.framework */; }; + 569F02C2A1F24B07122911AD /* Pods_sampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D13CD22D95FB701EE4964D8 /* Pods_sampleTests.framework */; }; 761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; D3AD968898A2D5F12A3B498E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + B876D47D2E95685D00879086 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = sample; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 13B07F961A680F5B00A75B9A /* sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = sample/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = sample/Info.plist; sourceTree = ""; }; 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = sample/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 62FFC4186F63AD65AFE093B0 /* Pods-sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.debug.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.debug.xcconfig"; sourceTree = ""; }; + 486618FCE55087C25EB9BF1D /* Pods-sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.debug.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.debug.xcconfig"; sourceTree = ""; }; + 52ABC802CD11075CAC1D7A6E /* Pods-sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.release.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.release.xcconfig"; sourceTree = ""; }; + 6C958AFA022AE4909BEF03FC /* Pods_sample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = sample/AppDelegate.swift; sourceTree = ""; }; + 7D13CD22D95FB701EE4964D8 /* Pods_sampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8076FB5F87DB66D1F4A34A9E /* Pods-sampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.release.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.release.xcconfig"; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = sample/LaunchScreen.storyboard; sourceTree = ""; }; - D98E067E86847122A6FFB478 /* Pods_sample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EA760650CC3D9C3F9C9A1D55 /* Pods-sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.release.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.release.xcconfig"; sourceTree = ""; }; + A546F94700107D7C6438301D /* Pods-sampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.debug.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.debug.xcconfig"; sourceTree = ""; }; + B876D4792E95685D00879086 /* sampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = sampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedRootGroup section */ + B876D47A2E95685D00879086 /* sampleTests */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + ); + path = sampleTests; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 64AFA32A2DDB54942BF68566 /* Pods_sample.framework in Frameworks */, + 420EA70000DF6814120DCB3A /* Pods_sample.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B876D4762E95685D00879086 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 569F02C2A1F24B07122911AD /* Pods_sampleTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -55,7 +88,8 @@ isa = PBXGroup; children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - D98E067E86847122A6FFB478 /* Pods_sample.framework */, + 6C958AFA022AE4909BEF03FC /* Pods_sample.framework */, + 7D13CD22D95FB701EE4964D8 /* Pods_sampleTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -72,6 +106,7 @@ children = ( 13B07FAE1A68108700A75B9A /* sample */, 832341AE1AAA6A7D00B99B32 /* Libraries */, + B876D47A2E95685D00879086 /* sampleTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, BBD78D7AC51CEA395F1C20DB /* Pods */, @@ -85,6 +120,7 @@ isa = PBXGroup; children = ( 13B07F961A680F5B00A75B9A /* sample.app */, + B876D4792E95685D00879086 /* sampleTests.xctest */, ); name = Products; sourceTree = ""; @@ -92,8 +128,10 @@ BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - 62FFC4186F63AD65AFE093B0 /* Pods-sample.debug.xcconfig */, - EA760650CC3D9C3F9C9A1D55 /* Pods-sample.release.xcconfig */, + 486618FCE55087C25EB9BF1D /* Pods-sample.debug.xcconfig */, + 52ABC802CD11075CAC1D7A6E /* Pods-sample.release.xcconfig */, + A546F94700107D7C6438301D /* Pods-sampleTests.debug.xcconfig */, + 8076FB5F87DB66D1F4A34A9E /* Pods-sampleTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -105,13 +143,13 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "sample" */; buildPhases = ( - 340C12F67BF4B940FD808512 /* [CP] Check Pods Manifest.lock */, + 727EEDF2529691ED37080D91 /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 346A0B84F77D00A995183BDD /* [CP] Embed Pods Frameworks */, - 782DFB06BF8A4A2165DF4767 /* [CP] Copy Pods Resources */, + 2A24A4A7E53AFC60391A3AE0 /* [CP] Embed Pods Frameworks */, + D7CCE2092F41415D438D02A1 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -122,21 +160,47 @@ productReference = 13B07F961A680F5B00A75B9A /* sample.app */; productType = "com.apple.product-type.application"; }; + B876D4782E95685D00879086 /* sampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = B876D4812E95685D00879086 /* Build configuration list for PBXNativeTarget "sampleTests" */; + buildPhases = ( + 9F4985D31B26071FF9EFD1AB /* [CP] Check Pods Manifest.lock */, + B876D4752E95685D00879086 /* Sources */, + B876D4762E95685D00879086 /* Frameworks */, + B876D4772E95685D00879086 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B876D47E2E95685D00879086 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + B876D47A2E95685D00879086 /* sampleTests */, + ); + name = sampleTests; + productName = sampleTests; + productReference = B876D4792E95685D00879086 /* sampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 2600; LastUpgradeCheck = 1210; TargetAttributes = { 13B07F861A680F5B00A75B9A = { LastSwiftMigration = 1120; }; + B876D4782E95685D00879086 = { + CreatedOnToolsVersion = 26.0.1; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "sample" */; - compatibilityVersion = "Xcode 12.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -144,11 +208,13 @@ Base, ); mainGroup = 83CBB9F61A601CBA00E9B192; + preferredProjectObjectVersion = 77; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 13B07F861A680F5B00A75B9A /* sample */, + B876D4782E95685D00879086 /* sampleTests */, ); }; /* End PBXProject section */ @@ -164,6 +230,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + B876D4772E95685D00879086 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -183,7 +256,24 @@ 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"; }; - 340C12F67BF4B940FD808512 /* [CP] Check Pods Manifest.lock */ = { + 2A24A4A7E53AFC60391A3AE0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 727EEDF2529691ED37080D91 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -205,24 +295,29 @@ 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; }; - 346A0B84F77D00A995183BDD /* [CP] Embed Pods Frameworks */ = { + 9F4985D31B26071FF9EFD1AB /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-sampleTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks.sh\"\n"; + 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; }; - 782DFB06BF8A4A2165DF4767 /* [CP] Copy Pods Resources */ = { + D7CCE2092F41415D438D02A1 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -250,12 +345,27 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + B876D4752E95685D00879086 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + B876D47E2E95685D00879086 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* sample */; + targetProxy = B876D47D2E95685D00879086 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 62FFC4186F63AD65AFE093B0 /* Pods-sample.debug.xcconfig */; + baseConfigurationReference = 486618FCE55087C25EB9BF1D /* Pods-sample.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -283,7 +393,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EA760650CC3D9C3F9C9A1D55 /* Pods-sample.release.xcconfig */; + baseConfigurationReference = 52ABC802CD11075CAC1D7A6E /* Pods-sample.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; @@ -494,6 +604,81 @@ }; name = Release; }; + B876D47F2E95685D00879086 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A546F94700107D7C6438301D /* Pods-sampleTests.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 4GB94SV7D4; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.usercentrics.sampleTest.sampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sample"; + }; + name = Debug; + }; + B876D4802E95685D00879086 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8076FB5F87DB66D1F4A34A9E /* Pods-sampleTests.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 4GB94SV7D4; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.usercentrics.sampleTest.sampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRING_CATALOG_GENERATE_SYMBOLS = NO; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/sample"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -515,6 +700,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + B876D4812E95685D00879086 /* Build configuration list for PBXNativeTarget "sampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B876D47F2E95685D00879086 /* Debug */, + B876D4802E95685D00879086 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; diff --git a/sample/ios/sampleTests/BannerSettingsDictTests.swift b/sample/ios/sampleTests/BannerSettingsDictTests.swift new file mode 100644 index 00000000..52619e26 --- /dev/null +++ b/sample/ios/sampleTests/BannerSettingsDictTests.swift @@ -0,0 +1,31 @@ +import XCTest + +import UsercentricsUI +@testable import react_native_usercentrics + +class BannerSettingsDictTests: XCTestCase { + + func testFromDictWithCorrectValues() { + let dict: NSDictionary = [ + "generalStyleSettings": [ + "font": ["fontName": "Avenir-Heavy", "fontSize": 16.0], + "logo": ["logoName": "logo"] + ] + ] + let settings = BannerSettings(from: dict) + + XCTAssertNotNil(settings) + // XCTAssertNotNil(settings?.generalStyleSettings?.logo) +// XCTAssertEqual("Avenir-Heavy", settings?.font?.fontName) +// XCTAssertEqual(16.0, settings?.font?.pointSize) + } + + func testFromDictWithIncorrectValues() { + let dict: NSDictionary = ["font": ["fontName": "", "fontSize": ""], "logo": ["logoName": ""]] + let settings = BannerSettings(from: dict) + + XCTAssertNotNil(settings) + XCTAssertNil(settings?.generalStyleSettings?.logo) + XCTAssertNil(settings?.generalStyleSettings?.font) + } +} diff --git a/sample/ios/sampleTests/Fake/FakeDispatchQueue.swift b/sample/ios/sampleTests/Fake/FakeDispatchQueue.swift new file mode 100644 index 00000000..0bf9e3b1 --- /dev/null +++ b/sample/ios/sampleTests/Fake/FakeDispatchQueue.swift @@ -0,0 +1,9 @@ +import Foundation +import react_native_usercentrics + + +final class FakeDispatchQueue: DispatchQueueManager { + func async(execute work: @escaping @convention(block) () -> Void) { + work() + } +} diff --git a/sample/ios/sampleTests/Fake/FakePresentationViewController.swift b/sample/ios/sampleTests/Fake/FakePresentationViewController.swift new file mode 100644 index 00000000..e355fd5f --- /dev/null +++ b/sample/ios/sampleTests/Fake/FakePresentationViewController.swift @@ -0,0 +1,4 @@ +import Foundation +import UIKit + +final class FakePresentationViewController: UIViewController { } diff --git a/sample/ios/sampleTests/Fake/FakeUsercentricsManager.swift b/sample/ios/sampleTests/Fake/FakeUsercentricsManager.swift new file mode 100644 index 00000000..18e0a8c4 --- /dev/null +++ b/sample/ios/sampleTests/Fake/FakeUsercentricsManager.swift @@ -0,0 +1,205 @@ + +import Foundation +import Usercentrics +import UsercentricsUI +import UIKit +import react_native_usercentrics + + +enum FakeUsercentricsError: Error { + case test +} + +final class FakeUsercentricsManager: UsercentricsManager { + + var alreadyConfigured: Bool = false + + var restoreControllerId: String? + + var getTCStringValue: String? + var getControllerIdValue: String? + var getABTestingVariantValue: String? + + var configureOptions: UsercentricsOptions? + var isReadySuccessCompletion: UsercentricsReadyStatus? + var isReadyErrorCompletion: Error? + + var restoreUserSessionSuccess: UsercentricsReadyStatus? + var restoreUserSessionError: Error? + + var clearUserSessionSuccess: UsercentricsReadyStatus? + var clearUserSessionError: Error? + + func isReady(onSuccess: @escaping ((UsercentricsReadyStatus) -> Void), onFailure: @escaping ((Error) -> Void)) { + if let isReadySuccessCompletion = isReadySuccessCompletion { + onSuccess(isReadySuccessCompletion) + } + + if let isReadyErrorCompletion = isReadyErrorCompletion { + onFailure(isReadyErrorCompletion) + } + } + + func configure(options: UsercentricsOptions) { + self.configureOptions = options + alreadyConfigured = true + } + + func restoreUserSession(controllerId: String, onSuccess: @escaping ((UsercentricsReadyStatus) -> Void), onFailure: @escaping ((Error) -> Void)) { + self.restoreControllerId = controllerId + + if let restoreUserSessionSuccess = restoreUserSessionSuccess { + onSuccess(restoreUserSessionSuccess) + } + + if let restoreUserSessionError = restoreUserSessionError { + onFailure(restoreUserSessionError) + } + } + + func getTCString(callback: @escaping (String) -> Void) { + callback(getTCStringValue!) + } + + func getControllerId() -> String { + return getControllerIdValue! + } + + func getABTestingVariant() -> String? { + return getABTestingVariantValue! + } + + var getConsentsResponse: [UsercentricsServiceConsent]? + func getConsents() -> [UsercentricsServiceConsent] { + return getConsentsResponse! + } + + var getCMPDataResponse: UsercentricsCMPData? + func getCMPData() -> UsercentricsCMPData { + return getCMPDataResponse! + } + + var getUserSessionDataResponse: String? + func getUserSessionData() -> String { + return getUserSessionDataResponse! + } + + var getUSPDataResponse: CCPAData? + func getUSPData() -> CCPAData { + return getUSPDataResponse! + } + + var getTCFDataResponse: TCFData? + func getTCFData(callback: @escaping (TCFData) -> Void) { + callback(getTCFDataResponse!) + } + + var getAdditionalConsentModeDataResponse: AdditionalConsentModeData? + func getAdditionalConsentModeData() -> AdditionalConsentModeData { + return getAdditionalConsentModeDataResponse! + } + + func setTCFUIAsClosed() { + } + + func setTCFUIAsOpen() { + } + + var changeLanguageValue: String? = nil + var changeLanguageError: Error? = nil + func changeLanguage(language: String, onSuccess: @escaping (() -> Void), onFailure: @escaping ((Error) -> Void)) { + changeLanguageValue = language + if let changeLanguageError = changeLanguageError { + onFailure(changeLanguageError) + } else { + onSuccess() + } + } + + var acceptAllForTCFConsentType: UsercentricsConsentType? + var acceptAllForTCFFromLayer: TCFDecisionUILayer? + var acceptAllForTCFResponse: [UsercentricsServiceConsent]? + func acceptAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + acceptAllForTCFFromLayer = fromLayer + acceptAllForTCFConsentType = consentType + return acceptAllForTCFResponse! + } + + var acceptAllConsentType: UsercentricsConsentType? + var acceptAllResponse: [UsercentricsServiceConsent]? + func acceptAll(consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + acceptAllConsentType = consentType + return acceptAllResponse! + } + + var denyAllForTCFConsentType: UsercentricsConsentType? + var denyAllForTCFFromLayer: TCFDecisionUILayer? + var denyAllForTCFResponse: [UsercentricsServiceConsent]? + func denyAllForTCF(fromLayer: TCFDecisionUILayer, consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + self.denyAllForTCFConsentType = consentType + self.denyAllForTCFFromLayer = fromLayer + return denyAllForTCFResponse! + } + + var denyAllConsentType: UsercentricsConsentType? + var denyAllResponse: [UsercentricsServiceConsent]? + func denyAll(consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + self.denyAllConsentType = consentType + return denyAllResponse! + } + + var saveDecisionsForTCFResponse: [UsercentricsServiceConsent]? + func saveDecisionsForTCF(tcfDecisions: TCFUserDecisions, fromLayer: TCFDecisionUILayer, serviceDecisions: [UserDecision], consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + return saveDecisionsForTCFResponse! + } + + var saveDecisionsResponse: [UsercentricsServiceConsent]? + func saveDecisions(decisions: [UserDecision], consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + return saveDecisionsResponse! + } + + var saveOptOutForCCPAResponse: [UsercentricsServiceConsent]? + func saveOptOutForCCPA(isOptedOut: Bool, consentType: UsercentricsConsentType) -> [UsercentricsServiceConsent] { + return saveOptOutForCCPAResponse! + } + + var cmpId: Int32? + func setCMPId(id: Int32) { + self.cmpId = id + } + + var variant: String? + func setABTestingVariant(variant: String) { + self.variant = variant + } + + var showFirstLayerBannerSettings: BannerSettings? + + func showFirstLayer(bannerSettings: BannerSettings?, + dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void) { + self.showFirstLayerBannerSettings = bannerSettings + dismissViewHandler(UsercentricsConsentUserResponse(consents: [], controllerId: "", userInteraction: .acceptAll)) + } + + var showSecondLayerBannerSettings: BannerSettings? + func showSecondLayer(bannerSettings: BannerSettings?, dismissViewHandler: @escaping (UsercentricsConsentUserResponse) -> Void) { + self.showSecondLayerBannerSettings = bannerSettings + dismissViewHandler(UsercentricsConsentUserResponse(consents: [], controllerId: "", userInteraction: .acceptAll)) + } + + var trackCalls: Array = [] + func track(event: UsercentricsAnalyticsEventType) { + trackCalls.append(event) + } + + func clearUserSession(onSuccess: @escaping ((UsercentricsReadyStatus) -> Void), onError: @escaping ((Error) -> Void)) { + + if let clearUserSessionSuccess = clearUserSessionSuccess { + onSuccess(clearUserSessionSuccess) + } + + if let clearUserSessionError = clearUserSessionError { + onError(clearUserSessionError) + } + } +} diff --git a/sample/ios/sampleTests/FirstLayerOptionsDictTests.swift b/sample/ios/sampleTests/FirstLayerOptionsDictTests.swift new file mode 100644 index 00000000..0be2cc0e --- /dev/null +++ b/sample/ios/sampleTests/FirstLayerOptionsDictTests.swift @@ -0,0 +1,237 @@ +import XCTest + +import UsercentricsUI +@testable import react_native_usercentrics + +class FirstLayerOptionsDictTests: XCTestCase { + + func testMapNSTextAlignment() { + XCTAssertEqual(.center, NSTextAlignment.from(enumString: "CENTER")) + XCTAssertEqual(.left, NSTextAlignment.from(enumString: "LEFT")) + XCTAssertEqual(.right, NSTextAlignment.from(enumString: "RIGHT")) + XCTAssertNil(NSTextAlignment.from(enumString: "Abc")) + } + + func testMapSectionPosition() { + XCTAssertEqual(.center, SectionPosition.from(enumString: "CENTER")) + XCTAssertEqual(.left, SectionPosition.from(enumString: "START")) + XCTAssertEqual(.right, SectionPosition.from(enumString: "END")) + XCTAssertNil(SectionPosition.from(enumString: "Abc")) + } + + func testMapUsercentricsLayout() { + XCTAssertEqual(.full, UsercentricsLayout.from(enumString: "FULL")) + XCTAssertEqual(.popup(position: .center), UsercentricsLayout.from(enumString: "POPUP_CENTER")) + XCTAssertEqual(.popup(position: .bottom), UsercentricsLayout.from(enumString: "POPUP_BOTTOM")) + XCTAssertEqual(.sheet, UsercentricsLayout.from(enumString: "SHEET")) + XCTAssertNil(UsercentricsLayout.from(enumString: "TEST")) + } + + func testMapButtonType() { + XCTAssertEqual(.acceptAll, ButtonType.from(enumString: "ACCEPT_ALL")) + XCTAssertEqual(.denyAll, ButtonType.from(enumString: "DENY_ALL")) + XCTAssertEqual(.save, ButtonType.from(enumString: "SAVE")) + XCTAssertEqual(.more, ButtonType.from(enumString: "MORE")) + XCTAssertNil(ButtonType.from(enumString: "Abc")) + } + + func testMapButtonSettingsWithValidData() { + let dict: NSDictionary = ["buttonType": "ACCEPT_ALL", + "font": ["fontName": "Avenir-Heavy", "fontSize": 16.0], + "textColorHex": "000000", + "backgroundColorHex": "00ff00", + "cornerRadius": 123] + + let buttonSettings = ButtonSettings(from: dict) + /// TODO: Expose ButtonSettings properties for test purposes. + XCTAssertNotNil(buttonSettings) + } + + func testMapButtonSettingsWithInvalidData() { + let dict: NSDictionary = ["": 1] + let buttonSettings = ButtonSettings(from: dict) + + XCTAssertNil(buttonSettings) + } + + func testMapButtonLayoutWithRowButtons() { + let dict: NSDictionary = ["layout": "ROW", "buttons": [[["buttonType": "ACCEPT_ALL"], ["buttonType": "DENY_ALL"]]]] + let buttonLayout = ButtonLayout.from(dictionary: dict) + + XCTAssertNotNil(buttonLayout) + switch buttonLayout! { + case .row(let buttons): + XCTAssertEqual(2, buttons.count) + default: + XCTFail() + } + } + + func testMapButtonLayoutWithColumnButtons() { + let dict: NSDictionary = ["layout": "COLUMN", "buttons": [[["buttonType": "ACCEPT_ALL"], ["buttonType": "DENY_ALL"]]]] + let buttonLayout = ButtonLayout.from(dictionary: dict) + + XCTAssertNotNil(buttonLayout) + switch buttonLayout! { + case .column(let buttons): + XCTAssertEqual(2, buttons.count) + default: + XCTFail() + } + } + + func testMapButtonLayoutWithGridButtons() { + let dict: NSDictionary = ["layout": "GRID", "buttons": [[["buttonType": "ACCEPT_ALL"], ["buttonType": "DENY_ALL"]]]] + let buttonLayout = ButtonLayout.from(dictionary: dict) + + XCTAssertNotNil(buttonLayout) + switch buttonLayout! { + case .grid(let buttons): + XCTAssertEqual(1, buttons.count) + XCTAssertEqual(2, buttons.first?.count) + default: + XCTFail() + } + } + + func testMapButtonLayoutWithInvalidButtons() { + let dict: NSDictionary = ["": 1] + let buttonLayout = ButtonLayout.from(dictionary: dict) + + XCTAssertNil(buttonLayout) + } + + func testMapMessageSettingsWithValidData() { + let dict: NSDictionary = ["fontName": "Avenir-Heavy", + "textSize": 16.0, + "textColorHex": "000000", + "textAlignment": "LEFT", + "linkTextColorHex": "ffffff", + "linkTextUnderline": false] + let messageSettings = MessageSettings(from: dict) + let expectedMessageSettings = MessageSettings(font: UIFont(name: "Avenir-Heavy", size: 16.0), + textColor: UIColor(unsafeHex: "000000"), + textAlignment: .left, + linkTextColor: UIColor(unsafeHex: "ffffff"), + linkTextUnderline: false) + XCTAssertEqual(expectedMessageSettings, messageSettings) + } + + func testMapMessageSettingsWithInvalidData() { + let messageSettings = MessageSettings(from: nil) + XCTAssertNil(messageSettings) + } + + func testMapTitleSettingsWithValidData() { + let dict: NSDictionary = ["fontName": "Avenir-Heavy", + "textSize": 16.0, + "textColorHex": "0f0f0f", + "textAlignment": "RIGHT"] + let titleSettings = TitleSettings(from: dict) + let expectedTitleSettings = TitleSettings(font: UIFont(name: "Avenir-Heavy", size: 16.0), + textColor: UIColor(unsafeHex: "0f0f0f"), + textAlignment: .right) + XCTAssertEqual(expectedTitleSettings, titleSettings) + } + + func testMapTitleSettingsWithFallbackFont() { + let dict: NSDictionary = ["textColorHex": "0f0f0f", + "textAlignment": "RIGHT"] + let titleSettings = TitleSettings(from: dict, fallbackFont: UIFont(name: "Avenir-Heavy", size: 16.0)) + let expectedTitleSettings = TitleSettings(font: UIFont(name: "Avenir-Heavy", size: UIFont.systemFontSize), + textColor: UIColor(unsafeHex: "0f0f0f"), + textAlignment: .right) + XCTAssertEqual(expectedTitleSettings, titleSettings) + } + + func testMapTitleWithFallbackFontAndDictFontShouldIgnoreFallback() { + let dict: NSDictionary = ["fontName": "Avenir-Heavy", + "textSize": 16.0, + "textColorHex": "0f0f0f", + "textAlignment": "RIGHT"] + let titleSettings = TitleSettings(from: dict, fallbackFont: UIFont(name: "Avenir", size: 35.0)) + let expectedTitleSettings = TitleSettings(font: UIFont(name: "Avenir-Heavy", size: 16.0), + textColor: UIColor(unsafeHex: "0f0f0f"), + textAlignment: .right) + XCTAssertEqual(expectedTitleSettings, titleSettings) + } + + func testMapTitleWithFallbackFontAndWithoutFontName() { + let dict: NSDictionary = ["textSize": 16.0, + "textColorHex": "0f0f0f", + "textAlignment": "RIGHT"] + let titleSettings = TitleSettings(from: dict, fallbackFont: UIFont(name: "Avenir", size: 35.0)) + let expectedTitleSettings = TitleSettings(font: UIFont(name: "Avenir", size: 16.0), + textColor: UIColor(unsafeHex: "0f0f0f"), + textAlignment: .right) + XCTAssertEqual(expectedTitleSettings, titleSettings) + } + + func testMapTitleWithoutFallbackShouldUseSystemFont() { + let dict: NSDictionary = ["textSize": 16.0, + "textColorHex": "0f0f0f", + "textAlignment": "RIGHT"] + let titleSettings = TitleSettings(from: dict) + let expectedTitleSettings = TitleSettings(font: UIFont.systemFont(ofSize: 16.0), + textColor: UIColor(unsafeHex: "0f0f0f"), + textAlignment: .right) + XCTAssertEqual(expectedTitleSettings, titleSettings) + } + + func testMapTitleWithFallbackFontAndWithoutFontSize() { + let dict: NSDictionary = ["fontName": "Avenir-Heavy", + "textColorHex": "0f0f0f", + "textAlignment": "RIGHT"] + let titleSettings = TitleSettings(from: dict, fallbackFont: UIFont(name: "Avenir", size: 35.0)) + let expectedTitleSettings = TitleSettings(font: UIFont(name: "Avenir-Heavy", size: UIFont.systemFontSize), + textColor: UIColor(unsafeHex: "0f0f0f"), + textAlignment: .right) + XCTAssertEqual(expectedTitleSettings, titleSettings) + } + + func testMapTitleSettingsWithInvalidData() { + let titleSettings = TitleSettings(from: nil) + XCTAssertNil(titleSettings) + } + + func testMapHeaderImageAsExtended() { + let dict: NSDictionary = ["isExtended": true] + let headerSettings = HeaderImageSettings.from(dictionary: dict) + + switch headerSettings! { + case .extended: + XCTAssertTrue(true) + default: + XCTFail() + } + } + + func testMapHeaderImageAsHidden() { + let dict: NSDictionary = ["isHidden": true] + let headerSettings = HeaderImageSettings.from(dictionary: dict) + + switch headerSettings! { + case .hidden: + XCTAssertTrue(true) + default: + XCTFail() + } + } + + func testMapHeaderImageAsLogo() { + let dict: NSDictionary = ["logoUrl": "google.com"] + let headerSettings = HeaderImageSettings.from(dictionary: dict) + + switch headerSettings! { + case .logo(let settings): + XCTAssertNotNil(settings) + default: + XCTFail() + } + } + + func testMapHeaderImageWithInvalidData() { + let headerSettings = HeaderImageSettings.from(dictionary: nil) + XCTAssertNil(headerSettings) + } +} diff --git a/sample/ios/sampleTests/Mock/CMPData+Mock.swift b/sample/ios/sampleTests/Mock/CMPData+Mock.swift new file mode 100644 index 00000000..51c1f93b --- /dev/null +++ b/sample/ios/sampleTests/Mock/CMPData+Mock.swift @@ -0,0 +1,543 @@ +import Usercentrics + +extension UsercentricsCMPData { + + static func mock() -> UsercentricsCMPData { + return .init(settings: .mock(), + services: [.mock()], + legalBasis: .mock(), + activeVariant: .tcf, + userLocation: .mock()) + } +} + +extension UsercentricsSettings { + + static func mock() -> UsercentricsSettings { + return .init(labels: .mock(), + secondLayer: .mock(), + version: "1.0.0", + language: "en", + imprintUrl: "imprintUrl", + privacyPolicyUrl: "privacyPolicyUrl", + cookiePolicyUrl: "cookiePolicyUrl", + firstLayerDescriptionHtml: "firstLayerDescriptionHtml", + firstLayerMobileDescriptionHtml: "firstLayerMobileDescriptionHtml", + settingsId: "settingsId", + bannerMobileDescriptionIsActive: true, + enablePoweredBy: true, + displayOnlyForEU: true, + tcf2Enabled: true, + reshowBanner: 123, + editableLanguages: ["editableLanguages"], + languagesAvailable: ["languagesAvailable"], + showInitialViewForVersionChange: ["showInitialViewForVersionChange"], + ccpa: .mock(), + tcf2: .mock(), + customization: .mock(), + firstLayer: .mock(), + styles: .mock(), + interactionAnalytics: true, + consentAnalytics: true, + consentXDevice: true, + variants: .mock(), + dpsDisplayFormat: .all, + framework: .vcdpa, + publishedApps: [.mock()], + renewConsentsTimestamp: 1000, + consentWebhook: true, + consentTemplates: [.mock()], + categories: [.mock()]) + } +} + +extension UsercentricsService { + + static func mock() -> UsercentricsService { + return .init(templateId: "templateId", + version: "version", + type: "type", + adminSettingsId: ["adminSettingsId"], + dataProcessor: "dataProcessor", + dataPurposes: ["dataPurposes"], + processingCompany: "processingCompany", + nameOfProcessingCompany: "nameOfProcessingCompany", + addressOfProcessingCompany: "addressOfProcessingCompany", + descriptionOfService: "descriptionOfService", + technologyUsed: ["technologyUsed"], + languagesAvailable: ["languagesAvailable"], + dataCollectedList: ["dataCollectedList"], + dataPurposesList: ["dataPurposesList"], + dataRecipientsList: ["dataRecipientsList"], + legalBasisList: ["legalBasisList"], + retentionPeriodList: ["retentionPeriodList"], + subConsents: ["subConsents"], + language: "language", + createdBy: "createdBy", + updatedBy: "updatedBy", + isLatest: true, + linkToDpa: "linkToDpa", + legalGround: "legalGround", + optOutUrl: "optOutUrl", + policyOfProcessorUrl: "policyOfProcessorUrl", + categorySlug: "categorySlug", + recordsOfProcessingActivities: "recordsOfProcessingActivities", + retentionPeriodDescription: "retentionPeriodDescription", + dataProtectionOfficer: "dataProtectionOfficer", + privacyPolicyURL: "privacyPolicyURL", + cookiePolicyURL: "cookiePolicyURL", + locationOfProcessing: "locationOfProcessing", + dataCollectedDescription: "dataCollectedDescription", + thirdCountryTransfer: "thirdCountryTransfer", + description: "description", + cookieMaxAgeSeconds: 123, + usesNonCookieAccess: true, + deviceStorageDisclosureUrl: "deviceStorageDisclosureUrl", + deviceStorage: .mock(), + dpsDisplayFormat: "dpsDisplayFormat", + isHidden: true, + framework: "framework", + isDeactivated: true, + isAutoUpdateAllowed: true, + disableLegalBasis: true, + isEssential: true) + } +} + +extension LegalBasisLocalization { + + static func mock() -> LegalBasisLocalization { + let value = (NSClassFromString("UsercentricsLegalBasisLocalization")?.alloc() as! LegalBasisLocalization) + return value.doCopy(labels: 123, labelsAria: .mock(), data: ["123": "123"]) + } +} + +extension UsercentricsLabels { + + static func mock() -> UsercentricsLabels { + return .init(btnAcceptAll: "btnAcceptAll", + btnDeny: "btnDeny", + btnSave: "btnSave", + firstLayerTitle: "firstLayerTitle", + accepted: "accepted", + denied: "denied", + date: "date", + decision: "decision", + dataCollectedList: "dataCollectedList", + dataCollectedInfo: "dataCollectedInfo", + locationOfProcessing: "locationOfProcessing", + transferToThirdCountries: "transferToThirdCountries", + transferToThirdCountriesInfo: "transferToThirdCountriesInfo", + dataPurposes: "dataPurposes", + dataPurposesInfo: "dataPurposesInfo", + dataRecipientsList: "dataRecipientsList", + descriptionOfService: "descriptionOfService", + history: "history", + historyDescription: "historyDescription", + legalBasisList: "legalBasisList", + legalBasisInfo: "legalBasisInfo", + processingCompanyTitle: "processingCompanyTitle", + retentionPeriod: "retentionPeriod", + technologiesUsed: "technologiesUsed", + technologiesUsedInfo: "technologiesUsedInfo", + cookiePolicyInfo: "cookiePolicyInfo", + optOut: "optOut", + policyOf: "policyOf", + imprintLinkText: "imprintLinkText", + privacyPolicyLinkText: "privacyPolicyLinkText", + categories: "categories", + anyDomain: "anyDomain", + day: "day", + days: "days", + domain: "domain", + duration: "duration", + informationLoadingNotPossible: "informationLoadingNotPossible", + hour: "hour", + hours: "hours", + identifier: "identifier", + maximumAgeCookieStorage: "maximumAgeCookieStorage", + minute: "minute", + minutes: "minutes", + month: "month", + months: "months", + multipleDomains: "multipleDomains", + no: "no", + nonCookieStorage: "nonCookieStorage", + seconds: "seconds", + session: "session", + loadingStorageInformation: "loadingStorageInformation", + storageInformation: "storageInformation", + detailedStorageInformation: "detailedStorageInformation", + tryAgain: "tryAgain", + type: "type", + year: "year", + years: "years", + yes: "yes", + storageInformationDescription: "storageInformationDescription", + btnBannerReadMore: "btnBannerReadMore", + readLess: "readLess", + btnMore: "btnMore", + more: "more", + linkToDpaInfo: "linkToDpaInfo", + second: "second", + consent: "consent", + headerModal: "headerModal", + secondLayerDescriptionHtml: "secondLayerDescriptionHtml", + secondLayerTitle: "secondLayerTitle", + + settings: "settings", + subConsents: "subConsents", + btnAccept: "btnAccept", + poweredBy: "poweredBy", + dataProtectionOfficer: "dataProtectionOfficer", + nameOfProcessingCompany: "nameOfProcessingCompany", + btnBack: "btnBack", + copy: "copyLabel", + copied: "copied", + basic: "basic", + advanced: "advanced", + processingCompany: "processingCompany", + name: "name", + explicit: "explicit", + implicit: "implicit", + btnMoreInfo: "btnMoreInfo", + furtherInformationOptOut: "furtherInformationOptOut", + cookiePolicyLinkText: "cookiePolicyLinkText", + noImplicit: "noImplicit", + yesImplicit: "yesImplicit", + + addressOfProcessingCompany: "addressOfProcessingCompany", + consentType: "consentType", + consents: "consents", + language: "language", + less: "less", + notAvailable: "notAvailable", + technology: "technology", + view: "view") + } +} + +extension SecondLayer { + + static func mock() -> SecondLayer { + return .init(tabsCategoriesLabel: "tabsCategoriesLabel", + tabsServicesLabel: "tabsServicesLabel", + hideTogglesForServices: true, + hideDataProcessingServices: true, + hideButtonDeny: true, + hideLanguageSwitch: true, + acceptButtonText: "acceptButtonText", + denyButtonText: "denyButtonText") + } +} + +extension ConsentDisclosureObject { + + static func mock() -> ConsentDisclosureObject { + return .init(disclosures: [.mock()]) + } +} + +extension ConsentDisclosure { + + static func mock() -> ConsentDisclosure { + return .init(identifier: "identifier", + type: .app, + name: "name", + maxAgeSeconds: 123, + cookieRefresh: true, + purposes: [1,2,3], + domain: "domain", + description: "description") + } +} + + +extension CCPASettings { + + static func mock() -> CCPASettings { + return .init(optOutNoticeLabel: "optOutNoticeLabel", + btnSave: "btnSave", + firstLayerTitle: "firstLayerTitle", + secondLayerTitle: "secondLayerTitle", + secondLayerDescription: "secondLayerDescription", + btnMoreInfo: "btnMoreInfo", + firstLayerMobileVariant: .full, + isActive: true, + region: .all, + showOnPageLoad: true, + reshowAfterDays: 123, + iabAgreementExists: true, + removeDoNotSellToggle: true, + appFirstLayerDescription: "appFirstLayerDescription", + firstLayerMobileDescriptionIsActive: true, + firstLayerMobileDescription: "firstLayerMobileDescription", + secondLayerHideLanguageSwitch: true) + } +} + +extension TCF2Settings { + + static func mock() -> TCF2Settings { + return .init(firstLayerTitle: "firstLayerTitle", + secondLayerTitle: "secondLayerTitle", + tabsPurposeLabel: "tabsPurposeLabel", + tabsVendorsLabel: "tabsVendorsLabel", + labelsFeatures: "labelsFeatures", + labelsIabVendors: "labelsIabVendors", + labelsNonIabPurposes: "labelsNonIabPurposes", + labelsNonIabVendors: "labelsNonIabVendors", + labelsPurposes: "labelsPurposes", + vendorFeatures: "vendorFeatures", + vendorLegitimateInterestPurposes: "vendorLegitimateInterestPurposes", + vendorPurpose: "vendorPurpose", + vendorSpecialFeatures: "vendorSpecialFeatures", + vendorSpecialPurposes: "vendorSpecialPurposes", + togglesConsentToggleLabel: "togglesConsentToggleLabel", + togglesLegIntToggleLabel: "togglesLegIntToggleLabel", + buttonsAcceptAllLabel: "buttonsAcceptAllLabel", + buttonsDenyAllLabel: "buttonsDenyAllLabel", + buttonsSaveLabel: "buttonsSaveLabel", + linksManageSettingsLabel: "linksManageSettingsLabel", + linksVendorListLinkLabel: "linksVendorListLinkLabel", + togglesSpecialFeaturesToggleOn: "togglesSpecialFeaturesToggleOn", + togglesSpecialFeaturesToggleOff: "togglesSpecialFeaturesToggleOff", + firstLayerMobileVariant: .full, + firstLayerHideToggles: true, + secondLayerHideToggles: true, + hideLegitimateInterestToggles: true, + categoriesOfDataLabel: "categoriesOfDataLabel", + dataRetentionPeriodLabel: "dataRetentionPeriodLabel", + legitimateInterestLabel: "legitimateInterestLabel", + version: "version", + examplesLabel: "examplesLabel", + cmpId: 123, + cmpVersion: 123, + showDataSharedOutsideEUText: true, + dataSharedOutsideEUText: "dataSharedOutsideEUText", + vendorIdsOutsideEUList: [1,2,3], + firstLayerHideButtonDeny: true, + secondLayerHideButtonDeny: true, + publisherCountryCode: "publisherCountryCode", + purposeOneTreatment: true, + selectedVendorIds: [1,2,3], + gdprApplies: true, + selectedStacks: [1,2,3], + scope: .global, + disabledSpecialFeatures: [1,2,3], + firstLayerShowDescriptions: true, + hideNonIabOnFirstLayer: true, + resurfacePeriodEnded: true, + resurfacePurposeChanged: true, + resurfaceVendorAdded: true, + firstLayerDescription: "firstLayerDescription", + firstLayerAdditionalInfo: "firstLayerAdditionalInfo", + secondLayerDescription: "secondLayerDescription", + appLayerNoteResurface: "appLayerNoteResurface", + firstLayerNoteResurface: "firstLayerNoteResurface", + changedPurposes: .mock(), + acmV2Enabled: true, + selectedATPIds: [43,46,55], + resurfaceATPListChanged: false, + atpListTitle: "Google Providers") + } +} + +extension UsercentricsCustomization { + + static func mock() -> UsercentricsCustomization { + return .init(logoUrl: "logoUrl", + borderRadiusLayer: 123, + borderRadiusButton: 123, + overlayOpacity: 123, + font: .mock(), + color: .mock(), + logoAltTag: "logoAltTag") + } +} + +extension FirstLayer { + + static func mock() -> FirstLayer { + return .init(hideButtonDeny: true, + logoPosition: .center, + secondLayerTrigger: .button, + closeOption: .icon, + mobileVariant: .full) + } +} + +extension UsercentricsStyles { + + static func mock() -> UsercentricsStyles { + return .init(btnPrivacyButtonInactiveSize: 123, + historyDateFormat: 123, + btnPrivacyButtonActiveSize: 123, + txtOptInMsgFontSize: 123, + btnPrivacyButtonTransparency: 123, + btnPrivacyButtonBgColor: "btnPrivacyButtonBgColor", + btnAcceptTextColor: "btnAcceptTextColor", + btnDenyTextColor: "btnDenyTextColor", + txtOptInMsgColor: "txtOptInMsgColor", + btnMoreInfoBgColor: "btnMoreInfoBgColor", + btnMoreInfoTextColor: "btnMoreInfoTextColor", + btnAcceptBgColor: "btnAcceptBgColor", + btnDenyBgColor: "btnDenyBgColor", + linkColor: "linkColor", + cornerModalHeaderBgColor: "cornerModalHeaderBgColor", + cornerModalHeaderTextColor: "cornerModalHeaderTextColor", + privacyModalHeaderBgColor: "privacyModalHeaderBgColor", + privacyModalHeaderTextColor: "privacyModalHeaderTextColor", + bannerBgColor: "bannerBgColor", + bannerTextColor: "bannerTextColor", + btnPrivacyButtonTextColor: "btnPrivacyButtonTextColor", + modalSaveTextColor: "modalSaveTextColor", + modalSaveBgColor: "modalSaveBgColor", + chipTextColor: "chipTextColor", + chipBgColor: "chipBgColor") + } +} + +extension VariantsSettings { + + static func mock() -> VariantsSettings { + return .init(enabled: true, + experimentsJson: "experimentsJson", + activateWith: "activateWith") + } +} + +extension PublishedApp { + + static func mock() -> PublishedApp { + return .init(bundleId: "bundleId", + platform: .ios) + } +} + +extension ServiceConsentTemplate { + + static func mock() -> ServiceConsentTemplate { + return .init(isDeactivated: true, + defaultConsentStatus: true, + templateId: "templateId", + version: "version", + categorySlug: "categorySlug", + description: "description", + isHidden: true, + subConsents: [.mock()], + isAutoUpdateAllowed: true, + legalBasisList: ["legalBasisList"], + disableLegalBasis: true) + } +} + +extension SubConsentTemplate { + + static func mock() -> SubConsentTemplate { + return .init(isDeactivated: true, + defaultConsentStatus: true, + templateId: "templateId", + version: "version", + categorySlug: "categorySlug", + description: "description", + isHidden: true) + } +} + + +extension UsercentricsCategory { + + static func mock() -> UsercentricsCategory { + return .init(categorySlug: "categorySlug", + label: "label", + description: "description", + isEssential: true, + isHidden: true) + } +} + +extension TCF2ChangedPurposes { + + static func mock() -> TCF2ChangedPurposes { + return .init(purposes: [1,2,3], legIntPurposes: [1,2,3], notAllowedPurposes: [1,2,3]) + } +} + + +extension CustomizationFont { + + static func mock() -> CustomizationFont { + return .init(family: "family", size: 123) + } +} + +extension CustomizationColor { + + static func mock() -> CustomizationColor { + return .init(primary: "primary", + acceptBtnText: "acceptBtnText", + acceptBtnBackground: "acceptBtnBackground", + denyBtnText: "denyBtnText", + denyBtnBackground: "denyBtnBackground", + saveBtnText: "saveBtnText", + saveBtnBackground: "saveBtnBackground", + linkIcon: "linkIcon", + linkFont: "linkFont", + text: "text", + layerBackground: "layerBackground", + overlay: "overlay", + toggleInactiveBackground: "toggleInactiveBackground", + toggleInactiveIcon: "toggleInactiveIcon", + toggleActiveBackground: "toggleActiveBackground", + toggleActiveIcon: "toggleActiveIcon", + toggleDisabledBackground: "toggleDisabledBackground", + toggleDisabledIcon: "toggleDisabledIcon", + secondLayerTab: "secondLayerTab", + tabsBorderColor: "tabsBorderColor", + ccpaButtonColor: "ccpaButtonColor", + ccpaButtonTextColor: "ccpaButtonTextColor") + } +} + +extension TranslationAriaLabels { + + static func mock() -> TranslationAriaLabels { + return .init(acceptAllButton: "acceptAllButton", + ccpaButton: "ccpaButton", + ccpaMoreInformation: "ccpaMoreInformation", + closeButton: "closeButton", + collapse: "collapse", + cookiePolicyButton: "cookiePolicyButton", + copyControllerId: "copyControllerId", + denyAllButton: "denyAllButton", + expand: "expand", + fullscreenButton: "fullscreenButton", + imprintButton: "imprintButton", + languageSelector: "languageSelector", + privacyButton: "privacyButton", + privacyPolicyButton: "privacyPolicyButton", + saveButton: "saveButton", + serviceInCategoryDetails: "serviceInCategoryDetails", + servicesInCategory: "servicesInCategory", + tabButton: "tabButton", + usercentricsCMPButtons: "usercentricsCMPButtons", + usercentricsCMPContent: "usercentricsCMPContent", + usercentricsCMPHeader: "usercentricsCMPHeader", + usercentricsCMPUI: "usercentricsCMPUI", + usercentricsCard: "usercentricsCard", + usercentricsList: "usercentricsList", + vendorConsentToggle: "vendorConsentToggle", + vendorDetailedStorageInformation: "vendorDetailedStorageInformation", + vendorLegIntToggle: "vendorLegIntToggle") + } +} + + +extension UsercentricsLocation { + + static func mock() -> UsercentricsLocation { + return UsercentricsLocation(countryCode: "PT", regionCode: "") + } +} + diff --git a/sample/ios/sampleTests/Mock/TCFData+Mock.swift b/sample/ios/sampleTests/Mock/TCFData+Mock.swift new file mode 100644 index 00000000..d902b02b --- /dev/null +++ b/sample/ios/sampleTests/Mock/TCFData+Mock.swift @@ -0,0 +1,103 @@ +import Foundation +import Usercentrics + +extension TCFData { + static func mock() -> TCFData { + return .init(features: [.mock()], + purposes: [.mock()], + specialFeatures: [.mock()], + specialPurposes: [.mock()], + stacks: [.mock()], + vendors: [.mock()], + tcString: "abc", + thirdPartyCount: 123) + } +} + +extension TCFFeature { + static func mock() -> TCFFeature { + return .init(purposeDescription: "abc", + illustrations: ["abc"], + id: Int32(123), + name: "abc") + } +} + +extension TCFPurpose { + static func mock() -> TCFPurpose { + return .init(purposeDescription: "abc", + illustrations: ["abc"], + id: Int32(123), + name: "abc", + consent: KotlinBoolean(bool: false), + isPartOfASelectedStack: false, + legitimateInterestConsent: KotlinBoolean(bool: false), + showConsentToggle: false, + showLegitimateInterestToggle: false, + stackId: KotlinInt(int: Int32(123)), + numberOfVendors: 1) + } +} + +extension TCFSpecialFeature { + static func mock() -> TCFSpecialFeature { + return .init(purposeDescription: "abc", + illustrations: ["abc"], + id: Int32(123), + name: "abc", + consent: KotlinBoolean(bool: false), + isPartOfASelectedStack: false, + stackId: KotlinInt(int: Int32(123)), + showConsentToggle: false) + } +} + +extension TCFStack { + static func mock() -> TCFStack { + return .init(description: "abc", + id: Int32(123), + name: "abc", + purposeIds: [], + specialFeatureIds: []) + } +} + +extension TCFSpecialPurpose { + static func mock() -> TCFSpecialPurpose { + return .init(purposeDescription: "abc", + illustrations: ["abc"], + id: Int32(123), + name: "abc") + } +} + +extension TCFVendor { + static func mock() -> TCFVendor { + return .init(consent: KotlinBoolean(bool: false), + features: [.init(id: Int32(123), name: "abc")], + flexiblePurposes: [.init(id: Int32(123), name: "abc")], + id: Int32(123), + legitimateInterestConsent: KotlinBoolean(bool: false), + legitimateInterestPurposes: [.init(id: Int32(123), name: "abc")], + name: "abc", + policyUrl: "abc", + purposes: [.init(id: Int32(123), name: "abc")], + restrictions: [ + TCFVendorRestriction(purposeId: 1, restrictionType: .requireLi) + ], + specialFeatures: [.init(id: Int32(123), name: "abc")], + specialPurposes: [.init(id: Int32(123), name: "abc")], + showConsentToggle: false, + showLegitimateInterestToggle: false, + cookieMaxAgeSeconds: nil, + usesNonCookieAccess: false, + deviceStorageDisclosureUrl: "abc", + usesCookies: false, + cookieRefresh: KotlinBoolean(bool: false), + dataSharedOutsideEU: KotlinBoolean(bool: false), + dataRetention: nil, + dataCategories: [IdAndName(id: 123, name: "name")], + vendorUrls: [VendorUrl(langId: "langId", privacy: "privacy", legIntClaim: "legIntClaim")] + ) + } +} diff --git a/sample/ios/sampleTests/Mock/TCFUserDecisions+Mock.swift b/sample/ios/sampleTests/Mock/TCFUserDecisions+Mock.swift new file mode 100644 index 00000000..30b558f9 --- /dev/null +++ b/sample/ios/sampleTests/Mock/TCFUserDecisions+Mock.swift @@ -0,0 +1,80 @@ +import Foundation +import Usercentrics + +extension TCFUserDecisions { + static func mock() -> TCFUserDecisions { + return TCFUserDecisions(purposes: [.mock()], + specialFeatures: [.mock()], + vendors: [.mock()], + adTechProviders: [.mock()]) + } + + static func mockToDict() -> NSDictionary { + let decisions = TCFUserDecisions.mock() + return [ + "purposes": decisions.purposes?.map { $0.toDictionary() } as Any, + "specialFeatures": decisions.specialFeatures?.map { $0.toDictionary() } as Any, + "vendors": decisions.vendors?.map { $0.toDictionary() } as Any, + "adTechProviders": decisions.adTechProviders.map { $0.toDictionary() } as Any + ] + } +} + +extension TCFUserDecisionOnPurpose { + static func mock() -> TCFUserDecisionOnPurpose { + return .init(id: Int32(1), + consent: KotlinBoolean(bool: false), + legitimateInterestConsent: KotlinBoolean(bool: false)) + } + + func toDictionary() -> NSDictionary { + return [ + "id": self.id as Any, + "consent": self.consent?.boolValue as Any, + "legitimateInterestConsent": self.legitimateInterestConsent?.boolValue as Any + ] + } +} + +extension TCFUserDecisionOnSpecialFeature { + static func mock() -> TCFUserDecisionOnSpecialFeature { + return .init(id: Int32(1), + consent: KotlinBoolean(bool: false)) + } + + func toDictionary() -> NSDictionary { + return [ + "id": self.id as Any, + "consent": self.consent?.boolValue as Any + ] + } +} + +extension TCFUserDecisionOnVendor { + static func mock() -> TCFUserDecisionOnVendor { + return .init(id: Int32(1), + consent: KotlinBoolean(bool: false), + legitimateInterestConsent: KotlinBoolean(bool: false)) + } + + func toDictionary() -> NSDictionary { + return [ + "id": self.id as Any, + "consent": self.consent?.boolValue as Any, + "legitimateInterestConsent": self.legitimateInterestConsent?.boolValue as Any + ] + } +} + +extension AdTechProviderDecision { + static func mock() -> AdTechProviderDecision { + return .init(id: Int32(1), consent: true) + } + + func toDictionary() -> NSDictionary { + return [ + "id": self.id as Any, + "consent": self.consent + ] + } +} diff --git a/sample/ios/sampleTests/Mock/UserDecisions+Mock.swift b/sample/ios/sampleTests/Mock/UserDecisions+Mock.swift new file mode 100644 index 00000000..6363449a --- /dev/null +++ b/sample/ios/sampleTests/Mock/UserDecisions+Mock.swift @@ -0,0 +1,12 @@ +import Foundation +import Usercentrics + +extension UserDecision { + static func mockToDict() -> NSDictionary { + let decision = UserDecision(serviceId: "abc", consent: false) + return [ + "serviceId": decision.serviceId, + "consent": decision.consent + ] + } +} diff --git a/sample/ios/sampleTests/Mock/UsercentricsIsReady+Mock.swift b/sample/ios/sampleTests/Mock/UsercentricsIsReady+Mock.swift new file mode 100644 index 00000000..5f693b9a --- /dev/null +++ b/sample/ios/sampleTests/Mock/UsercentricsIsReady+Mock.swift @@ -0,0 +1,37 @@ +// +// UsercentricsIsReady+Mock.swift +// exampleTests +// +// Created by Pedro Araujo on 21/10/2021. +// + +import Foundation +import Usercentrics + +extension UsercentricsReadyStatus { + static func mock() -> UsercentricsReadyStatus { + return UsercentricsReadyStatus(shouldCollectConsent: false, + consents: [.mock(), .mock()], + geolocationRuleset: GeolocationRuleset(activeSettingsId: "settingsId", bannerRequiredAtLocation: true), + location: UsercentricsLocation(countryCode: "PT", regionCode: "PT11")) + } +} + +extension UsercentricsServiceConsent { + static func mock() -> UsercentricsServiceConsent { + return UsercentricsServiceConsent(templateId: "AAAA", + status: true, + history: [.mock()], + type: .explicit_, + dataProcessor: "BBBB", + version: "1.2.3", + isEssential: false, + category: "marketing") + } +} + +extension UsercentricsConsentHistoryEntry { + static func mock() -> UsercentricsConsentHistoryEntry { + return UsercentricsConsentHistoryEntry(status: false, type: .explicit_, timestampInMillis: Int64(123)) + } +} diff --git a/sample/ios/sampleTests/Mock/UsercentricsOptions+Mock.swift b/sample/ios/sampleTests/Mock/UsercentricsOptions+Mock.swift new file mode 100644 index 00000000..6f903ae5 --- /dev/null +++ b/sample/ios/sampleTests/Mock/UsercentricsOptions+Mock.swift @@ -0,0 +1,30 @@ +import Foundation +import Usercentrics + +extension UsercentricsOptions { + static func mock(loggerLevel: UsercentricsLoggerLevel = .warning, + settingsId: String = "AAAAA", + ruleSetId: String = "BBBBB", + defaultLanguage: String = "PT", + version: String = "1.2.3", + timeoutMillis: Int64 = 1000, + consentMediation: Bool = true, + domains: UsercentricsDomains? = nil, + initTimeoutMillis: Int64 = 1000) -> UsercentricsOptions { + return UsercentricsOptions(settingsId: settingsId, defaultLanguage: defaultLanguage, version: version, timeoutMillis: timeoutMillis, loggerLevel: loggerLevel, ruleSetId: ruleSetId, consentMediation: consentMediation, domains: domains, initTimeoutMillis: initTimeoutMillis) + } + + static func asDict(mockObject: UsercentricsOptions? = nil) -> NSDictionary { + let expectedOptions = (mockObject == nil ? self.mock() : mockObject)! + return [ + "settingsId": expectedOptions.settingsId, + "ruleSetId": expectedOptions.ruleSetId, + "loggerLevel": expectedOptions.loggerLevel.ordinal, + "timeoutMillis": expectedOptions.timeoutMillis, + "version": expectedOptions.version, + "defaultLanguage": expectedOptions.defaultLanguage, + "consentMediation": expectedOptions.consentMediation, + "initTimeoutMillis": expectedOptions.initTimeoutMillis + ] + } +} diff --git a/sample/ios/sampleTests/RNUsercentricsModuleTests.swift b/sample/ios/sampleTests/RNUsercentricsModuleTests.swift new file mode 100644 index 00000000..8137d4ae --- /dev/null +++ b/sample/ios/sampleTests/RNUsercentricsModuleTests.swift @@ -0,0 +1,627 @@ + +import XCTest +import UsercentricsUI + +@testable import react_native_usercentrics +@testable import Usercentrics + +class RNUsercentricsModuleTests: XCTestCase { + + private var module: RNUsercentricsModule! + private var fakeUsercentrics: FakeUsercentricsManager! + + override func setUp() { + module = RNUsercentricsModule() + fakeUsercentrics = FakeUsercentricsManager() + module.queue = FakeDispatchQueue() + module.usercentricsManager = fakeUsercentrics + } + + override func tearDown() { + fakeUsercentrics = nil + module = nil + } + + func testModuleName() { + XCTAssertEqual(RNUsercentricsModule.moduleName(), "RNUsercentricsModule") + } + + func testConfigure() { + let expectedOptions = UsercentricsOptions.mock() + module.configure(UsercentricsOptions.asDict()) + + XCTAssertEqual(expectedOptions.settingsId, fakeUsercentrics.configureOptions!.settingsId) + XCTAssertEqual(expectedOptions.defaultLanguage, fakeUsercentrics.configureOptions!.defaultLanguage) + XCTAssertEqual(expectedOptions.version, fakeUsercentrics.configureOptions!.version) + XCTAssertEqual(expectedOptions.loggerLevel, fakeUsercentrics.configureOptions!.loggerLevel) + XCTAssertEqual(expectedOptions.timeoutMillis, fakeUsercentrics.configureOptions!.timeoutMillis) + } + + func testConfigureWithoutCorrectValues() { + module.configure([:]) + XCTAssertEqual(UsercentricsOptions(), fakeUsercentrics.configureOptions) + } + + func testIsReady() { + fakeUsercentrics.isReadySuccessCompletion = .mock() + module.isReady { result in + guard + let result = result as? NSDictionary, + let shouldCollectConsent = result["shouldCollectConsent"] as? Bool, + let consentsMap = result["consents"] as? [NSDictionary], + let geolocationRulesetMap = result["geolocationRuleset"] as? NSDictionary, + let locationMap = result["location"] as? NSDictionary, + let consent = consentsMap.first + else { + XCTFail() + return + } + + XCTAssertEqual(false, shouldCollectConsent) + + XCTAssertEqual("settingsId", geolocationRulesetMap["activeSettingsId"] as! String) + XCTAssertEqual(true, geolocationRulesetMap["bannerRequiredAtLocation"] as! Bool) + + XCTAssertEqual("PT", locationMap["countryCode"] as! String) + XCTAssertEqual("PT11", locationMap["regionCode"] as! String) + + XCTAssertEqual("1.2.3", consent["version"] as! String) + XCTAssertEqual("BBBB", consent["dataProcessor"] as! String) + XCTAssertEqual("AAAA", consent["templateId"] as! String) + XCTAssertEqual(0, consent["type"] as! Int) + XCTAssertEqual(true, consent["status"] as! Bool) + } reject: { _,_,_ in + XCTFail("Should not go here") + } + } + + func testIsReadyWithError() { + fakeUsercentrics.isReadyErrorCompletion = FakeUsercentricsError.test + module.isReady { _ in + XCTFail("Should not go here") + } reject: { code, message, error in + XCTAssertEqual(error?.localizedDescription, FakeUsercentricsError.test.localizedDescription) + XCTAssertEqual("usercentrics_reactNative_isReady_error", code) + XCTAssertEqual("The operation couldn’t be completed. (sampleTests.FakeUsercentricsError error 0.)", message) + } + } + + func testRestoreUserSession() { + fakeUsercentrics.restoreUserSessionSuccess = .mock() + module.restoreUserSession("abc") { [self] result in + guard + let result = result as? NSDictionary, + let shouldCollectConsent = result["shouldCollectConsent"] as? Bool, + let consentsMap = result["consents"] as? [NSDictionary], + let consent = consentsMap.first + else { + XCTFail() + return + } + + XCTAssertEqual(shouldCollectConsent, false) + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + XCTAssertEqual(self.fakeUsercentrics.restoreControllerId, "abc") + } reject: { _,_,_ in + XCTFail("Should not go here") + } + } + + func testRestoreUserSessionWithError() { + fakeUsercentrics.restoreUserSessionError = FakeUsercentricsError.test + module.restoreUserSession("abc") { _ in + XCTFail("Should not go here") + } reject: { code, message, error in + XCTAssertEqual(error?.localizedDescription, FakeUsercentricsError.test.localizedDescription) + XCTAssertEqual("usercentrics_reactNative_restoreUserSession_error", code) + XCTAssertEqual("The operation couldn’t be completed. (sampleTests.FakeUsercentricsError error 0.)", message) + } + } + + func testGetControllerId() { + fakeUsercentrics.getControllerIdValue = "abc" + module.getControllerId { response in + XCTAssertEqual("abc", response as? String) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testGetABTestingVariantId() { + fakeUsercentrics.getABTestingVariantValue = "variantA" + module.getABTestingVariant { response in + XCTAssertEqual("variantA", response as? String) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testGetConsents() { + fakeUsercentrics.getConsentsResponse = [.mock()] + module.getConsents { result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testGetUserSessionData() { + fakeUsercentrics.getUserSessionDataResponse = "abc" + module.getUserSessionData { result in + guard + let result = result as? String + else { + XCTFail() + return + } + + XCTAssertEqual("abc", result) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testGetCCPAData() { + fakeUsercentrics.getUSPDataResponse = CCPAData(version: 1, noticeGiven: .init(bool: false), optedOut: .init(bool: false), lspact: .init(bool: false)) + module.getUSPData { result in + guard + let result = result as? NSDictionary + else { + XCTFail() + return + } + + XCTAssertEqual(1, result["version"] as! Int) + XCTAssertEqual(false, result["noticeGiven"] as! Bool) + XCTAssertEqual(false, result["optedOut"] as! Bool) + XCTAssertEqual(false, result["lspact"] as! Bool) + XCTAssertEqual("1NNN", result["uspString"] as! String) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testChangeLanguage() { + module.changeLanguage("pt") { result in + XCTAssert(result != nil) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testChangeLanguageWithError() { + fakeUsercentrics.changeLanguageError = FakeUsercentricsError.test + module.changeLanguage("pt") { result in + XCTFail("Should not go here") + } reject: { code, message, error in + XCTAssertEqual(error?.localizedDescription, FakeUsercentricsError.test.localizedDescription) + XCTAssertEqual("usercentrics_reactNative_changeLanguage_error", code) + XCTAssertEqual("The operation couldn’t be completed. (sampleTests.FakeUsercentricsError error 0.)", message) + } + } + + func testAcceptAllExplicit() { + fakeUsercentrics.acceptAllResponse = [.mock()] + module.acceptAll(0) { [unowned self] result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + + XCTAssertEqual(.explicit_, self.fakeUsercentrics.acceptAllConsentType!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testAcceptAllImplicit() { + fakeUsercentrics.acceptAllResponse = [.mock()] + module.acceptAll(1) { [unowned self] _ in + XCTAssertEqual(.implicit, self.fakeUsercentrics.acceptAllConsentType!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testAcceptAllForTCF() { + fakeUsercentrics.acceptAllForTCFResponse = [.mock()] + + module.acceptAllForTCF(0, consentType: 0) { [unowned self] result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + + XCTAssertEqual(.explicit_, self.fakeUsercentrics.acceptAllForTCFConsentType!) + XCTAssertEqual(.firstLayer, self.fakeUsercentrics.acceptAllForTCFFromLayer!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testAcceptAllForTCFSecondLayer() { + fakeUsercentrics.acceptAllForTCFResponse = [.mock()] + + module.acceptAllForTCF(1, consentType: 1) { [unowned self] _ in + XCTAssertEqual(.implicit, self.fakeUsercentrics.acceptAllForTCFConsentType!) + XCTAssertEqual(.secondLayer, self.fakeUsercentrics.acceptAllForTCFFromLayer!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + + func testDenyAllExplicit() { + fakeUsercentrics.denyAllResponse = [.mock()] + module.denyAll(0) { [unowned self] result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + + XCTAssertEqual(.explicit_, self.fakeUsercentrics.denyAllConsentType!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testDenyAllImplicit() { + fakeUsercentrics.denyAllResponse = [.mock()] + module.denyAll(1) { [unowned self] _ in + XCTAssertEqual(.implicit, self.fakeUsercentrics.denyAllConsentType!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testDenyAllForTCF() { + fakeUsercentrics.denyAllForTCFResponse = [.mock()] + + module.denyAllForTCF(0, consentType: 0) { [unowned self] result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + + XCTAssertEqual(.explicit_, self.fakeUsercentrics.denyAllForTCFConsentType!) + XCTAssertEqual(.firstLayer, self.fakeUsercentrics.denyAllForTCFFromLayer!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testDenyAllForTCFSecondLayer() { + fakeUsercentrics.denyAllForTCFResponse = [.mock()] + module.denyAllForTCF(1, consentType: 1) { [unowned self] _ in + XCTAssertEqual(.implicit, self.fakeUsercentrics.denyAllForTCFConsentType!) + XCTAssertEqual(.secondLayer, self.fakeUsercentrics.denyAllForTCFFromLayer!) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testSaveDecisionsForTCF() { + fakeUsercentrics.saveDecisionsForTCFResponse = [.mock()] + module.saveDecisionsForTCF(TCFUserDecisions.mockToDict(), + fromLayer: 0, + serviceDecisions: [UserDecision.mockToDict()], + consentType: 0) { result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testSaveDecisions() { + fakeUsercentrics.saveDecisionsResponse = [.mock()] + module.saveDecisions([UserDecision.mockToDict()], consentType: 0) { result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testSaveOptOutForCCPA() { + fakeUsercentrics.saveOptOutForCCPAResponse = [.mock()] + + module.saveOptOutForCCPA(false, consentType: 0) { result in + guard + let result = result as? [NSDictionary], + let consent = result.first + else { + XCTFail() + return + } + + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testGetTCFData() { + fakeUsercentrics.getTCFDataResponse = .mock() + module.getTCFData { result in + guard + let result = result as? NSDictionary + else { + XCTFail() + return + } + + let features = result["features"] as? [NSDictionary] + let purposes = result["purposes"] as? [NSDictionary] + let specialFeatures = result["specialFeatures"] as? [NSDictionary] + let specialPurposes = result["specialPurposes"] as? [NSDictionary] + let stacks = result["stacks"] as? [NSDictionary] + let vendors = result["vendors"] as? [NSDictionary] + let tcString = result["tcString"] as? String + let thirdPartyCount = result["thirdPartyCount"] as? Int + + XCTAssertNotNil(features) + XCTAssertNotNil(purposes) + XCTAssertNotNil(specialFeatures) + XCTAssertNotNil(specialPurposes) + XCTAssertNotNil(stacks) + XCTAssertNotNil(vendors) + XCTAssertNotNil(tcString) + XCTAssertNotNil(thirdPartyCount) + + XCTAssertEqual(1, features!.count) + XCTAssertEqual(1, purposes!.count) + XCTAssertEqual(1, specialFeatures!.count) + XCTAssertEqual(1, specialPurposes!.count) + XCTAssertEqual(1, stacks!.count) + XCTAssertEqual(1, vendors!.count) + + XCTAssertEqual(TCFFeature.mock().toDictionary(), features!.first) + XCTAssertEqual(TCFPurpose.mock().toDictionary(), purposes!.first) + XCTAssertEqual(TCFSpecialFeature.mock().toDictionary(), specialFeatures!.first) + XCTAssertEqual(TCFSpecialPurpose.mock().toDictionary(), specialPurposes!.first) + XCTAssertEqual(TCFStack.mock().toDictionary(), stacks!.first) + XCTAssertEqual(TCFVendor.mock().toDictionary(), vendors!.first) + XCTAssertEqual("abc", tcString) + XCTAssertEqual(123, thirdPartyCount) + + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testSetCMPId() { + module.setCMPId(123) + XCTAssertEqual(Int32(123), fakeUsercentrics.cmpId) + } + + func testSetABTestingVariant() { + module.setABTestingVariant("variantA") + XCTAssertEqual(String("variantA"), fakeUsercentrics.variant) + } + + func testShowFirstLayerWithBannerSettingsObject() { + let serializedSettings: NSDictionary = [ + "firstLayerStyleSettings": ["layout": "POPUP_CENTER"] + ] + module.showFirstLayer(serializedSettings) { result in + XCTAssertEqual(.popup(position: .center), self.fakeUsercentrics.showFirstLayerBannerSettings?.firstLayerStyleSettings?.layout) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testShowFirstLayerWithEmptyBannerSettingsObject() { + let emptyDictionary: NSDictionary = [:] + module.showFirstLayer(emptyDictionary) { result in + XCTAssertNil(self.fakeUsercentrics.showFirstLayerBannerSettings?.firstLayerStyleSettings) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testShowSecondLayerWithBannerSettingsObject() { + let serializedSettings: NSDictionary = [ + "secondLayerStyleSettings": ["showCloseButton": true] + ] + module.showSecondLayer(serializedSettings) { result in + XCTAssertEqual(true, self.fakeUsercentrics.showSecondLayerBannerSettings?.secondLayerStyleSettings?.showCloseButton) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testShowSecondLayerWithEmptyBannerSettingsObject() { + let emptyDictionary: NSDictionary = [:] + + module.showSecondLayer(emptyDictionary) { result in + XCTAssertNil(self.fakeUsercentrics.showSecondLayerBannerSettings?.secondLayerStyleSettings) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testTrack() { + module.track(1) + XCTAssertEqual(1, fakeUsercentrics.trackCalls.count) + XCTAssertEqual(UsercentricsAnalyticsEventType.acceptAllFirstLayer, fakeUsercentrics.trackCalls[0]) + } + + func testGetCMPData() { + fakeUsercentrics.getCMPDataResponse = .mock() + module.getCMPData { result in + guard + let result = result as? NSDictionary + else { + XCTFail() + return + } + + let settings = result["settings"] as? NSDictionary + let services = result["services"] as? [NSDictionary] + let legalBasis = result["legalBasis"] as? NSDictionary + let activeVariant = result["activeVariant"] + let userLocation = result["userLocation"] as? NSDictionary + let categories = result["categories"] as? [NSDictionary] + + XCTAssertNotNil(settings) + XCTAssertNotNil(services) + XCTAssertNotNil(legalBasis) + XCTAssertNotNil(userLocation) + XCTAssertNotNil(activeVariant) + XCTAssertNotNil(categories) + + XCTAssertEqual(1, services!.count) + XCTAssertEqual(1, categories!.count) + + XCTAssertEqual(UsercentricsSettings.mock().toDictionary(), settings) + XCTAssertEqual(UsercentricsService.mock().toDictionary(), services!.first) + XCTAssertEqual(LegalBasisLocalization.mock().toDictionary(), legalBasis) + XCTAssertEqual(2, activeVariant as? Int) + XCTAssertEqual(UsercentricsLocation.mock().toDictionary(), userLocation) + XCTAssertEqual(UsercentricsCategory.mock().toDictionary(), categories!.first) + + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testGetAdditionalConsentModeData() { + let expected = AdditionalConsentModeData(acString: "2~43.46.55~dv.", + adTechProviders: [AdTechProvider(id: 43, name: "AdPredictive", privacyPolicyUrl: "https://adpredictive.com/privacy", consent: true)]) + + fakeUsercentrics.getAdditionalConsentModeDataResponse = expected + + module.getAdditionalConsentModeData { response in + guard let result = response as? NSDictionary else { + XCTFail() + return + } + + XCTAssertEqual(expected.acString, result["acString"] as! String) + + let adTechProviders = result["adTechProviders"] as? [NSDictionary] + XCTAssertEqual(1, adTechProviders!.count) + + XCTAssertEqual(43, adTechProviders![0]["id"] as! Int) + XCTAssertEqual(true, adTechProviders![0]["consent"] as! Bool) + XCTAssertEqual("AdPredictive", adTechProviders![0]["name"] as! String) + XCTAssertEqual("https://adpredictive.com/privacy", adTechProviders![0]["privacyPolicyUrl"] as! String) + } reject: { _, _, _ in + XCTFail("Should not go here") + } + } + + func testclearUserSession() { + fakeUsercentrics.clearUserSessionSuccess = .mock() + module.clearUserSession() { [self] result in + guard + let result = result as? NSDictionary, + let shouldCollectConsent = result["shouldCollectConsent"] as? Bool, + let consentsMap = result["consents"] as? [NSDictionary], + let consent = consentsMap.first + else { + XCTFail() + return + } + + XCTAssertEqual(shouldCollectConsent, false) + XCTAssertEqual(consent["version"] as! String, "1.2.3") + XCTAssertEqual(consent["dataProcessor"] as! String, "BBBB") + XCTAssertEqual(consent["templateId"] as! String, "AAAA") + XCTAssertEqual(consent["type"] as! Int, 0) + XCTAssertEqual(consent["status"] as! Bool, true) + } reject: { _,_,_ in + XCTFail("Should not go here") + } + } + + func testClearUserSessionWithError() { + fakeUsercentrics.clearUserSessionError = FakeUsercentricsError.test + module.clearUserSession() { _ in + XCTFail("Should not go here") + } reject: { code, message, error in + XCTAssertEqual(error?.localizedDescription, FakeUsercentricsError.test.localizedDescription) + XCTAssertEqual("usercentrics_reactNative_clearUserSession_error", code) + XCTAssertEqual("The operation couldn’t be completed. (sampleTests.FakeUsercentricsError error 0.)", message) + } + } +} diff --git a/sample/ios/sampleTests/ReadyStatusDictTests.swift b/sample/ios/sampleTests/ReadyStatusDictTests.swift new file mode 100644 index 00000000..de338d28 --- /dev/null +++ b/sample/ios/sampleTests/ReadyStatusDictTests.swift @@ -0,0 +1,76 @@ +import XCTest + +@testable import Usercentrics +@testable import react_native_usercentrics + +class ReadyStatusDictTests: XCTestCase { + + func testSerialize() { + let history = UsercentricsConsentHistoryEntry(status: false, type: .explicit_, timestampInMillis: Int64(123)) + let consent: UsercentricsServiceConsent = UsercentricsServiceConsent(templateId: "abc", + status: true, + history: [history], + type: .explicit_, + dataProcessor: "abc", + version: "version", + isEssential: true, + category: "marketing") + + let usercentricsReady = UsercentricsReadyStatus(shouldCollectConsent: false, + consents: [consent], + geolocationRuleset: GeolocationRuleset(activeSettingsId: "settingsId", bannerRequiredAtLocation: true), + location: UsercentricsLocation(countryCode: "PT", regionCode: "PT11")) + let dictionary = usercentricsReady.toDictionary() + + XCTAssertEqual(false, dictionary["shouldCollectConsent"] as! Bool) + XCTAssertNotNil(dictionary["consents"] as? [NSDictionary]) + + let geolocationRuleset = dictionary["geolocationRuleset"] as! NSDictionary + XCTAssertEqual(true, geolocationRuleset["bannerRequiredAtLocation"] as! Bool) + XCTAssertEqual("settingsId", geolocationRuleset["activeSettingsId"] as! String) + + let location = dictionary["location"] as! NSDictionary + XCTAssertEqual("PT", location["countryCode"] as! String) + XCTAssertEqual("PT11", location["regionCode"] as! String) + } + + func testSerializeConsent() { + let history = UsercentricsConsentHistoryEntry(status: false, type: .explicit_, timestampInMillis: Int64(123)) + let consent = UsercentricsServiceConsent(templateId: "abc", + status: true, + history: [history], + type: .explicit_, + dataProcessor: "abc", + version: "version", + isEssential: false, + category: "marketing").toDictionary() + + XCTAssertEqual("abc", consent["templateId"] as! String) + XCTAssertEqual(true, consent["status"] as! Bool) + XCTAssertEqual(0, consent["type"] as! Int) + XCTAssertEqual("abc", consent["dataProcessor"] as! String) + XCTAssertEqual("version", consent["version"] as! String) + XCTAssertEqual(false, consent["isEssential"] as! Bool) + + let historyImplicit = UsercentricsConsentHistoryEntry(status: false, type: .implicit, timestampInMillis: Int64(123)) + let consentImplicit = UsercentricsServiceConsent(templateId: "abc", + status: true, + history: [historyImplicit], + type: .implicit, + dataProcessor: "abc", + version: "version", + isEssential: false, + category: "marketing").toDictionary() + + XCTAssertEqual(1, consentImplicit["type"] as! Int) + } + + func testSerializeConsentHistoryEntry() { + let historyDict = [UsercentricsConsentHistoryEntry(status: false, type: .explicit_, timestampInMillis: Int64(123))].toDictionary().first! + + XCTAssertEqual(false, historyDict["status"] as! Bool) + XCTAssertEqual(0, historyDict["type"] as! Int) + XCTAssertEqual(123, historyDict["timestampInMillis"] as! Int) + } + +} diff --git a/sample/ios/sampleTests/TCFDecisionUILayerTests.swift b/sample/ios/sampleTests/TCFDecisionUILayerTests.swift new file mode 100644 index 00000000..19ce6a9d --- /dev/null +++ b/sample/ios/sampleTests/TCFDecisionUILayerTests.swift @@ -0,0 +1,12 @@ +import XCTest + +@testable import Usercentrics +@testable import react_native_usercentrics + +class TCFDecisionUILayerTests: XCTestCase { + + func testToIntMethod() { + XCTAssertEqual(.firstLayer, TCFDecisionUILayer.initialize(from: 0)) + XCTAssertEqual(.secondLayer, TCFDecisionUILayer.initialize(from: 1)) + } +} diff --git a/sample/ios/sampleTests/UserDecisionDictTests.swift b/sample/ios/sampleTests/UserDecisionDictTests.swift new file mode 100644 index 00000000..fdd3b897 --- /dev/null +++ b/sample/ios/sampleTests/UserDecisionDictTests.swift @@ -0,0 +1,23 @@ +import XCTest + +@testable import Usercentrics +@testable import react_native_usercentrics + +class UserDecisionDictTests: XCTestCase { + + func testFromDictWithCorrectValues() { + let dict: NSDictionary = ["serviceId": "abc", "consent": false] + let decision = UserDecision(from: dict) + + XCTAssertNotNil(decision) + XCTAssertEqual("abc", decision!.serviceId) + XCTAssertEqual(false, decision!.consent) + } + + func testFromDictWithoutCorrectValuesShouldBeNil() { + let dict: NSDictionary = ["service": "abc", "consent": false] + let decision = UserDecision(from: dict) + + XCTAssertNil(decision) + } +} diff --git a/sample/ios/sampleTests/UsercentricsAnalyticsEventTypeTests.swift b/sample/ios/sampleTests/UsercentricsAnalyticsEventTypeTests.swift new file mode 100644 index 00000000..b1043a22 --- /dev/null +++ b/sample/ios/sampleTests/UsercentricsAnalyticsEventTypeTests.swift @@ -0,0 +1,11 @@ +import XCTest + +@testable import Usercentrics +@testable import react_native_usercentrics + +class UsercentricsAnalyticsEventTypeTests: XCTestCase { + + func testInitialize() { + XCTAssertEqual(UsercentricsAnalyticsEventType.acceptAllFirstLayer, UsercentricsAnalyticsEventType.initialize(from: 1)) + } +} diff --git a/sample/ios/sampleTests/UsercentricsConsentTypeTests.swift b/sample/ios/sampleTests/UsercentricsConsentTypeTests.swift new file mode 100644 index 00000000..6bf39d34 --- /dev/null +++ b/sample/ios/sampleTests/UsercentricsConsentTypeTests.swift @@ -0,0 +1,12 @@ +import XCTest + +@testable import Usercentrics +@testable import react_native_usercentrics + +class UsercentricsConsentTypeTests: XCTestCase { + + func testToIntMethod() { + XCTAssertEqual(.explicit_, UsercentricsConsentType.initialize(from: 0)) + XCTAssertEqual(.implicit, UsercentricsConsentType.initialize(from: 1)) + } +} diff --git a/sample/ios/sampleTests/UsercentricsOptionsDictTests.swift b/sample/ios/sampleTests/UsercentricsOptionsDictTests.swift new file mode 100644 index 00000000..c5ee0583 --- /dev/null +++ b/sample/ios/sampleTests/UsercentricsOptionsDictTests.swift @@ -0,0 +1,89 @@ +import XCTest + +@testable import Usercentrics +@testable import react_native_usercentrics + +class UsercentricsOptionsDictTests: XCTestCase { + + func testInitializeUserOptionsFromDictionary() { + let dict: NSDictionary = [ + "loggerLevel": 3, + "defaultLanguage": "pt", + "settingsId": "123", + "ruleSetId": "qwer", + "timeoutMillis": 1000, + "version": "1.2.3", + "networkMode": 1, + "initTimeoutMillis": 1500, + ] + + + let usercentricsOptionsFromDict = UsercentricsOptions.initialize(from: dict)! + + XCTAssertEqual("123", usercentricsOptionsFromDict.settingsId) + XCTAssertEqual("qwer", usercentricsOptionsFromDict.ruleSetId) + XCTAssertEqual("pt", usercentricsOptionsFromDict.defaultLanguage) + XCTAssertEqual("1.2.3", usercentricsOptionsFromDict.version) + XCTAssertEqual(.debug, usercentricsOptionsFromDict.loggerLevel) + XCTAssertEqual(1000, usercentricsOptionsFromDict.timeoutMillis) + XCTAssertEqual(.eu, usercentricsOptionsFromDict.networkMode) + XCTAssertEqual(1500, usercentricsOptionsFromDict.initTimeoutMillis) + } + + func testInitializeWithoutSettingsIdShouldNotInitialize() { + let dict: NSDictionary = [:] + let usercentricsOptionsFromDict = UsercentricsOptions.initialize(from: dict) + XCTAssertEqual(UsercentricsOptions(), usercentricsOptionsFromDict) + } + + func testSerializeLoggerLevel() { + let dict0: NSDictionary = [ + "loggerLevel": 0, + "settingsId": "123", + ] + + + let dict1: NSDictionary = [ + "loggerLevel": 1, + "settingsId": "123", + ] + + + let dict2: NSDictionary = [ + "loggerLevel": 2, + "settingsId": "123", + ] + + + let dict3: NSDictionary = [ + "loggerLevel": 3, + "settingsId": "123", + ] + XCTAssertEqual(UsercentricsLoggerLevel.none, UsercentricsOptions.initialize(from: dict0)?.loggerLevel) + XCTAssertEqual(.error, UsercentricsOptions.initialize(from: dict1)?.loggerLevel) + XCTAssertEqual(.warning, UsercentricsOptions.initialize(from: dict2)?.loggerLevel) + XCTAssertEqual(.debug, UsercentricsOptions.initialize(from: dict3)?.loggerLevel) + } + + func testSerializeNetworkMode() { + let dict0: NSDictionary = [ + "networkMode": 0, + "settingsId": "123", + ] + + + let dict1: NSDictionary = [ + "networkMode": 1, + "settingsId": "123", + ] + + + let dict2: NSDictionary = [ + "settingsId": "123", + ] + XCTAssertEqual(.world, UsercentricsOptions.initialize(from: dict0)?.networkMode) + XCTAssertEqual(.eu, UsercentricsOptions.initialize(from: dict1)?.networkMode) + XCTAssertEqual(.world, UsercentricsOptions.initialize(from: dict2)?.networkMode) + } + +} diff --git a/sample/ios/sampleTests/UsercentricsUserInteractionDictTest.swift b/sample/ios/sampleTests/UsercentricsUserInteractionDictTest.swift new file mode 100644 index 00000000..694e6c35 --- /dev/null +++ b/sample/ios/sampleTests/UsercentricsUserInteractionDictTest.swift @@ -0,0 +1,15 @@ +import XCTest + +import UsercentricsUI +@testable import Usercentrics +@testable import react_native_usercentrics + +class UsercentricsUserInteractionDictTest: XCTestCase { + + func testToIntMethod() { + XCTAssertEqual(0, UsercentricsUserInteraction.acceptAll.toInt()) + XCTAssertEqual(1, UsercentricsUserInteraction.denyAll.toInt()) + XCTAssertEqual(2, UsercentricsUserInteraction.granular.toInt()) + XCTAssertEqual(3, UsercentricsUserInteraction.noInteraction.toInt()) + } +} diff --git a/sample/package-lock.json b/sample/package-lock.json index a77eb50b..8dc73c59 100644 --- a/sample/package-lock.json +++ b/sample/package-lock.json @@ -112,7 +112,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -144,7 +143,6 @@ "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -2771,7 +2769,6 @@ "integrity": "sha512-DyKptlG78XPFo7tDod+we5a3R+U9qjyhaVFbOPvH4pFNu5Dehewtol/srl44K6Cszq0aEMlAJZ3juk0W4WnOJA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@react-native-community/cli-clean": "18.0.0", "@react-native-community/cli-config": "18.0.0", @@ -3369,7 +3366,6 @@ "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.18.tgz", "integrity": "sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg==", "license": "MIT", - "peer": true, "dependencies": { "@react-navigation/core": "^6.4.17", "escape-string-regexp": "^4.0.0", @@ -3597,7 +3593,6 @@ "integrity": "sha512-1LOH8xovvsKsCBq1wnT4ntDUdCJKmnEakhsuoUSy6ExlHCkGP2hqnatagYTgFk6oeL0VU31u7SNjunPN+GchtA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -3646,7 +3641,6 @@ "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", @@ -3681,7 +3675,6 @@ "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", @@ -3925,7 +3918,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4587,7 +4579,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -5738,7 +5729,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7881,7 +7871,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -12166,7 +12155,6 @@ "version": "4.0.3", "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12996,7 +12984,6 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -13213,7 +13200,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -13272,7 +13258,6 @@ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.6.tgz", "integrity": "sha512-kvIWSmf4QPfY41HC25TR285N7Fv0Pyn3DAEK8qRL9dA35usSaxsJkHfw+VqnonqJjXOaoKCEanwudRAJ60TBGA==", "license": "MIT", - "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.79.6", @@ -13342,7 +13327,6 @@ "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz", "integrity": "sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA==", "license": "MIT", - "peer": true, "peerDependencies": { "react": "*", "react-native": "*" @@ -13353,7 +13337,6 @@ "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", "license": "MIT", - "peer": true, "dependencies": { "react-freeze": "^1.0.0", "react-native-is-edge-to-edge": "^1.2.1", @@ -14822,7 +14805,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver"