diff --git a/.eslintrc.js b/.eslintrc.js index 41821abb..ae6a46d8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,6 +1,6 @@ module.exports = { root: true, - extends: ['@react-native'], + extends: ['@react-native', 'plugin:jest/recommended'], plugins: ['jest', 'import'], env: { browser: true, @@ -9,6 +9,7 @@ module.exports = { rules: { '@typescript-eslint/no-unused-vars': 'off', 'react-hooks/rules-of-hooks': 'off', + '@typescript-eslint/func-call-spacing': 'off', }, parserOptions: { project: ['./tsconfig.json'], diff --git a/.gitignore b/.gitignore index 5b4acc4b..e4969710 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,9 @@ coverage !.yarn/releases !.yarn/sdks !.yarn/versions +example/.yarn +playground/.yarn/cache/ +playground/android +playground/ios + +.java-version diff --git a/.prettierrc.js b/.prettierrc.js index 335ca394..11bc2cdd 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,10 +1,9 @@ module.exports = { - bracketSpacing: true, - jsxBracketSameLine: true, - singleQuote: true, - trailingComma: 'all', - arrowParens: 'avoid', - importOrder: ['', '^~(.*)/(.*)$', '^[./]'], - importOrderSeparation: true, - importOrderSortSpecifiers: true, + plugins: [require('@ianvs/prettier-plugin-sort-imports')], + bracketSpacing: true, + singleQuote: true, + trailingComma: 'all', + arrowParens: 'avoid', + importOrder: ['', '^~(.*)/(.*)$', '^[./]'], + parser: 'typescript', }; diff --git a/README.md b/README.md index d453e4bc..78c19cea 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,39 @@ [![github][github-image]][github-url] [![npm][npm-image]][npm-url] [![docs][docs-image]][docs-url] [![Maintenance Status][maintenance-image]](#maintenance-status) -A.M.A. stands for **A**ccessible **M**obile **A**pp and is react native library that aim offers the best accessibility tooling experience and guides to guide you through accessibility best practices while you code your app. -That's why we created A.M.A., a set of components and hooks designed to enforce minimum accessibility requirements. -This is combined with extensive [guidelines](https://commerce.nearform.com/open-source/react-native-ama/guidelines/) to help you understand how accessibility should work when manually testing your app. Finally we have provided a [checklist](https://commerce.nearform.com/open-source/react-native-ama/checklist/) which condenses these guidelines, explaining their intended functionality against specific features or components. +**A.M.A.** stands for **A**ccessible **M**obile **A**pp and is a React Native library that offers the best accessibility tooling experience as well as expert guides to support you with accessibility best practices while developing your app. -While in development AMA also provides run time accessibility checks against components +The library consists of -#### Example of AMA checks performed in development: +1. Runtime checks that help you catch common accessibility issues during development. +2. A set of popular components that are designed with accessibility in mind. +2. Extensive [guidelines](https://commerce.nearform.com/open-source/react-native-ama/guidelines/) to help you understand how accessibility should work when manually testing your app. +3. A [checklist](https://commerce.nearform.com/open-source/react-native-ama/checklist/) which condenses these guidelines, explaining their intended functionality against specific features or components. -Example of runtime failure detected by AMA +**AMA** consists of a family of packages under the npm `@react-native-ama` namespace. +These packages are designed to work independently, allowing you to pick and choose the ones that suit your needs. +This modular approach enables developers to create a tailored experience for their applications without the overhead of unnecessary dependencies. -> [!NOTE] -> This is an example of a runtime failure detected by AMA with additional information and links to guidelines provided in the console. +## Runtime Dev Tooling (Accessibility Checks) -**Example of additional console info**: -Example of console warning by AMA +Adopting an "accessibility-first" approach is the best way to ensure that digital experiences are inclusive for everyone. By prioritizing accessibility in the early stages of code development, you avoid having to later apply retroactive fixes which can be very time-consuming, expensive and difficult. + +### How it works + +When you wrap your application with the AMAProvider from the [@react-native-ama/core](/core/) package, AMA begins scanning your UI for accessibility (a11y) issues as the app is running. + +If any issues are found at the end of a scan, AMA will: + +- Highlight the offending component directly on the screen. +- Print a detailed report of the issue to the console. +- Display a summary of the total number of errors and warnings detected. + +You can use the built-in developer UI to get more information about the issues affecting each component. +As you modify your code to fix them, AMA reacts to the changes and removes the issues from the report in real-time. + +| Real Time scanning | AMA in-app info | +|---------|-------------| +| ![AMA flags multiple accessibility issues in real time, including missing roles and contrast failures, and visually marks each element with severity indicators to guide developers toward immediate fixes.](/img/ama-checks.png) | ![AMA’s real-time accessibility checker detecting a missing role on a pressable element, with detailed guidance, severity level, and direct links to related guidelines.](/img/ama-issue.png) | ## Getting started @@ -49,7 +67,7 @@ yarn add @react-native-ama/core npm install @react-native-ama/core ``` -**2. Wrap App in ``** +**2. Wrap the App in ``** ```jsx {2-4,6,8-9} import { AMAProvider } from '@react-native-ama/core'; @@ -63,6 +81,12 @@ export const App = () => { }; ``` +### Playground + +You can use the playground app within this repository to see how AMA checks work in practice. +The playground can also be used to learn how to fix accessibility issues in your app. + + ## 📃 [Documentation](https://commerce.nearform.com/open-source/react-native-ama) The documentation contains everything you need to know about `@react-native-ama/...`. It contains several sections in order of importance when you first get started: diff --git a/ama.config.json b/ama.config.json new file mode 100644 index 00000000..c988b3be --- /dev/null +++ b/ama.config.json @@ -0,0 +1,6 @@ +{ + "rules": {}, + "accessibilityLabelExceptions": [], + "highlight": "border" +} + diff --git a/babel.base.js b/babel.base.js index 3e7c0553..b0e3b860 100644 --- a/babel.base.js +++ b/babel.base.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line module.exports = { presets: ['module:metro-react-native-babel-preset'], plugins: [ @@ -22,8 +21,6 @@ module.exports = { alias: { '@react-native-ama/core/src': `${__dirname}/packages/core/src`, '@react-native-ama/core': `${__dirname}/packages/core/src`, - '@react-native-ama/internal/src': `${__dirname}/packages/internal/src`, - '@react-native-ama/internal': `${__dirname}/packages/internal/src`, '@react-native-ama/animations/src': `${__dirname}/packages/animations/src`, '@react-native-ama/animations': `${__dirname}/packages/animations/src`, '@react-native-ama/extras/src': `${__dirname}/packages/extras/src`, @@ -32,8 +29,6 @@ module.exports = { '@react-native-ama/lists': `${__dirname}/packages/lists/src`, '@react-native-ama/react-native/src': `${__dirname}/packages/react-native/src`, '@react-native-ama/react-native': `${__dirname}/packages/react-native/src`, - '@react-native-ama/internal/src': `${__dirname}/packages/internal/src`, - '@react-native-ama/internal': `${__dirname}/packages/internal/src`, }, }, ], diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 5cbf5654..00000000 --- a/examples/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Examples - -Welcome to the examples directory! This directory contains a both an example app for expo and one for react-native bare workflow. - -These apps share a common `shared` package which contains all the testable code. When adding a new example, it should be added to the shared package and then pulled into both apps and tested. - -> [!IMPORTANT] -> Changes made to the library should be tested in both the expo and bare react-native apps. diff --git a/examples/bare/.bundle/config b/examples/bare/.bundle/config deleted file mode 100644 index 848943bb..00000000 --- a/examples/bare/.bundle/config +++ /dev/null @@ -1,2 +0,0 @@ -BUNDLE_PATH: "vendor/bundle" -BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/examples/bare/.eslintrc.js b/examples/bare/.eslintrc.js deleted file mode 100644 index 187894b6..00000000 --- a/examples/bare/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - root: true, - extends: '@react-native', -}; diff --git a/examples/bare/.gitignore b/examples/bare/.gitignore deleted file mode 100644 index 188d2d24..00000000 --- a/examples/bare/.gitignore +++ /dev/null @@ -1,75 +0,0 @@ -# OSX -# -.DS_Store - -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -**/.xcode.env.local - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml -*.hprof -.cxx/ -*.keystore -!debug.keystore - -# node.js -# -node_modules/ -npm-debug.log -yarn-error.log - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the -# screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/ - -**/fastlane/report.xml -**/fastlane/Preview.html -**/fastlane/screenshots -**/fastlane/test_output - -# Bundle artifact -*.jsbundle - -# Ruby / CocoaPods -**/Pods/ -/vendor/bundle/ - -# Temporary files created by Metro to check the health of the file watcher -.metro-health-check* - -# testing -/coverage - -# Yarn -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions - diff --git a/examples/bare/.prettierrc.js b/examples/bare/.prettierrc.js deleted file mode 100644 index 26419e47..00000000 --- a/examples/bare/.prettierrc.js +++ /dev/null @@ -1,4 +0,0 @@ -const baseConfig = require('../../.prettierrc.js'); -module.exports = { - ...baseConfig, -}; diff --git a/examples/bare/.watchmanconfig b/examples/bare/.watchmanconfig deleted file mode 100644 index 0967ef42..00000000 --- a/examples/bare/.watchmanconfig +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/examples/bare/CHANGELOG.md b/examples/bare/CHANGELOG.md deleted file mode 100644 index f2597b51..00000000 --- a/examples/bare/CHANGELOG.md +++ /dev/null @@ -1,13 +0,0 @@ -# amaexample - -## 1.1.0 - -### Minor Changes - -- Added `` component example screens ([#272](https://github.com/FormidableLabs/react-native-ama/pull/272)) - -## 0.0.2 - -### Patch Changes - -- Ignoring eslint on babel ([#253](https://github.com/FormidableLabs/react-native-ama/pull/253)) diff --git a/examples/bare/Gemfile b/examples/bare/Gemfile deleted file mode 100644 index 676766e0..00000000 --- a/examples/bare/Gemfile +++ /dev/null @@ -1,9 +0,0 @@ -source 'https://rubygems.org' - -# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby ">= 2.6.10" - -# 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' \ No newline at end of file diff --git a/examples/bare/Gemfile.lock b/examples/bare/Gemfile.lock deleted file mode 100644 index 71ccde6e..00000000 --- a/examples/bare/Gemfile.lock +++ /dev/null @@ -1,100 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (3.0.6) - rexml - activesupport (6.1.7.6) - concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 1.6, < 2) - minitest (>= 5.1) - tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.5) - public_suffix (>= 2.0.2, < 6.0) - algoliasearch (1.27.5) - httpclient (~> 2.8, >= 2.8.3) - json (>= 1.5.1) - atomos (0.1.3) - claide (1.1.0) - cocoapods (1.12.1) - addressable (~> 2.8) - claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.1) - cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.6.0, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored2 (~> 3.1) - escape (~> 0.0.4) - fourflusher (>= 2.3.0, < 3.0) - gh_inspector (~> 1.0) - molinillo (~> 0.8.0) - nap (~> 1.0) - ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.1) - activesupport (>= 5.0, < 8) - addressable (~> 2.8) - algoliasearch (~> 1.0) - concurrent-ruby (~> 1.1) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - netrc (~> 0.11) - public_suffix (~> 4.0) - typhoeus (~> 1.0) - cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.1) - cocoapods-trunk (1.6.0) - nap (>= 0.8, < 2.0) - netrc (~> 0.11) - cocoapods-try (1.2.0) - colored2 (3.1.2) - concurrent-ruby (1.2.2) - escape (0.0.4) - ethon (0.16.0) - ffi (>= 1.15.0) - ffi (1.15.5) - fourflusher (2.3.1) - fuzzy_match (2.0.4) - gh_inspector (1.1.3) - httpclient (2.8.3) - i18n (1.14.1) - concurrent-ruby (~> 1.0) - json (2.6.3) - minitest (5.20.0) - molinillo (0.8.0) - nanaimo (0.3.0) - nap (1.1.0) - netrc (0.11.0) - public_suffix (4.0.7) - rexml (3.2.6) - ruby-macho (2.5.1) - typhoeus (1.4.0) - ethon (>= 0.9.0) - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) - xcodeproj (1.22.0) - CFPropertyList (>= 2.3.3, < 4.0) - atomos (~> 0.1.3) - claide (>= 1.0.2, < 2.0) - colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (~> 3.2.4) - zeitwerk (2.6.11) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (~> 1.12) - -RUBY VERSION - ruby 2.6.10p210 - -BUNDLED WITH - 1.17.2 diff --git a/examples/bare/README.md b/examples/bare/README.md deleted file mode 100644 index 0fd08a88..00000000 --- a/examples/bare/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Getting Started - -Before getting started, make sure you have installed _node_modules_ by running `yarn` from the root of the project, then come back here. - -> **Note**: Make sure you have completed the [React Native - Environment Setup](https://reactnative.dev/docs/environment-setup) instructions till "Creating a new application" step, before proceeding. - -## Step 1: Start the Metro Server - -First, you will need to start **Metro**, the JavaScript _bundler_ that ships _with_ React Native. - -To start Metro, run the following command from the _root_ of your React Native project: - -```bash -yarn start -``` - -## Step 2: Start your Application - -Let Metro Bundler run in its _own_ terminal. Open a _new_ terminal from the _root_ of your React Native project. Run the following command to start your _Android_ or _iOS_ app: - -### For Android - -```bash -yarn android -``` - -### For iOS - -```bash -yarn ios -``` - -If everything is set up _correctly_, you should see your new app running in your _Android Emulator_ or _iOS Simulator_ shortly provided you have set up your emulator/simulator correctly. - -This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively. diff --git a/examples/bare/__tests__/App.test.tsx b/examples/bare/__tests__/App.test.tsx deleted file mode 100644 index ef217ab4..00000000 --- a/examples/bare/__tests__/App.test.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @format - */ - -import 'react-native'; -import React from 'react'; -import App from '../App'; - -// Note: import explicitly to use the types shipped with jest. -import { it } from '@jest/globals'; - -// Note: test renderer must be required after react-native. -import renderer from 'react-test-renderer'; - -it('renders correctly', () => { - renderer.create(); -}); diff --git a/examples/bare/android/app/build.gradle b/examples/bare/android/app/build.gradle deleted file mode 100644 index 3fac518c..00000000 --- a/examples/bare/android/app/build.gradle +++ /dev/null @@ -1,119 +0,0 @@ -apply plugin: "com.android.application" -apply plugin: "org.jetbrains.kotlin.android" -apply plugin: "com.facebook.react" - -/** - * This is the configuration block to customize your React Native Android app. - * By default you don't need to apply any configuration, just uncomment the lines you need. - */ -react { - /* Folders */ - // The root of your project, i.e. where "package.json" lives. Default is '../..' - // root = file("../../") - // The folder where the react-native NPM package is. Default is ../../node_modules/react-native - reactNativeDir = file("../../../../node_modules/react-native") - // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen - codegenDir = file("../../../../node_modules/@react-native/codegen") - // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js - // cliFile = file("../../node_modules/react-native/cli.js") - - /* Variants */ - // The list of variants to that are debuggable. For those we're going to - // skip the bundling of the JS bundle and the assets. By default is just 'debug'. - // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. - // debuggableVariants = ["liteDebug", "prodDebug"] - - /* Bundling */ - // A list containing the node command and its flags. Default is just 'node'. - // nodeExecutableAndArgs = ["node"] - // - // The command to run when bundling. By default is 'bundle' - // bundleCommand = "ram-bundle" - // - // The path to the CLI configuration file. Default is empty. - // bundleConfig = file(../rn-cli.config.js) - // - // The name of the generated asset file containing your JS bundle - // bundleAssetName = "MyApplication.android.bundle" - // - // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' - // entryFile = file("../js/MyApplication.android.js") - // - // A list of extra flags to pass to the 'bundle' commands. - // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle - // extraPackagerArgs = [] - - /* Hermes Commands */ - // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" - // - // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" - // hermesFlags = ["-O", "-output-source-map"] - - /* Autolinking */ - autolinkLibrariesWithApp() -} - -/** - * Set this to true to Run Proguard on Release builds to minify the Java bytecode. - */ -def enableProguardInReleaseBuilds = false - -/** - * The preferred build flavor of JavaScriptCore (JSC) - * - * For example, to use the international variant, you can use: - * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` - * - * The international variant includes ICU i18n library and necessary data - * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that - * give correct results when using with locales other than en-US. Note that - * this variant is about 6MiB larger per architecture than default. - */ -def jscFlavor = 'org.webkit:android-jsc:+' - -android { - ndkVersion rootProject.ext.ndkVersion - buildToolsVersion rootProject.ext.buildToolsVersion - compileSdk rootProject.ext.compileSdkVersion - - namespace "com.example.rnama" - defaultConfig { - applicationId "com.example.rnama" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - } - signingConfigs { - debug { - storeFile file('debug.keystore') - storePassword 'android' - keyAlias 'androiddebugkey' - keyPassword 'android' - } - } - buildTypes { - debug { - signingConfig signingConfigs.debug - } - release { - // Caution! In production, you need to generate your own keystore file. - // see https://reactnative.dev/docs/signed-apk-android. - signingConfig signingConfigs.debug - minifyEnabled enableProguardInReleaseBuilds - proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" - } - } -} - -dependencies { - // The version of react-native is set by the React Native Gradle Plugin - implementation("com.facebook.react:react-android") - - if (hermesEnabled.toBoolean()) { - implementation("com.facebook.react:hermes-android") - } else { - implementation jscFlavor - } -} diff --git a/examples/bare/android/app/debug.keystore b/examples/bare/android/app/debug.keystore deleted file mode 100644 index 364e105e..00000000 Binary files a/examples/bare/android/app/debug.keystore and /dev/null differ diff --git a/examples/bare/android/app/proguard-rules.pro b/examples/bare/android/app/proguard-rules.pro deleted file mode 100644 index 11b02572..00000000 --- a/examples/bare/android/app/proguard-rules.pro +++ /dev/null @@ -1,10 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: diff --git a/examples/bare/android/app/src/debug/AndroidManifest.xml b/examples/bare/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index ced5aabf..00000000 --- a/examples/bare/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/examples/bare/android/app/src/main/AndroidManifest.xml b/examples/bare/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index e1892528..00000000 --- a/examples/bare/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - diff --git a/examples/bare/android/app/src/main/java/com/example/rnama/MainActivity.kt b/examples/bare/android/app/src/main/java/com/example/rnama/MainActivity.kt deleted file mode 100644 index b31e4228..00000000 --- a/examples/bare/android/app/src/main/java/com/example/rnama/MainActivity.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.example.rnama; - -// react-native-screens import -import android.os.Bundle - -import com.facebook.react.ReactActivity -import com.facebook.react.ReactActivityDelegate -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled -import com.facebook.react.defaults.DefaultReactActivityDelegate - -class MainActivity : ReactActivity() { - - /** - * Returns the name of the main component registered from JavaScript. This is used to schedule - * rendering of the component. - */ - override fun getMainComponentName(): String = "AMA Example" - - /** - * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] - * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] - */ - override fun createReactActivityDelegate(): ReactActivityDelegate = - DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) - - //react-native-screens override - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(null) - } -} \ No newline at end of file diff --git a/examples/bare/android/app/src/main/java/com/example/rnama/MainApplication.kt b/examples/bare/android/app/src/main/java/com/example/rnama/MainApplication.kt deleted file mode 100644 index 4cb6cc55..00000000 --- a/examples/bare/android/app/src/main/java/com/example/rnama/MainApplication.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.rnama - -import android.app.Application -import com.facebook.react.PackageList -import com.facebook.react.ReactApplication -import com.facebook.react.ReactHost -import com.facebook.react.ReactNativeHost -import com.facebook.react.ReactPackage -import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load -import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost -import com.facebook.react.defaults.DefaultReactNativeHost -import com.facebook.react.soloader.OpenSourceMergedSoMapping -import com.facebook.soloader.SoLoader - -class MainApplication : Application(), ReactApplication { - - override val reactNativeHost: ReactNativeHost = - object : DefaultReactNativeHost(this) { - override fun getPackages(): List = - PackageList(this).packages.apply { - // Packages that cannot be autolinked yet can be added manually here, for example: - // add(MyReactNativePackage()) - } - - override fun getJSMainModuleName(): String = "index" - - override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG - - override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED - override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED - } - - override val reactHost: ReactHost - get() = getDefaultReactHost(applicationContext, reactNativeHost) - - override fun onCreate() { - super.onCreate() - SoLoader.init(this, OpenSourceMergedSoMapping) - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // If you opted-in for the New Architecture, we load the native entry point for this app. - load() - } - } -} \ No newline at end of file diff --git a/examples/bare/android/app/src/main/res/drawable/rn_edit_text_material.xml b/examples/bare/android/app/src/main/res/drawable/rn_edit_text_material.xml deleted file mode 100644 index 5c25e728..00000000 --- a/examples/bare/android/app/src/main/res/drawable/rn_edit_text_material.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - diff --git a/examples/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 6cde17ab..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ded7aabf6a56b694e486e096efd89e2f0c9067d292b634663898e352c9491f10 -size 3056 diff --git a/examples/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/examples/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 08863165..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21304a0c9b00da6a72cfa31c7229c9528fc17b6e5eb4e68a969bce08c01a2fee -size 5024 diff --git a/examples/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 3b1c1d23..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eef20f25fb1477d8c9df15757e764811cc503fb0777f18d0f7fb2d19178b5bf6 -size 2096 diff --git a/examples/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/examples/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 33487015..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:520d05f978a15ba0ccf23006a1a5691a054a02478c70cafc5ebafae76e600f0d -size 2858 diff --git a/examples/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 65f75b81..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e77c5045bfdb6f4bbe955b3a793bfed3baa369ce4811ae2a9103d5480637cfff -size 4569 diff --git a/examples/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/examples/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 9e16d22d..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2846e1a703e519791fe22f41bcb243b82f908d12e5ebcb43f020ddf9982780b0 -size 7098 diff --git a/examples/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index fcd544e4..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3a34b13632e0cb3b1c0f4273035866cbe81b1b17b7178ce29d19c78d394a5e -size 6464 diff --git a/examples/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/examples/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index f50c62c7..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:363a569beb72e8b007bf046454612148d4c9f782b9391352059fe83179f18e30 -size 10676 diff --git a/examples/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 8d80ab4a..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ff27328b6916b7f75b99ef36153f154bb4724946e5654635cba2e257352c69f -size 9250 diff --git a/examples/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/examples/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index fc01724b..00000000 --- a/examples/bare/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bacd97a1b41e4413c6092cdbd83f65112a9124e823cfaa3a219c65e2761647b -size 15523 diff --git a/examples/bare/android/app/src/main/res/values/strings.xml b/examples/bare/android/app/src/main/res/values/strings.xml deleted file mode 100644 index a92a83b0..00000000 --- a/examples/bare/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - AMA Example - diff --git a/examples/bare/android/app/src/main/res/values/styles.xml b/examples/bare/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 7ba83a2a..00000000 --- a/examples/bare/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/examples/bare/android/build.gradle b/examples/bare/android/build.gradle deleted file mode 100644 index 15221462..00000000 --- a/examples/bare/android/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -buildscript { - ext { - buildToolsVersion = "35.0.0" - minSdkVersion = 24 - compileSdkVersion = 35 - targetSdkVersion = 34 - ndkVersion = "26.1.10909125" - kotlinVersion = "1.9.24" - } - repositories { - google() - mavenCentral() - } - dependencies { - classpath("com.android.tools.build:gradle") - classpath("com.facebook.react:react-native-gradle-plugin") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") - } -} - -apply plugin: "com.facebook.react.rootproject" \ No newline at end of file diff --git a/examples/bare/android/gradle.properties b/examples/bare/android/gradle.properties deleted file mode 100644 index 5e24e3aa..00000000 --- a/examples/bare/android/gradle.properties +++ /dev/null @@ -1,39 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true - -# Use this property to specify which architecture you want to build. -# You can also override it from the CLI using -# ./gradlew -PreactNativeArchitectures=x86_64 -reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 - -# Use this property to enable support to the new architecture. -# This will allow you to use TurboModules and the Fabric render in -# your application. You should enable this flag either if you want -# to write custom TurboModules/Fabric components OR use libraries that -# are providing them. -newArchEnabled=true - -# Use this property to enable or disable the Hermes JS engine. -# If set to false, you will be using JSC instead. -hermesEnabled=true diff --git a/examples/bare/android/gradle/wrapper/gradle-wrapper.jar b/examples/bare/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b95..00000000 Binary files a/examples/bare/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/examples/bare/android/gradle/wrapper/gradle-wrapper.properties b/examples/bare/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index c0cb293e..00000000 --- a/examples/bare/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file diff --git a/examples/bare/android/gradlew b/examples/bare/android/gradlew deleted file mode 100755 index b26d4110..00000000 --- a/examples/bare/android/gradlew +++ /dev/null @@ -1,252 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/examples/bare/android/gradlew.bat b/examples/bare/android/gradlew.bat deleted file mode 100644 index 9b42019c..00000000 --- a/examples/bare/android/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/examples/bare/android/settings.gradle b/examples/bare/android/settings.gradle deleted file mode 100644 index 0a0ea9c3..00000000 --- a/examples/bare/android/settings.gradle +++ /dev/null @@ -1,6 +0,0 @@ -pluginManagement { includeBuild("../../../node_modules/@react-native/gradle-plugin") } -plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } -rootProject.name = 'AMA Example' -include ':app' -includeBuild('../../../node_modules/@react-native/gradle-plugin') diff --git a/examples/bare/app.json b/examples/bare/app.json deleted file mode 100644 index 392ee8c1..00000000 --- a/examples/bare/app.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "AMA Example", - "displayName": "AMA Example" -} diff --git a/examples/bare/babel.config.js b/examples/bare/babel.config.js deleted file mode 100644 index a430c7f9..00000000 --- a/examples/bare/babel.config.js +++ /dev/null @@ -1,7 +0,0 @@ -// eslint-disable-next-line -module.exports = { - presets: ['module:@react-native/babel-preset'], - plugins: [ - 'react-native-reanimated/plugin', // reanimated plugin must be listed last - ], -}; diff --git a/examples/bare/index.js b/examples/bare/index.js deleted file mode 100644 index ebf66c0f..00000000 --- a/examples/bare/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import 'react-native-gesture-handler'; - -import { AppRegistry } from 'react-native'; - -import { name as appName } from './app.json'; -import App from './src/App'; - -AppRegistry.registerComponent(appName, () => App); diff --git a/examples/bare/ios/.xcode.env b/examples/bare/ios/.xcode.env deleted file mode 100644 index 3d5782c7..00000000 --- a/examples/bare/ios/.xcode.env +++ /dev/null @@ -1,11 +0,0 @@ -# This `.xcode.env` file is versioned and is used to source the environment -# used when running script phases inside Xcode. -# To customize your local environment, you can create an `.xcode.env.local` -# file that is not versioned. - -# NODE_BINARY variable contains the PATH to the node executable. -# -# Customize the NODE_BINARY variable here. -# For example, to use nvm with brew, add the following line -# . "$(brew --prefix nvm)/nvm.sh" --no-use -export NODE_BINARY=$(command -v node) diff --git a/examples/bare/ios/AMAExample.xcodeproj/project.pbxproj b/examples/bare/ios/AMAExample.xcodeproj/project.pbxproj deleted file mode 100644 index 34c3428e..00000000 --- a/examples/bare/ios/AMAExample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,719 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 00E356F31AD99517003FC87E /* AMAExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* AMAExampleTests.m */; }; - 0C80B921A6F3F58F76C31292 /* libPods-AMAExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-AMAExample.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 7699B88040F8A987B510C191 /* libPods-AMAExample-AMAExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-AMAExample-AMAExampleTests.a */; }; - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; - E40C58A134BE2E9DBA4A5A66 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3BE1C7BC2CD5DD090025DC5C /* PrivacyInfo.xcprivacy */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = AMAExample; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 00E356EE1AD99517003FC87E /* AMAExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AMAExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* AMAExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AMAExampleTests.m; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* AMAExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AMAExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = AMAExample/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = AMAExample/AppDelegate.mm; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AMAExample/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = AMAExample/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = AMAExample/main.m; sourceTree = ""; }; - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-AMAExample-AMAExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AMAExample-AMAExampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B4392A12AC88292D35C810B /* Pods-AMAExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AMAExample.debug.xcconfig"; path = "Target Support Files/Pods-AMAExample/Pods-AMAExample.debug.xcconfig"; sourceTree = ""; }; - 3BE1C7BC2CD5DD090025DC5C /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = AMAExample/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 5709B34CF0A7D63546082F79 /* Pods-AMAExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AMAExample.release.xcconfig"; path = "Target Support Files/Pods-AMAExample/Pods-AMAExample.release.xcconfig"; sourceTree = ""; }; - 5B7EB9410499542E8C5724F5 /* Pods-AMAExample-AMAExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AMAExample-AMAExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests.debug.xcconfig"; sourceTree = ""; }; - 5DCACB8F33CDC322A6C60F78 /* libPods-AMAExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AMAExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = AMAExample/LaunchScreen.storyboard; sourceTree = ""; }; - 89C6BE57DB24E9ADA2F236DE /* Pods-AMAExample-AMAExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AMAExample-AMAExampleTests.release.xcconfig"; path = "Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests.release.xcconfig"; sourceTree = ""; }; - ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7699B88040F8A987B510C191 /* libPods-AMAExample-AMAExampleTests.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0C80B921A6F3F58F76C31292 /* libPods-AMAExample.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00E356EF1AD99517003FC87E /* AMAExampleTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* AMAExampleTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = AMAExampleTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* AMAExample */ = { - isa = PBXGroup; - children = ( - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.mm */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, - 13B07FB71A68108700A75B9A /* main.m */, - 3BE1C7BC2CD5DD090025DC5C /* PrivacyInfo.xcprivacy */, - ); - name = AMAExample; - sourceTree = ""; - }; - 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { - isa = PBXGroup; - children = ( - ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 5DCACB8F33CDC322A6C60F78 /* libPods-AMAExample.a */, - 19F6CBCC0A4E27FBF8BF4A61 /* libPods-AMAExample-AMAExampleTests.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = Libraries; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* AMAExample */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* AMAExampleTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 2D16E6871FA4F8E400B85C8A /* Frameworks */, - BBD78D7AC51CEA395F1C20DB /* Pods */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* AMAExample.app */, - 00E356EE1AD99517003FC87E /* AMAExampleTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - BBD78D7AC51CEA395F1C20DB /* Pods */ = { - isa = PBXGroup; - children = ( - 3B4392A12AC88292D35C810B /* Pods-AMAExample.debug.xcconfig */, - 5709B34CF0A7D63546082F79 /* Pods-AMAExample.release.xcconfig */, - 5B7EB9410499542E8C5724F5 /* Pods-AMAExample-AMAExampleTests.debug.xcconfig */, - 89C6BE57DB24E9ADA2F236DE /* Pods-AMAExample-AMAExampleTests.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* AMAExampleTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AMAExampleTests" */; - buildPhases = ( - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = AMAExampleTests; - productName = AMAExampleTests; - productReference = 00E356EE1AD99517003FC87E /* AMAExampleTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* AMAExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AMAExample" */; - buildPhases = ( - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = AMAExample; - productName = AMAExample; - productReference = 13B07F961A680F5B00A75B9A /* AMAExample.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1210; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 13B07F861A680F5B00A75B9A = { - LastSwiftMigration = 1120; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AMAExample" */; - compatibilityVersion = "Xcode 12.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* AMAExample */, - 00E356ED1AD99517003FC87E /* AMAExampleTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - E40C58A134BE2E9DBA4A5A66 /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "$(SRCROOT)/.xcode.env.local", - "$(SRCROOT)/.xcode.env", - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; - }; - 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample/Pods-AMAExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample/Pods-AMAExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AMAExample/Pods-AMAExample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-AMAExample-AMAExampleTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-AMAExample-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample/Pods-AMAExample-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample/Pods-AMAExample-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AMAExample/Pods-AMAExample-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AMAExample-AMAExampleTests/Pods-AMAExample-AMAExampleTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* AMAExampleTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* AMAExample */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-AMAExample-AMAExampleTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = AMAExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.rnama; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AMAExample.app/AMAExample"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-AMAExample-AMAExampleTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - INFOPLIST_FILE = AMAExampleTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - "$(inherited)", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.rnama; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AMAExample.app/AMAExample"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-AMAExample.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = AMAExample/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "AMA Example"; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.rnama; - PRODUCT_NAME = AMAExample; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-AMAExample.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = AMAExample/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "AMA Example"; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.rnama; - PRODUCT_NAME = AMAExample; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CC = ""; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CXX = ""; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD = ""; - LDPLUSPLUS = ""; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = ( - "\"$(SDKROOT)/usr/lib/swift\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "$(inherited)"; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DFOLLY_NO_CONFIG", - "-DFOLLY_MOBILE=1", - "-DFOLLY_USE_LIBCPP=1", - "-DFOLLY_CFG_NO_COROUTINES=1", - "-DFOLLY_HAVE_CLOCK_GETTIME=1", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; - USE_HERMES = true; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CC = ""; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "c++20"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - CXX = ""; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD = ""; - LDPLUSPLUS = ""; - LD_RUNPATH_SEARCH_PATHS = ( - /usr/lib/swift, - "$(inherited)", - ); - LIBRARY_SEARCH_PATHS = ( - "\"$(SDKROOT)/usr/lib/swift\"", - "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", - "\"$(inherited)\"", - ); - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = "$(inherited)"; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DFOLLY_NO_CONFIG", - "-DFOLLY_MOBILE=1", - "-DFOLLY_USE_LIBCPP=1", - "-DFOLLY_CFG_NO_COROUTINES=1", - "-DFOLLY_HAVE_CLOCK_GETTIME=1", - ); - OTHER_LDFLAGS = ( - "$(inherited)", - " ", - ); - REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native"; - SDKROOT = iphoneos; - USE_HERMES = true; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AMAExampleTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AMAExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AMAExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/examples/bare/ios/AMAExample.xcodeproj/xcshareddata/xcschemes/AMAExample.xcscheme b/examples/bare/ios/AMAExample.xcodeproj/xcshareddata/xcschemes/AMAExample.xcscheme deleted file mode 100644 index 4c6374b3..00000000 --- a/examples/bare/ios/AMAExample.xcodeproj/xcshareddata/xcschemes/AMAExample.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/bare/ios/AMAExample.xcworkspace/contents.xcworkspacedata b/examples/bare/ios/AMAExample.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index b2d8cdfe..00000000 --- a/examples/bare/ios/AMAExample.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/examples/bare/ios/AMAExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/bare/ios/AMAExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/examples/bare/ios/AMAExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/examples/bare/ios/AMAExample/AppDelegate.h b/examples/bare/ios/AMAExample/AppDelegate.h deleted file mode 100644 index 5d280825..00000000 --- a/examples/bare/ios/AMAExample/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : RCTAppDelegate - -@end diff --git a/examples/bare/ios/AMAExample/AppDelegate.mm b/examples/bare/ios/AMAExample/AppDelegate.mm deleted file mode 100644 index 914715ec..00000000 --- a/examples/bare/ios/AMAExample/AppDelegate.mm +++ /dev/null @@ -1,31 +0,0 @@ -#import "AppDelegate.h" - -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.moduleName = @"AMA Example"; - // You can add your custom initial props in the dictionary below. - // They will be passed down to the ViewController used by React Native. - self.initialProps = @{}; - - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge -{ - return [self bundleURL]; -} - -- (NSURL *)bundleURL -{ -#if DEBUG - return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; -#else - return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; -#endif -} - -@end diff --git a/examples/bare/ios/AMAExample/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/bare/ios/AMAExample/Images.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 81213230..00000000 --- a/examples/bare/ios/AMAExample/Images.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/examples/bare/ios/AMAExample/Images.xcassets/Contents.json b/examples/bare/ios/AMAExample/Images.xcassets/Contents.json deleted file mode 100644 index 2d92bd53..00000000 --- a/examples/bare/ios/AMAExample/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/examples/bare/ios/AMAExample/Info.plist b/examples/bare/ios/AMAExample/Info.plist deleted file mode 100644 index f7bda597..00000000 --- a/examples/bare/ios/AMAExample/Info.plist +++ /dev/null @@ -1,52 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - AMA Example - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSRequiresIPhoneOS - - NSAppTransportSecurity - - - NSAllowsArbitraryLoads - - NSAllowsLocalNetworking - - - NSLocationWhenInUseUsageDescription - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/bare/ios/AMAExample/LaunchScreen.storyboard b/examples/bare/ios/AMAExample/LaunchScreen.storyboard deleted file mode 100644 index 3fbf9752..00000000 --- a/examples/bare/ios/AMAExample/LaunchScreen.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/bare/ios/AMAExample/PrivacyInfo.xcprivacy b/examples/bare/ios/AMAExample/PrivacyInfo.xcprivacy deleted file mode 100644 index 41b8317f..00000000 --- a/examples/bare/ios/AMAExample/PrivacyInfo.xcprivacy +++ /dev/null @@ -1,37 +0,0 @@ - - - - - NSPrivacyAccessedAPITypes - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryFileTimestamp - NSPrivacyAccessedAPITypeReasons - - C617.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategoryUserDefaults - NSPrivacyAccessedAPITypeReasons - - CA92.1 - - - - NSPrivacyAccessedAPIType - NSPrivacyAccessedAPICategorySystemBootTime - NSPrivacyAccessedAPITypeReasons - - 35F9.1 - - - - NSPrivacyCollectedDataTypes - - NSPrivacyTracking - - - diff --git a/examples/bare/ios/AMAExample/main.m b/examples/bare/ios/AMAExample/main.m deleted file mode 100644 index d645c724..00000000 --- a/examples/bare/ios/AMAExample/main.m +++ /dev/null @@ -1,10 +0,0 @@ -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/examples/bare/ios/AMAExampleTests/AMAExampleTests.m b/examples/bare/ios/AMAExampleTests/AMAExampleTests.m deleted file mode 100644 index 41edf552..00000000 --- a/examples/bare/ios/AMAExampleTests/AMAExampleTests.m +++ /dev/null @@ -1,66 +0,0 @@ -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React" - -@interface AMAExampleTests : XCTestCase - -@end - -@implementation AMAExampleTests - -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test -{ - if (test(view)) { - return YES; - } - for (UIView *subview in [view subviews]) { - if ([self findSubviewInView:subview matching:test]) { - return YES; - } - } - return NO; -} - -- (void)testRendersWelcomeScreen -{ - UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; -#ifdef DEBUG - RCTSetLogFunction( - ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); -#endif - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view - matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - -#ifdef DEBUG - RCTSetLogFunction(RCTDefaultLogFunction); -#endif - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - -@end diff --git a/examples/bare/ios/AMAExampleTests/Info.plist b/examples/bare/ios/AMAExampleTests/Info.plist deleted file mode 100644 index ba72822e..00000000 --- a/examples/bare/ios/AMAExampleTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/examples/bare/ios/Podfile b/examples/bare/ios/Podfile deleted file mode 100644 index 785767ba..00000000 --- a/examples/bare/ios/Podfile +++ /dev/null @@ -1,40 +0,0 @@ -# Resolve react_native_pods.rb with node to allow for hoisting -require Pod::Executable.execute_command('node', ['-p', - 'require.resolve( - "react-native/scripts/react_native_pods.rb", - {paths: [process.argv[1]]}, - )', __dir__]).strip - -platform :ios, min_ios_version_supported -prepare_react_native_project! - -linkage = ENV['USE_FRAMEWORKS'] -if linkage != nil - Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green - use_frameworks! :linkage => linkage.to_sym -end - -target 'AMAExample' do - config = use_native_modules! - - use_react_native!( - :path => config[:reactNativePath], - # An absolute path to your application root. - :app_path => "#{Pod::Config.instance.installation_root}/.." - ) - - target 'AMAExampleTests' do - inherit! :complete - # Pods for testing - end - - post_install do |installer| - # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 - react_native_post_install( - installer, - config[:reactNativePath], - :mac_catalyst_enabled => false, - # :ccache_enabled => true - ) - end -end diff --git a/examples/bare/ios/Podfile.lock b/examples/bare/ios/Podfile.lock deleted file mode 100644 index cf5e7e87..00000000 --- a/examples/bare/ios/Podfile.lock +++ /dev/null @@ -1,2065 +0,0 @@ -PODS: - - boost (1.84.0) - - DoubleConversion (1.1.6) - - FBLazyVector (0.76.2) - - fmt (9.1.0) - - glog (0.3.5) - - hermes-engine (0.76.2): - - hermes-engine/Pre-built (= 0.76.2) - - hermes-engine/Pre-built (0.76.2) - - RCT-Folly (2024.01.01.00): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCT-Folly/Default (= 2024.01.01.00) - - RCT-Folly/Default (2024.01.01.00): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCT-Folly/Fabric (2024.01.01.00): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCTDeprecation (0.76.2) - - RCTRequired (0.76.2) - - RCTTypeSafety (0.76.2): - - FBLazyVector (= 0.76.2) - - RCTRequired (= 0.76.2) - - React-Core (= 0.76.2) - - React (0.76.2): - - React-Core (= 0.76.2) - - React-Core/DevSupport (= 0.76.2) - - React-Core/RCTWebSocket (= 0.76.2) - - React-RCTActionSheet (= 0.76.2) - - React-RCTAnimation (= 0.76.2) - - React-RCTBlob (= 0.76.2) - - React-RCTImage (= 0.76.2) - - React-RCTLinking (= 0.76.2) - - React-RCTNetwork (= 0.76.2) - - React-RCTSettings (= 0.76.2) - - React-RCTText (= 0.76.2) - - React-RCTVibration (= 0.76.2) - - React-callinvoker (0.76.2) - - React-Core (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default (= 0.76.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/CoreModulesHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/Default (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/DevSupport (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default (= 0.76.2) - - React-Core/RCTWebSocket (= 0.76.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTActionSheetHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTAnimationHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTBlobHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTImageHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTLinkingHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTNetworkHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTSettingsHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTTextHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTVibrationHeaders (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-Core/RCTWebSocket (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTDeprecation - - React-Core/Default (= 0.76.2) - - React-cxxreact - - React-featureflags - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-perflogger - - React-runtimescheduler - - React-utils - - SocketRocket (= 0.7.1) - - Yoga - - React-CoreModules (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety (= 0.76.2) - - React-Core/CoreModulesHeaders (= 0.76.2) - - React-jsi (= 0.76.2) - - React-jsinspector - - React-NativeModulesApple - - React-RCTBlob - - React-RCTImage (= 0.76.2) - - ReactCodegen - - ReactCommon - - SocketRocket (= 0.7.1) - - React-cxxreact (0.76.2): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-debug (= 0.76.2) - - React-jsi (= 0.76.2) - - React-jsinspector - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - React-runtimeexecutor (= 0.76.2) - - React-timing (= 0.76.2) - - React-debug (0.76.2) - - React-defaultsnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-domnativemodule - - React-Fabric - - React-featureflags - - React-featureflagsnativemodule - - React-graphics - - React-idlecallbacksnativemodule - - React-ImageManager - - React-microtasksnativemodule - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-domnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricComponents - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/animations (= 0.76.2) - - React-Fabric/attributedstring (= 0.76.2) - - React-Fabric/componentregistry (= 0.76.2) - - React-Fabric/componentregistrynative (= 0.76.2) - - React-Fabric/components (= 0.76.2) - - React-Fabric/core (= 0.76.2) - - React-Fabric/dom (= 0.76.2) - - React-Fabric/imagemanager (= 0.76.2) - - React-Fabric/leakchecker (= 0.76.2) - - React-Fabric/mounting (= 0.76.2) - - React-Fabric/observers (= 0.76.2) - - React-Fabric/scheduler (= 0.76.2) - - React-Fabric/telemetry (= 0.76.2) - - React-Fabric/templateprocessor (= 0.76.2) - - React-Fabric/uimanager (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/animations (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/attributedstring (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistry (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/componentregistrynative (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/components/legacyviewmanagerinterop (= 0.76.2) - - React-Fabric/components/root (= 0.76.2) - - React-Fabric/components/view (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/legacyviewmanagerinterop (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/root (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/components/view (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - Yoga - - React-Fabric/core (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/dom (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/imagemanager (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/leakchecker (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/mounting (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/observers/events (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/scheduler (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/observers/events - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-performancetimeline - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/telemetry (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/templateprocessor (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric/uimanager/consistency (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-Fabric/uimanager/consistency (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCommon/turbomodule/core - - React-FabricComponents (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components (= 0.76.2) - - React-FabricComponents/textlayoutmanager (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-FabricComponents/components/inputaccessory (= 0.76.2) - - React-FabricComponents/components/iostextinput (= 0.76.2) - - React-FabricComponents/components/modal (= 0.76.2) - - React-FabricComponents/components/rncore (= 0.76.2) - - React-FabricComponents/components/safeareaview (= 0.76.2) - - React-FabricComponents/components/scrollview (= 0.76.2) - - React-FabricComponents/components/text (= 0.76.2) - - React-FabricComponents/components/textinput (= 0.76.2) - - React-FabricComponents/components/unimplementedview (= 0.76.2) - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/inputaccessory (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/iostextinput (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/modal (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/rncore (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/safeareaview (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/scrollview (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/text (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/textinput (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/components/unimplementedview (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricComponents/textlayoutmanager (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-cxxreact - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-logger - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/core - - Yoga - - React-FabricImage (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - RCTRequired (= 0.76.2) - - RCTTypeSafety (= 0.76.2) - - React-Fabric - - React-graphics - - React-ImageManager - - React-jsi - - React-jsiexecutor (= 0.76.2) - - React-logger - - React-rendererdebug - - React-utils - - ReactCommon - - Yoga - - React-featureflags (0.76.2) - - React-featureflagsnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-graphics (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-jsi - - React-jsiexecutor - - React-utils - - React-hermes (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.76.2) - - React-jsi - - React-jsiexecutor (= 0.76.2) - - React-jsinspector - - React-perflogger (= 0.76.2) - - React-runtimeexecutor - - React-idlecallbacksnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-ImageManager (0.76.2): - - glog - - RCT-Folly/Fabric - - React-Core/Default - - React-debug - - React-Fabric - - React-graphics - - React-rendererdebug - - React-utils - - React-jserrorhandler (0.76.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-cxxreact - - React-debug - - React-jsi - - React-jsi (0.76.2): - - boost - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-jsiexecutor (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-cxxreact (= 0.76.2) - - React-jsi (= 0.76.2) - - React-jsinspector - - React-perflogger (= 0.76.2) - - React-jsinspector (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-featureflags - - React-jsi - - React-perflogger (= 0.76.2) - - React-runtimeexecutor (= 0.76.2) - - React-jsitracing (0.76.2): - - React-jsi - - React-logger (0.76.2): - - glog - - React-Mapbuffer (0.76.2): - - glog - - React-debug - - React-microtasksnativemodule (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-safe-area-context (4.14.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - react-native-safe-area-context/common (= 4.14.0) - - react-native-safe-area-context/fabric (= 4.14.0) - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-safe-area-context/common (4.14.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - react-native-safe-area-context/fabric (4.14.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - react-native-safe-area-context/common - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - React-nativeconfig (0.76.2) - - React-NativeModulesApple (0.76.2): - - glog - - hermes-engine - - React-callinvoker - - React-Core - - React-cxxreact - - React-jsi - - React-jsinspector - - React-runtimeexecutor - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - React-perflogger (0.76.2): - - DoubleConversion - - RCT-Folly (= 2024.01.01.00) - - React-performancetimeline (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - React-cxxreact - - React-timing - - React-RCTActionSheet (0.76.2): - - React-Core/RCTActionSheetHeaders (= 0.76.2) - - React-RCTAnimation (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTAnimationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-RCTAppDelegate (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-CoreModules - - React-debug - - React-defaultsnativemodule - - React-Fabric - - React-featureflags - - React-graphics - - React-hermes - - React-nativeconfig - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-RCTNetwork - - React-rendererdebug - - React-RuntimeApple - - React-RuntimeCore - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - ReactCodegen - - ReactCommon - - React-RCTBlob (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-Core/RCTBlobHeaders - - React-Core/RCTWebSocket - - React-jsi - - React-jsinspector - - React-NativeModulesApple - - React-RCTNetwork - - ReactCodegen - - ReactCommon - - React-RCTFabric (0.76.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-Core - - React-debug - - React-Fabric - - React-FabricComponents - - React-FabricImage - - React-featureflags - - React-graphics - - React-ImageManager - - React-jsi - - React-jsinspector - - React-nativeconfig - - React-performancetimeline - - React-RCTImage - - React-RCTText - - React-rendererconsistency - - React-rendererdebug - - React-runtimescheduler - - React-utils - - Yoga - - React-RCTImage (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTImageHeaders - - React-jsi - - React-NativeModulesApple - - React-RCTNetwork - - ReactCodegen - - ReactCommon - - React-RCTLinking (0.76.2): - - React-Core/RCTLinkingHeaders (= 0.76.2) - - React-jsi (= 0.76.2) - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - ReactCommon/turbomodule/core (= 0.76.2) - - React-RCTNetwork (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTNetworkHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-RCTSettings (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - RCTTypeSafety - - React-Core/RCTSettingsHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-RCTText (0.76.2): - - React-Core/RCTTextHeaders (= 0.76.2) - - Yoga - - React-RCTVibration (0.76.2): - - RCT-Folly (= 2024.01.01.00) - - React-Core/RCTVibrationHeaders - - React-jsi - - React-NativeModulesApple - - ReactCodegen - - ReactCommon - - React-rendererconsistency (0.76.2) - - React-rendererdebug (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - RCT-Folly (= 2024.01.01.00) - - React-debug - - React-rncore (0.76.2) - - React-RuntimeApple (0.76.2): - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-callinvoker - - React-Core/Default - - React-CoreModules - - React-cxxreact - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-Mapbuffer - - React-NativeModulesApple - - React-RCTFabric - - React-RuntimeCore - - React-runtimeexecutor - - React-RuntimeHermes - - React-runtimescheduler - - React-utils - - React-RuntimeCore (0.76.2): - - glog - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-cxxreact - - React-featureflags - - React-jserrorhandler - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-performancetimeline - - React-runtimeexecutor - - React-runtimescheduler - - React-utils - - React-runtimeexecutor (0.76.2): - - React-jsi (= 0.76.2) - - React-RuntimeHermes (0.76.2): - - hermes-engine - - RCT-Folly/Fabric (= 2024.01.01.00) - - React-featureflags - - React-hermes - - React-jsi - - React-jsinspector - - React-jsitracing - - React-nativeconfig - - React-RuntimeCore - - React-utils - - React-runtimescheduler (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker - - React-cxxreact - - React-debug - - React-featureflags - - React-jsi - - React-performancetimeline - - React-rendererconsistency - - React-rendererdebug - - React-runtimeexecutor - - React-timing - - React-utils - - React-timing (0.76.2) - - React-utils (0.76.2): - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-debug - - React-jsi (= 0.76.2) - - ReactCodegen (0.76.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-FabricImage - - React-featureflags - - React-graphics - - React-jsi - - React-jsiexecutor - - React-NativeModulesApple - - React-rendererdebug - - React-utils - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - ReactCommon (0.76.2): - - ReactCommon/turbomodule (= 0.76.2) - - ReactCommon/turbomodule (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-cxxreact (= 0.76.2) - - React-jsi (= 0.76.2) - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - ReactCommon/turbomodule/bridging (= 0.76.2) - - ReactCommon/turbomodule/core (= 0.76.2) - - ReactCommon/turbomodule/bridging (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-cxxreact (= 0.76.2) - - React-jsi (= 0.76.2) - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - ReactCommon/turbomodule/core (0.76.2): - - DoubleConversion - - fmt (= 9.1.0) - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - React-callinvoker (= 0.76.2) - - React-cxxreact (= 0.76.2) - - React-debug (= 0.76.2) - - React-featureflags (= 0.76.2) - - React-jsi (= 0.76.2) - - React-logger (= 0.76.2) - - React-perflogger (= 0.76.2) - - React-utils (= 0.76.2) - - RNGestureHandler (2.21.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNReanimated (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/reanimated (= 3.16.2) - - RNReanimated/worklets (= 3.16.2) - - Yoga - - RNReanimated/reanimated (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNReanimated/reanimated/apple (= 3.16.2) - - Yoga - - RNReanimated/reanimated/apple (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNReanimated/worklets (3.16.2): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNScreens (3.35.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNScreens/common (= 3.35.0) - - Yoga - - RNScreens/common (3.35.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-RCTImage - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - RNSVG (15.9.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - RNSVG/common (= 15.9.0) - - Yoga - - RNSVG/common (15.9.0): - - DoubleConversion - - glog - - hermes-engine - - RCT-Folly (= 2024.01.01.00) - - RCTRequired - - RCTTypeSafety - - React-Core - - React-debug - - React-Fabric - - React-featureflags - - React-graphics - - React-ImageManager - - React-NativeModulesApple - - React-RCTFabric - - React-rendererdebug - - React-utils - - ReactCodegen - - ReactCommon/turbomodule/bridging - - ReactCommon/turbomodule/core - - Yoga - - SocketRocket (0.7.1) - - 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`) - - 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-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-nativeconfig (from `../../../node_modules/react-native/ReactCommon`) - - React-NativeModulesApple (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - - 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-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-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-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`) - - ReactCodegen (from `build/generated/ios`) - - ReactCommon/turbomodule/core (from `../../../node_modules/react-native/ReactCommon`) - - RNGestureHandler (from `../../../node_modules/react-native-gesture-handler`) - - RNReanimated (from `../../../node_modules/react-native-reanimated`) - - RNScreens (from `../../../node_modules/react-native-screens`) - - RNSVG (from `../../../node_modules/react-native-svg`) - - Yoga (from `../../../node_modules/react-native/ReactCommon/yoga`) - -SPEC REPOS: - trunk: - - SocketRocket - -EXTERNAL SOURCES: - boost: - :podspec: "../../../node_modules/react-native/third-party-podspecs/boost.podspec" - DoubleConversion: - :podspec: "../../../node_modules/react-native/third-party-podspecs/DoubleConversion.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-2024-11-12-RNv0.76.2-5b4aa20c719830dcf5684832b89a6edb95ac3d64 - 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-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-nativeconfig: - :path: "../../../node_modules/react-native/ReactCommon" - React-NativeModulesApple: - :path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" - 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-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-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-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" - ReactCodegen: - :path: build/generated/ios - ReactCommon: - :path: "../../../node_modules/react-native/ReactCommon" - RNGestureHandler: - :path: "../../../node_modules/react-native-gesture-handler" - RNReanimated: - :path: "../../../node_modules/react-native-reanimated" - RNScreens: - :path: "../../../node_modules/react-native-screens" - RNSVG: - :path: "../../../node_modules/react-native-svg" - Yoga: - :path: "../../../node_modules/react-native/ReactCommon/yoga" - -SPEC CHECKSUMS: - boost: 4cb898d0bf20404aab1850c656dcea009429d6c1 - DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 - FBLazyVector: bc70dcb22ad30ce734a7cce7210791dc737e230f - fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 - glog: 69ef571f3de08433d766d614c73a9838a06bf7eb - hermes-engine: 3852e37f6158a2fcfad23e31215ed495da3a6a40 - RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 - RCTDeprecation: d575d28132f93e5deef4849d5afffb4ac4e63226 - RCTRequired: e2e5df1df76aac8685aabfebca389e6bec64792b - RCTTypeSafety: 30e36ceafa26979860e13fb3f234fb61692924c2 - React: 10ad41b51f981992714011b6a4e081234c28dc2e - React-callinvoker: 58b51494f8b2cca07a27fc6f69273239c30a1e70 - React-Core: 54860c16fb5873a6f00dd44d8979bbb648b34c7c - React-CoreModules: 443101f113a7b5d51b93e061574dcadf7850f8cc - React-cxxreact: 5407ecb854a755de34c0e6b03965d3a51c28c933 - React-debug: 252c723eb205cc508aa9690a16dff46293c30ed8 - React-defaultsnativemodule: 1fb982daba4ac5bb3052ae262a919a0d117f3b1b - React-domnativemodule: 914401fb13804b7828020d7b3a89afa72ff22564 - React-Fabric: 58696d9eaee305bb5a5af26071966dcfb941f9eb - React-FabricComponents: a037b977430eceae4bac539934497bacc8de3971 - React-FabricImage: 2658c3e383195f69e7c83e4f75519bee17c3169a - React-featureflags: 7dc483869b3a940dcd92c7942c5e3492ad6afe68 - React-featureflagsnativemodule: 7a50dda8a6d3883139c47b4bda797156737240db - React-graphics: 066863eb87b142f0603fed08c71bac452238ac3e - React-hermes: 8f31f252aff98a4cb711ccf6644cccfe35d8edd1 - React-idlecallbacksnativemodule: c3f68fe97e379c4c1b6c4ba25e5d450cbe931e25 - React-ImageManager: 36240f8ab7181551574ca443da507272dbbf7014 - React-jserrorhandler: 1aa045c492222751dc476bcb973f787e82f952b9 - React-jsi: b96853ac12c1dab5fe3ea131f959fda0bbaf1151 - React-jsiexecutor: e38748a0e9d899f63dec562f93ac06c7acbc813d - React-jsinspector: 91b3c73d2afb7627af7872cedb0b74a0f00f57d1 - React-jsitracing: a340047c9fd31a36b222569c402e472e20557805 - React-logger: 81d58ca6f1d93fca9a770bda6cc1c4fbfcc99c9c - React-Mapbuffer: 726951e68f4bb1c2513d322f2548798b2a3d628d - React-microtasksnativemodule: 7a69a9b8fded72ea3cf81923ecf75cad5558ed26 - react-native-safe-area-context: 2500e4fe998caad50ad3bc51ec23ef951308569e - React-nativeconfig: 470fce6d871c02dc5eff250a362d56391b7f52d6 - React-NativeModulesApple: 6297fc3136c1fd42884795c51d7207de6312b606 - React-perflogger: f2c94413cfad44817c96cab33753831e73f0d0dd - React-performancetimeline: d6e493713e6aab3cc8b7c1c07e97160e22dd79cc - React-RCTActionSheet: 2eb26cbf384f3d3b2cb2e23be850a956d83f77ab - React-RCTAnimation: 59463699a92edc6705ce5306bb789d6a0ca4df0b - React-RCTAppDelegate: 4d9efca7caa477b106e3d55af339d0e071441536 - React-RCTBlob: 0883f5363069ad30f628c970fcb413a619e42804 - React-RCTFabric: 4c761af601a1fe0061b15df97af9fb77403362a2 - React-RCTImage: 78884b7ea6ef4f7bb9655614bf09a40054f282ce - React-RCTLinking: b9beba7465fd9a1ed7a88a4e7fc403d26e17ab95 - React-RCTNetwork: 701d9c050077596b15a11b6b573ed95c309d2315 - React-RCTSettings: e700a82e3e923c10060b8f65297f9d321b93d8eb - React-RCTText: e782ce1c3f9d915daf50d97157f8c226e8f3d206 - React-RCTVibration: 2a19c56be78cb7afce9f4f3471aacfb063f32a00 - React-rendererconsistency: b389e324712bf0869529823216e922836ed9b737 - React-rendererdebug: 9f5629032c0937c62b21dcaf96b374a149bf8a44 - React-rncore: 2cf6b2348ee5d5431c4735180364b207ecf47123 - React-RuntimeApple: 84d648b9a87c34041d6628dde50d1acf54e5bf89 - React-RuntimeCore: 79290b2eb17a25c1b23c4d5dde13d43c20467eef - React-runtimeexecutor: 69e27948ee2127400297c7de50b809a7cd127a15 - React-RuntimeHermes: 5fe2082f98187410c1815c532f72348fbe1d0517 - React-runtimescheduler: 95b7087f459699756c1b7feb3f4637066c337b62 - React-timing: 97673939f96f79031d2a5a0a92285618475149ec - React-utils: ed6cb7ba089ac0856aa104df12691e99abbf14e1 - ReactCodegen: 4bc4d9328ff15fef96d6305bc6fea67b7fe16163 - ReactCommon: 208cb02e3c0bb8a727b3e1a1782202bcfa5d9631 - RNGestureHandler: 0e5ae8d72ef4afb855e98dcdbe60f27d938abe13 - RNReanimated: aaab3966c0741b35b486467329128fb99abc47e7 - RNScreens: e389d6a6a66a4f0d3662924ecae803073ccce8ec - RNSVG: b2fbe96b2bb3887752f8abc1f495953847e90384 - SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 - Yoga: 96872ee462cfc43866ad013c8160d4ff6b85709b - -PODFILE CHECKSUM: c9b94076957c1eddb2655ee62a5fee71a3cc3a6c - -COCOAPODS: 1.15.2 diff --git a/examples/bare/jest.config.js b/examples/bare/jest.config.js deleted file mode 100644 index 8eb675e9..00000000 --- a/examples/bare/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - preset: 'react-native', -}; diff --git a/examples/bare/metro.config.js b/examples/bare/metro.config.js deleted file mode 100644 index f72a5eaf..00000000 --- a/examples/bare/metro.config.js +++ /dev/null @@ -1,22 +0,0 @@ -const path = require('path'); -const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); - -const { - wrapWithReanimatedMetroConfig, -} = require('react-native-reanimated/metro-config'); -/** - * Metro configuration - * https://reactnative.dev/docs/metro - * - * @type {import('metro-config').MetroConfig} - */ -const config = { - watchFolders: [path.join(__dirname, '..', '..')], - resolver: { - unstable_enableSymlinks: true, - }, -}; - -module.exports = wrapWithReanimatedMetroConfig( - mergeConfig(getDefaultConfig(__dirname), config), -); diff --git a/examples/bare/package.json b/examples/bare/package.json deleted file mode 100644 index 53c750fa..00000000 --- a/examples/bare/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "amaexample", - "version": "1.1.0", - "private": true, - "scripts": { - "android": "react-native run-android", - "ios": "react-native run-ios", - "lint": "eslint .", - "start": "react-native start", - "test": "jest" - }, - "dependencies": { - "@react-navigation/native": "^6.1.7", - "@react-navigation/native-stack": "^6.9.14", - "react": "18.3.1", - "react-native": "0.76.2", - "react-native-gesture-handler": "^2.21.2", - "react-native-reanimated": "^3.16.2", - "react-native-safe-area-context": "^4.14.0", - "react-native-screens": "^3.35.0", - "react-native-svg": "^15.9.0" - }, - "devDependencies": { - "@babel/core": "^7.25.2", - "@babel/preset-env": "^7.25.3", - "@babel/runtime": "^7.25.0", - "@react-native-community/cli": "15.0.1", - "@react-native-community/cli-platform-android": "15.0.1", - "@react-native-community/cli-platform-ios": "15.0.1", - "@react-native/babel-preset": "0.76.2", - "@react-native/eslint-config": "0.76.2", - "@react-native/metro-config": "0.76.2", - "@react-native/typescript-config": "0.76.2", - "@types/react": "^18.2.6", - "@types/react-test-renderer": "^18.0.0", - "babel-jest": "^29.6.3", - "eslint": "^8.19.0", - "jest": "^29.6.3", - "prettier": "^2.8.8", - "react-test-renderer": "18.3.1", - "typescript": "5.0.4" - }, - "engines": { - "node": ">=18" - }, - "packageManager": "yarn@3.6.4" -} diff --git a/examples/bare/src/App.tsx b/examples/bare/src/App.tsx deleted file mode 100644 index 007e4cdb..00000000 --- a/examples/bare/src/App.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import 'react-native-gesture-handler'; - -import { AMAProvider } from '@react-native-ama/core'; -import React from 'react'; -import { GestureHandlerRootView } from 'react-native-gesture-handler'; - -import { AppNavigator } from './AppNavigator'; - -const App = () => { - return ( - - - - - - ); -}; - -export default App; diff --git a/examples/bare/src/AppNavigator.tsx b/examples/bare/src/AppNavigator.tsx deleted file mode 100644 index 8ac34b17..00000000 --- a/examples/bare/src/AppNavigator.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { - BackButton, - BottomSheetScreen, - CarouselScreen, - ExpandablePressableScreen, - FlatListDynamicScreen, - FlatListScreen, - FlatListStaticScreen, - FormScreen, - Header, - HomeScreen, - LoadingScreen, - PressableScreen, - SwitchListItemScreen, - TextScreen, - TouchableOpacityScreen, - TouchableWithoutFeedbackScreen, - UseAMAContextScreen, - UseAnimationDurationScreen, - UseAnimationScreen, - UseReanimatedAnimationBuilderScreen, - UseReanimatedTimingScreen, - UseTimedActionScreen, -} from '@examples/shared-ui'; -import { useAMAContext } from '@react-native-ama/core'; -import { NavigationContainer } from '@react-navigation/native'; -import { - NativeStackNavigationOptions, - createNativeStackNavigator, -} from '@react-navigation/native-stack'; -import React from 'react'; - -export const AppNavigator = () => { - const { reactNavigationScreenOptions: amaAnimationScreenOptions } = - useAMAContext(); - - return ( - - -
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - - - ); -}; - -const Stack = createNativeStackNavigator(); - -const BaseNavigatorOptions: NativeStackNavigationOptions = { - headerTitleAlign: 'center', - headerBackVisible: false, -}; - -type StackParamList = { - Home: undefined; - Pressable: undefined; - TouchableOpacity: undefined; - TouchableWithoutFeedback: undefined; - Text: undefined; - UseAnimation: undefined; - UseAnimationDuration: undefined; - UseReanimatedAnimationBuilder: undefined; - UseReanimatedTiming: undefined; - SwitchListItem: undefined; - Form: undefined; - FlatList: undefined; - ExpandablePressable: undefined; - FlatListDynamic: undefined; - FlatListStatic: undefined; - BottomSheet: undefined; - Carousel: undefined; - Loading: undefined; - UseTimedAction: undefined; - UseAMAContext: undefined; -}; diff --git a/examples/bare/src/theme.ts b/examples/bare/src/theme.ts deleted file mode 100644 index 41c7ac07..00000000 --- a/examples/bare/src/theme.ts +++ /dev/null @@ -1,29 +0,0 @@ -export const theme = { - padding: { - small: 6, - normal: 12, - big: 24, - }, - fontSize: { - normal: 12, - medium: 18, - big: 24, - }, - color: { - black: '#000', - white: '#fff', - hover: '#005D85', - disabled: '#5C5757', - checked: '#820085', - mixed: '#006602', - selected: '#660000', - }, - lineHeight: { - normal: 16, - medium: 24, - big: 48, - }, - flex1: { - flex: 1, - }, -}; diff --git a/examples/bare/src/types.ts b/examples/bare/src/types.ts deleted file mode 100644 index 4cfe306c..00000000 --- a/examples/bare/src/types.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type RootStackParamList = { - Home: undefined; - Pressable: undefined; - TouchableOpacity: undefined; - TouchableWithoutFeedback: undefined; - Text: undefined; - UseAnimation: undefined; - UseAnimationDuration: undefined; - UseReanimatedAnimationBuilder: undefined; - UseReanimatedTiming: undefined; - Form: undefined; - FlatList: undefined; - ExpandablePressable: undefined; - FlatListDynamic: undefined; - FlatListStatic: undefined; - BottomSheet: undefined; - UseTimedAction: undefined; - UseAMAContext: undefined; - SwitchListItem: undefined; -}; diff --git a/examples/bare/src/utils/useTypedNavigation.tsx b/examples/bare/src/utils/useTypedNavigation.tsx deleted file mode 100644 index d1098c1b..00000000 --- a/examples/bare/src/utils/useTypedNavigation.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { useNavigation } from '@react-navigation/native'; -import type { NativeStackNavigationProp } from '@react-navigation/native-stack'; - -import type { RootStackParamList } from '../types'; - -export const useTypedNavigation = () => - useNavigation>(); diff --git a/examples/bare/tsconfig.json b/examples/bare/tsconfig.json deleted file mode 100644 index 83dcdb1e..00000000 --- a/examples/bare/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": [ - "@react-native/typescript-config/tsconfig.json", - "../../tsconfig.json" - ] -} diff --git a/examples/expo/App.tsx b/examples/expo/App.tsx deleted file mode 100644 index 0ac330d5..00000000 --- a/examples/expo/App.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { AMAProvider } from '@react-native-ama/core'; -import { StatusBar } from 'expo-status-bar'; -import React from 'react'; -import { GestureHandlerRootView } from 'react-native-gesture-handler'; - -import { AppNavigator } from './src/AppNavigation'; - -export default function App() { - return ( - - - - - - - ); -} diff --git a/examples/expo/CHANGELOG.md b/examples/expo/CHANGELOG.md deleted file mode 100644 index 53dfb6d0..00000000 --- a/examples/expo/CHANGELOG.md +++ /dev/null @@ -1,13 +0,0 @@ -# ama-expo-example - -## 1.1.0 - -### Minor Changes - -- Added `` component example screens ([#272](https://github.com/FormidableLabs/react-native-ama/pull/272)) - -## 1.0.1 - -### Patch Changes - -- Ignoring eslint on babel ([#253](https://github.com/FormidableLabs/react-native-ama/pull/253)) diff --git a/examples/expo/README.md b/examples/expo/README.md deleted file mode 100644 index c989a5bb..00000000 --- a/examples/expo/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Getting Started - -Before getting started, make sure you have installed _node_modules_ by running `yarn` from the root of the project, then come back here. - -## Step 1: Start the Metro Server - -First, you will need to start **Metro**, the JavaScript _bundler_, simply run - -```bash -npx expo start -``` - -## Step 2: Start your Application - -Start your app in the Expo Go app on your iOS or Android device. Use the QR code in the Metro Bundler to open your project or by pressing `a` for Android emulator, `i` for iOS simulator. diff --git a/examples/expo/assets/adaptive-icon.png b/examples/expo/assets/adaptive-icon.png deleted file mode 100644 index d6a03320..00000000 --- a/examples/expo/assets/adaptive-icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f4c0a732b6325bf4071d9124d2ae67e037cb24fcc9c482ef82bea742109a3b8 -size 17547 diff --git a/examples/expo/assets/favicon.png b/examples/expo/assets/favicon.png deleted file mode 100644 index 7e8afed9..00000000 --- a/examples/expo/assets/favicon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24272cdaeff82cc5facdaccd982a6f05b60c4504704bbf94c19a6388659880bb -size 1466 diff --git a/examples/expo/assets/icon.png b/examples/expo/assets/icon.png deleted file mode 100644 index 71aadd56..00000000 --- a/examples/expo/assets/icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74c64047eb557b1341bba7a2831eedde9ddb705e6451a9ad9f5552bf558f13de -size 22380 diff --git a/examples/expo/assets/splash.png b/examples/expo/assets/splash.png deleted file mode 100644 index f775d15c..00000000 --- a/examples/expo/assets/splash.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc25a616b4e31cf7300cd97b9cbf8894e855e6373aa797d0badd7e211111c5e5 -size 47346 diff --git a/examples/expo/babel.config.js b/examples/expo/babel.config.js deleted file mode 100644 index 6bbc8da5..00000000 --- a/examples/expo/babel.config.js +++ /dev/null @@ -1,10 +0,0 @@ -// eslint-disable-next-line -module.exports = function (api) { - api.cache(true); - return { - presets: ['babel-preset-expo'], - plugins: [ - 'react-native-reanimated/plugin', // reanimated plugin must be listed last - ], - }; -}; diff --git a/examples/expo/metro.config.js b/examples/expo/metro.config.js deleted file mode 100644 index 92970a12..00000000 --- a/examples/expo/metro.config.js +++ /dev/null @@ -1,21 +0,0 @@ -const { getDefaultConfig } = require('expo/metro-config'); -const path = require('path'); - -// Find the project and workspace directories -const projectRoot = __dirname; -// This can be replaced with `find-yarn-workspace-root` -const workspaceRoot = path.resolve(projectRoot, '../..'); - -const config = getDefaultConfig(projectRoot); - -// 1. Watch all files within the monorepo -config.watchFolders = [workspaceRoot]; -// 2. Let Metro know where to resolve packages and in what order -config.resolver.nodeModulesPaths = [ - path.resolve(projectRoot, 'node_modules'), - path.resolve(workspaceRoot, 'node_modules'), -]; -// 3. Force Metro to resolve (sub)dependencies only from the `nodeModulesPaths` -config.resolver.disableHierarchicalLookup = true; - -module.exports = config; diff --git a/examples/expo/package.json b/examples/expo/package.json deleted file mode 100644 index a9700974..00000000 --- a/examples/expo/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "ama-expo-example", - "private": true, - "version": "1.1.0", - "main": "index.js", - "scripts": { - "start": "expo start", - "android": "expo start --android", - "ios": "expo start --ios", - "web": "expo start --web" - }, - "dependencies": { - "@react-navigation/native": "^6.1.7", - "@react-navigation/native-stack": "^6.9.14", - "expo": "~51.0.39", - "expo-status-bar": "~1.12.1", - "react": "18.2.0", - "react-native": "0.74.5", - "react-native-gesture-handler": "~2.16.1", - "react-native-reanimated": "~3.10.1", - "react-native-safe-area-context": "4.10.5", - "react-native-screens": "3.31.1" - }, - "devDependencies": { - "@babel/core": "^7.24.0", - "@types/react": "~18.2.45", - "typescript": "~5.3.3" - } -} diff --git a/examples/expo/src/AppNavigation.tsx b/examples/expo/src/AppNavigation.tsx deleted file mode 100644 index 25e5c018..00000000 --- a/examples/expo/src/AppNavigation.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { - BackButton, - BottomSheetScreen, - CarouselScreen, - ExpandablePressableScreen, - FlatListDynamicScreen, - FlatListScreen, - FlatListStaticScreen, - FormScreen, - Header, - HomeScreen, - LoadingScreen, - PressableScreen, - SwitchListItemScreen, - TextScreen, - TouchableOpacityScreen, - TouchableWithoutFeedbackScreen, - UseAMAContextScreen, - UseAnimationDurationScreen, - UseAnimationScreen, - UseReanimatedAnimationBuilderScreen, - UseReanimatedTimingScreen, - UseTimedActionScreen, -} from '@examples/shared-ui'; -import { useAMAContext } from '@react-native-ama/core'; -import { NavigationContainer } from '@react-navigation/native'; -import { - NativeStackNavigationOptions, - createNativeStackNavigator, -} from '@react-navigation/native-stack'; -import React from 'react'; - -export const AppNavigator = () => { - const { reactNavigationScreenOptions: amaAnimationScreenOptions } = - useAMAContext(); - - return ( - - -
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () =>
, - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - , - headerTitle: () => ( -
- ), - }} - /> - - - ); -}; - -const Stack = createNativeStackNavigator(); - -const BaseNavigatorOptions: NativeStackNavigationOptions = { - headerTitleAlign: 'center', - headerBackVisible: false, -}; - -type StackParamList = { - Home: undefined; - Pressable: undefined; - TouchableOpacity: undefined; - TouchableWithoutFeedback: undefined; - Text: undefined; - UseAnimation: undefined; - UseAnimationDuration: undefined; - UseReanimatedTiming: undefined; - UseReanimatedAnimationBuilder: undefined; - Form: undefined; - FlatList: undefined; - SwitchListItem: undefined; - ExpandablePressable: undefined; - FlatListDynamic: undefined; - FlatListStatic: undefined; - BottomSheet: undefined; - Carousel: undefined; - Loading: undefined; - UseTimedAction: undefined; - UseAMAContext: undefined; -}; diff --git a/examples/expo/tsconfig.json b/examples/expo/tsconfig.json deleted file mode 100644 index 03d7a0ce..00000000 --- a/examples/expo/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": ["../../tsconfig.json", "expo/tsconfig.base"], - "baseUrl": "./", - "paths": { - "@examples/shared-ui": ["examples/shared/index"], - }, - "compilerOptions": { - "strict": true - } -} diff --git a/examples/shared/CHANGELOG.md b/examples/shared/CHANGELOG.md deleted file mode 100644 index 02d1f634..00000000 --- a/examples/shared/CHANGELOG.md +++ /dev/null @@ -1,7 +0,0 @@ -# @examples/shared-ui - -## 1.1.0 - -### Minor Changes - -- Added `` component example screens ([#272](https://github.com/FormidableLabs/react-native-ama/pull/272)) diff --git a/examples/shared/index.ts b/examples/shared/index.ts deleted file mode 100644 index 3a7fc2cd..00000000 --- a/examples/shared/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -// components -export { BackButton } from './src/components/BackButton'; -export { CTAPressable } from './src/components/CTAPressable'; -export { CTATouchableOpacity } from './src/components/CTATouchableOpacity'; -export { CTATouchableWithoutFeedback } from './src/components/CTATouchableWithoutFeedback'; -export { Header } from './src/components/Header'; -export { Spacer } from './src/components/Spacer'; - -// Screens -export { LoadingScreen } from './src/screens/Loading.screen'; -export { CarouselScreen } from './src/screens/Carousel.screen'; -export { BottomSheetScreen } from './src/screens/BottomSheet.screen'; -export { ExpandablePressableScreen } from './src/screens/ExpandablePressableScreen'; -export { FlatListScreen } from './src/screens/FlatList.screen'; -export { FlatListDynamicScreen } from './src/screens/FlatListDynamic.screen'; -export { FlatListStaticScreen } from './src/screens/FlatListStatic.screen'; -export { FormScreen } from './src/screens/Form.screen'; -export { HomeScreen } from './src/screens/Home.screen'; -export { PressableScreen } from './src/screens/Pressable.screen'; -export { TextScreen } from './src/screens/Text.screen'; -export { TouchableOpacityScreen } from './src/screens/TouchableOpacity.screen'; -export { TouchableWithoutFeedbackScreen } from './src/screens/TouchableWithoutFeedback.screen'; -export { UseAMAContextScreen } from './src/screens/UseAMAContext.screen'; -export { UseAnimationDurationScreen } from './src/screens/UseAnimationDurationScreen'; -export { UseAnimationScreen } from './src/screens/UseAnimationScreen'; -export { UseReanimatedAnimationBuilderScreen } from './src/screens/UseReanimatedAnimationBuilderScreen'; -export { UseReanimatedTimingScreen } from './src/screens/UseReanimatedTimingScreen'; -export { UseTimedActionScreen } from './src/screens/UseTimedAction.screen'; -export { SwitchListItemScreen } from './src/screens/SwitchListItemScreen'; - -// other - -export { theme } from './src/theme'; diff --git a/examples/shared/package.json b/examples/shared/package.json deleted file mode 100644 index 99b0a13c..00000000 --- a/examples/shared/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@examples/shared-ui", - "version": "1.1.0", - "description": "Example Apps shared UI components", - "private": true, - "react-native": "index", - "main": "dist/index.js", - "scripts": { - "build": "rimraf dist && tsc", - "UNCOMMENT:postinstall": "yarn build", - "type:watch": "tsc --watch", - "type:check": "tsc --noEmit" - }, - "dependencies": { - "react-native-svg": "13.9.0" - }, - "devDependencies": { - "rimraf": "^3.0.2", - "typescript": "^5.1.3" - }, - "peerDependencies": { - "@react-navigation/native": ">=5.0.0", - "react": "*", - "react-native": "*" - } -} diff --git a/examples/shared/src/components/CTAPressable.tsx b/examples/shared/src/components/CTAPressable.tsx deleted file mode 100644 index a1ff9d99..00000000 --- a/examples/shared/src/components/CTAPressable.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import { - Pressable as AMAPressable, - type PressableProps, -} from '@react-native-ama/react-native'; -import React from 'react'; -import { - AccessibilityState, - ActivityIndicator, - StyleSheet, - Text, -} from 'react-native'; - -import { theme } from '../theme'; - -type CTAPressableProps = Omit< - PressableProps, - 'children' | 'accessibilityRole' | 'accessibilityLabel' -> & { - title: string; - accessibilityLabel?: string; - textTransform?: 'none' | 'capitalize' | 'uppercase' | 'lowercase' | undefined; -} & { - marginLeft?: number; - marginRight?: number; -} & { - checked?: AccessibilityState['checked']; - selected?: boolean; - expanded?: boolean; -}; - -export const CTAPressable = ({ - title, - onPress, - disabled, - textTransform, - marginLeft, - marginRight, - accessibilityLabel, - ...rest -}: CTAPressableProps) => { - return ( - { - const buttonStyles = getButtonStyle({ - pressed, - disabled, - // @ts-ignore - checked: rest?.checked, - // @ts-ignore - selected: rest?.selected, - }); - - return [ - styles.button, - buttonStyles, - { marginLeft, marginRight }, - rest.style, - ]; - }} - onPress={onPress}> - {rest.busy ? : null} - - {title} - - - ); -}; - -function getButtonStyle({ - pressed, - disabled, - checked, - selected, -}: { - pressed: boolean; - disabled?: boolean | null; - checked?: AccessibilityState['checked']; - selected?: boolean; -}) { - if (disabled) { - return styles.disabled; - } else if (pressed) { - return styles.pressed; - } else if (checked) { - return checked === 'mixed' ? styles.mixed : styles.checked; - } else if (selected) { - return styles.selected; - } - - return {}; -} - -const styles = StyleSheet.create({ - button: { - paddingVertical: theme.padding.normal, - paddingHorizontal: theme.padding.big, - backgroundColor: theme.color.black, - minHeight: 48, - minWidth: 48, - }, - pressed: { - backgroundColor: theme.color.hover, - }, - checked: { - backgroundColor: theme.color.checked, - }, - mixed: { - backgroundColor: theme.color.mixed, - }, - selected: { - backgroundColor: theme.color.selected, - }, - disabled: { - backgroundColor: theme.color.disabled, - }, - text: { - textAlign: 'center', - color: theme.color.white, - fontSize: theme.fontSize.medium, - }, -}); diff --git a/examples/shared/src/components/Header.tsx b/examples/shared/src/components/Header.tsx deleted file mode 100644 index bc7a7794..00000000 --- a/examples/shared/src/components/Header.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Text } from '@react-native-ama/react-native'; -import * as React from 'react'; -import { StyleSheet } from 'react-native'; - -import { theme } from '../theme'; - -type HeaderProps = { - title: string; - autofocus?: boolean; -}; - -export const Header: React.FC = ({ title, autofocus }) => { - return ( - - {title} - - ); -}; - -const styles = StyleSheet.create({ - title: { - fontSize: theme.fontSize.medium, - fontWeight: 'bold', - }, -}); diff --git a/examples/shared/src/screens/SwitchListItemScreen.tsx b/examples/shared/src/screens/SwitchListItemScreen.tsx deleted file mode 100644 index 38337c2a..00000000 --- a/examples/shared/src/screens/SwitchListItemScreen.tsx +++ /dev/null @@ -1,200 +0,0 @@ -import { - SwitchListItem, - Text, - useSwitch, -} from '@react-native-ama/react-native'; -import React, { useState } from 'react'; -import { Linking, StyleSheet, TouchableOpacity } from 'react-native'; -import { View } from 'react-native'; -import { Path, Svg } from 'react-native-svg'; - -import { CTAPressable } from '../components/CTAPressable'; -import { Spacer } from '../components/Spacer'; -import { theme } from '../theme'; - -const getStyles = (value, isError) => { - return isError - ? { - ...styles.touchableOpacityError, - backgroundColor: value ? '#4CAF50' : 'white', - } - : { - ...styles.touchableOpacity, - backgroundColor: value ? '#4CAF50' : 'white', - }; -}; - -const CheckCircle = props => { - return ( - - - - - ); -}; - -const Circle = props => { - return ( - - - - ); -}; -const CustomSwitch = ({ value, onValueChange, isError = false }) => { - const props = useSwitch({ - accessibilityLabel: 'My Switch', - style: getStyles(value, isError), - }); - return ( - - {value ? : } - - ); -}; - -export const SwitchListItemScreen = () => { - const [isSwitchOn, setIsSwitchOn] = useState(false); - const [isCustomSwitchOn, setCustomIsSwitchOn] = useState(false); - const [isErrorCustomSwitchOn, setErrorCustomIsSwitchOn] = useState(false); - const [showTouchableAreaError, setShowTouchableAreaError] = useState(false); - const toggleRNSwitch = () => { - setIsSwitchOn(previousState => !previousState); - }; - - const toggleCustomSwitch = () => { - setCustomIsSwitchOn(previousState => !previousState); - }; - - const toggleErrorCustomSwitch = () => { - setErrorCustomIsSwitchOn(previousState => !previousState); - }; - - return ( - - - This example shows how to use the{' '} - - Linking.openURL( - 'https://commerce.nearform.com/open-source/react-native-ama/react-native/SwitchListItem', - ) - }> - SwitchListItem. - - - - React Native Switch - } - style={styles.switchListItem} - value={isSwitchOn} - onValueChange={toggleRNSwitch} - /> - - Custom Switch with{'\n'} - height:46px{'\n'} - width:46px{'\n'} - and no error - - } - style={styles.switchListItem} - value={isCustomSwitchOn} - onValueChange={toggleCustomSwitch}> - - - - - setShowTouchableAreaError(true)} - /> - {showTouchableAreaError ? ( - <> - - Custom Switch with breaking guidelines: - - Custom Switch{'\n'} - height:40px{'\n'} - width:40px{'\n'} - - } - style={styles.switchListItem} - value={isErrorCustomSwitchOn} - onValueChange={toggleErrorCustomSwitch}> - - - - ) : null} - - - ); -}; - -const styles = StyleSheet.create({ - view: { - paddingHorizontal: theme.padding.big, - paddingTop: theme.padding.big, - }, - container: { - paddingHorizontal: theme.padding.normal, - paddingTop: theme.padding.normal, - }, - intro: { - lineHeight: theme.lineHeight.medium, - }, - underline: { - textDecorationLine: 'underline', - }, - labelComponent: { - paddingBottom: theme.padding.small, - }, - switchText: { - flex: 1, - paddingRight: theme.padding.normal, - }, - switchListItem: { - marginVertical: theme.padding.normal, - }, - touchableOpacity: { - width: 46, - height: 46, - borderRadius: 100, - padding: 10, - justifyContent: 'center', - alignItems: 'center', - }, - touchableOpacityError: { - width: 40, - height: 40, - borderRadius: 100, - padding: 10, - justifyContent: 'center', - alignItems: 'center', - }, -}); diff --git a/examples/shared/src/screens/TouchableOpacity.screen.tsx b/examples/shared/src/screens/TouchableOpacity.screen.tsx deleted file mode 100644 index 0d110e20..00000000 --- a/examples/shared/src/screens/TouchableOpacity.screen.tsx +++ /dev/null @@ -1,260 +0,0 @@ -import { Text, TouchableOpacity } from '@react-native-ama/react-native'; -import * as React from 'react'; -import { - AccessibilityState, - SafeAreaView, - ScrollView, - StyleSheet, - View, -} from 'react-native'; - -import { CTATouchableOpacity } from '../components/CTATouchableOpacity'; -import { Header } from '../components/Header'; -import { Spacer } from '../components/Spacer'; -import { theme } from '../theme'; - -export const TouchableOpacityScreen = () => { - return ( - - - - - {/* Disabled */} - - - - - {/* Busy */} - - - - - {/* Checked */} - - - - - {/* Selected*/} - - - - - {/* Expanded*/} - - - - - {/* Test rule breakage */} - - - {/* Test minimum size failing */} - - - - - - ); -}; - -const TouchableOpacityExample: React.FC<{ - state: 'checked' | 'disabled' | 'busy' | 'selected' | 'expanded'; - children: React.ReactNode; -}> = ({ state, children }) => { - return ( - <> -
- - {children} - - - ); -}; - -const checkedStates: AccessibilityState['checked'][] = [true, false, 'mixed']; - -const CheckedButton = () => { - const [state, setState] = React.useState(checkedStates[0]); - - const nextState = () => { - const stateIndex = checkedStates.indexOf(state); - const nextIndex = - stateIndex === checkedStates.length - 1 ? 0 : stateIndex + 1; - - setState(checkedStates[nextIndex]); - }; - - return ( - - - {`${state}`} - - ); -}; - -const SelectedButton = () => { - const [state, setState] = React.useState(true); - - const nextState = () => { - setState(isSelected => !isSelected); - }; - - return ( - - - {`${state}`} - - ); -}; - -const ExpandedButton = () => { - const [state, setState] = React.useState(true); - - const nextState = () => { - setState(isExpanded => !isExpanded); - }; - - return ( - - - {`${state}`} - - ); -}; - -const ContrastCheckerFailing = () => { - const [activeButton, setActiveButton] = React.useState< - null | 'all' | 'aa' | 'aaa' - >(null); - - // @ts-ignore - const failingStyle = styles[`failingText_${activeButton || ''}`]; - - return ( - <> - -
- - setActiveButton('all')} - checked={activeButton === 'all'} - /> - setActiveButton('aa')} - checked={activeButton === 'aa'} - /> - setActiveButton('aaa')} - checked={activeButton === 'aaa'} - /> - - {activeButton === null ? null : ( - - <> - This fails - - - )} - - ); -}; - -const MinimumSizeFailing = () => { - const [isButtonVisible, setIsButtonVisible] = React.useState(false); - - return ( - <> - -
- - setIsButtonVisible(true)} - /> - {isButtonVisible ? ( - - <> - This fails - - - ) : null} - - ); -}; - -const styles = StyleSheet.create({ - list: { - paddingHorizontal: theme.padding.big, - }, - checkButton: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - checkLabel: { - paddingLeft: theme.padding.normal, - }, - testButtons: { - paddingTop: theme.padding.normal, - flexDirection: 'row', - }, - failingButtonStyle: { - backgroundColor: theme.color.black, - flex: 1, - minHeight: 48, - justifyContent: 'center', - alignItems: 'center', - marginTop: theme.padding.normal, - }, - failingText_all: { - color: '#5a5a5a', - }, - failingText_aa: { - color: '#c70000', - }, - failingText_aaa: { - color: '#FF0000', - }, - minSizeFailing: { - backgroundColor: theme.color.black, - justifyContent: 'center', - alignItems: 'center', - marginTop: theme.padding.normal, - height: 40, - flex: 1, - }, -}); diff --git a/examples/shared/src/screens/TouchableWithoutFeedback.screen.tsx b/examples/shared/src/screens/TouchableWithoutFeedback.screen.tsx deleted file mode 100644 index bb3d69d1..00000000 --- a/examples/shared/src/screens/TouchableWithoutFeedback.screen.tsx +++ /dev/null @@ -1,261 +0,0 @@ -import { Text, TouchableWithoutFeedback } from '@react-native-ama/react-native'; -import * as React from 'react'; -import { - AccessibilityState, - SafeAreaView, - ScrollView, - StyleSheet, - View, -} from 'react-native'; - -import { CTATouchableWithoutFeedback } from '../components/CTATouchableWithoutFeedback'; -import { Header } from '../components/Header'; -import { Spacer } from '../components/Spacer'; -import { theme } from '../theme'; - -export const TouchableWithoutFeedbackScreen = () => { - return ( - - - - - {/* Disabled */} - - - - - {/* Busy */} - - - - - {/* Checked */} - - - - - {/* Selected*/} - - - - - {/* Expanded*/} - - - - - {/* Test rule breakage */} - - - {/* Test minimum size failing */} - - - - ); -}; - -const TouchableWithoutFeedbackExample: React.FC<{ - state: 'busy' | 'disabled' | 'checked' | 'selected' | 'expanded'; - children: React.ReactNode; -}> = ({ state, children }) => { - return ( - <> -
- - {children} - - - ); -}; - -const checkedStates: AccessibilityState['checked'][] = [true, false, 'mixed']; - -const CheckedButton = () => { - const [state, setState] = React.useState(checkedStates[0]); - - const nextState = () => { - const stateIndex = checkedStates.indexOf(state); - const nextIndex = - stateIndex === checkedStates.length - 1 ? 0 : stateIndex + 1; - - setState(checkedStates[nextIndex]); - }; - - return ( - - - {`${state}`} - - ); -}; - -const SelectedButton = () => { - const [state, setState] = React.useState(true); - - const nextState = () => { - setState(isSelected => !isSelected); - }; - - return ( - - - {`${state}`} - - ); -}; - -const ExpandedButton = () => { - const [state, setState] = React.useState(true); - - const nextState = () => { - setState(isExpanded => !isExpanded); - }; - - return ( - - - {`${state}`} - - ); -}; - -const ContrastCheckerFailing = () => { - const [activeButton, setActiveButton] = React.useState< - null | 'all' | 'aa' | 'aaa' - >(null); - - // @ts-ignore - const failingStyle = styles[`failingText_${activeButton || ''}`]; - - return ( - <> - -
- - setActiveButton('all')} - checked={activeButton === 'all'} - /> - setActiveButton('aa')} - checked={activeButton === 'aa'} - /> - setActiveButton('aaa')} - checked={activeButton === 'aaa'} - /> - - {activeButton === null ? null : ( - - <> - This fails - - - )} - - ); -}; - -const MinimumSizeFailing = () => { - const [isButtonVisible, setIsButtonVisible] = React.useState(false); - - return ( - <> - -
- - setIsButtonVisible(true)} - /> - {isButtonVisible ? ( - - <> - This fails - - - ) : null} - - ); -}; - -const styles = StyleSheet.create({ - list: { - paddingHorizontal: theme.padding.big, - }, - checkButton: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }, - checkLabel: { - paddingLeft: theme.padding.normal, - }, - testButtons: { - paddingTop: theme.padding.normal, - flexDirection: 'row', - }, - failingButtonStyle: { - backgroundColor: theme.color.black, - flex: 1, - minHeight: 48, - justifyContent: 'center', - alignItems: 'center', - marginTop: theme.padding.normal, - }, - failingText_all: { - color: '#5a5a5a', - }, - failingText_aa: { - color: '#c70000', - }, - failingText_aaa: { - color: '#FF0000', - }, - minSizeFailing: { - backgroundColor: theme.color.black, - justifyContent: 'center', - alignItems: 'center', - marginTop: theme.padding.normal, - height: 40, - flex: 1, - }, -}); diff --git a/examples/shared/tsconfig.build.json b/examples/shared/tsconfig.build.json deleted file mode 100644 index b140cd90..00000000 --- a/examples/shared/tsconfig.build.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "dist", - "declaration": true - } -} \ No newline at end of file diff --git a/examples/shared/tsconfig.json b/examples/shared/tsconfig.json deleted file mode 100644 index 58ae44b4..00000000 --- a/examples/shared/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "jsx": "react", - "lib": ["dom", "dom.iterable", "esnext"], - "module": "commonjs", - "moduleResolution": "node", - "target": "es6", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true, - }, -} \ No newline at end of file diff --git a/package.json b/package.json index 4632f15b..d73a9762 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ "repository": "https://github.com/FormidableLabs/react-native-ama.git", "homepage": "https://commerce.nearform.com/open-source/react-native-ama/", "scripts": { - "example:bare": "yarn --cwd examples/bare", - "example:expo": "yarn --cwd examples/expo", + "playground": "cd playground && yarn start", + "playground:ios": "cd playground && yarn ios", + "playground:android": "cd playground && yarn android", "build:animations": "yarn workspace @react-native-ama/animations build", "build:core": "yarn workspace @react-native-ama/core build", "build:extras": "yarn workspace @react-native-ama/extras build", @@ -20,35 +21,46 @@ "ts:check": "tsc --noEmit", "lint": "eslint --ext .js,.ts,.tsx ./packages", "version": "yarn changeset version && yarn install --no-frozen-lockfile", - "build": "yarn build:internal && yarn build:core && yarn build:animations && yarn build:react-native && yarn build:extras && yarn build:forms && yarn build:lists" + "build": "yarn build:internal && yarn build:core && yarn build:animations && yarn build:react-native && yarn build:extras && yarn build:forms && yarn build:lists", + "prettier": "yarn prettier --write 'packages/**/*.{js,jsx,ts,tsx}'" }, "workspaces": [ "packages/animations", "packages/core", "packages/extras", "packages/forms", - "packages/internal", "packages/lists", "packages/react-native", - "examples/bare", - "examples/expo", - "examples/shared" + "example" ], "devDependencies": { "@changesets/cli": "^2.27.7", - "@ianvs/prettier-plugin-sort-imports": "^3.4.2", + "@ianvs/prettier-plugin-sort-imports": "^4.4.2", "@react-native/eslint-config": "^0.76.3", "@svitejs/changesets-changelog-github-compact": "^1.1.0", "@testing-library/react-native": "^12.3.0", "@types/jest": "^29.5.10", + "@types/node": "^24.0.15", + "@types/react": "~19.0.0", "eslint": "^8.19.0", "eslint-plugin-import": "^2.26.0", - "eslint-plugin-prettier": "^3.1.3", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-prettier": "^5.5.1", + "expo": "~53.0.0", + "expo-module-scripts": "^4.1.6", "husky": "^8.0.1", "jest": "^29.6.3", - "prettier": "^3.4.2", + "prettier": "^3.6.2", + "react-native": "0.79.1", + "react-native-gesture-handler": "~2.24.0", + "react-native-reanimated": "~3.17.4", "ts-jest": "^29.1.1", "typescript": "^5.1.3" }, + "peerdependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + }, "packageManager": "yarn@3.6.4" } diff --git a/packages/animations/package.json b/packages/animations/package.json index 50d9505c..b546f035 100644 --- a/packages/animations/package.json +++ b/packages/animations/package.json @@ -27,7 +27,8 @@ }, "peerDependencies": { "react": "*", - "react-native": "*" + "react-native": "*", + "react-native-reanimated": ">=2.0.0" }, "keywords": [ "react-native", diff --git a/packages/animations/src/components/AnimatedContainer.test.tsx b/packages/animations/src/components/AnimatedContainer.test.tsx index f9d36036..3c4ccda0 100644 --- a/packages/animations/src/components/AnimatedContainer.test.tsx +++ b/packages/animations/src/components/AnimatedContainer.test.tsx @@ -1,7 +1,6 @@ import { AutofocusContainer } from '@react-native-ama/core'; import { render } from '@testing-library/react-native'; import * as React from 'react'; - import * as UseReanimatedAnimationBuilder from '../hooks/useReanimatedAnimationBuilder'; import { AnimatedContainer } from './AnimatedContainer'; diff --git a/packages/animations/src/components/AnimatedContainer.tsx b/packages/animations/src/components/AnimatedContainer.tsx index 568411dc..9c1b4efe 100644 --- a/packages/animations/src/components/AnimatedContainer.tsx +++ b/packages/animations/src/components/AnimatedContainer.tsx @@ -3,7 +3,6 @@ import * as React from 'react'; import type { PropsWithChildren } from 'react'; import type { ViewProps } from 'react-native'; import Animated, { AnimateProps } from 'react-native-reanimated'; - import { AnimatedEntryViewStyle, AnimatedExitViewStyle, @@ -55,7 +54,8 @@ export const AnimatedContainer = React.forwardRef< entering={entering} exiting={exiting} ref={forwardRef} - {...rest}> + {...rest} + > {children} diff --git a/packages/animations/src/hooks/useAnimation.test.ts b/packages/animations/src/hooks/useAnimation.test.ts index c2392e14..a527595c 100644 --- a/packages/animations/src/hooks/useAnimation.test.ts +++ b/packages/animations/src/hooks/useAnimation.test.ts @@ -1,7 +1,6 @@ import * as AMAProvider from '@react-native-ama/core'; import { renderHook } from '@testing-library/react-native'; import { Animated } from 'react-native'; - import { useAnimation } from './useAnimation'; beforeEach(() => { diff --git a/packages/animations/src/hooks/useAnimationDuration.test.ts b/packages/animations/src/hooks/useAnimationDuration.test.ts index b4f33db3..1546707a 100644 --- a/packages/animations/src/hooks/useAnimationDuration.test.ts +++ b/packages/animations/src/hooks/useAnimationDuration.test.ts @@ -1,6 +1,5 @@ import * as AMAProvider from '@react-native-ama/core'; import { renderHook } from '@testing-library/react-native'; - import { useAnimationDuration } from './useAnimationDuration'; describe('useAnimationDuration', () => { diff --git a/packages/animations/src/hooks/useAnimationDuration.ts b/packages/animations/src/hooks/useAnimationDuration.ts index f8fd5f5a..e08dada0 100644 --- a/packages/animations/src/hooks/useAnimationDuration.ts +++ b/packages/animations/src/hooks/useAnimationDuration.ts @@ -1,7 +1,6 @@ import { useAMAContext } from '@react-native-ama/core'; import React from 'react'; import type { ViewStyle } from 'react-native'; - import { isMotionAnimation } from '../utils/isMotionAnimation'; export const useAnimationDuration = () => { diff --git a/packages/animations/src/hooks/useReanimatedAnimationBuilder.test.ts b/packages/animations/src/hooks/useReanimatedAnimationBuilder.test.ts index 2a6e26be..35e39017 100644 --- a/packages/animations/src/hooks/useReanimatedAnimationBuilder.test.ts +++ b/packages/animations/src/hooks/useReanimatedAnimationBuilder.test.ts @@ -1,6 +1,5 @@ import * as AMAProvider from '@react-native-ama/core'; import { renderHook } from '@testing-library/react-native'; - import { useReanimatedAnimationBuilder } from './useReanimatedAnimationBuilder'; beforeEach(() => { diff --git a/packages/animations/src/hooks/useReanimatedTiming.test.ts b/packages/animations/src/hooks/useReanimatedTiming.test.ts index 9a9e1c8a..07ec0710 100644 --- a/packages/animations/src/hooks/useReanimatedTiming.test.ts +++ b/packages/animations/src/hooks/useReanimatedTiming.test.ts @@ -1,7 +1,6 @@ import * as AMAProvider from '@react-native-ama/core'; import { MOTION_ANIMATIONS } from '@react-native-ama/internal'; import { renderHook } from '@testing-library/react-native'; - import { useReanimatedTiming } from './useReanimatedTiming'; beforeEach(() => { diff --git a/packages/animations/src/hooks/useReanimatedTiming.ts b/packages/animations/src/hooks/useReanimatedTiming.ts index f149f463..b59bfc89 100644 --- a/packages/animations/src/hooks/useReanimatedTiming.ts +++ b/packages/animations/src/hooks/useReanimatedTiming.ts @@ -8,7 +8,6 @@ import { WithSpringConfig, WithTimingConfig, } from 'react-native-reanimated'; - import { isMotionAnimation } from '../utils/isMotionAnimation'; export const useReanimatedTiming = () => { diff --git a/packages/core/ama.config.json b/packages/core/ama.config.json new file mode 100644 index 00000000..39cb4bdb --- /dev/null +++ b/packages/core/ama.config.json @@ -0,0 +1,6 @@ +{ + "rules": {}, + "accessibilityLabelExceptions": [], + "highlight": "both", + "uppercaseMinLength": 4 +} diff --git a/packages/core/android/build.gradle b/packages/core/android/build.gradle new file mode 100644 index 00000000..11cb174b --- /dev/null +++ b/packages/core/android/build.gradle @@ -0,0 +1,43 @@ +apply plugin: 'com.android.library' + +group = 'expo.modules.ama' +version = '0.1.0' + +def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle") +apply from: expoModulesCorePlugin +applyKotlinExpoModulesCorePlugin() +useCoreDependencies() +useExpoPublishing() + +// If you want to use the managed Android SDK versions from expo-modules-core, set this to true. +// The Android SDK versions will be bumped from time to time in SDK releases and may introduce breaking changes in your module code. +// Most of the time, you may like to manage the Android SDK versions yourself. +def useManagedAndroidSdkVersions = false +if (useManagedAndroidSdkVersions) { + useDefaultAndroidSdkVersions() +} else { + buildscript { + // Simple helper that allows the root project to override versions declared by this library. + ext.safeExtGet = { prop, fallback -> + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback + } + } + project.android { + compileSdkVersion safeExtGet("compileSdkVersion", 34) + defaultConfig { + minSdkVersion safeExtGet("minSdkVersion", 21) + targetSdkVersion safeExtGet("targetSdkVersion", 34) + } + } +} + +android { + namespace "expo.modules.ama" + defaultConfig { + versionCode 1 + versionName "0.1.0" + } + lintOptions { + abortOnError false + } +} diff --git a/packages/core/android/src/debug/AndroidManifest.xml b/packages/core/android/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..bdae66c8 --- /dev/null +++ b/packages/core/android/src/debug/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/packages/core/android/src/debug/java/expo/modules/ama/ReactNativeAmaModule.kt b/packages/core/android/src/debug/java/expo/modules/ama/ReactNativeAmaModule.kt new file mode 100644 index 00000000..7914a6ef --- /dev/null +++ b/packages/core/android/src/debug/java/expo/modules/ama/ReactNativeAmaModule.kt @@ -0,0 +1,203 @@ +package expo.modules.ama + +import android.app.Activity +import android.graphics.Rect +import android.os.Handler +import android.os.Looper +import android.util.DisplayMetrics +import android.view.View +import android.view.ViewGroup +import android.view.ViewTreeObserver +import android.widget.ScrollView +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat +import expo.modules.kotlin.modules.Module +import expo.modules.kotlin.modules.ModuleDefinition +import kotlin.math.max + +object Constants { + const val DEBOUNCE: Long = 100 +} + +data class AMAConfig( + val rules: Map = emptyMap(), + val accessibilityLabelExceptions: List = emptyList(), + val highlight: String = "both" +) + +class ReactNativeAmaModule : Module() { + private var isMonitoring = false + private var currentDecorView: View? = null + private val drawListener = ViewTreeObserver.OnDrawListener { scheduleA11yCheck() } + + private val checkHandler = Handler(Looper.getMainLooper()) + private var checkRunnable: Runnable? = null + private lateinit var a11yChecker: NodesGrabber + + override fun definition() = ModuleDefinition { + Name("ReactNativeAma") + + Events("onAmaNodes") + + Function("start") { configMap: Map -> + if (!isMonitoring) { + + val config = + AMAConfig( + // Use safe casting and provide default values + rules = configMap["rules"] as? Map ?: emptyMap(), + accessibilityLabelExceptions = + configMap["accessibilityLabelExceptions"] as? List + ?: emptyList(), + highlight = configMap["highlight"] as? String ?: "both" + ) + + Logger.info("start", "👀 Start Monitoring 👀", config.toString()) + + a11yChecker = NodesGrabber(appContext, config) + + getCurrentActivity()?.window?.decorView?.let { + currentDecorView = it + it.viewTreeObserver.addOnDrawListener(drawListener) + } + + isMonitoring = true + } + } + + Function("stop") { + if (isMonitoring) { + a11yChecker.clearAllIssues() + currentDecorView?.let { it.viewTreeObserver.removeOnDrawListener(drawListener) } + + isMonitoring = false + } + } + + AsyncFunction("getPosition") { viewId: Int -> + val activity = appContext.activityProvider?.currentActivity ?: return@AsyncFunction null + val root = activity.window.decorView as? ViewGroup ?: return@AsyncFunction null + val target = root.findViewById(viewId) ?: return@AsyncFunction null + + val scroll = + generateSequence(target.parent) { (it as? View)?.parent } + .filterIsInstance() + .firstOrNull() + scroll?.let { sv -> + val frame = Rect().apply { target.getDrawingRect(this) } + sv.offsetDescendantRectToMyCoords(target, frame) + + val topVisible = frame.top >= 0 + val bottomVisible = frame.bottom <= sv.height + + if (!topVisible || !bottomVisible) { + val mPx = (10 * activity.resources.displayMetrics.density).toInt() + val scrollToY = + when { + frame.top < 0 -> max(0, frame.top - mPx) + frame.bottom > sv.height -> frame.bottom - sv.height + mPx + else -> sv.scrollY + } + sv.scrollTo(sv.scrollX, scrollToY) + } + } + + target.getGlobalDpBounds(root) + } + + AsyncFunction("inspectViewAttributes") { viewId: Int -> + val activity: Activity = + appContext.activityProvider?.currentActivity ?: return@AsyncFunction null + + val root = activity.window.decorView as? ViewGroup ?: return@AsyncFunction null + + // find the view + val view = root.findViewById(viewId) ?: return@AsyncFunction null + + // wrap its AccessibilityNodeInfo for compat APIs + val info = AccessibilityNodeInfoCompat.wrap(view.createAccessibilityNodeInfo()) + + // get raw screen bounds + val loc = IntArray(2) + view.getLocationOnScreen(loc) + val bounds = + mapOf( + "left" to loc[0], + "top" to loc[1], + "right" to loc[0] + view.width, + "bottom" to loc[1] + view.height + ) + + mapOf( + "id" to view.id, + "className" to view.javaClass.name, + "visibility" to view.visibility, // 0=VISIBLE,4=INVISIBLE,8=GONE + "importantForAccessibility" to view.importantForAccessibility, + "clickable" to view.isClickable, + "focusable" to view.isFocusable, + "contentDescription" to view.contentDescription?.toString(), + "a11yText" to info.text?.toString(), + "a11yRoleDescription" to info.roleDescription?.toString(), + "isVisibleToUser" to info.isVisibleToUser, + "bounds" to bounds + ) + } + } + + private fun getCurrentActivity(): Activity? { + return appContext.activityProvider?.currentActivity + } + + private fun scheduleA11yCheck() { + checkRunnable?.let { checkHandler.removeCallbacks(it) } + checkRunnable = Runnable { + Logger.info2("scheduleA11yCheck", "💨 Running a11y scheduler") + + val decorView = currentDecorView ?: return@Runnable + + // When a component fails an a11y check, we highlight that. + // This causes the drawListener to being fired again, causing + // an infinite loop. To avoid that we temporarily detach the listener + // until all thecks have been performed. + decorView.viewTreeObserver.removeOnDrawListener(drawListener) + + getNodesToCheck() + + decorView.post { + // Check if the observer is still alive before re-attaching + if (decorView.viewTreeObserver.isAlive) { + decorView.viewTreeObserver.addOnDrawListener(drawListener) + } + } + } + checkHandler.postDelayed(checkRunnable!!, Constants.DEBOUNCE) + } + + private fun getNodesToCheck() { + Logger.info("getNodesToCheck", "doing the job") + val issues = a11yChecker.getNodesToCheck(currentDecorView!!) + + sendEvent( + "onAmaNodes", + mapOf("timestamp" to System.currentTimeMillis(), "issues" to issues) + ) + } +} + +private fun View.getGlobalDpBounds(rootView: View): List { + val abs = Rect().also { createAccessibilityNodeInfo().getBoundsInScreen(it) } + + val origin = IntArray(2).also { rootView.getLocationOnScreen(it) } + val relLeftPx = abs.left - origin[0] + val relTopPx = abs.top - origin[1] + val widthPx = abs.width() + val heightPx = abs.height() + + val metrics: DisplayMetrics = resources.displayMetrics + val d = metrics.density + val leftDp = (relLeftPx / d).toInt() + val topDp = (relTopPx / d).toInt() + val widthDp = (widthPx / d).toInt() + val heightDp = (heightPx / d).toInt() + + return listOf(leftDp, topDp, widthDp, heightDp) +} diff --git a/packages/core/android/src/debug/java/expo/modules/ama/ReactNativeAmaView.kt b/packages/core/android/src/debug/java/expo/modules/ama/ReactNativeAmaView.kt new file mode 100644 index 00000000..d6fb1c0a --- /dev/null +++ b/packages/core/android/src/debug/java/expo/modules/ama/ReactNativeAmaView.kt @@ -0,0 +1,30 @@ +package expo.modules.ama + +import android.content.Context +import android.webkit.WebView +import android.webkit.WebViewClient +import expo.modules.kotlin.AppContext +import expo.modules.kotlin.viewevent.EventDispatcher +import expo.modules.kotlin.views.ExpoView + +class ReactNativeAmaView(context: Context, appContext: AppContext) : ExpoView(context, appContext) { + // Creates and initializes an event dispatcher for the `onLoad` event. + // The name of the event is inferred from the value and needs to match the event name defined in the module. + private val onLoad by EventDispatcher() + + // Defines a WebView that will be used as the root subview. + internal val webView = WebView(context).apply { + layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView, url: String) { + // Sends an event to JavaScript. Triggers a callback defined on the view component in JavaScript. + onLoad(mapOf("url" to url)) + } + } + } + + init { + // Adds the WebView to the view hierarchy. + addView(webView) + } +} diff --git a/packages/core/android/src/debug/java/expo/modules/ama/a11yChecker.kt b/packages/core/android/src/debug/java/expo/modules/ama/a11yChecker.kt new file mode 100644 index 00000000..387ef75f --- /dev/null +++ b/packages/core/android/src/debug/java/expo/modules/ama/a11yChecker.kt @@ -0,0 +1,418 @@ +package expo.modules.ama + +import android.graphics.Color +import android.graphics.Rect +import android.graphics.drawable.ColorDrawable +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat +import expo.modules.kotlin.AppContext +import java.util.Collections +import kotlin.collections.mutableListOf +import kotlin.synchronized + +data class A11yIssue( + val type: RuleAction, + val rule: Rule, + val label: String? = null, + val reason: String? = null, + val viewId: Int? = null, +) + +enum class RuleAction { + MUST, + MUST_NOT, + SHOULD, + SHOULD_NOT, + IGNORE +} + +enum class Rule { + CONTRAST_FAILED, + CONTRAST_FAILED_AAA, + FLATLIST_NO_COUNT_IN_SINGULAR_MESSAGE, + FLATLIST_NO_COUNT_IN_PLURAL_MESSAGE, + MINIMUM_SIZE, + NO_ACCESSIBILITY_LABEL, + NO_ACCESSIBILITY_ROLE, + NO_FORM_LABEL, + NO_FORM_ERROR, + NO_KEYBOARD_TRAP, + NO_UNDEFINED, + UPPERCASE_TEXT_NO_ACCESSIBILITY_LABEL, + NO_UPPERCASE_TEXT, + BOTTOM_SHEET_CLOSE_ACTION, + INCOMPATIBLE_ACCESSIBILITY_STATE, + NO_FORM_LABEL_ENDING_WITH_ASTERISK, + INCOMPATIBLE_ACCESSIBILITY_ROLE +} + +val LOGGER_RULES: Map = + mapOf( + Rule.CONTRAST_FAILED to RuleAction.MUST, + Rule.CONTRAST_FAILED_AAA to RuleAction.SHOULD, + Rule.FLATLIST_NO_COUNT_IN_SINGULAR_MESSAGE to RuleAction.SHOULD, + Rule.FLATLIST_NO_COUNT_IN_PLURAL_MESSAGE to RuleAction.MUST, + Rule.MINIMUM_SIZE to RuleAction.MUST, + Rule.NO_ACCESSIBILITY_LABEL to RuleAction.MUST, + Rule.NO_ACCESSIBILITY_ROLE to RuleAction.MUST, + Rule.NO_FORM_LABEL to RuleAction.MUST, + Rule.NO_FORM_ERROR to RuleAction.MUST, + Rule.NO_KEYBOARD_TRAP to RuleAction.MUST_NOT, + Rule.NO_UNDEFINED to RuleAction.MUST_NOT, + Rule.UPPERCASE_TEXT_NO_ACCESSIBILITY_LABEL to RuleAction.MUST_NOT, + Rule.NO_UPPERCASE_TEXT to RuleAction.MUST_NOT, + Rule.BOTTOM_SHEET_CLOSE_ACTION to RuleAction.MUST, + Rule.INCOMPATIBLE_ACCESSIBILITY_STATE to RuleAction.MUST, + Rule.NO_FORM_LABEL_ENDING_WITH_ASTERISK to RuleAction.MUST_NOT, + Rule.INCOMPATIBLE_ACCESSIBILITY_ROLE to RuleAction.MUST_NOT + ) + +class NodesGrabber(private val appContext: AppContext, private val config: AMAConfig) { + val activity = appContext.activityProvider?.currentActivity + + private val issues = Collections.synchronizedList(mutableListOf()) + private val highlighter = Highlight(appContext) + private lateinit var rootView: View + + public fun getNodesToCheck(rootView: View): List> { + Logger.info("getNodesToCheck", "Performing a11y checks") + + this.rootView = rootView + + rootView.let { root -> + val oldIssues = synchronized(issues) { issues.toList() } + + synchronized(issues) { issues.clear() } + + traverseAndCheck(root) + + clearFixedIssues(oldIssues) + + if (issues.isNotEmpty()) { + Logger.debug("getNodesToCheck", issues.toString()) + + val issuesPayload = + issues.map { issue -> + mapOf( + "type" to issue.type, + "rule" to issue.rule, + "label" to (issue.label ?: ""), + "reason" to (issue.reason ?: ""), + "viewId" to issue.viewId + ) + } + + return issuesPayload + } + } + + return emptyList() + } + + public fun clearAllIssues() { + issues.forEach { issue -> issue.viewId?.let { highlighter.clearHighlight(it) } } + } + + private fun clearFixedIssues(oldIssues: List) { + val fixed = oldIssues.filter { it !in issues } + + fixed.forEach { issue -> issue.viewId?.let { highlighter.clearHighlight(it) } } + } + + private fun traverseAndCheck(view: View) { + val className = view.javaClass.name + + // Ignores the debug overlay + if (className.startsWith("com.facebook.react.views.debuggingoverlay")) { + return + } + + checkView(view) + + if (view is ViewGroup) { + for (i in 0 until view.childCount) { + traverseAndCheck(view.getChildAt(i)) + } + } + } + + private fun addIssue(rule: Rule, label: String, reason: String, view: View) { + val action = getRuleAction(rule) + + if (action == RuleAction.IGNORE) { + return + } + + val existingIssue = issues.find { it.rule == rule && it.viewId == view.id } + + if (existingIssue == null) { + view.id.let { id -> highlighter.highlight(id, config.highlight, action) } + + issues.add( + A11yIssue( + type = action, + rule = rule, + label = label, + reason = reason, + viewId = view.id + ) + ) + } + } + + private fun checkView(view: View) { + val info = view.createAccessibilityNodeInfo() + val a11yInfo = AccessibilityNodeInfoCompat.wrap(info) + + if (view.isPressable(a11yInfo)) { + checkForA11yLabel(view, a11yInfo) + checkForA11yRole(view, a11yInfo) + checkForMinimumTargetSize(view) + } + + // if (view is TextView) { + // Logger.debug("checkView", "Check for color contrast") + // + // checkColorContrast(view) + // } + } + + private fun checkForA11yLabel(view: View, a11yInfo: AccessibilityNodeInfoCompat) { + val a11yLabel: String? = a11yInfo.contentDescription?.toString() + + if (a11yLabel.isNullOrEmpty()) { + Logger.error("checkForA11yLabel", view.toString()) + Logger.error("checkForA11yLabel", view.getTextOrContent()) + + addIssue( + rule = Rule.NO_ACCESSIBILITY_LABEL, + label = view.getTextOrContent(), + reason = "", + view = view + ) + } + } + + private fun checkForA11yRole(view: View, a11yInfo: AccessibilityNodeInfoCompat) { + val className = a11yInfo.className?.toString() ?: view.javaClass.simpleName + val roleDescription: String? = a11yInfo.roleDescription?.toString() + val defaultRole = + when { + className.endsWith(".Button") -> "button" + className.endsWith(".CheckBox") -> "checkbox" + className.endsWith(".EditText") -> "text field" + className.endsWith(".ImageView") && view.isClickable -> "image button" + else -> null + } + + val role = roleDescription ?: defaultRole + + if (role.isNullOrEmpty()) { + Logger.error("checkForA11yRole", view.getTextOrContent()) + + addIssue( + rule = Rule.NO_ACCESSIBILITY_ROLE, + label = view.getTextOrContent(), + reason = "", + view = view + ) + } + } + + private val density: Float + get() = activity?.resources?.displayMetrics?.density ?: 1f + + /** dp → px */ + private fun dpToPx(dp: Float): Int = (dp * density + 0.5f).toInt() + + /** px → dp */ + private fun pxToDp(px: Int): Float = px / density + + private fun checkForMinimumTargetSize(view: View) { + val absBounds = Rect().also { view.createAccessibilityNodeInfo().getBoundsInScreen(it) } + + getHitSlopRect(view)?.let { hitSlop -> + absBounds.left -= hitSlop.left + absBounds.top -= hitSlop.top + absBounds.right += hitSlop.right + absBounds.bottom += hitSlop.bottom + } + + val widthPx = absBounds.width() + val heightPx = absBounds.height() + val widthDp = widthPx / view.resources.displayMetrics.density + val heightDp = heightPx / view.resources.displayMetrics.density + + // 4) check vs 48dp + if (widthDp < 48 || heightDp < 48) { + addIssue( + rule = Rule.MINIMUM_SIZE, + label = view.toString(), + reason = String.format("%.1f×%.1f dp (< 48 dp)", widthDp, heightDp), + view = view + ) + } + } + + private fun checkColorContrast(textView: TextView) { + try { + // Get text color + val textColor = textView.currentTextColor + + // Get background color + val backgroundColor = getBackgroundColor(textView) + + // Calculate contrast ratio + val contrastRatio = calculateContrastRatio(textColor, backgroundColor) + + // Check against WCAG standards + val textSize = + textView.textSize / textView.context.resources.displayMetrics.scaledDensity + val isLargeText = textSize >= 18f || (textSize >= 14f && isTextBold(textView)) + + val minContrast = if (isLargeText) 3.0 else 4.5 // WCAG AA standards + + if (contrastRatio < minContrast) { + addIssue( + rule = Rule.CONTRAST_FAILED, + label = textView.toString(), + reason = "Color contrast ratio ${String.format("%.2f", contrastRatio)}", + view = textView + ) + } + } catch (e: Exception) { + // Handle cases where color extraction fails + // Could add logging here if needed + } + } + + private fun getBackgroundColor(view: View): Int { + // Try to get background color from the view itself + val background = view.background + if (background is ColorDrawable) { + return background.color + } + + // If no background, traverse up the view hierarchy + var parent = view.parent + while (parent is View) { + val parentView = parent as View + val parentBackground = parentView.background + if (parentBackground is ColorDrawable) { + return parentBackground.color + } + parent = parentView.parent + } + + // Default to white if no background found + return Color.WHITE + } + + private fun isTextBold(textView: TextView): Boolean { + val typeface = textView.typeface + return typeface != null && typeface.isBold + } + + private fun calculateContrastRatio(color1: Int, color2: Int): Double { + val luminance1 = calculateLuminance(color1) + val luminance2 = calculateLuminance(color2) + + val lighter = maxOf(luminance1, luminance2) + val darker = minOf(luminance1, luminance2) + + return (lighter + 0.05) / (darker + 0.05) + } + + private fun calculateLuminance(color: Int): Double { + // Extract RGB components + val red = Color.red(color) / 255.0 + val green = Color.green(color) / 255.0 + val blue = Color.blue(color) / 255.0 + + // Apply gamma correction + val r = if (red <= 0.03928) red / 12.92 else Math.pow((red + 0.055) / 1.055, 2.4) + val g = if (green <= 0.03928) green / 12.92 else Math.pow((green + 0.055) / 1.055, 2.4) + val b = if (blue <= 0.03928) blue / 12.92 else Math.pow((blue + 0.055) / 1.055, 2.4) + + // Calculate relative luminance + return 0.2126 * r + 0.7152 * g + 0.0722 * b + } + + private fun getRuleAction(rule: Rule): RuleAction { + val overrideAction = config.rules[rule.name] + + if (overrideAction != null) { + return when (overrideAction.uppercase()) { + "PLEASE_FORGIVE_ME" -> RuleAction.IGNORE + "MUST" -> RuleAction.MUST + "SHOULD" -> RuleAction.SHOULD + "SHOULD_NOT" -> RuleAction.SHOULD_NOT + "MUST_NOT" -> RuleAction.MUST_NOT + else -> LOGGER_RULES[rule]!! + } + } + + return LOGGER_RULES[rule]!! + } +} + +fun View.isPressable(a11yInfo: AccessibilityNodeInfoCompat): Boolean { + return this.isClickable && this.isAccessible(a11yInfo) +} + +fun View.isAccessible(a11yInfo: AccessibilityNodeInfoCompat): Boolean { + if (this.importantForAccessibility == View.IMPORTANT_FOR_ACCESSIBILITY_NO || + !a11yInfo.isVisibleToUser + ) { + return false + } + + return true +} + +fun View.getTextOrContent(): String { + if (!this.contentDescription.isNullOrEmpty()) { + return this.contentDescription.toString() + } + + if (this is TextView) { + if (!this.text.isNullOrEmpty()) { + return this.text.toString() + } + + if (!this.hint.isNullOrEmpty()) { + return this.hint.toString() + } + } + + val info = createAccessibilityNodeInfo() + val a11yInfo = AccessibilityNodeInfoCompat.wrap(info) + + return a11yInfo.contentDescription?.toString().orEmpty() +} + +fun getHitSlopRect(view: View): Rect? { + return try { + val rvClass = Class.forName("com.facebook.react.views.view.ReactViewGroup") + + if (!rvClass.isInstance(view)) { + Logger.info("getHitSlopRect", "no class found") + + return null + } + + val getter = rvClass.getMethod("getHitSlopRect") + + @Suppress("UNCHECKED_CAST") val rect = getter.invoke(view) as? Rect + + rect + } catch (e: ClassNotFoundException) { + null + } catch (e: NoSuchMethodException) { + null + } catch (e: Exception) { + null + } +} diff --git a/packages/core/android/src/debug/java/expo/modules/ama/highlight.kt b/packages/core/android/src/debug/java/expo/modules/ama/highlight.kt new file mode 100644 index 00000000..cd1105be --- /dev/null +++ b/packages/core/android/src/debug/java/expo/modules/ama/highlight.kt @@ -0,0 +1,142 @@ +package expo.modules.ama + +import android.app.Activity +import android.graphics.* +import android.graphics.drawable.Drawable +import android.graphics.drawable.LayerDrawable +import android.graphics.drawable.ShapeDrawable +import android.graphics.drawable.shapes.RectShape +import android.view.View +import expo.modules.kotlin.AppContext +import java.util.concurrent.ConcurrentHashMap + +val ruleColors: Map = + mapOf( + RuleAction.MUST to Color.RED, + RuleAction.MUST_NOT to Color.RED, + RuleAction.SHOULD to Color.YELLOW + ) + +class Highlight(private val appContext: AppContext) { + private val originalBackgrounds = ConcurrentHashMap() + + /** + * Highlight the view with the given ID. + * @param viewId the Android view ID + * @param mode "background" | "border" | "both" + */ + fun highlight(viewId: Int, mode: String, action: RuleAction) { + val activity: Activity = appContext.currentActivity ?: return + val color = ruleColors[action] + + activity.runOnUiThread { + val target = activity.findViewById(viewId) ?: return@runOnUiThread + + val view = activity.findViewById(viewId) ?: return@runOnUiThread + + view.background?.let { bg -> originalBackgrounds.putIfAbsent(viewId, bg) } + + when (mode) { + "background" -> applyStripyBackground(target, color) + "border" -> applyRedBorderOverlay(target, color) + else -> { + Logger.info("highlight", "3") + applyRedBorderOverlay(target, color) + Logger.info("highlight", "4") + applyStripyBackground(target, color) + } + } + } + } + + fun clearHighlight(viewId: Int) { + val activity: Activity = appContext.currentActivity ?: return + activity.runOnUiThread { + val view = activity.findViewById(viewId) ?: return@runOnUiThread + + val original = originalBackgrounds.remove(viewId) + view.background = original + + view.overlay.clear() + } + } + + private fun applyStripyBackground(view: View, color: Int?) { + val originalBackground = view.background + + val stripeWidth = 5f + val gapWidth = 25f + val bmpWidth = 150 + val bmpHeight = bmpWidth + + val bmp = Bitmap.createBitmap(bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888) + val canvas = Canvas(bmp) + + val stripePaint = + Paint().apply { + this.color = color ?: Color.RED + isAntiAlias = true + } + + val canvasCenter = bmpWidth / 2f + canvas.save() + canvas.rotate(-45f, canvasCenter, canvasCenter) + + val extendedSize = (bmpWidth * 1.5f) + var y = -extendedSize + while (y < extendedSize) { + canvas.drawRect(-extendedSize, y, extendedSize, y + stripeWidth, stripePaint) + y += stripeWidth + gapWidth + } + + canvas.restore() + + val shader = BitmapShader(bmp, Shader.TileMode.MIRROR, Shader.TileMode.REPEAT) + + val backgroundPaint = Paint().apply { this.shader = shader } + + val stripedDrawable = + object : Drawable() { + override fun draw(c: Canvas) = c.drawRect(bounds, backgroundPaint) + + override fun setAlpha(alpha: Int) { + backgroundPaint.alpha = alpha + } + + override fun setColorFilter(cf: ColorFilter?) { + backgroundPaint.colorFilter = cf + } + + @Deprecated( + "Deprecated in Java", + ReplaceWith("PixelFormat.TRANSLUCENT", "android.graphics.PixelFormat") + ) + override fun getOpacity(): Int = PixelFormat.TRANSLUCENT + } + + if (originalBackground == null) { + view.background = stripedDrawable + } else { + val layers = arrayOf(originalBackground, stripedDrawable) + view.background = LayerDrawable(layers) + } + } + + private fun applyRedBorderOverlay(view: View, color: Int?) { + view.overlay.clear() + + val stroke = 6f + val half = (stroke / 2).toInt() + val shape = + ShapeDrawable(RectShape()).apply { + paint.apply { + this.color = color ?: Color.RED + style = Paint.Style.STROKE + strokeWidth = stroke + } + } + + shape.setBounds(0, 0, view.width - half, view.height - half) + view.overlay.add(shape) + } +} diff --git a/packages/core/android/src/debug/java/expo/modules/ama/logger.kt b/packages/core/android/src/debug/java/expo/modules/ama/logger.kt new file mode 100644 index 00000000..85937f13 --- /dev/null +++ b/packages/core/android/src/debug/java/expo/modules/ama/logger.kt @@ -0,0 +1,25 @@ +package expo.modules.ama + +import android.util.Log + +object Logger { + public fun info(fn: String, message: String, extra: String? = null) { + if (extra.isNullOrEmpty()) { + Log.i("[ReactNative AMA]: ", fn + " " + message) + } else { + Log.i("[ReactNative AMA]: ", fn + " " + message + " >>> " + extra) + } + } + + public fun info2(fn: String, message: String) { + Logger.info(" " + fn, message) + } + + public fun debug(fn: String, message: String) { + // Log.d("[ReactNative AMA]: ", fn + " " + message) + } + + public fun error(fn: String, message: String) { + Log.e("[ReactNative AMA - Error]: ", fn + " " + message) + } +} diff --git a/packages/core/docs/components/AMAProvider.md b/packages/core/docs/components/AMAProvider.md index 6cc0155d..345de689 100644 --- a/packages/core/docs/components/AMAProvider.md +++ b/packages/core/docs/components/AMAProvider.md @@ -1,4 +1,5 @@ # AMAProvider +import { useChecks } from './useChecks'; You must include the provider in your app because it stores information about various accessibility services. This information is essential for the internal functioning of the library's packages and hooks. The provider manages the failure message that appears when AMA accessibility fails[^1]. diff --git a/packages/core/docs/core.md b/packages/core/docs/core.md index f5d0cb80..46a3c5ad 100644 --- a/packages/core/docs/core.md +++ b/packages/core/docs/core.md @@ -24,9 +24,9 @@ npm install @react-native-ama/core ### Config File -When you install the `@react-native-ama/core` package, the `ama.rules.json` file should be generated automatically in your project's root folder. If it didn't generate automatically when you installed the package, you can create it manually with the default config: +When you install the `@react-native-ama/core` package, the `ama.config.json` file should be generated automatically in your project's root folder. If it didn't generate automatically when you installed the package, you can create it manually with the default config: -```json title="ama.rules.json" +```json title="ama.config.json" { rules: {}, accessibilityLabelExceptions: [], diff --git a/packages/core/expo-module.config.json b/packages/core/expo-module.config.json new file mode 100644 index 00000000..7644c662 --- /dev/null +++ b/packages/core/expo-module.config.json @@ -0,0 +1,9 @@ +{ + "platforms": ["apple", "android", "web"], + "apple": { + "modules": ["ReactNativeAmaModule"] + }, + "android": { + "modules": ["expo.modules.ama.ReactNativeAmaModule"] + } +} diff --git a/packages/core/ios/Highlight.swift b/packages/core/ios/Highlight.swift new file mode 100644 index 00000000..ed5bcbe1 --- /dev/null +++ b/packages/core/ios/Highlight.swift @@ -0,0 +1,158 @@ +import UIKit + +public class Highlight { + private let stripeOverlayTag = 0xA11 + private let borderLayerName = "ama_border" + private var stripeOverlays = [Int: UIView]() + private var borderLayers = [Int: CAShapeLayer]() + + public init() {} + + public func highlight(view: UIView, mode: String, hexColor: String) { + let color = UIColor(hex: hexColor) ?? .red + + DispatchQueue.main.async { + switch mode { + case "background": + self.applyStripyBackground(to: view, color: color) + case "border": + self.applyBorderOverlay(to: view, color: color) + default: + self.applyBorderOverlay(to: view, color: color) + self.applyStripyBackground(to: view, color: color) + } + } + } + + public func clearHighlight(viewId: Int) { + clearStripeOverlay(viewId: viewId) + clearBorderOverlay(viewId: viewId) + } + + private func clearStripeOverlay(viewId: Int) { + if let overlay = stripeOverlays.removeValue(forKey: viewId) { + overlay.removeFromSuperview() + } + } + + private func clearBorderOverlay(viewId: Int) { + if let border = borderLayers.removeValue(forKey: viewId) { + border.removeFromSuperlayer() + } + } + + /// Call this when you know the screen is going away + public func clearAll() { + stripeOverlays.values.forEach { $0.removeFromSuperview() } + borderLayers.values.forEach { $0.removeFromSuperlayer() } + stripeOverlays.removeAll() + borderLayers.removeAll() + } + + public func clearHighlight2(viewId: Int) { + guard let root = UIApplication.shared.keyWindow, + let target = root.viewWithTag(viewId) + else { return } + + target.viewWithTag(stripeOverlayTag)?.removeFromSuperview() + + target.layer.sublayers? + .filter { $0.name == borderLayerName } + .forEach { $0.removeFromSuperlayer() } + } + + private func applyStripyBackground(to view: UIView, color: UIColor) { + view.viewWithTag(stripeOverlayTag)?.removeFromSuperview() + + let stripeImage = makeStripyPatternImage(color: color) + let overlay = UIView(frame: view.bounds) + overlay.tag = stripeOverlayTag + overlay.isUserInteractionEnabled = false + overlay.backgroundColor = UIColor(patternImage: stripeImage) + overlay.autoresizingMask = [.flexibleWidth, .flexibleHeight] + view.addSubview(overlay) + + stripeOverlays[view.tag] = overlay + } + + private func applyBorderOverlay(to view: UIView, color: UIColor) { + view.layer.sublayers? + .filter { $0.name == borderLayerName } + .forEach { $0.removeFromSuperlayer() } + + let stroke: CGFloat = 3 + let border = CAShapeLayer() + border.name = borderLayerName + border.frame = view.bounds + border.lineWidth = stroke + border.strokeColor = color.cgColor + border.fillColor = UIColor.clear.cgColor + let inset = stroke / 2 + let rect = view.bounds.insetBy(dx: inset, dy: inset) + border.path = UIBezierPath(rect: rect).cgPath + view.layer.addSublayer(border) + + borderLayers[view.tag] = border + } + + func makeStripyPatternImage( + stripeWidth: CGFloat = 2, + gapWidth: CGFloat = 10, + tileSize: CGFloat = 150, + color: UIColor = .red + ) -> UIImage { + let size = CGSize(width: tileSize, height: tileSize) + let extended = tileSize * 1.5 + + let base = UIGraphicsImageRenderer(size: size).image { ctx in + let c = ctx.cgContext + c.setFillColor(color.cgColor) + + c.translateBy(x: size.width / 2, y: size.height / 2) + c.rotate(by: -.pi / 4) + c.translateBy(x: -size.width / 2, y: -size.height / 2) + + var y: CGFloat = -extended + while y < extended { + c.fill( + CGRect( + x: -extended, + y: y, + width: extended * 2, + height: stripeWidth)) + y += stripeWidth + gapWidth + } + } + + return base.resizableImage(withCapInsets: .zero, resizingMode: .tile) + } +} + +extension UIColor { + public convenience init?(hex: String) { + let r, g, b, a: CGFloat + + if hex.hasPrefix("#") { + let start = hex.index(hex.startIndex, offsetBy: 1) + let hexColor = String(hex[start...]) + + if hexColor.count == 8 { + let scanner = Scanner(string: hexColor) + var hexNumber: UInt64 = 0 + + if scanner.scanHexInt64(&hexNumber) { + r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 + g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 + b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 + a = CGFloat(hexNumber & 0x000000ff) / 255 + + self.init(red: r, green: g, blue: b, alpha: a) + return + } + } + } + + return nil + } +} + diff --git a/packages/core/ios/Logger.swift b/packages/core/ios/Logger.swift new file mode 100644 index 00000000..a250fc88 --- /dev/null +++ b/packages/core/ios/Logger.swift @@ -0,0 +1,31 @@ +import os + +public struct Logger { + // Replace with your own bundle identifier or subsystem + private static let subsystem = Bundle.main.bundleIdentifier ?? "com.your.app" + private static let log = os.Logger(subsystem: subsystem, category: "ReactNative AMA") + + public static func info(_ fn: String, _ message: String, extra: String? = nil) { + if let extra = extra, !extra.isEmpty { + log.info("[INFO]: \(fn) \(message) >>> \(extra, privacy: .public)") + } else { + log.info("[INFO]: \(fn) \(message, privacy: .public)") + } + } + + public static func info2(_ fn: String, _ message: String) { + info(" \(fn)", message) + } + + public static func debug(_ fn: String, _ message: String, extra: String? = nil) { + if let extra = extra, !extra.isEmpty { + log.info("[DEBUG]: \(fn) \(message) >>> \(extra, privacy: .public)") + } else { + log.info("[DEBUG]: \(fn) \(message, privacy: .public)") + } + } + + public static func error(_ fn: String, _ message: String) { + log.info("[ERROR]: \(fn) \(message, privacy: .public)") + } +} diff --git a/packages/core/ios/NodesGrabber.swift b/packages/core/ios/NodesGrabber.swift new file mode 100644 index 00000000..e7165cec --- /dev/null +++ b/packages/core/ios/NodesGrabber.swift @@ -0,0 +1,319 @@ +import ExpoModulesCore +import UIKit + +public struct NodePayload: Equatable { + let viewId: Int + let isPressable: Bool + let bounds: [Double]? + let ariaLabel: String? + let content: String? + let ariaRole: String? + let traits: [String]? + let fg: String? + let bg: String? + let fontSize: CGFloat? + let isBold: Bool? + + func toDictionary() -> [String: Any?] { + return [ + "viewId": self.viewId, + "isPressable": self.isPressable, + "bounds": self.bounds, + "ariaLabel": self.ariaLabel, + "content": self.content, + "ariaRole": self.ariaRole, + "traits": self.traits, + "fg": self.fg, + "bg": self.bg, + "fontSize": self.fontSize, + "isBold": self.isBold, + ] + } +} + +public class NodesGrabber { + private let appContext: AppContext + private var nodesToCheck: [Int: NodePayload] = [:] + + public init(appContext: AppContext) { + self.appContext = appContext + } + + public func getNodesToCheck(on rootView: UIView?) -> (nodes: [Int: NodePayload], send: Bool) { + guard let root = rootView else { return (nodesToCheck, false) } + + nodesToCheck.removeAll() + + traverseAndCheck(view: root) + + return (nodesToCheck, true) + } + + private func traverseAndCheck(view: UIView) { + checkView(view) + + for subview in view.subviews { + traverseAndCheck(view: subview) + } + } + + private func checkView(_ view: UIView) { + if view.isPressable { + let font = view.contentFont + + addNode( + node: NodePayload( + viewId: view.tag, + isPressable: true, + bounds: getTargetArea(view), + ariaLabel: view.accessibilityLabel, + content: view.content, + ariaRole: getDefaultAriaRole(view), + traits: view.accessibilityTraits.names, + fg: view.contentColor?.hexString, + bg: view.contentBackgroundColor.hexString, + fontSize: font?.pointSize, + isBold: font?.fontDescriptor.symbolicTraits.contains(.traitBold) + )) + } + } + + private func getDefaultAriaRole(_ view: UIView) -> String? { + let defaultRole: String? = { + switch view { + case is UIButton: + return "button" + case is UISwitch: + return "switch" + case is UITextField: + return "text field" + case let iv as UIImageView where iv.isUserInteractionEnabled: + return "image button" + default: + return nil + } + }() + + return defaultRole + } + + private func getTargetArea(_ view: UIView) -> [Double] { + let baseSize: CGRect = view.frame + let insets = view.getHitSlopRect() + let pressableWidth = baseSize.width - insets.left - insets.right + let pressableHeight = baseSize.height - insets.top - insets.bottom + + return [pressableWidth, pressableHeight] + } + + private func addNode(node: NodePayload) { + guard node.viewId > 0 else { return } + + nodesToCheck[node.viewId] = node + } +} + +extension UIView { + + private func findColorIn(view: UIView) -> UIColor? { + if let imageView = view as? UIImageView, let bgColor = imageView.backgroundColor { + return bgColor + } + + if let bgColor = view.backgroundColor, bgColor.cgColor.alpha > 0 { + return bgColor + } + + for subview in view.subviews { + if let color = findColorIn(view: subview) { + return color + } + } + + return nil + } + + var content: String? { + let className = String(describing: type(of: self)) + + if className.contains("RCTParagraphComponentView") { + if let attrText = self.value(forKey: "attributedText") as? NSAttributedString { + return attrText.string + } + } + + return subviews.compactMap { $0.content }.first + } + + var contentBackgroundColor: UIColor { + var current: UIView? = self + while let superview = current?.superview { + for subview in superview.subviews { + let className = String(describing: type(of: subview)) + if className.contains("_UIBarBackground") { + if let color = findColorIn(view: subview) { + return color + } + } + } + current = superview + } + + if let bg = self.backgroundColor { return bg } + + var parent = self.superview + while let p = parent { + if let bg = p.backgroundColor, bg.cgColor.alpha > 0 { + return bg + } + parent = p.superview + } + + return .white + } + + var contentColor: UIColor? { + let className = String(describing: type(of: self)) + + if className.contains("SVG") { + return nil + } + + if className.contains("RCTParagraphComponentView"), + let anyObj = self as AnyObject?, + let attrText = anyObj.value(forKey: "attributedText") as? NSAttributedString, + attrText.length > 0, + let fgColor = attrText.attribute(.foregroundColor, at: 0, effectiveRange: nil) + as? UIColor + { + return fgColor + } + + if let label = self as? UILabel { + return label.textColor + } + if let button = self as? UIButton { + if let tc = button.titleColor(for: .normal) { return tc } + return button.tintColor + } + if let iv = self as? UIImageView { + return iv.tintColor + } + + for sub in subviews { + if let cc = sub.contentColor { + return cc + } + } + + return self.tintColor + } + + var contentFont: UIFont? { + if let label = self as? UILabel { + return label.font + } + + if let button = self as? UIButton, + let f = button.titleLabel?.font + { + return f + } + + let className = String(describing: type(of: self)) + + if className.contains("RCTParagraphComponentView"), + let anyObj = self as AnyObject?, + let attrText = anyObj.value(forKey: "attributedText") as? NSAttributedString, + attrText.length > 0, + let font = attrText.attribute(.font, at: 0, effectiveRange: nil) as? UIFont + { + return font + } + + for sub in subviews { + if let f = sub.contentFont { + return f + } + } + + return nil + } + + fileprivate func getHitSlopRect() -> UIEdgeInsets { + let selector = NSSelectorFromString("hitTestEdgeInsets") + + guard self.responds(to: selector) else { + return .zero + } + + let anyObj = self as AnyObject + guard + let edgeValue = anyObj.value(forKey: "hitTestEdgeInsets") as? UIEdgeInsets + else { + return .zero + } + + return edgeValue + } + + /** + * Returns true if the user can tap on the element + */ + var isPressable: Bool { + return isUserInteractionEnabled && isAccessibilityElement + } +} + +extension UIAccessibilityTraits { + fileprivate var names: [String] { + let all: [(UIAccessibilityTraits, String)] = [ + (.button, "button"), + (.link, "link"), + (.header, "header"), + (.searchField, "searchField"), + (.image, "image"), + (.selected, "selected"), + (.playsSound, "playsSound"), + (.keyboardKey, "keyboardKey"), + (.staticText, "staticText"), + (.summaryElement, "summaryElement"), + (.notEnabled, "notEnabled"), + (.updatesFrequently, "updatesFrequently"), + (.startsMediaSession, "startsMediaSession"), + (.adjustable, "adjustable"), + (.allowsDirectInteraction, "allowsDirectInteraction"), + (.causesPageTurn, "causesPageTurn"), + ] + return all.compactMap { (trait, name) in + (self.rawValue & trait.rawValue) != 0 ? name : nil + } + } +} + +extension UIColor { + var rgbaComponents: (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat)? { + var r: CGFloat = 0 + var g: CGFloat = 0 + var b: CGFloat = 0 + var a: CGFloat = 0 + guard self.getRed(&r, green: &g, blue: &b, alpha: &a) else { return nil } + return (r, g, b, a) + } + + var rgbaString: String { + guard let c = rgbaComponents else { return self.description } + let R = Int(c.r * 255) + let G = Int(c.g * 255) + let B = Int(c.b * 255) + return String(format: "rgba(%d,%d,%d,%.2f)", R, G, B, c.a) + } + + var hexString: String { + guard let c = rgbaComponents else { return self.description } + let R = Int(c.r * 255) + let G = Int(c.g * 255) + let B = Int(c.b * 255) + return String(format: "#%02X%02X%02X", R, G, B) + } +} diff --git a/packages/core/ios/ReactNativeAma.podspec b/packages/core/ios/ReactNativeAma.podspec new file mode 100644 index 00000000..693830c5 --- /dev/null +++ b/packages/core/ios/ReactNativeAma.podspec @@ -0,0 +1,29 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json'))) + +Pod::Spec.new do |s| + s.name = 'ReactNativeAma' + s.version = package['version'] + s.summary = package['description'] + s.description = package['description'] + s.license = package['license'] + s.author = package['author'] + s.homepage = package['homepage'] + s.platforms = { + :ios => '15.1', + :tvos => '15.1' + } + s.swift_version = '5.4' + s.source = { git: 'https://github.com/FormidableLabs/react-native-ama/' } + s.static_framework = true + + s.dependency 'ExpoModulesCore' + + # Swift/Objective-C compatibility + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + } + + s.source_files = "**/*.{h,m,mm,swift,hpp,cpp}" +end diff --git a/packages/core/ios/ReactNativeAmaModule.swift b/packages/core/ios/ReactNativeAmaModule.swift new file mode 100644 index 00000000..90a7d0c7 --- /dev/null +++ b/packages/core/ios/ReactNativeAmaModule.swift @@ -0,0 +1,164 @@ +import ExpoModulesCore +import UIKit + +struct Constants { + static let debounce: TimeInterval = 2.0 +} + +public class ReactNativeAmaModule: Module { + private var isMonitoring = false + private var currentDecorView: UIView? + private var displayLink: CADisplayLink? + + private var a11yChecker: NodesGrabber? + private var highlighter: Highlight? + private var isCheckScheduled = false + + public func definition() -> ModuleDefinition { + Name("ReactNativeAma") + + Events("onAmaNodes") + + Function("start") { + guard !isMonitoring else { return } + + Logger.info("start", "👀 Start Monitoring 👀") + + self.a11yChecker = NodesGrabber(appContext: self.appContext!) + self.highlighter = Highlight() + + isMonitoring = true + + DispatchQueue.main.async { + guard let viewController = self.appContext?.utilities?.currentViewController(), + let decorView = viewController.view + else { + return + } + + self.currentDecorView = decorView + self.setupDisplayLink() + } + } + + Function("stop") { + guard isMonitoring else { return } + + isMonitoring = false + + DispatchQueue.main.async { + self.displayLink?.invalidate() + self.displayLink = nil + // self.a11yChecker?.clearAllHighlights() + } + } + + AsyncFunction("highlight") { (viewId: Int, mode: String, hexColor: String) async -> [Double]? in + guard + let root = self.currentDecorView, + let target = root.viewWithTag(viewId) + else { return nil } + + await MainActor.run { + if let scroll = target.enclosingScrollView { + var frameInScroll = target.convert(target.bounds, to: scroll) + let m = CGFloat(10) + + frameInScroll.origin.y = max(0, frameInScroll.origin.y - m) + scroll.scrollRectToVisible(frameInScroll, animated: false) + + self.highlighter?.highlight(view: target, mode: mode, hexColor: hexColor) + } + } + + let bounds: CGRect = await MainActor.run { + target.convert(target.bounds, to: nil) + } + + return [ + bounds.origin.x, + bounds.origin.y, + bounds.width, + bounds.height, + ] + } + // + // AsyncFunction("highlight") { (viewId: Int) in + // guard + // let root = self.currentDecorView, + // let target = root.viewWithTag(viewId) + // else { return } + // + // await MainActor.run { + // self.highlighter?.highlight(view: target, mode: "both", hexColor: "#f00") + // } + // } + + AsyncFunction("clearHighlight") { (viewId: Int) in + await MainActor.run { + self.highlighter?.clearHighlight(viewId: viewId) + } + } + } + + private func setupDisplayLink() { + displayLink = CADisplayLink(target: self, selector: #selector(scheduleA11yCheck)) + displayLink?.add(to: .main, forMode: .default) + } + + @objc private func scheduleA11yCheck() { + guard isMonitoring, !isCheckScheduled else { return } + + isCheckScheduled = true + + DispatchQueue.main.asyncAfter(deadline: .now() + Constants.debounce) { [weak self] in + guard let self = self, let decorView = self.currentDecorView else { + self?.isCheckScheduled = false + + return + } + + self.displayLink?.isPaused = true + self.getNodesToCheck() + + DispatchQueue.main.async { + self.displayLink?.isPaused = false + self.isCheckScheduled = false + } + } + } + + private func getNodesToCheck() { + guard isMonitoring else { return } + guard let result = a11yChecker?.getNodesToCheck(on: currentDecorView) else { return } + + if let shouldSend = result.send as? Bool, shouldSend { + // Since result.nodes is not optional, we can access it directly here. + let nodes = result.nodes + let nodesWithStringKeys = Dictionary( + uniqueKeysWithValues: nodes.map { (key, value) in + (String(key), value.toDictionary()) + } + ) + + + sendEvent( + "onAmaNodes", + nodesWithStringKeys + ) + } + } +} + +extension UIView { + fileprivate var enclosingScrollView: UIScrollView? { + var v: UIView? = self + while let view = v { + if let scroll = view as? UIScrollView { + return scroll + } + v = view.superview + } + return nil + } +} diff --git a/packages/core/ios/ReactNativeAmaView.swift b/packages/core/ios/ReactNativeAmaView.swift new file mode 100644 index 00000000..68fa92fa --- /dev/null +++ b/packages/core/ios/ReactNativeAmaView.swift @@ -0,0 +1,38 @@ +import ExpoModulesCore +import WebKit + +// This view will be used as a native component. Make sure to inherit from `ExpoView` +// to apply the proper styling (e.g. border radius and shadows). +class ReactNativeAmaView: ExpoView { + let webView = WKWebView() + let onLoad = EventDispatcher() + var delegate: WebViewDelegate? + + required init(appContext: AppContext? = nil) { + super.init(appContext: appContext) + clipsToBounds = true + delegate = WebViewDelegate { url in + self.onLoad(["url": url]) + } + webView.navigationDelegate = delegate + addSubview(webView) + } + + override func layoutSubviews() { + webView.frame = bounds + } +} + +class WebViewDelegate: NSObject, WKNavigationDelegate { + let onUrlChange: (String) -> Void + + init(onUrlChange: @escaping (String) -> Void) { + self.onUrlChange = onUrlChange + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation) { + if let url = webView.url { + onUrlChange(url.absoluteString) + } + } +} diff --git a/packages/core/scripts/create-config.ts b/packages/core/scripts/create-config.ts index 6f3512ae..5bee0309 100644 --- a/packages/core/scripts/create-config.ts +++ b/packages/core/scripts/create-config.ts @@ -3,7 +3,7 @@ import path from 'path'; const projectRoot = path.resolve(process.cwd(), '..', '..', '..'); -const configFileName = 'ama.rules.json'; +const configFileName = 'ama.config.json'; const configFilePath = path.join(projectRoot, configFileName); const defaultConfig = { rules: {}, @@ -13,8 +13,8 @@ const defaultConfig = { if (!fs.existsSync(configFilePath)) { try { fs.writeFileSync(configFilePath, JSON.stringify(defaultConfig, null, 2)); - console.log(`[AMA]: Rules file created at ${configFilePath}`); + console.log(`[AMA]: Config file created at ${configFilePath}`); } catch (error) { - console.error('[AMA]: Error creating rules file:', error); + console.error('[AMA]: Error creating config file:', error); } } diff --git a/packages/core/src/ReactNativeAma.types.ts b/packages/core/src/ReactNativeAma.types.ts new file mode 100644 index 00000000..e53840da --- /dev/null +++ b/packages/core/src/ReactNativeAma.types.ts @@ -0,0 +1,36 @@ +import type { StyleProp, ViewStyle } from 'react-native'; + +export type OnLoadEventPayload = { + url: string; +}; + +export type AmaNode = { + viewId: number; + bounds: [number, number, number, number]; + hitSlop?: { top: number; left: number; bottom: number; right: number }; + + isPressable?: boolean; + ariaLabel?: string; + ariaRole?: string; + traits?: string[]; + content?: string; + + fg?: string; + bg?: string; + fontSize?: number; // pt + isBold?: boolean; +}; + +export type ReactNativeAmaModuleEvents = { + onAmaNodes: (nodes: AmaNode[]) => void; +}; + +export type ChangeEventPayload = { + value: string; +}; + +export type ReactNativeAmaViewProps = { + url: string; + onLoad: (event: { nativeEvent: OnLoadEventPayload }) => void; + style?: StyleProp; +}; diff --git a/packages/core/src/ReactNativeAmaModule.ts b/packages/core/src/ReactNativeAmaModule.ts new file mode 100644 index 00000000..fbc4bdb8 --- /dev/null +++ b/packages/core/src/ReactNativeAmaModule.ts @@ -0,0 +1,16 @@ +import { NativeModule, requireNativeModule } from 'expo'; +import { ReactNativeAmaModuleEvents } from './ReactNativeAma.types'; + +declare class ReactNativeAmaModule extends NativeModule { + start(config?: any): void; + stop(): void; + highlight( + viewId: number, + mode: 'background' | 'border' | 'both', + color: string, + ): Promise; + clearHighlight(viewId: number): void; +} + +// This call loads the native module object from the JSI. +export default requireNativeModule('ReactNativeAma'); diff --git a/packages/core/src/ReactNativeAmaModule.web.ts b/packages/core/src/ReactNativeAmaModule.web.ts new file mode 100644 index 00000000..e7d26658 --- /dev/null +++ b/packages/core/src/ReactNativeAmaModule.web.ts @@ -0,0 +1,15 @@ +import { NativeModule, registerWebModule } from 'expo'; +import { ReactNativeAmaModuleEvents } from './ReactNativeAma.types'; +import type { A11yIssue } from './internals/types'; + +class ReactNativeAmaModule extends NativeModule { + PI = Math.PI; + async setValueAsync(issues: A11yIssue[]): Promise { + this.emit('onAmaNodes', issues); + } + hello() { + return 'Hello world! 👋'; + } +} + +export default registerWebModule(ReactNativeAmaModule, 'ReactNativeAmaModule'); diff --git a/packages/core/src/ReactNativeAmaView.tsx b/packages/core/src/ReactNativeAmaView.tsx new file mode 100644 index 00000000..265d2b4b --- /dev/null +++ b/packages/core/src/ReactNativeAmaView.tsx @@ -0,0 +1,9 @@ +import { requireNativeView } from 'expo'; +import * as React from 'react'; +import { ReactNativeAmaViewProps } from './ReactNativeAma.types'; + +const NativeView: React.ComponentType = requireNativeView('ReactNativeAma'); + +export default function ReactNativeAmaView(props: ReactNativeAmaViewProps) { + return ; +} diff --git a/packages/core/src/ReactNativeAmaView.web.tsx b/packages/core/src/ReactNativeAmaView.web.tsx new file mode 100644 index 00000000..df9deb70 --- /dev/null +++ b/packages/core/src/ReactNativeAmaView.web.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import { ReactNativeAmaViewProps } from './ReactNativeAma.types'; + +export default function ReactNativeAmaView(props: ReactNativeAmaViewProps) { + return ( +
+